假設(shè)老板今天給bai了我們一個(gè)任務(wù),讓我們判斷一個(gè)IP是否在du線。我們可以zhi用Python編寫ping IP代碼importost=input('請輸dao入要檢測的IP:')result=os.popen('ping-C 1-t1%s'%(主機(jī)))。Read()如果'ttl'inresult:Print('Ip online')否則:Print('Ip offline')。
現(xiàn)在,作為一個(gè)代碼審閱者,您不會考慮代碼的總體結(jié)構(gòu),也不會考慮編寫此代碼的程序員為什么使用Ping或Popen。你覺得有什么問題嗎?如果沒有,請考慮兩個(gè)問題:波本的本質(zhì)是什么?如果您不知道或沒有使用過Popen,請不要查找它并猜測此函數(shù)的用。在這個(gè)程序中源碼,Popen要執(zhí)行的命令是什么?既然 popen 后面執(zhí)行的語句中的 host 變量是由用戶輸入的,那惡意用戶是不是可以輸入一個(gè)localhost whoami 呢?這樣 popen 執(zhí)行的代碼就變成了 ping -c 1 -t 1 localhost whoami。注意,就算上述例子中沒有將運(yùn)行結(jié)果直接打印出來,但沒打印出來并不代表代碼沒有運(yùn)行。例如如果我直接輸入 host 為 localhost whoami的話,輸出結(jié)果還是 IP 存在, 但這并不代表 whoami 命令沒有運(yùn)行,我們依舊可以建立一個(gè) Reverse Shell。為了驗(yàn)證結(jié)果,我們在代碼里面讓 result 被打印出來。
這種技術(shù)稱為命令注入。如果普通程序員沒有遇到這種問題,他們就不會碰這種技術(shù)。當(dāng)他們看到上面的漏洞代碼時(shí),他們會覺得沒有問題。他們至多認(rèn)為這有點(diǎn)不愉快,但能反映出第一時(shí)間安全漏洞的少數(shù)人是少數(shù)。這聽起來像是一種簡單的技術(shù),比反向和動(dòng)力提升簡單得多。但這項(xiàng)技術(shù)很有創(chuàng)意,有低下限和高上限。例如,我們現(xiàn)在知道上面的問題存在,所以在輸入階段中過濾一些關(guān)鍵字是可以的。在這個(gè)問題中,我們希望用戶輸入一個(gè)IP地址,所以我們需要直接過濾掉空間。普通IP地址中沒有空格。
我認(rèn)為它在脆弱性敏感度和創(chuàng)造力方面都很強(qiáng)。在CVE、黑客論壇等場所提高脆弱性敏感度需要花費(fèi)大量時(shí)間,而創(chuàng)造力只有靠天賦和運(yùn)氣才能提高。你可能認(rèn)為有很多方法可以避免這個(gè)例子。首先,我承認(rèn)這個(gè)例子是一個(gè)暫時(shí)的例子,這是不好的,但請注意,我的例子是非常簡單和不成熟的。在現(xiàn)實(shí)的紅藍(lán)戰(zhàn)場上,以SQL注入為例,經(jīng)過這么多年,我們能完全避免它嗎?我記得今年年初黑網(wǎng)曝光的收藏?cái)?shù)據(jù)庫,1000克各種注入數(shù)據(jù)庫,涉及世界各地的各種論壇源碼,甚至包括一些銀行、一些人口辦公室和一些政府機(jī)構(gòu)。代碼思想是有限的,創(chuàng)造力是無限的。