mysql寬位元組數 sql寬位元組簡介

2021-10-19 19:25:33 字數 2380 閱讀 2231

寬位元組注入其實在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...