---
# System prepended metadata

title: PHP文件包含漏洞

---

PHP文件包含漏洞
===
本文写于2017年7月16日

PHP功能强大，这些函数会引起PHP文件包含漏洞，于是参考了一些资料（在最后）后总结一下这个漏洞

## 产生原理：

这些函数中包含的新文件，无论其格式如何，只要里面的内容符合PHP语法，那么就会将其解析并执行

Text.php里：

<?php echo "hellowrld";?>

统一路径下的Myfirst.php:

<?php

echo "file inclusion";

echo "<br>";

include("text.php");

?>

（此处应有截图）

text.php

这两个文件在同一目录下

（此处应有截图）

MYfirstphp.php




（此处应有截图）

text.php里的代码被执行了

## 如何利用？

1、如果allow_url_fopen的值时on，就可以远程执行文件

上传的文件（无论什么格式都可以，图片格式最好，可以绕过普通WAF），其内容为

<?fput(fopen("webshell.php","w"),"<?php eval($_POST[cmd])?>")?>

再用文件包含远程执行它，webshell就到手了

只不过在5.2还是5.3之后allow_url_fopen的值有了一些新的选项，基本上不会出现这种漏洞了

2、还有就是日志文件，日志文件会记录一切访问，即使没有这个资源

于是我们请求个http://www.baidu.com/<?php eval($_POST[cmd])?>（如果被转吗了用burp来绕过编码）

接下来执行日志文件就行了，但是大网站日志文件会非常大，执行会很费劲，可以趁着凌晨的时候试试

3、如果有足够的权限（不太可能啊），可以试着访问一些敏感文件，试试windos和Linux默认存放敏感文件的路径，即使不成功也会报错

4、即使没有上传文件成功，得不到webshell，也可以通过爆出来的警告获得网站的绝对路径。

5、这里还用到了php的封装协议php:// — 访问各个输入/输出流（I/O streams），直接读取二进制数据流，base64转码（.php文件几乎不可能在前台输出，所以要转码），读取源码，就能看到后台php文件的源码了

## 如何防范？

1、比较偷懒的方法：固定扩展名

<?php

if(isset($_GET['page']))

{include $_GET['page'].".php";}

else{include 'home.php';}

?>

但是如果试出来且报错了，那么/0截断一下就好。可惜的是5.3以后已经完全修复了/0截断的漏洞

2、修改php.ini的那几个配置，远程包含能别用就别用，当然默认是关闭的

3、包含文件验证：验证被包含的文件是否是白名单中的一员；这个是业界通用也是最管用的方法

4、尽量不要使用动态包含，可以在需要包含的页面固定写好，如：include("head.php");

5、严格判断包含的参数是否外部可控，因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制；

6、路径限制：限制被包含的文件只能在某一文件夹内，一定要禁止目录跳转字符，如：“../”；




（待补充）

## 总结

现在渗透测试里很少能够碰到文件包含漏洞了，基本都修复了，利用的机会也不大。但是万一碰见了呢？

参考书籍：

《web安全深度剖析》、《白帽子讲web安全》、《代码审计：企业级web代码安全架构》的文件包含漏洞这一章节

参考文献：

乌云知识库：http://wooyun.tangscan.cn/static/drops/tips-3827.html（里面有一些linux的文件可以记一下）

这个安全博客：http://www.cnseay.com/2356/comment-page-1/

南邮CTF的wpweb第十题

南邮CTFwp博客http://blog.csdn.net/qq_31481187/article/details/52097287?locationNum=9


