寬位元組注入其實在sql注入是乙個比較常見的注入,但是有時候很長時間沒有遇到寬位元組注入,突然出現了乙個寬位元組注入,就是返回去翻資料,還不如自己寫篇文章記錄一下。寬位元組的注入,sqlmap也是無法識別出來的。
需要說明的是,本文的資料主要是來自於p神的**白盒審計中的字元編碼及sql注入,只是對其中內容稍有修改。
簡介本質上sql的寬位元組注入就是使用mysql進行sql查詢時,用錯了gbk和utf-8的編碼而導致出現的問題。通常來說,乙個gbk編碼的漢字占用2個位元組,乙個utf8的漢字占用3個位元組。這樣也可以換個說法,當使用gbk編碼時,是將2個位元組解釋為乙個漢字,當使用的是utf8的編碼時,是將3個位元組解釋為乙個漢字。
以上這就是寬位元組注入的背景知識了。
例項**1
24<?php
//連線資料庫部分,注意使用了gbk編碼
$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');
mysql_query("set names 'gbk'");
mysql_select_db('test', $conn) or emmsg("連線資料庫失敗,未找到您填寫的資料庫");
//執行sql語句
$id = isset($_get['id']) ? addslashes($_get['id']) : 1;
$sql = "select * from news where tid=''";
$result = mysql_query($sql, $conn) or die(mysql_error());
新聞 $row = mysql_fetch_array($result, mysql_assoc);
echo "
\n";
mysql_free_result($result);
sql 語句是 select * from news where tid='',就是根據文章的 id 把文章從
news 表中取出來。其中,表示會解析$id的內容,同時還在外外面加上'',因為這是乙個字串的查詢。
在查詢之前存在addslashes()函式,此函式主要使用對單引號(』)、雙引號(」)、反斜線(\)與 nul(null 字元)進行轉義,這樣使用者輸入的單引號就無用了。如下所示:
可以看出,在加了'之後,對最後的結果沒有影響。
為什麼會這樣呢?在兩種情況下的,sql注入語句分別為:
2select * from news where tid='1'
select * from news where tid='1\''
通過轉義符\將'進行轉義,所以對結果沒有影響。
逃逸addslashes
那麼怎麼逃過 addslashes 的限制?眾所周知 addslashes 函式產生的效果就是,讓』變成』\』,
讓引號變得不再是「單引號」,只是一撇而已。一般繞過方式就是,想辦法處理\』前面的\:
想辦法給\前面再加乙個』\』(或單數個即可),變成\\' ,這樣\被轉義了,'逃出了限制
想辦法把\弄沒有。
而寬位元組注入的方式就是消除掉\。上面的**中使用的是gbk編碼,意味著是將2個位元組看成乙個漢字。如果我們傳入的id為%df',結果為:
分析出現這個錯誤的原因。
輸入了%df'會被addslashes轉義為%df\'。\的hex編碼為5c,最後就會變為%df%5c'。因為gbk編碼認為2個位元組是乙個漢字,所以%df%5c就被解釋為運,'就逃逸出來了。最後sql語句就變為:
1select * from news where tid='運''
這樣就會報錯了,這就是乙個簡單的sql注入的原理。
注入拿資料
在消滅了\之後,就可以通過進行sql注入拿到資料了。
以上面的**為例來進行說明,最終的payload為
1-1%df' union select 1,2,flag from flag%23
這樣最終執行的sql注入語句為:
1select * from news where id='-1運' union select 1,2,flag from flag#'
但是出現了如下的問題:
這樣應該是編碼的問題,將flag使用hex編碼一下。
最終使用-1%df' union select 1,2,hex(flag) from flag%23
參考
mysql 寬位元組注入 SQL注入之寬位元組注入
簡介 寬位元組注入是相對於單位元組注入而言的。單位元組注入就是大家平時的直接在帶有引數id的url後面 追回sql語句進行注入。比如 1 1 1 2 這個經典的判斷目標是否存在注入的例子就是單位元組注入。理論上說,只要資料庫連線 設定了gbk編碼,或者是預設編碼就 是gbk,那現在的程式裡到處都是注...
SQL寬位元組注入
什麼是寬位元組注入?寬位元組注入就是因為gbk編碼方式需要兩個ascii碼組合來解碼,所以形象的叫做寬位元組,這個作為了解即可 寬位元組注入的條件 1 資料庫查詢設定為gbk編碼 2 使用了addslashes mysql real escape string mysql escape string...
SQL寬位元組注入01
1 and 1 1 23 不報錯 and 1 2 23 報錯 2 id 1 bf order by 5 23 檢視字段數,即列數 3 id 1 bf and 1 2 union select 1,2,3,4,5 23 查詢回顯點 查詢有哪些資料庫,該語句查出了全部的資料庫 5 id 1 bf and...