四时宝库

程序员的知识宝库

代码审计之熊海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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接