记录mysql中的隐患特性
一、背景
? ? ? ?參考鏈接:?http://http://www.360doc.com/content/16/1204/19/27425026_611850045.shtml
? ? ? ?1.1 MYSQL在遇到/*! SQL語句*/這種格式的時候,里面的SQL語句會當正常的語句一樣被解析。
? ? ? ? 如圖:
? ? ? ??
? ? ? ? 以上我們可以看到 where id =1;的部分被mysql解析了。
? ? ? ? 1.2 如果在!之后是一串數字(這串數字就是mysql數據庫的版本號),如果當前數據庫的版本號大于等于該數字,SQL語句則執行,否則就不執行(鏈接中的說法),如圖:
? ? ? ??
? ? ? ? 如上圖所示,在mysql新版本中將這條約束歸到了開始的規則里面了,因為在更改了!后面的版本號之后,sql語句照樣執行
二、示例
? ? ? ? 參考鏈接:http://http://www.freebuf.com/articles/web/22041.html
? ? ? ? 2.1 回到我們的注入點上來看看,我們使用mysql注釋+CRLF來進行payload的構造(注意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轉義如下(注意轉行符的解析):
0 div 1 union#foo*/*bar select#foo 1,2,current_user? ? ? ? ?這句sql語句到了Mysql的解析引擎后會再次被解析為:? ? ? ? ?0 div 1 union select 1,2,current_user
? ? ? ? ?可以看到,注釋符之間進行了就近原則的交錯組合,Mysql的Sql Parser則選擇進行了忽略。
? ? ? ? 我們知道,ModSecurity使用正則表達式來對Input Sql進行匹配檢測,對Select、Union在敏感位置的出現都進行了攔截,但是ModSecurity有一個特點(或者叫做優點),它會對輸入進行"規范化",規范化的本意本來是防御"基于編碼格式、解析順序"的繞過的。
? ? ? ? ?2.2 注入Payload
? ? ? ? ?
? ? ? ? ? 繞過分析:
? ? ? ? ? ? ? ? ?這里采用了"碎片注入法(分段SQL注入)",或者是我們常說的"Split And Balance原則"。例如:??
對于最簡單的情況,可以使用字符串連接技術將較小的部分構造成一個字符串。不同的數據庫使用不同的語法來構造字符串 oracle: 'selec'||'t' sqlserver: 'selec'+''; mysql: 'selec'+'t' (這就是所謂的split and balance思想) 還要注意的是,加號和空格要先進行URL編碼后在發送) ?這種技術的好處是可以將原本完整的Payload分成幾段,利用ModSecurity對SQL語義的理解不全來進行規則繞過。常常用于進行"二值邏輯"的盲注推理。? ? ? ? ? ? ? ? ?回到我們的注入點上來看:
? ? ? ? ? ? ? ? ?對于Mod來說,我們的攻擊Payload為:
hUserId=2276&FromDate=a1%27+or&ToDate=%3C%3Eamount+and%27&sendbutton1=Get+Statement 而對于Mysql的解析引擎來說,它會自動去除、轉換這些鏈接控制符,從而變成: hUserId=22768&FromDate=a1%27+or&ToData=<>amount and%27&sendbutton1=GetStatement 2.3 注入PayLoad:? ? ? ? ? ? ??
? ? ? ? ? ? ? ?這里使用了HPP(HTTP Parameter Pollution)注入技術,關于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這個字段出現了3次,其中后2次的出現其實是產生了逗號的作用,以此來繞過。
? ? ? ? ?2.4 注入Payload:
? ? ? ? ? ? ?
? ? ? ? ? ? ? 思路分析:
? ? ? ? ? ? ? 這里采用了"半開注釋符(Unterminated Comments)"+"Mysql注釋符代碼執行(MySQL Comment Extensions for conditional code execution)"技術來進行繞過。半開注釋符是利用Mod的replaceComments來進行敏感關鍵字的繞過。而"Mysql注釋符代碼執行"則是Mysql的一個運行機制。
? ? ? ? ? ? ? Mysql的Parser引擎會自動解析這種格式中的sql代碼,同時其他的數據庫(例如MSSQL、ORACLE會自動忽略這些注釋),也就是說,這是Mysql特有的特性。
? ? ? ? ? ? ? 防御方法:采用使用多行匹配(MultiMatch Action)+規范化方法(ReplaceComments)
? ? ? ? ? 2.5 注入Payload:
? ? ? ? ? ? ? ?
? 注入分析:這里采用了COOKIE注入
? ? ? ? ? ? ? ? 防御方法:
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? 關于這個COOKIE注入,我想眼神幾點想法:
? ? ? ? ? ? ? ? ? 在注入點的選擇中,HTTP中的任何字段、任何位置都"有可能"產生SQL注入,這里只能說有可能,因為是否能否產生注入,和具體的應用系統的環境有關,即應用系統會使用哪些字段帶入數據進行執行.
? ? ? ? ? ? 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)"的組合方法來進行Mod的繞過(本質上是對Mod所使用的正則表達式的繞過)
? ? ? ? ? ? ? ? ? ? ? ?在Mod看來,我們的PayLoad如下:
? ? ? ? ? ? ? ? ? ? ? ?
http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=@@new union#sqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmap select 1,2,database#sqlmap () 然而,當這段SQL代碼進入Mysql的解析引擎的時候,Mysql看到的是這樣的形式: artist=@@new union select 1,2,database() 防御方法:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SQL是一種極其靈活的命令式語言,各個元素之間的組合可以有很多種,采用正則REGEX的方法來進行匹配常常無法做到精確指導,為了解決這個問題,我們有兩種思路:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? a) 采用高階的SQL解析方法,例如AST:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??http://www.cnblogs.com/LittleHann/p/3495602.html
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? b) 改進正則,采用敏感關鍵字匹配的方法
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錯誤回顯"+"Tab鍵分隔繞過"的組合方法來進行Mod的繞過,這里的關鍵點是沒有使用傳統的空格來進行"Split And Balance"。
? ? ? ? ? ? ? ? ? 如果一定要采用黑名單,則必須進行嚴格的代碼審計和測試,保證黑名單的完整性
例如,在Mysql中允許的分隔符為: 09 0A 0B 0C 0D A0 ? 防御方法:? ? ? ? ? ? ? ? ? ? ? ? ?采用完整的"準空格分隔符"黑名單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}'三、總結? ? ? Blakclist filtering is not enough? -- 不要依賴黑名單機制
? ? ? 應該使用多種方法進行縱深防御? ??
? ? ? 對輸入驗證采用安全模型,包括規范化、數據類型、數據格式、數據長度
? ? ? WAF作為一個防御手段,從某種程序上來說只是增加了攻擊者的攻擊成本,并不能從根本上解決注入的發生,要解決注入漏洞的產生,保護敏感數據,必須多管齊下,從應用系統、waf、數據庫防火墻的角度去思考。
四、附錄
? ? ? ? ?4.1 information-schema和mysql數據庫結構
? ? ? ? ? ? ? ?
總結
以上是生活随笔為你收集整理的记录mysql中的隐患特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读WAF与IPS的区别总结之摘抄
- 下一篇: 读”SQL Injection Pock