寬位元組注入漏洞

2021-08-15 15:59:53 字數 4112 閱讀 9329

1 經典sql注入漏洞

例子1是沒有任何sql注入防護措施的php程式,它存在sql注入漏洞。

[html]view plain

copy

<?

php$name

=$_get['name'];  

$conn

=mysql_connect

('localhost','root','root');  

if($conn

==null)  

mysql_select_db("aaa",$conn);  

$sql

="select * from a1 where name='"

.$name."'";  

$result

=mysql_query

($sql,$conn);  

while($val

=mysql_fetch_row

($result))  

?>

例子1:無sql注入防護的php程式

對該php程式的sql注入poc包括:

(1)          'or 'a'='a

(2)          'or 1=1 -- %20

(3)          'or 1=1 -- %23

其中,%20對應空格,%23對應#的url編碼,該poc在php5.4.45+apache測試成功。

2 安全過濾

如果對例子1中的php程式中的$name變數進行安全過濾,如使用轉義函式addslashes,mysql_real_escape_string,mysql_escape_string,則對應的poc全部失效了。

轉義函式影響的字元包括:

(1)          ascii(null)字元\x00,

(2)          換行字元\n,addslashes不轉義

(3)          回車字元\r,addslashes不轉義

(4)          反斜槓字元\,

(5)          單引號字元『,

(6)          雙引號字元「,

(7)          \x1a,addslashes不轉義

對於例子1進行安全增強後,得到例子2,如下所示。

注意:三個轉義函式的功能稍有區別,同時,轉義只對字元型sql注入防範有效,對於數值型sql注入無效。

[html]view plain

copy

<?

php$name

=$_get['name'];  

//$name

=addslashes

($name);  

//$name

=mysql_escape_string

($name);  

$conn

=mysql_connect

('localhost','root','root');  

$name

=mysql_real_escape_string

($name);  

if($conn

==null)  

mysql_select_db("aaa",$conn);  

$sql

="select * from a1 where name='"

.$name."'";  

$result

=mysql_query

($sql,$conn);  

while($val

=mysql_fetch_row

($result))  

?>

例子2:轉義增強後的php程式

3 寬位元組注入漏洞原理

寬字元是指兩個位元組寬度的編碼技術,如unicode、gbk、big5等。當mysql資料庫資料在處理和儲存過程中,涉及到的字符集相關資訊包括:

(1)          character_set_client:客戶端傳送過來的sql語句編碼,也就是php傳送的sql查詢語句編碼字符集。

(2)          character_set_connection:mysql伺服器接收客戶端sql查詢語句後,在實施真正查詢之前sql查詢語句編碼字符集。

(3)          character_set_database:資料庫預設編碼字符集。

(4)          character_set_filesystem:檔案系統編碼字符集。

(5)          character_set_results:sql語句執行結果編碼字符集。

(6)          character_set_server:伺服器預設編碼字符集。

(7)          character_set_system:系統預設編碼字符集。

(8)       character_sets_dir:字符集存放目錄,一般不要修改。

寬位元組對轉義字元的影響發生在character_set_client=gbk的情況,也就是說,如果客戶端傳送的資料字符集是gbk,則可能會吃掉轉義字元\,從而導致轉義消毒失敗。

例子3就是乙個存在寬字元注入漏洞的php程式。

[html]view plain

copy

<?

php$name

=$_get['name'];  

$name

=addslashes

($name);  

$conn

=mysql_connect

('localhost','root','root');  

if($conn

==null)  

mysql_query("set names 'gbk'",$conn);  

mysql_select_db("aaa",$conn);  

$sql

="select * from a1 where name='"

.$name."'";  

$result

=mysql_query

($sql,$conn);  

while($val

=mysql_fetch_row

($result))  

?>

這個php程式的sql注入poc為:

' or 1=1; %20%23

其原理是mysql_query("setnames 'gbk'",$conn)語句將編碼字符集修改為gbk,此時,%df\'對應的編碼就是%df%5c』,即漢字「運』」,這樣單引號之前的轉義符號「\」就被吃調了,從而轉義消毒失敗。

4 寬位元組注入漏洞再深入

從寬位元組注入漏洞原理可以看出,寬位元組注入的關鍵點有兩個:

(1)          設定寬位元組字符集;

(2)          設定的寬字符集可能吃掉轉義符號「\」(對應的編碼為0x5c,即低位中包含正常的0x5c就行了)。

理論上,符合第二條的字符集都可能導致寬位元組注入漏洞,這裡以gbk字符集為典型,介紹寬字元注入漏洞典型案例。

寬位元組注入漏洞的另乙個關鍵是設定了character_set_client為寬位元組字符集,這裡有很多中設定的方式,主要包括隱式設定和顯式設定。

隱含方式設定是指charcter_set_client預設字符集就是寬位元組字符集。

顯式設定是指在php程式中呼叫相應的設定函式來實現字符集的設定或直接對字串進行編碼轉換,設定的函式包括:

(1) mysql_query,如mysql_query("set names 'gbk'", $conn)、mysql_query("setcharacter_set_client = gbk", $conn)。

(2) mysql_set_charset,如mysql_set_charset("gbk",$conn)。

(3) mb_convert_encoding,如mb_convert_encoding($sql,"utf8","gbk"),將sql語句從gbk格式轉換為utf8格式時,0x5c被吃掉了。

(4) iconv,如iconv('gbk', 'utf-8',$sql),原理同上。

寬位元組注入

大家都知道 df 被php轉義 開啟gpc 用addslashes函式,或者icov等 單引號被加上反斜槓 變成了 df 其中 的十六進製制是 5c 那麼現在 df df 5c 27,如果程式的預設字符集是gbk等寬位元組字符集,則mysql用gbk的編碼時,會認為 df 5c 是乙個寬字元,也就是...

寬位元組注入

在使用php連線mysql的時候,當設定 set character set client gbk 時會導致乙個編碼轉換的問題,也就是我們熟悉的寬位元組注入,當存在寬位元組注入的時候,注入引數裡帶入 df 27,即可把 5c 吃掉,舉個例子。當提交 1 1 23 時,mysql的執行的sql語句為 ...

寬位元組注入

這個md的 是我之前做南郵的一道sql注入題目,我實在是調動目前所學的sql注入知識沒做出來,一直搞不懂將 轉義為 因此去網上看了一下wp,是考寬位元組注入,於是在網上找了教程學習一下,這個文章只是為了記錄一下自己的學習過程,不喜勿噴,有錯希望指正 寬位元組注入指的是mysql資料庫在使用寬位元組 ...