1、函數簡介:python
input()函數是python中的內置函數,函數做用是從stdin中讀取數據
喜歡python2的朋友都知道python中有兩個常見的輸入函數:input()函數和raw_input()函數,可是咱們在寫腳本使用輸入函數的時候,每每會使用raw_input()函數。這是爲何?由於input()函數在python2中擁有很是大的安全隱患。因此當咱們自學python的時候,課本上,老師說的都是推薦raw_input()函數。Input()函數具體存在什麼安全隱患?慢慢道來!
2、input()函數與raw_input()函數的區別安全
一、 input()函數,可以自動的識別出輸入的類型(str,int,fload);
raw_input()函數,徹底默認爲str字符串類型
二、 input()函數若是接收的是數學計算式,會自動執行獲得結果(漏洞產生的緣由)
raw_input()函數則會將輸入的以字符串形式顯示
例:
輸入3+2的字符串,input()函數處理後,獲得5;
而raw_input()函數則不會出現這種問題
3、input()函數產生漏洞的緣由
此函數會將stdin輸入的內容當作python代碼去執行(就像執行計算式同樣,將其看作python代碼,經過計算返回結果)。若是咱們將輸入的結果是須要查看/etc/passwd的文件內容呢?顯然這裏的漏洞仍是不小的。接下來咱們演示一下。
首先咱們要清楚,在python中如何去調用系統命令。這個有不少方法,就不在一一解釋,朋友們能夠去百度一下。我這裏是利用的os模塊的system()方法。
實驗結果:
import():是python中的內置函數,同語法import 相同,都是調用模塊
system()就是os模塊中的方法,此方法用來調用系統命令
cat /etc/passwd 系統命令,用來查看文件/etc/passwd的內容
4、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*
題目附帶了個腳本:ide
這個題目就是利用所說的input()函數漏洞。
輸入input(),讓腳本中的input()函數去執行咱們輸入的input()函數。這樣咱們就能夠再次輸入咱們構造的查看flag的語句:__import__('os').system('cat /home/small/flag')
5、漏洞修復
在python2中,推薦使用raw_input()函數,儘可能不要使用input()函數,在python3中,input()函數被默認改成默認輸入爲字符串。函數