安全開發之淺析索引Python input 函式存在的安全風險
0x00. 前言
input 是 Python3.x 和Python2.x 都內建的用於接受標準輸入資料的函式。在Python2.x中,與input 有類似功能的還有raw_input函式,與input函式不同的是,raw_input將所有輸入作為字串看待,返回字串型別,而 input() 相當於 eval(raw_input(prompt)) ,如果來自標準輸入的資料是一個惡意的表示式語句,則存在任意程式碼執行的安全風險,本文結合示例進行演示說明,詳文入下
0x01. 實驗演示
注: 下面幾個測試意在證明,如果傳入input的內容沒有過濾,則可能引發安全風險
input 希望能夠讀取一個合法的 python 表示式,即你輸入字串的時候必須使用引號將它括起來,否則它會引發一個 SyntaxError 。
1) 傳入一個字串拼接表示式,則返回字串拼接後的結果
2) 傳入一個讀取檔案的函式表示式,則導致任意檔案讀取
3) 傳入一個精心構造的程式碼表達式,實現任意程式碼執行
注: 上圖中subclasses()[58] 中的索引58 是根據具體系統環境計算出來的,計算方法如下:
num = 0 for i in ().class.bases[0].subclasses(): try: if 'builtins' in i.init.globals.keys(): print(i, num) except: pass else: num = num + 1
結果可能有多個合適的,選擇一個就可以了
4)甚至可以利用精心構造的傳入資料 寫入 後門?
0x02. 總結
How to Prevent ?
1) 對於Python2.x
強烈建議請使用raw_input 替代input
這樣就不會有任意程式碼執行風險
2) 對於Python3.x
Python3.x 中已沒有raw_input。 input 已經修復了Python2.x中的安全隱患
也許本文涉及的小技巧可以在CTF 比賽中有些用處。