Python中input()函數漏洞及與raw_input()函數區別

Python中input()函數漏洞

一、函數簡介:

input()函數是python中的內置函數,函數作用是從stdin中讀取數據

喜歡python2的朋友都知道python中有兩個常見的輸入函數:input()函數和raw_input()函數,但是我們在寫腳本使用輸入函數的時候,往往會使用raw_input()函數。這是爲什麼?因爲input()函數在python2中擁有非常大的安全隱患。所以當我們自學python的時候,課本上,老師說的都是推薦raw_input()函數。Input()函數具體存在什麼安全隱患?慢慢道來!
二、input()函數與raw_input()函數的區別

1、 input()函數,能夠自動的識別出輸入的類型(str,int,fload);
Python中input()函數漏洞及與raw_input()函數區別
raw_input()函數,完全默認爲str字符串類型
Python中input()函數漏洞及與raw_input()函數區別
2、 input()函數如果接收的是數學計算式,會自動執行得到結果(漏洞產生的原因)
raw_input()函數則會將輸入的以字符串形式顯示
例:
Python中input()函數漏洞及與raw_input()函數區別
輸入3+2的字符串,input()函數處理後,得到5;
而raw_input()函數則不會出現這種問題
Python中input()函數漏洞及與raw_input()函數區別
三、input()函數產生漏洞的原因
此函數會將stdin輸入的內容當做python代碼去執行(就像執行計算式一樣,將其看做python代碼,通過計算返回結果)。如果我們將輸入的結果是需要查看/etc/passwd的文件內容呢?顯然這裏的漏洞還是不小的。接下來我們演示一下。
首先我們要清楚,在python中如何去調用系統命令。這個有很多方法,就不在一一解釋,朋友們可以去百度一下。我這裏是利用的os模塊的system()方法。
實驗結果:
Python中input()函數漏洞及與raw_input()函數區別
import():是python中的內置函數,同語法import 相同,都是調用模塊
system()就是os模塊中的方法,此方法用來調用系統命令
cat /etc/passwd 系統命令,用來查看文件/etc/passwd的內容
四、CTF例題實戰
題目來源:https://junior.stillhackinganyway.nl/challenges?chal=13#challenge-information
題目內容:
This program consists of only 4 words, and still they've made a mistake. Read the flag from
/home/small/flag
nc small.stillhackinganyway.nl 1337*
題目附帶了個腳本:
Python中input()函數漏洞及與raw_input()函數區別

這個題目就是利用所說的input()函數漏洞。
Python中input()函數漏洞及與raw_input()函數區別
輸入input(),讓腳本中的input()函數去執行我們輸入的input()函數。這樣我們就可以再次輸入我們構造的查看flag的語句:
__import__('os').system('cat /home/small/flag')
五、漏洞修復
在python2中,推薦使用raw_input()函數,儘量不要使用input()函數,在python3中,input()函數被默認改爲默認輸入爲字符串。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章