邪恶的空格-PHP本地文件包含漏洞的新突破口
来源:茄子乱语
PS:文章说的出错鸟,事后剑心提醒我才发现,有忽悠人的嫌疑,Connection HTTP标头和能不能写入空格无关!!
记得Zizzy写过一篇《关于php包含Apache日志的随想》,这是一个很好的思路,我们可以随意构造
http://www.exp.com/index<?/**/eval($_POST[cmd]);/**/?>.php
这样的GET请求,将一句话木马写入web日志,然后利用文件包含漏洞包含日志得到WEBSHELL,如milw0rm上的这个EXP:
http://www.milw0rm.com/exploits/4029
不过很遗憾,这类情况只能在short_open_tag=on的情况下才能有效,当short_open_tag=off时,PHP将不支持<?/**/eval($_POST[cmd]);/**/?>这样的短语句.
所以我们只能使用<?php eval($_POST[cmd]);?>这样标准语法的一句话木马,但是问题来鸟,语句中有一个空格,类似
http://www.exp.com/index<?php eval($_POST[cmd]);?>.php
这样的提交,WEB服务器将会把空格做HTTP编码转成%20写入web日志,如果PHP包含<?php%20eval($_POST[cmd]);?>这样的语句肯定是不会成功的,所以我们必须把空格真正的写入WEB日志.
哈,上面说的牛牛可以略过,下面开始切入正题,我们知道一般情况下,一旦Web服务器向浏览器发送了请求数据,肯定会返回响应,这里我发现了WEB服务器一个奇怪的特性,就是如果没有返回响应而WEB服务器又接受了请求,那么请求的内容将原封不动的写入WEB日志,不会进行HTTP编码.
这样我们想个办法一直与WEB服务器保持TCP连接,不让WEB服务器处理响应返回,然后再由客户端的我们中断这次TCP连接,说得这么复杂其实很容易实现.只要在HTTP请求的数据包中去掉Connection HTTP标头值。
利用NC伪造没有Connection HTTP标头的请求包:
GET /index< >.php HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: 192.168.3.44
你会发现WEB服务器一直不会返回响应,直到我们客户端断开这次连接,这个邪恶的空格便写入了WEB日志!
其实老大能发现这样的办法是很有才,但是我发现直接使用ie6提交请求,空格就会直接写入日志。。空格变20%是浏览器的问题,apache服务器并不会转义。。。
是这样。浏览器转码,直接bp改包就能绕过。