所謂SQL注入:就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。也就是說用sql代碼登入你想進(jìn)的網(wǎng)站,但是你沒有賬號或密碼或是你有一個賬號,你就可以用sql注入進(jìn)入相關(guān)的網(wǎng)站,提前你想要的信息。
密碼SQL注入:
比如:我的用戶名是:foo? 密碼是:‘or‘1'=’1
sql語句在查詢時就變成了下面一句話:
$sql = “select count(*) as ctr from users where username=’foo’ and password=” or ‘1′=’1′ limit 1″;
很明顯,現(xiàn)在變成又多了一個條件1=1?只要兩個條件有一條符合,就可以返回1,所以foo可以在密碼為空的情況可以登錄網(wǎng)站。
用戶名SQL注入:
比如:填好正確的用戶名(marcofly)和密碼(test)后,點(diǎn)擊提交,將會返回給我們“歡迎管理員”的界面。
sql如下:
$sql=“select * from users where username='marcofly' and password=md5('test')”;
很明顯,如果給出正確的用戶名和密碼就能成功登錄網(wǎng)站;但是,如果我們輸入一個錯誤的用戶名或密碼呢?很明顯,登入不了吧。恩,正常情況下是如此,但是對于有sql注入漏洞的網(wǎng)站來說,只要構(gòu)造特殊的“字符串”,照樣能夠登入成功。
比如:在用戶名輸入框中輸入:’ or 1=1#,密碼隨便輸入,這時候的合成后的SQL查詢語句為:
$sql="select * from users where username='' or 1=1#' and password=md5('')";
語義分析:“#”在mysql中是注釋符,這樣井號后面的內(nèi)容將被mysql視為注釋內(nèi)容,這樣就不會去執(zhí)行了,換句話說,以下的兩句sql語句等價:
$sql="select * from users where username='' or 1=1#' and password=md5('test')";
等價于
$sql="select * from users where username='' or 1=1";
因?yàn)?=1永遠(yuǎn)是都是成立的,即where子句總是為真,將該sql進(jìn)一步簡化之后,等價于如下select語句:
select * from users 沒錯,該sql語句的作用是檢索users表中的所有字段。
有漏洞的腳本才有機(jī)會給你攻擊,比如一個帶參數(shù)的刪除腳本a.asp?action=del&id=2你可以改為a.asp?action=del&id=2 or 1這樣就有可能刪除全部數(shù)據(jù)------sql注入就是通過類似的手段來破壞數(shù)據(jù)。