easy_tornado
題目打開,大概率是模板注入
修改filename,報錯
http://124.126.19.106:56689/error?msg=Error
tplmap里跑一下,沒有注入的地方,可能注入方式有問題
基於hint要尋找cookie_secret,控制台找不到
查資料無果,查WP:
handler指向的處理當前這個頁面的RequestHandler對象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings,這里面就是我們一下環境變量,我們正是從這里獲取的cookie_secret
Payload:
?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))
shrine
得到源碼:
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
看樣子可能是flask的模板注入,@app.route后面跟的是瀏覽器請求的默認方法,即路由,大概率還有過濾
/shrine/{{ 2+2 }}
能返回4,說明的確是ssti,放tplmap里面是沒法跑的,因為沒有注入點(像id一類)
倒是第一次接觸,查WP:
注冊了一個名為FLAG的config,猜測這就是flag,如果沒有過濾可以直接{{config}}即可查看所有app.config內容,但是這題設了黑名單[‘config’,‘self’]並且過濾了括號
上面這行代碼把黑名單的東西遍歷並設為空,例如:
不過python還有一些內置函數,比如url_for和get_flashed_messages
那我們就當前app下的config:
也就是說,我們只要能查看config文件就能獲得flag
看了看api.php源碼,如下,大致說號碼是隨機生成的7位,至少猜對兩位才能得到獎勵
查閱WP:
$numbers
來自用戶json
輸入{"action":"buy","numbers":"1122334"}
,沒有檢查數據類型。$win_numbers
是隨機生成的數字字符串。
使用 PHP 弱類型松散比較,以"1"
為例,和TRUE
,1
,"1"
相等。 由於 json 支持布爾型數據,因此可以抓包改包
就是將數據包里面的7位數,修改為7個true(PHP弱類型可以這么用嗎?)
之后一直重復,直到可以購買flag為止