记录mysql中的隐患特性
一、背景
? ? ? ?參考鏈接:?http://http://www.360doc.com/content/16/1204/19/27425026_611850045.shtml
? ? ? ?1.1 MYSQL在遇到/*! SQL語句*/這種格式的時(shí)候,里面的SQL語句會當(dāng)正常的語句一樣被解析。
? ? ? ? 如圖:
? ? ? ??
? ? ? ? 以上我們可以看到 where id =1;的部分被mysql解析了。
? ? ? ? 1.2 如果在!之后是一串?dāng)?shù)字(這串?dāng)?shù)字就是mysql數(shù)據(jù)庫的版本號),如果當(dāng)前數(shù)據(jù)庫的版本號大于等于該數(shù)字,SQL語句則執(zhí)行,否則就不執(zhí)行(鏈接中的說法),如圖:
? ? ? ??
? ? ? ? 如上圖所示,在mysql新版本中將這條約束歸到了開始的規(guī)則里面了,因?yàn)樵诟牧?后面的版本號之后,sql語句照樣執(zhí)行
二、示例
? ? ? ? 參考鏈接:http://http://www.freebuf.com/articles/web/22041.html
? ? ? ? 2.1 回到我們的注入點(diǎn)上來看看,我們使用mysql注釋+CRLF來進(jìn)行payload的構(gòu)造(注意URL編碼):
? ? ? ??http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A1%2C2%2Ccurrent_user
? ? ? ? 對其URL轉(zhuǎn)義如下(注意轉(zhuǎn)行符的解析):
0 div 1 union#foo*/*bar select#foo 1,2,current_user? ? ? ? ?這句sql語句到了Mysql的解析引擎后會再次被解析為:? ? ? ? ?0 div 1 union select 1,2,current_user
? ? ? ? ?可以看到,注釋符之間進(jìn)行了就近原則的交錯(cuò)組合,Mysql的Sql Parser則選擇進(jìn)行了忽略。
? ? ? ? 我們知道,ModSecurity使用正則表達(dá)式來對Input Sql進(jìn)行匹配檢測,對Select、Union在敏感位置的出現(xiàn)都進(jìn)行了攔截,但是ModSecurity有一個(gè)特點(diǎn)(或者叫做優(yōu)點(diǎn)),它會對輸入進(jìn)行"規(guī)范化",規(guī)范化的本意本來是防御"基于編碼格式、解析順序"的繞過的。
? ? ? ? ?2.2 注入Payload
? ? ? ? ?
? ? ? ? ? 繞過分析:
? ? ? ? ? ? ? ? ?這里采用了"碎片注入法(分段SQL注入)",或者是我們常說的"Split And Balance原則"。例如:??
對于最簡單的情況,可以使用字符串連接技術(shù)將較小的部分構(gòu)造成一個(gè)字符串。不同的數(shù)據(jù)庫使用不同的語法來構(gòu)造字符串 oracle: 'selec'||'t' sqlserver: 'selec'+''; mysql: 'selec'+'t' (這就是所謂的split and balance思想) 還要注意的是,加號和空格要先進(jìn)行URL編碼后在發(fā)送) ?這種技術(shù)的好處是可以將原本完整的Payload分成幾段,利用ModSecurity對SQL語義的理解不全來進(jìn)行規(guī)則繞過。常常用于進(jìn)行"二值邏輯"的盲注推理。? ? ? ? ? ? ? ? ?回到我們的注入點(diǎn)上來看:
? ? ? ? ? ? ? ? ?對于Mod來說,我們的攻擊Payload為:
hUserId=2276&FromDate=a1%27+or&ToDate=%3C%3Eamount+and%27&sendbutton1=Get+Statement 而對于Mysql的解析引擎來說,它會自動去除、轉(zhuǎn)換這些鏈接控制符,從而變成: hUserId=22768&FromDate=a1%27+or&ToData=<>amount and%27&sendbutton1=GetStatement 2.3 注入PayLoad:? ? ? ? ? ? ??
? ? ? ? ? ? ? ?這里使用了HPP(HTTP Parameter Pollution)注入技術(shù),關(guān)于HPP,有很多資料:
http://www.80sec.com/%E6%B5%85%E8%B0%88%E7%BB%95%E8%BF%87waf%E7%9A%84%E6%95%B0%E7%A7%8D%E6%96%B9%E6%B3%95.html
http://www.freebuf.com/articles/web/5908.html
http://hi.baidu.com/aullik5/item/860da508a90709843c42e2ca
http://hi.baidu.com/4b5f5f4b/item/abc28dda72c100f154347f36
https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf
? ? ? ? ? ? 回到我們的注入PayLoad上來,我們注意到after這個(gè)字段出現(xiàn)了3次,其中后2次的出現(xiàn)其實(shí)是產(chǎn)生了逗號的作用,以此來繞過。
? ? ? ? ?2.4 注入Payload:
? ? ? ? ? ? ?
? ? ? ? ? ? ? 思路分析:
? ? ? ? ? ? ? 這里采用了"半開注釋符(Unterminated Comments)"+"Mysql注釋符代碼執(zhí)行(MySQL Comment Extensions for conditional code execution)"技術(shù)來進(jìn)行繞過。半開注釋符是利用Mod的replaceComments來進(jìn)行敏感關(guān)鍵字的繞過。而"Mysql注釋符代碼執(zhí)行"則是Mysql的一個(gè)運(yùn)行機(jī)制。
? ? ? ? ? ? ? Mysql的Parser引擎會自動解析這種格式中的sql代碼,同時(shí)其他的數(shù)據(jù)庫(例如MSSQL、ORACLE會自動忽略這些注釋),也就是說,這是Mysql特有的特性。
? ? ? ? ? ? ? 防御方法:采用使用多行匹配(MultiMatch Action)+規(guī)范化方法(ReplaceComments)
? ? ? ? ? 2.5 注入Payload:
? ? ? ? ? ? ? ?
? 注入分析:這里采用了COOKIE注入
? ? ? ? ? ? ? ? 防御方法:
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? 關(guān)于這個(gè)COOKIE注入,我想眼神幾點(diǎn)想法:
? ? ? ? ? ? ? ? ? 在注入點(diǎn)的選擇中,HTTP中的任何字段、任何位置都"有可能"產(chǎn)生SQL注入,這里只能說有可能,因?yàn)槭欠衲芊癞a(chǎn)生注入,和具體的應(yīng)用系統(tǒng)的環(huán)境有關(guān),即應(yīng)用系統(tǒng)會使用哪些字段帶入數(shù)據(jù)進(jìn)行執(zhí)行.
? ? ? ? ? ? 2.6 注入Payload:
http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=%40%40new%20union%23sqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapswlmapsqlmap%0Aselect%201,2,database%23sqlmap%0A%28%29 ?payload分析:? ? ? ? ? ? ? ? ? ? ? ?這里采用了"Mysql注釋(MySQL Comment)"+"換行繞過(New Line trick)"的組合方法來進(jìn)行Mod的繞過(本質(zhì)上是對Mod所使用的正則表達(dá)式的繞過)
? ? ? ? ? ? ? ? ? ? ? ?在Mod看來,我們的PayLoad如下:
? ? ? ? ? ? ? ? ? ? ? ?
http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=@@new union#sqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmap select 1,2,database#sqlmap () 然而,當(dāng)這段SQL代碼進(jìn)入Mysql的解析引擎的時(shí)候,Mysql看到的是這樣的形式: artist=@@new union select 1,2,database() 防御方法:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SQL是一種極其靈活的命令式語言,各個(gè)元素之間的組合可以有很多種,采用正則REGEX的方法來進(jìn)行匹配常常無法做到精確指導(dǎo),為了解決這個(gè)問題,我們有兩種思路:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? a) 采用高階的SQL解析方法,例如AST:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??http://www.cnblogs.com/LittleHann/p/3495602.html
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? b) 改進(jìn)正則,采用敏感關(guān)鍵字匹配的方法
SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \ "([\~\!\@\#\$\%\^\&\*\(\)\-\+\=\{\}\[\]\|\:\;\"\'\`\‘\’\<\>].*){4,}" \ "phase:2,t:none,t:urlDecodeUni,block,id:'981173',rev:'2.2.1',msg:'Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded',capture,logdata:'%{tx.1}',setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:tx.sql_injection_score=+1,setvar:'tx.msg=%{rule.msg}',setvar:tx.%{rule.id}-WEB_ATTACK/RESTRICTED_SQLI_CHARS-%{matched_var_name}=%{tx.0}" ? 2.7 注入Payload:? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? HTML URL編碼鏈接:http://http://www.w3school.com.cn/tags/html_ref_urlencode.html
? ? ? ? ? ? ? ? ? Payloag分析:
? ? ? ? ? ? ? ? ? 這里采用了"Mysql錯(cuò)誤回顯"+"Tab鍵分隔繞過"的組合方法來進(jìn)行Mod的繞過,這里的關(guān)鍵點(diǎn)是沒有使用傳統(tǒng)的空格來進(jìn)行"Split And Balance"。
? ? ? ? ? ? ? ? ? 如果一定要采用黑名單,則必須進(jìn)行嚴(yán)格的代碼審計(jì)和測試,保證黑名單的完整性
例如,在Mysql中允許的分隔符為: 09 0A 0B 0C 0D A0 ? 防御方法:? ? ? ? ? ? ? ? ? ? ? ? ?采用完整的"準(zhǔn)空格分隔符"黑名單CRS
SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \ "(?i:(?:,.*[)\da-f(\"|'|`|′|’|‘)](\"|'|`|′|’|‘)(?:(\"|'|`|′|’|‘).*(\"|'|`|′|’|‘)|\Z|[^(\"|'|`|′|’|‘)]+))|(?:\Wselect.+\W*from)|((?:select|create|rename|truncate|load|alter|delete|update|insert|desc)\s*\(\s*space\s*\())" \ "phase:2,capture,multiMatch,t:none,t:urlDecodeUni,t:replaceComments,block,msg:'Detects MySQL comment-/space-obfuscated injections and backtick termination',id:'981257',tag:'WEB_ATTACK/SQLI',tag:'WEB_ATTACK/ID',logdata:'%{TX.0}',severity:'2',setvar:'tx.msg=%{rule.id}-%{rule.msg}',setvar:tx.anomaly_score=+5,setvar:'tx.%{tx.msg}-WEB_ATTACK/SQLI-%{matched_var_name}=%{tx.0}',setvar:'tx.%{tx.msg}-WEB_ATTACK/ID-%{matched_var_name}=%{tx.0}'三、總結(jié)? ? ? Blakclist filtering is not enough? -- 不要依賴黑名單機(jī)制
? ? ? 應(yīng)該使用多種方法進(jìn)行縱深防御? ??
? ? ? 對輸入驗(yàn)證采用安全模型,包括規(guī)范化、數(shù)據(jù)類型、數(shù)據(jù)格式、數(shù)據(jù)長度
? ? ? WAF作為一個(gè)防御手段,從某種程序上來說只是增加了攻擊者的攻擊成本,并不能從根本上解決注入的發(fā)生,要解決注入漏洞的產(chǎn)生,保護(hù)敏感數(shù)據(jù),必須多管齊下,從應(yīng)用系統(tǒng)、waf、數(shù)據(jù)庫防火墻的角度去思考。
四、附錄
? ? ? ? ?4.1 information-schema和mysql數(shù)據(jù)庫結(jié)構(gòu)
? ? ? ? ? ? ? ?
總結(jié)
以上是生活随笔為你收集整理的记录mysql中的隐患特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读WAF与IPS的区别总结之摘抄
- 下一篇: 摘录HTTP头部信息的注释