linux、渗透测试、网络安全、CTF、windows

代码审计之--本地包含漏洞找寻特点

男渗鹏鹏 Blog's:

web 2.0时代可谓是带火了SQL
injection的攻击。但是根据调查显示,随着注入工具的功能复杂完善和傻瓜化,几乎人人都能用工具完成从注入到后台这一步骤。不过一些大型站点显然
不是那么容易出现注入点的。现在很多人越来越多的注意到了网站文件包含和XSS CSRF上面,道理很简单,目前这两种安全问题管理员没有太多的重视。
可实际上这两种安全问题哪一种都不能忽视。几天来分析一下文件包含(File Include)中的本地包含。
很简单的一篇文章,但愿能给你带来收获:
网站本地包含漏洞找寻特点,代码浅分析,与修补建议
作者:YoCo Smart
来自:Silic Group Hacker Army
http://blackbap.org
I.网站本地包含漏洞找寻与利用
II.代码浅分析
III.修补建议


I.网站本地包含漏洞找寻与利用
其实要找寻一个有文件本地包含漏洞的网站很容易,在Google上面可以说是一抓一大把。关键字例如:
inurl:.aspx?page=
inurl:?p=about.html
inurl:?moudle=faq
.....
此类关键字可谓是数不胜数,虽然不是100%都有安全问题,但是存在漏洞是确实是不少的
更多的你可以参考一下这里:http://bbs.blackbap.org/thread-1748-1-1.html几位论坛会员他们找寻的包含漏洞
对于包含漏洞的利用,其实也很简单。说说原理,假设一个存在漏洞的页面是这样的:
index.aspx?变量=名称XXOO
而实际index.aspx的操作是:index.aspx通过变量获取名称"XXOO",然后将网站目录 /某个文件夹/XXOO.某种扩展名的模板文件  这个文件以文本显示出来
如果"XXOO"换成了其他的非法名称,index.aspx则就会显示出一些不应该显示的隐私信息。
例如:.aspx?page=../web.config这样的格式
当然,如果模板文件后面有扩展名,也不要紧  .aspx?page=../web.config%00 后面加上个%00这样就可以了(和有些后台上传webshell时文件名加%00其实是一种思想)
这是比较简单的例子,在实际应用中大家可以举一反三


II.代码分析
光说不行,咱们来看一段实际的代码,漏洞利用方法是index.php?p=index.php


index.php部分代码如下(有缩减):

<?php    include('cms/scripts/cms_init.inc');if($_GET['p']=='news.php'){            include('cms/scripts/cms_init.inc');            $cms_content = cms_content(0,15);}?><?php    if(isset($_GET['p'])){if($_GET['p']=='news.php'){?><?php print $cms_content;?><?php    }else{            $in = $_GET['p'];            $in = str_replace('http://','',str_replace('https://','',$in));             readfile($in);}}else{//include('home.html');}?>

问题代码出来了:

$in = $_GET['p']; $in = str_replace('http://','',str_replace('https://','',$in));readfile($in);

这三行line1中是对$in变量取值为GET协议得到的p值
line2中只进行了简单的"https://"和"http"两个词正则
line3直接读取以$in值为文件名的文件了
于是如果in取值为"index.php"那么就把自己“读取”了
那么根据它index.php的源码进一步读取

/index.php?p=cms/scripts/cms_config.inc&c=green/index.php?p=cms/scripts/cms_init.inc&c=green

就能读取到更多的信息,例如数据库配置文件



对于后面加%00的情况,大同小异,无非是系统本身代码编写上后面多预置了个.xxxx的扩展名,%00就把截断扩展名截断了


III.修补建议
我给出一个修补代码供大家参考下吧,也是一个PHP的
读取文件的格式如下:index.php?frame=XXOO

<?switch($_REQUEST['frame']){case"about":        include("module/about.html");break;case"XXOO":        include("module/XXOO.html");break;default:        include("module/home.php");break;}?>

做一个简单分析。
获得网页提交的变量frame,当frame等于什么什么的时候则读取什么什么,如果不等于则读取默认
如果你的对文件包含的正则不擅长,那么就建议你用上面的方案,穷举法。只能读取有限的模板,而不能任意读取。



评论
热度(5)
  1. redboy男渗鹏鹏 Blog's 转载了此文字

© redboy | Powered by LOFTER