PHP漏洞全解-SQL注入攻擊 |
發(fā)布時(shí)間: 2012/5/18 18:56:01 |
SQL注入攻擊(SQL Injection),是攻擊者在表單中提交精心構(gòu)造的sql語(yǔ)句,改動(dòng)原來(lái)的sql語(yǔ)句,如果web程序沒(méi)有對(duì)提交的數(shù)據(jù)經(jīng)過(guò)檢查,那么就會(huì)造成sql注入攻擊。 SQL注入攻擊的一般步驟: 1、攻擊者訪問(wèn)有SQL注入漏洞的站點(diǎn),尋找注入點(diǎn) 2、攻擊者構(gòu)造注入語(yǔ)句,注入語(yǔ)句和程序中的SQL語(yǔ)句結(jié)合生成新的sql語(yǔ)句 3、新的sql語(yǔ)句被提交到數(shù)據(jù)庫(kù)中執(zhí)行 處理 4、數(shù)據(jù)庫(kù)執(zhí)行了新的SQL語(yǔ)句,引發(fā)SQL注入攻擊 實(shí)例 數(shù)據(jù)庫(kù)
頁(yè)面 http://www.netsos.com.cn/show.php?id=71 可能存在注入點(diǎn),我們來(lái)測(cè)試 http://www.netsos.com.cn/show.php?id=71 and 1=1 返回頁(yè)面
一次查詢(xún)到記錄,一次沒(méi)有,我們來(lái)看看源碼 //show.php 12-15行 // 執(zhí)行mysql查詢(xún)語(yǔ)句 $query = "select * from postmessage where id = ".$_GET["id"]; $result = mysql_query($query) or die("執(zhí)行ySQL查詢(xún)語(yǔ)句失。" . mysql_error()); 參數(shù)id傳遞進(jìn)來(lái)后,和前面的字符串結(jié)合的sql語(yǔ)句放入數(shù)據(jù)庫(kù)執(zhí)行 查詢(xún) 提交 and 1=1,語(yǔ)句變成select * from postmessage where id = 71 and 1=1 這語(yǔ)句前值后值都為真,and以后也為真,返回查詢(xún)到的數(shù)據(jù) 提交 and 1=2,語(yǔ)句變成select * from postmessage where id = 71 and 1=2 這語(yǔ)句前值為真,后值為假,and以后為假,查詢(xún)不到任何數(shù)據(jù) 正常的SQL查詢(xún),經(jīng)過(guò)我們構(gòu)造的語(yǔ)句之后,形成了SQL注入攻擊。通過(guò)這個(gè)注入點(diǎn),我們還可以進(jìn)一步拿到權(quán)限,比如說(shuō)運(yùn)用 union讀取管理密碼,讀取數(shù)據(jù)庫(kù)信息,或者用mysql的load_file,into outfile等函數(shù)進(jìn)一步滲透。 防范方法 整型參數(shù): 運(yùn)用 intval函數(shù)將數(shù)據(jù)轉(zhuǎn)換成整數(shù) 函數(shù)原型 int intval(mixed var, int base) var是要轉(zhuǎn)換成整形的變量 base,可選,是基礎(chǔ)數(shù),默認(rèn)是10 浮點(diǎn)型參數(shù): 運(yùn)用 floatval或doubleval函數(shù)分別轉(zhuǎn)換單精度和雙精度浮點(diǎn)型參數(shù) 函數(shù)原型 int floatval(mixed var) var是要轉(zhuǎn)換的變量 int doubleval(mixed var) var是要轉(zhuǎn)換的變量 字符型參數(shù): 運(yùn)用 addslashes函數(shù)來(lái)將單引號(hào)“’”轉(zhuǎn)換成“\’”,雙引號(hào)“"”轉(zhuǎn)換成“\"”,反斜杠“\”轉(zhuǎn)換成“\\”,NULL字符加上反斜杠“\” 函數(shù)原型 string addslashes (string str) str是要檢查的字符串 那么剛才出現(xiàn)的代碼漏洞,我們可以這樣修補(bǔ) // 執(zhí)行mysql查詢(xún)語(yǔ)句 $query = "select * from postmessage where id = ".intval($_GET["id"]); $result = mysql_query($query) or die("執(zhí)行ySQL查詢(xún)語(yǔ)句失敗:" . mysql_error());
如果是字符型,先判斷magic_quotes_gpc能無(wú)法 為On,當(dāng)不為On的時(shí)候運(yùn)用 addslashes轉(zhuǎn)義特殊字符
再次測(cè)試,漏洞已經(jīng)修補(bǔ) 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |