0x00 漏洞简介
1.Apache HTTPD是美国阿帕奇(Apache)软件基金会的一款专为现代操作系统开发和维护的开源HTTP服务器。 Apache HTTPD 2.4.0版本至2.4.29版本中存在安全漏洞。
2.Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。在解析PHP时,xx.php\x0A将被按照PHP后缀进行解析,导致可以绕过一些服务器的安全策略。
3.解析漏洞是指服务器应用程序在解析某些精心构造的后缀文件时,会将其解析成网页脚本,从而导致网站的沦陷。大部分解析漏洞的产生都是由应用程序本身的漏洞导致的。
0x01 影响版本
HTTPD的版本2.4.0~2.4.29都有可能存在该漏洞
0x02 漏洞原理
靶场源代码:
看完上面的源代码我们很容易就能知道我们上传xx.php%0a和xx.php是不一样的,我们上传xx.php%0a就可以对文件上传的黑名单进行了绕过
另外在该版本的配置中,存在这么一段配置
<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>
只要满足这么一个正则匹配,就会告知Apache将这个满足匹配的文件按PHP文件来解析
但是不巧的是这里还有一个东西就是$这个东西,它是用来匹配字符串结尾位置的,而且如果设置了RegExp 对象(正则表达式)的 Multiline(/m) 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。
所以如果我们设置了RegExp 对象的 Multiline 属性(\m)的条件下,$还会匹配到字符串结尾的换行符(也就是%0a),于是也就产生了这么一个换行解析漏洞
0x03 漏洞复现
靶场:掌控安全Apache HTTPD 换行解析漏洞靶场
进入靶场后我们看到的是这个样子,只有一个简单的上传页面
然后我们选择一个本地的一句话木马上传进行抓包
这里有一点需要注意,我们不能直接在xj.php文件名后面加上%0a,因为Get传参他是有URL的编码解码的,但是我们这里是POST传参,他没有,所以我们通过Hex编码的方式手动给他加上
我们先加一个a(我们都知道a的16进制编码是61),然后我们去找到这个61进行替换就好了
我们替换成0a
然后放包过去
然后我们去访问一下我们上传的文件(一般是同级目录)
http://httpd_two.tp5.lab2.aqlab.cn/xj.php%0a
然后我们进行phpinfo()传参
然后我们甚至可以用蚁剑去进行连接
至此,我们就已经完成了这个漏洞的复现
0x04 漏洞修复
1.升级到最新版本
2.将上传的文件重命名为时间戳+随机数+.jpg的格式并禁用上传文件目录执行脚本权限
0x05 总结
这个漏洞需要有以下利用条件:
1、获取文件名时不能用$_FILES['file']['name'],因为它会自动把换行去掉。
2、Apache版本为2.4.0到2.4.29
3、服务器必须是linux系统,因为windows环境下不支持后缀名带有换行符\x0a
总体上而言,只要取$FILES[‘file’][‘name’]作为文件名,就可以无视该解析漏洞,所以该漏洞总体来说实际用处不大,但是由于漏洞根本成因在于$,在以后的其他某些漏洞可能会有利用到的地方,所以这个作为一种姿势学习一下还是很有趣的。