原文链接:代码审计 DSmall系统
最近比较闲来学习学习代码审计,顺便记录一下自己的成长。
找源码的话之前看到公众号发文,可以在网站中找开放的源码项目,网站就是下方这个。个人感 觉这里的源代码审计还是有难度的,例如本次审计的这个商城源码,我审计完之后才看到在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挖到了很多的漏洞,我还需要提升技术跟上前辈们的脚步
|