歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

PHPCMS v9.6.0 wap模塊SQL注入

來源:本站整理 作者:佚名 時間:2019-05-09 TAG: 我要投稿

一、漏洞詳情
phpcms v9.6.0 sys_auth 在解密參數后未進行適當校驗造成 sql injection。
看下漏洞的關鍵點,漏洞最終觸發 SQL 注入的點是位于 phpcms/modules/content/down.php 的 init 函數中:

在這個函數中,我們可以看到通過 GET 傳參 a_k 參數的值,然后調用 sys_auth 方法并傳參 DECODE 進行了和 auth_key 字段進行解密,其中 auth_key 是通過 load_config 讀取 system 配置,對應的是位于 caches\configs\system.php 文件中。接著進一步在 17 行調用了 parse_str 對$a_k 變量進行處理,這里的處理也是一個關鍵的處理,這里的操作目的是將把查詢字符串解析到變量中并同時解碼。我們可以通過以下演示可以看到:

可以看到執行完 parse_str 后,新增了兩個變量 name 和 age,然后%27 和%20 被進行了解碼操作。
然后我們繼續回到上面的代碼,可以繼續看到 26 行的$rs =$this->db->get_one(array(‘id’=>$id));操作,這里的 get_one 操作就是做的 SQL 查詢操作,而這里直接把$id 的值帶入查詢,并且在 17 行到 26 行之間并沒有看到任何對$id 參數的過濾處理。
那么結合$a_k 變量和 parse_str 操作,假如我們這里的$a_k 變量的值在解密后是類似以下的代碼,就可以實現 SQL 注入:
id=SQL 注入語句&其他參數=其他值
$a_k 變量是通過 GET 傳參的,但剛才我們講到中間是存在一個解密操作,所以要求傳入的$a_k 變量的值是加密后的結果,也就是我們的 payload 必須先做加密操作;這里大家可能會有個疑問,既然這樣那么就直接看下代碼是怎么加密的,直接本地加密個 payload 提交不就能觸發 SQL 注入了嗎?這里大家需要注意一個問題就是,解密的時候是有個 auth_key 的,對應加密也需要,而每個站點這個 auth_key 可能都是不一樣的,所以本地加密生成 payload 就不現實了,那么我們就需要找到一個可以傳參加密并且我們可以看到加密后的值的點。可以通過全局搜索 sys_auth 方法,看哪里是傳參 ENCODE,那么就是做加密處理。
正好在 phpcms\libs\classes\param.class.php 文件的 86 行 set_cookie 方法,可以看到 93 行和 96 行在調用 setcookie 的時候均調用了 sys_auth 做 ENCODE 操作,這個沒有傳參 auth_key,不過默認情況下就是系統配置里的 auth_key,所以對應上了上面的解密操作,而且值是放到 cookie 里,所以也是可以直接獲取到的。

接下來就要找哪里調用了 set_cookie 方法并且能夠傳入 payload 而不被過濾,正好在 phpcms/modules/attachment/attachments.php 239 行的 swfupload_json 方法就符合我們的要求:

在這個函數里,通過 GET 傳參 src 的參數,首先會經過 safe_replace 方法的過濾處理,然后寫入到數組 arr 中,進而做 json_encode 的操作,最終再調用 set_cookie 方法。 那么如果要保證傳入的 payload 不被處理,這里關鍵的點就要看下 safe_replace 方法,對應函數在 phpcms/libs/functions/global.func.php 文件中的 63 行:

這里可以看到函數里對%27、%2527 等情況進行了替換刪除操作,但是可以看到 67 行同時對*也進行替換刪除,而且是位于%27 等之后的,并且只進行一次替換處理,那么假如我們傳參%*27,就可以繞過前面%27 的替換刪除,然后后面*的替換刪除后,%*27 就會恢復為%27,就可以完成 payload 的傳入而不被過濾。
這里還有個點需要解決的,就是執行我們剛才說的觸發 set_cookie 的 swfupload_json 函數的有一定的條件,在該函數所在的類中的開頭,我們可以看到以下代碼:

這個函數會在 attachements 這個 swfupload_json 所在的類創建時被調用,相當于做類的初始化工作,這里要求要求說$this→userid 不為空,否則跳轉到登錄界面,那么 swfupload_json 就無法被調用。觀察 17 行可以看到這個值是通過 cookie 中的_userid 字段或者表單中的 userid_flash 字段做 sys_auth 解密結果,這里沒有做有效性的判斷,所以我們只要通過 POST 傳入一個 userid_flash 的值可以被 sys_auth 解密即可,通過 phpcms/modules/wap/index.php 可以得到這個一個值:

可以看到其中通過 set_cookie 方法設置了一個 siteid 的值,而我們起先講到,set_cookie 方法是會調用 sys_auth 加密方法的,所以訪問該首頁,cookie 中 siteid 的值就可以作為我們要 POST 的 userid_flash 字段的值。
最終就完成了整個漏洞的一個利用過程,以下為漏洞的復現過程:
a. 訪問:http://127.0.0.1/phpcmssql/index.php?m=wap&a=index&siteid=1
并獲取到 set-cookie

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺