偶然发现有这么一个个人开发的小型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) or die(‘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=“<?php echo $_COOKIE[‘name’]?>“ /></li>
<li><span>邮箱</span><input name=“mail” type=“text” value=“<?php echo $_COOKIE[‘mail’]?>“/></li>
<li><span>网址</span><input name=“url” type=“text” value=“<?php echo $_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) or die(‘新增错误:’.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分析~基本就是这样了。
做CTF的crypto,经常会遇到一些加密解密,杰弗逊加密也是考察频率较高的一种加密方式 像今年的ISCC CTF中就有一条转轮加密题目: 加密表: 1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE < 2: < KPBELNA…
请登录后发表评论
注册