php代碼審計學習之dvwa_sql

來源:互聯網
上載者:User

標籤:

0x00

  由於轉了onenote行列,所以已經好久沒有發表新的隨筆了,但是想想還是非常有必要的,這幾天開始學習php代碼審計,所以先開始發這一些的隨筆吧!

  首先就先通過十大測試平台dvwa開始學習吧,先在這裡帶上參考的大牛連結,感謝分享

  1.http://drops.wooyun.org/papers/483

  2.http://www.lxway.com/86980986.htm   is_numeric 函數繞過

  3.http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html  字元編碼繞過  寬位元組注入

0x01

  這裡先帶入最簡單low層級的php代碼

  

  $id = $_GET[‘id‘];//未作任何過濾,防注入處理    $getid = "SELECT first_name, last_name FROM users WHERE user_id = ‘$id‘";    $result = mysql_query($getid) or die(‘<pre>‘ . mysql_error() . ‘</pre>‘ );

  看到這裡我們可以知道這段代碼其實對id沒有進行處理,導致sql注入漏洞,ok,各種注入都可以,在這裡就不再詳敘了!

0x02

  medium層級,代碼:

  $id=$_GET[‘id‘];  $id=mysql_real_escape_string($id);//這裡對id進行了轉義的操作  $getid="SELECTfirst_name,last_nameFROMusersWHEREuser_id=$id";

  mysql_real_escape_string 函數對id參數進行了轉義操作,具體常見的轉義包括

  • ‘ => \‘
  • " => \"
  • \ => \\
  • \n => \\n

  這裡我想應該有2張方法來繞過這個處理:

  1. 數值型注入
  2. 寬位元組注入

  1.數值型注入

    由於這個函數主要針對的是字元型特殊字元的處理,這樣我們可以不使用特殊字元來進行注入,即數值注入

  

  構造:1 untion select user,password from users

    由此可以獲得users表中的帳號密碼,當然你會說要是是不知道具體表名列名改怎麼辦?ok,我們可以嘗試使用union bool注入

  構造:1+union+select+1,(select+case+when+char(72)=(select mid(table_name,0,1) from information_schema.tables limit 0,1)+then+2+end) 

    其中char()中的數值需要變換以及limit,這樣子可能會比較花時間,我們可以寫個python指令碼(ps:先佔個坑),其實用延時注入也同樣可以實現這樣的效果

  2.寬位元組注入

  mysql_real_escape_string  對參數進行轉義的方法就是添加一個‘\’,它的url編碼就是%5c ,這樣我們在參數中添加%df%5c%27 ,其中%df%5c為合法的gbk字元

  那麼經過該函數一處理,可以發現會變成%df%5c%5c%27 ,這樣子%df%5c會吞掉一個%5c  變成 一個gbk字元+ \\\‘ 

  而mysql的轉義符也是‘\‘ 相當於注入了一個單引號

  構造:1%df%5c%27%20||1+--+ 

  同樣的addslashes函數也存在同樣的問題,具體參考文章開始的連結

0x02

  high層級的php代碼

$id=$_GET[‘id‘];$id=stripslashes($id);//剔除參數中的斜杠$id=mysql_real_escape_string($id);//對id中的特殊字元進行轉義if(is_numeric($id)){//判斷是否是數值或數值字串    ...

  好吧,這樣一來,我覺得還是變得很安全了,前面2個函數對字元型的注入進行了處理,緊接著is_numeric函數則對數值型注入進行了處理。

  然而這樣子仍然可以造成sql注入,不過是二次注入,且限制的條件也比較苛刻但是仍有機會造成注入

  比如執行sql語句

  

  insert into test(type) values($s);   

 

  此時傳入的字串$s=0x31206f722031  

  這樣看可以知道這是一個16進位數,可以通過該函數的檢測,然後對16進位解碼我們可以發現$s其實實際的值為 ‘1 or 1’ 

  那麼這樣操作資料庫裡會變成什麼樣子

  

  可以看到資料庫將這串16進位數進行了轉碼變成了1 or 1  那麼到時候進行資料庫取值然後不經處理帶入到另一個sql語句中就會造成二次注入.所以我們在寫代碼的時候不能盲目的信任資料庫裡的資料,在取出資料時仍需要進行檢測。

0x03

  sql部分的代碼就分析到這裡,如有不正確的地方,歡迎拍磚!

  下篇準備sql blind :)

 

php代碼審計學習之dvwa_sql

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.