代码审计之熊海cms v1.0
偶然发现有这么一个个人开发的小型cms,正巧想好好研究下代码审计,那就借这个cms来给我的代码审计开篇吧~
看了道哥和seay的代码审计书,总感觉自己缺少实际经验,看别人的代码审计总觉得很简单,自己审计才发现有很多小细节需要自己挖掘才能发现。。原本想给漏洞分类然后发出来,但是这样体现不出代码审计的思路,还是按照我实际的思路来写吧,漏洞类型可能重复~
拿到代码,首先看看有哪些明显的漏洞存在(掏出seay的代码审计系统~)
一共34个可疑漏洞,下面对这些漏洞一一分析,看看哪些是有用的,另外除了这些已知的,看看有没有漏网之鱼~
1.文件包含漏洞
1 2 3 | $file=addslashes($_GET["r"]);//接收文件名 $action=$file==""?"index":$file;//判断为空或者等于index include("files/".$action.".php");//载入相应文件 |
这是ID1和2的漏洞代码,这里参数r经过一次转义,直接就进入了include函数
一个典型的文件包含漏洞!
这里我在根目录下新建了一个test.php,内容为<?php phpinfo(); ?>
但是这里注意,代码所显示的文件为files目录下
这里我们需要进行目录跳转,跳转到根目录后再包含我们作为测试的test.php
payload : http://127.0.0.1/?r=../test
然后我们继续参照seay审计系统给出的漏洞,可以发现在admin目录下存在大量sql注入漏洞,由于这是在admin目录,因此我们需要先获得后台登录账号密码,这里先放一放,看看后续有没有能够获取到管理员账号密码的漏洞,然后再来对这些漏洞进行验证性分析~
后续的漏洞经过实际测试没有明显的可行性,下面我们来对cms结构进行分析~
首先我们关注它的配置文件,其文件均在inc目录下,下面我们来对这个目录下的文件进行逐一分析,这个配置目录很重要!
2.越权漏洞
看到配置目录的第二个文件就已经发现问题了
1 2 3 4 5 6 7 | <?php $user=$_COOKIE["user"]; if($user==""){ header("Location: ?r=login"); exit; } ?> |
这里对cookie进行验证,如果user存在则放过,如果不存在cookie,那么跳转到/?r=login这个网页,这是什么网页呢,,瞧一瞧~
原来这是后台界面,,也就是后台的功能,就靠这一个cookie来进行认证,而且只要存在user,即默认为管理员。。。。
可以看到后台几乎所有的管理页面都是采用这样一种认证方式,那我们来进行绕过!
这里就拿/admin/files/wzlist.php来举例子~
这里我添加了认证,且这个user只需要存在即可。。
可以看到这就登上去了。。之后在进行后台操作时,只需要加上这个user=xxx就可以像管理员一样了。。
之后在看配置文件时,没有发现什么亮点,就是一些普通的数据库连接、图片定义之类的~
3.sql注入
来了,脚本小子的最爱~
在基本看完所有的配置文件后,我们来看看其页面存不存在sql注入~
随便翻看网页,例如这里的http://127.0.0.1/?r=content&cid=18
让我来看看是如何来调用参数的,,这里r前面已讲过~,这里注重分析cid(这里像极了sql注入)
对这个cid参数进行全文追踪,发现在调用一开始就采用了addslashes(),到这里注入基本已经gg,但是还有峰回路转~
接下来我去看后台登录页面,多少次万能密码直接登录的案例在我脑海里挥之不去~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | require"../inc/conn.php"; $login=$_POST["login"]; $user=$_POST["user"]; $password=$_POST["password"]; $checkbox=$_POST["checkbox"]; if($login<>""){ $query="SELECT * FROM manage WHERE user="$user""; $result=mysql_query($query)ordie("SQL语句有误:".mysql_error()); $users=mysql_fetch_array($result); if(!mysql_num_rows($result)){ echo"<Script language=JavaScript>alert("抱歉,用户名或者密码错误。");history.back();</Script>"; exit; }else{ $passwords=$users["password"]; if(md5($password)<>$passwords){ echo"<Script language=JavaScript>alert("抱歉,用户名或者密码错误。");history.back();</Script>"; exit; |
这里的user和password都没有过滤参数,直接带进了数据库查询!
解释一下的这里的密码判断机制,首先按照我们输入的用户名,从数据库中进行查询,如果没找到报错,找到后根据其md5值与我们输入的password的md5值进行比较,如果不对报错。。
因此这里万能密码没什么作用,,但是有注入!
payload : ‘ or updatexml(1,concat(0x7e,(select concat(user,0x7e,password) from manage)),0)#
这里密码随意,,因为我们已经能够利用报错注入,来显示用户名密码~
这里成功得到管理员账号密码~
到这里仿佛就已经可以登录进后台去getshell了,,不过这不是实际渗透,因此我们本着研究的精神,来继续对这个cms来进行分析!
4.xss漏洞
我们继续来看网页的各项功能,这里有个“联系”一下就吸引了我的眼球~
这里我们重点关注是否存在存储型xss漏洞!
这里经过实际测试,不需要经过管理员同意,可以直接显示~这大大方便了我们的测试啊~接下来看看能不能执行JavaScript,有无过滤~
过滤了<script></script>。。。下面我们来对源码进行分析~
1 2 3 4 5 | <li><span>昵称</span><input name="name"type="text"value="<?phpecho$_COOKIE["name"]?>"/></li> <li><span>邮箱</span><input name="mail"type="text"value="<?phpecho$_COOKIE["mail"]?>"/></li> <li><span>网址</span><input name="url"type="text"value="<?phpecho$_COOKIE["url"]?>"/></li> <textarea name="content"cols=""rows=""></textarea> <input name="save"type="submit"value="提交"id="input2"/> |
这里我大概卡了很长时间,因为我没有找到过滤函数,找来找去都没发现可以过滤<script>的功能函数,后来才发现是这个<textarea>搞得鬼!
这个<textarea>可以过滤标签,具体的原理参见:传送门
但是不要慌!这里的name、mail、url都没有进行过滤,我们可以直接提交js上去,不过这里我们需要注意闭合标签
这里经过实际测试,由于mail不在用户中显示,因此在这里插上xss在页面上不会引起不适~
这里跟普通用户一样,但是我们的xss代码已经插上去了~
这时候我们模拟管理员打开留言列表~
普通用户打开留言页面时:
另外发现了一个鸡肋的反射型xss漏洞
1 2 3 4 | $page=addslashes($_GET["page"]); if($page<>""){ if($page<>1){ $pages="第".$page."页 - "; |
这里的page参数经过一次转义,就直接带进了页面
payload : ?page=<script>alert(2)</script>
用户端的页面我基本看了个遍,漏洞大抵相同~
下面我们来进入后台,看看有木有什么漏洞~
5.sql注入2
这里由于我们根据前面的漏洞已经拿到了管理员的账号密码,因此在seay代码审计系统中所显示的admin目录下的漏洞,我们也就可以来进行验证了!
这里拿admin/?r=newlink举例~
1 2 3 | $query="INSERT INTO link (name,url,mail,jieshao,xs,date) VALUES ("$name","$url","$mail","jieshao","xs",now())"; @mysql_query($query)ordie("新增错误:".mysql_error()); echo"<script>alert("亲爱的,链接已经成功添加。");location.href="?r=linklist"</script>"; |
这里的参数同样没有经过过滤就直接insert进了数据库
payload :
错误回显:
6.csrf漏洞
这里管理员功能实在不多,,,就一一点开看了下~
突然看到一个删除文章的功能,点开页面抓包我仿佛看到了新大陆~
/admin/?r=wzlist&delete=18
补全的话就是http://127.0.0.1/admin/?r=wzlist&delete=18
这就是删除页面的链接,如果管理点击这个链接会发生什么呢。。我们来做一个测试
首先我退出管理账号,然后访问这个页面,根据前文的分析,这里一定会验证我user的身份,所以应该是返回登录界面
果然经过测试的确返回了登录界面~
下面我们登录进管理员,再点击这个链接~
这里我登录进去,然后点击这个链接,文章就被直接删除了!
审计到这里,就要想怎么getshell了!
可是水平不济,经过多番尝试都没有getshell。。。。
那么审计到这里,就告一段落了~总结下,先看整体的cms框架,然后针对配置目录和功能目录去进行重点分析,最后再对后台来进行getshell分析~基本就是这样了。
原创作者:ADog"s Blog
- 上一篇:没有了
- 下一篇:PHP代码审计:从入门到懵逼