最近比较闲来学习学习代码审计,顺便记录一下自己的成长。
找源码的话之前看到公众号发文,可以在网站中找开放的源码项目,网站就是下方这个。个人感 觉这里的源代码审计还是有难度的,例如本次审计的这个商城源码,我审计完之后才看到在CNVD 已经提交过好多漏洞了。此次也没有什么重要的漏洞成果,还是记录一下挖掘的一个思路。
https://down.chinaz.com/class/5_1.htm
1.安装&使用
在站长之家找到这套PHP源码进行审计,首先在本地安装,安装不用多说。可以看到这个更新日 期是2022/1/15如的,还是最新更新的。
这套源码基于Thinkphp开发的,还需要熟悉一下他的路由。安装好之后后台如下,首先需要熟悉 一下后台的一些功能点
这里我是用的是VSCode,在当前目录下使用code . 打开当前目录至vscode。这里的源码数量太 大,不建议使用源码审计工具了
在route/app.php中可以看到使用的是ThinkPHP6,我也就用过ThinkPHP5,对这套还不怎么熟 悉
这里网站的入口文件是public/index.php,然后路由也是在/index.php 后拼接
后台文件从这里进入
功能的跳转就是这个样子
就可以根据路由规则去找到相应的功能点
一些函数的功能我就不说了,直接代码审计
2.存储型XSS
在这个位置,存在一个会员通知
http://dsmalltest.com:81/public/index.php/admin/Index/index.html
在会员列表和通知内容写入内容,通知内容可以写入XSS代码
放包之后就会触发存储型XSS,这个位置的通知,可以发送给全部人员,也可以发给指定的人员, 危害还是挺大的
来看源码,就是app/admin/controller/Notice.php的notice()方法
第一步就是判断了是否为POST传递的参数,然后就使用input获取传递的内容,intval这里将 send_type设置为整形。
接着就判断了$send_type的值,如果为1那么就发送给指定的会员,如果为2那么就发送给所有的 会员
if (request()->isPost()) {
//
$notice_validate = ds_validate( 'notice ');
$content = trim(input( 'param.content1')); //信息内容
$send_type = intval(input( 'param.send_type '));
//验证
switch ($send_type) {
//指定会员
case 1:
}
$data = [
"user_name" => input("param.user_name")
];
if (!$notice_validate->scene( 'notice1')->check($data)) {
$this->error($notice_validate->getError());
}
break;
//全部会员
case 2:
break;
ds_validate()方法,这个方法对传入的content内容无关
input方法(),就是指定参数来源进行自动判断的
在下方的这里,就会根据接收的内容发送给相应的会员
//接收内容
$array = array();
$array[ 'send_mode '] = 1;
$array[ 'user_name '] = $memberid_list;
$array[ 'content '] = $content;
//添加短消息
$message_model = model( 'message ');
$insert_arr = array();
$insert_arr[ 'from_member_id '] = 0;
if ($send_type == 2) {
$insert_arr[ 'member_id '] = 'all ';
} else {
$insert_arr[ 'member_id '] = "," . implode( ', ', $memberid_list) .
}
$insert_arr[ 'msg_content '] = $content;
$insert_arr[ 'message_type '] = 1;
$insert_arr[ 'message_ismore '] = 1;
$message_model->addMessage($insert_arr);
//跳转
$this->log(lang( 'notice_index_send '), 1);
dsLayerOpenSuccess(lang( 'notice_index_send_succ '));
$this->success(lang( 'notice_index_send_succ '), 'notice/notice ');
这里并未对$content内容做一个处理导致了XSS漏洞,像其他的一些功能点都对输入做了一个处 理。
对输入做一个正则,如果不是数字,就会赋值空
3.总结
这个系统还是挺难的,看了共3小时,既要熟悉框架还要从中寻找漏洞点,其中也发现了其他的漏 洞点但是没有复现成功。还有一些函数的调用寻找起来很麻烦,还是不太熟悉框架,在审计的时 候会增加困难。前辈们都已经在这CMS挖到了很多的漏洞,我还需要提升技术跟上前辈们的脚步
热烈欢迎关注本安全公众号
原文始发于微信公众号(moonsec):代码审计 DSmall系统
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论