寬字節注入解析

在一個CTF練習的網站,看到了一個寬字節注入的題目,我是一個web萌新,沒什麼經驗,一開始也沒有想到是寬字節,仍是一位朋友給我提到的,讓我猛然大悟,咳咳。。。作一些總結。

練習題目網站地址:http://ctf.bugku.com
1、瞭解一下寬字節注入原理
前提
一、咱們都知道,在防護SQL注入的時候,大多說都是使用的過濾特殊字符,或者使用函數將特殊字符轉化爲實體,就是說在字符轉義,添加‘\’。這裏第一條就是有這個機制。
二、設置寬字節字符集,這裏爲GBK字符集,GBK字符集佔用兩個字節。關鍵就在於這個設置字符集。一般有不少方法能夠設置,例如:
(1) mysql_query,如mysql_query("SET NAMES 'gbk'", $conn)、mysql_query("setcharacter_set_client = gbk", $conn)。php

(2) mysql_set_charset,如mysql_set_charset("gbk",$conn)。
實現過程:當咱們測試的時候,輸入「%df‘」,這個時候若是php函數是使用的addslashes()的時候,會在冒號的前面加上’\’。也就變成了%df\’ 。對應的編碼是%df%5c’.這時候網站字符集是GBK,MYSQL使用的編碼也是GBK的話,就會認爲%df\是一個漢「運’」,這樣的話,單引號前面的\就不起做用了,從而轉義失敗,題目就會出現報錯信息。
咱們就以網站的題目測試一下:mysql

一、查看網頁源碼
寬字節注入解析
出現字符集gb2312,這時候就應該想到寬字節注入
二、報錯測試可注入
寬字節注入解析web

出現了報錯信息,由於構成的語句中會多出一個單引號。例如查詢語句爲:sql

$name=addslashes($_POST[‘name’])
Select * from user  where name=’$name’

將咱們的%df’傳遞進去就變成了:數據庫

Select * from user where name=’%df\’’

這樣咱們的單引號和前面的閉合,多出一個原來的單引號,報錯。
三、查詢字段數:ide

%df’ order by 2 %23

這裏%23表示註釋,意指去將後面的語句註釋掉包括什麼多出的單引號和limit限制只能查詢一行的語句。
寬字節注入解析
通過幾回測試,肯定字段數爲2.
四、判斷數據庫:函數

%df’ union select 1,database() %23

寬字節注入解析
獲得數據庫的 名字。測試

五、接着根據題目提示,給出了表名和字段名,能夠直接查詢字段內容網站

%df’ union select 1,string from sql5.key where id=1 %23

寬字節注入解析

我的看法編碼

相關文章
相關標籤/搜索