MoeCTF_2021web方向WP
fakegame
先尝试随便输入一些数,但是都是失败,bp抓包看一下
发现传递数据的方式是这样的,就可能是js中的原型链污染
稍微解释一下这个是什么:js中的对象有示例,比如我现在有一个Dog对象,然后我实例创建了一个dog
在每个实例对象中会有一个私有的属性__proto__
,这个属性指向它的原型,这个原型可以是动物对象,Dog对象继承了一些原型的属性
比如eat,sleep,这样子比如我创建一个新的对象Cat,Cat的原型也是动物,这样eat,sleep这些属性就继承就好,不用再重复写
在这道题中发现参数传递的方式是js的形式,所以考虑修改原型,因为限制只是针对勇者这个对象的,我们修改原型之后让勇者继承
这里我们先修改一些__proto__
这个属性,然后发包,发现返回的还是失败,为什么呢?
因为原型这个东西是对象刚被创建或者没有赋值的时候才会被对象继承的,我们抓包的时候,第一个勇者对象的生命,攻击这些已经被我们赋值了
然后修改了原型的属性,当我们再次发包的时候,因为原型已经被修改了,所以创建的第二个勇者就继承了我们修改了的原型属性
变成了开挂勇者,一刀砍死了巨龙,拿到flag
Web 安全入门指北 —POST
环境坏的,做不了
但是看这个题目,估计原题也只要发一个post请求就能解决
Web 安全入门指北 —GET
题目:
1 |
|
http://node5.anna.nssctf.cn:21557/?moe=flag
Web 安全入门指北 — 小饼干
这里就是要找关于VIP的东西,可以用bp抓包,我这里直接用curl解决了,加强一下命令使用
1 | ┌──(root㉿kakeru)-[~/tmp] |
2048
一个2048的游戏界面,随便按键,最后提示要达到50000分
查看页面源代码,这里有这个游戏的源码 ,然后ctrl+f搜索flag有关的
发现这里计算分数用的是get请求,在flag.php界面
所以访问http://node5.anna.nssctf.cn:22813/flag.php?score=50001
就能拿到flag
babyRCE
题目:
1 |
|
这里会执行$rce
的内容,但是过滤了很多函数
先用ls看看所有的文件
这题中没有过滤\
在linux中命令中间有分隔符,单引号双引号反斜杠反引号也可以照样执行命令比如l''s l""s l\s l``s 所以用这种方式绕过,空格用
$IFS`绕过,最后在源码中看到flag
Do you know HTTP
题目描述:检查一下你的学习成果吧
仅仅学习了 HTTP 请求头相关内容,你可能会发现浏览器已经不足以让你便利的去解决问题了,试试 burpsuite!
用bp抓包 根据原始页面的提示,把GET请求方法改成HS
再加上X-Forwarded-For: 127.0.0.1
而且这里每次都要重新发包,放到repeater模块不行,但是修改xff之后还是没反应,我就直接curl更改请求做了
1 | ┌──(root㉿kakeru)-[~/tmp] |
从哪里来就是要修改Referer
1 | ┌──(root㉿kakeru)-[~/tmp] |
指定浏览器就是修改UA头
1 | ┌──(root㉿kakeru)-[~/tmp] |
unserialize
题目
1 |
|
这里要找pop链
最后我们想要用的是evil
类中的__get函数的eval,$this->end
就是我们要执行的命令
当你试图访问一个不存在或不可访问(如 private
)的属性时,__get()
方法会被自动调用。
能够出发这个__get函数是springboard
中的__call函数,这里执行会echo $this->middle->hs;1
就让这里echo一个evil不存在的属性就能触发
__call怎么触发 在 PHP 中,__call()
是一个 魔法方法,当调用未定义或不可访问(如 private
)的方法时,它会被自动触发。
所以用entrance
类中的$this->start->helloworld();
让$this -> start
为springboard这样就能访问一个不存在的方法
payload:
1 |
|
地狱通讯
题目
1 |
|
这个是用python的flask构造一个web界面的源码
f1ag和exp都是通过get请求传递,这里最后返回的时候用format把flAg放在message中的{0}位置
所以如果exp中也有{0}就可以访问到FLAG
在python中
class 获取对象的类。
init 获取类的构造方法。
globals 获取该类定义时的全局变量。
payload为?flag=1&exp={0.__class__.__init__.__globals__}
1 | Your flag is {'__name__': 'flag', '__doc__': None, '__package__': '', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fc8364bbb10>, '__spec__': ModuleSpec(name='flag', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fc8364bbb10>, origin='/var/www/html/flag.py'), '__file__': '/var/www/html/flag.py', '__cached__': '/var/www/html/__pycache__/flag.cpython-311.pyc', '__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__package__': '', '__loader__': , '__spec__': ModuleSpec(name='builtins', loader=, origin='built-in'), '__build_class__': , '__import__': , 'abs': , 'all': , 'any': , 'ascii': , 'bin': , 'breakpoint': , 'callable': , 'chr': , 'compile': , 'delattr': , 'dir': , 'divmod': , 'eval': , 'exec': , 'format': , 'getattr': , 'globals': , 'hasattr': , 'hash': , 'hex': , 'id': , 'input': , 'isinstance': , 'issubclass': , 'iter': , 'aiter': , 'len': , 'locals': , 'max': , 'min': , 'next': , 'anext': , 'oct': , 'ord': , 'pow': , 'print': , 'repr': , 'round': , 'setattr': , 'sorted': , 'sum': , 'vars': , 'None': None, 'Ellipsis': Ellipsis, 'NotImplemented': NotImplemented, 'False': False, 'True': True, 'bool': , 'memoryview': , 'bytearray': , 'bytes': , 'classmethod': , 'complex': , 'dict': , 'enumerate': , 'filter': , 'float': , 'frozenset': , 'property': , 'int': , 'list': , 'map': , 'object': , 'range': , 'reversed': , 'set': , 'slice': , 'staticmethod': , 'str': , 'super': , 'tuple': , 'type': , 'zip': , '__debug__': True, 'BaseException': , 'BaseExceptionGroup': , 'Exception': , 'GeneratorExit': , 'KeyboardInterrupt': , 'SystemExit': , 'ArithmeticError': , 'AssertionError': , 'AttributeError': , 'BufferError': , 'EOFError': , 'ImportError': , 'LookupError': , 'MemoryError': , 'NameError': , 'OSError': , 'ReferenceError': , 'RuntimeError': , 'StopAsyncIteration': , 'StopIteration': , 'SyntaxError': , 'SystemError': , 'TypeError': , 'ValueError': , 'Warning': , 'FloatingPointError': , 'OverflowError': , 'ZeroDivisionError': , 'BytesWarning': , 'DeprecationWarning': , 'EncodingWarning': , 'FutureWarning': , 'ImportWarning': , 'PendingDeprecationWarning': , 'ResourceWarning': , 'RuntimeWarning': , 'SyntaxWarning': , 'UnicodeWarning': , 'UserWarning': , 'BlockingIOError': , 'ChildProcessError': , 'ConnectionError': , 'FileExistsError': , 'FileNotFoundError': , 'InterruptedError': , 'IsADirectoryError': , 'NotADirectoryError': , 'PermissionError': , 'ProcessLookupError': , 'TimeoutError': , 'IndentationError': , 'IndexError': , 'KeyError': , 'ModuleNotFoundError': , 'NotImplementedError': , 'RecursionError': , 'UnboundLocalError': , 'UnicodeError': , 'BrokenPipeError': , 'ConnectionAbortedError': , 'ConnectionRefusedError': , 'ConnectionResetError': , 'TabError': , 'UnicodeDecodeError': , 'UnicodeEncodeError': , 'UnicodeTranslateError': , 'ExceptionGroup': , 'EnvironmentError': , 'IOError': , 'open': , 'quit': Use quit() or Ctrl-D (i.e. EOF) to exit, 'exit': Use exit() or Ctrl-D (i.e. EOF) to exit, 'copyright': Copyright (c) 2001-2022 Python Software Foundation. All Rights Reserved. Copyright (c) 2000 BeOpen.com. All Rights Reserved. Copyright (c) 1995-2001 Corporation for National Research Initiatives. All Rights Reserved. Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All Rights Reserved., 'credits': Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands for supporting Python development. See www.python.org for more information., 'license': Type license() to see the full license text, 'help': Type help() for interactive help, or help(object) for help about object.}, 'os': , 'flag': 'NSSCTF{d49ac46c-0a9a-4a13-9c83-5a0fa1d8111c}', 'FLAG': } |
地狱通讯 - 改
题目:
1 |
|
该 Web 应用有两个路由:
/(index()):
读取 app.py 文件的内容并返回作为 HTTP 响应。
如果用户在 URL 参数 name 中提供了一个值,就生成一个 JWT 令牌(排除 “admin”)。
令牌存储在 token cookie 中。
/hello(hello()):
检查用户是否携带 token cookie,如果没有,则重定向到 /。
解析 JWT 令牌,提取 name。
如果 name 不是 “admin”,就返回一条个性化的消息。
如果 name 是 “admin”,则渲染 flag.html。
我们先创建一个用户得到token
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaGFjayJ9.qBmUAhskQCDOFXDZfDBtaRmR92EJUo_xLiPa5VfHkKc |
然后访问 /hello路由,用这个token作为cookie,然后用上题一样的stti漏洞
得到secret和headers
1 | 'secret': 'u_have_kn0w_what_f0rmat_i5', |
然后去一个jwt加密网站 http://jwt.io/
这是个签名,我们先把headers修改一下,然后输入secret,最后输入刚才token。因为这样才是认证签名
再把name改成admin
得到
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4ifQ.jlAcmWWxtmNLxbxwfRE45Fxf16dX6LQmrK_1dgx7zmg |
再去bp把这个admin的token给cookie