您好,登錄后才能下訂單哦!
一、函數簡介:
input()函數是python中的內置函數,函數作用是從stdin中讀取數據
喜歡python2的朋友都知道python中有兩個常見的輸入函數:input()函數和raw_input()函數,但是我們在寫腳本使用輸入函數的時候,往往會使用raw_input()函數。這是為什么?因為input()函數在python2中擁有非常大的安全隱患。所以當我們自學python的時候,課本上,老師說的都是推薦raw_input()函數。Input()函數具體存在什么安全隱患?慢慢道來!
二、input()函數與raw_input()函數的區別
1、 input()函數,能夠自動的識別出輸入的類型(str,int,fload);
raw_input()函數,完全默認為str字符串類型
2、 input()函數如果接收的是數學計算式,會自動執行得到結果(漏洞產生的原因)
raw_input()函數則會將輸入的以字符串形式顯示
例:
輸入3+2的字符串,input()函數處理后,得到5;
而raw_input()函數則不會出現這種問題
三、input()函數產生漏洞的原因
此函數會將stdin輸入的內容當做python代碼去執行(就像執行計算式一樣,將其看做python代碼,通過計算返回結果)。如果我們將輸入的結果是需要查看/etc/passwd的文件內容呢?顯然這里的漏洞還是不小的。接下來我們演示一下。
首先我們要清楚,在python中如何去調用系統命令。這個有很多方法,就不在一一解釋,朋友們可以去百度一下。我這里是利用的os模塊的system()方法。
實驗結果:
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*
題目附帶了個腳本:
這個題目就是利用所說的input()函數漏洞。
輸入input(),讓腳本中的input()函數去執行我們輸入的input()函數。這樣我們就可以再次輸入我們構造的查看flag的語句:__import__('os').system('cat /home/small/flag')
五、漏洞修復
在python2中,推薦使用raw_input()函數,盡量不要使用input()函數,在python3中,input()函數被默認改為默認輸入為字符串。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。