挖洞神器之XRAY使用初体验

挖洞 专栏收录该内容
1 篇文章 0 订阅

0x01写在前面

前几天白嫖了XRAY的高级版,因此试着利用XRAY + AWVS的形式来看看能不能找到CNVD上公布的问题CMS的漏洞。

我们都知道cnvd发布突破公告的时候是没有详细细节的,因此只能根据突破的种类自己去寻找突破点,如果cnvd公告里有存在突破文件的名称,相对于简单一点,但是没有的话,就相当于从头自己去审核整套系统,于是就找到了一个小型CMS当做演示:

挖洞神器之XRAY使用初体验

 

本文以cms的突破挖掘为基础,然后说说自己使用的感受。

0x02准备工作

XRAY + AWVS如何配置的,我就不在这里详细解析了,官网上已经写得很清楚了,有兴趣可以看:

https://chaitin.github.io/xray/#/scenario/awvs

需要注意两个点:

  • 要保证xray代理地址和awvs主机地址能够通信
  • 要保证XRAY配置文件中的允许扫描域为*或者你要扫描的地址(之前就是因为自己测试上一个地址忘了修改导致一直没有数据,所以这里突出一下)

然后就可以下载CMS进行建造,,建造过程也比较简单,因此没有多余的述,下载地址可见:

https://github.com/chilin89117/ED01-CMS

安装好后就可以添加扫描了。

首要是首先在本地运行起xray,命令如下:

./xray webscan --listen 0.0.0.0:1111 --html-output awvs.html

这里的端口可以自己设定,某些我设定的就是8888:

挖洞神器之XRAY使用初体验

 

然后添加已经建造好的CMS的地址:

挖洞神器之XRAY使用初体验

 

因为是测试环境,所以我们可以开启登陆选项:

挖洞神器之XRAY使用初体验

 

说不定挖掘的东西更多

其他配置就和XRAY官方介绍的一样,代理模板的端口要和你xray监听的端口一致:

挖洞神器之XRAY使用初体验

 

点击爬虫模式扫描,创建后,就可以正式扫描目标地址了:

挖洞神器之XRAY使用初体验

 

如下图,xray很快就接受到地址,并开始检测:

挖洞神器之XRAY使用初体验

 

最终扫描结果如下:

#Plugin / VulnTypeTargetCreateTime#1xsshttp://192.168.52.1/testcms/aposts.php2019-12-22 17:51:05#2xsshttp://192.168.52.1/testcms/registration.php2019-12-22 17:51:08 #3xsshttp://192.168.52.1/testcms/cposts.php2019-12-22 17:51:23#4xsshttp://192.168.52.1/testcms/post.php2019-12-22 17:51:38#5xsshttp:// /192.168.52.1/testcms/admin/users.php2019-12-22 17:51:59#6xsshttp://192.168.52.1/testcms/admin/posts.php2019-12-22 17:56:19#7sqldethttp:// /192.168.52.1/testcms/cposts.php2019-12-22 17:51:28#8sqldethttp://192.168.52.1/testcms/post.php2019-12-22 17:51:40#9sqldethttp://192.168.52.1 /testcms/admin/users.php2019-12-22 17:51:59#10sqldethttp://192.168.52.1/testcms/admin/posts.php2019-12-22 17:56:09#11struts / s2-007http:/ /192.168.52.1/testcms/admin/users.php2019-12-22 17:55:32

以上是我简化的结果,有的文件中可能存两个两个两个以上的ParamKey存在突破但只保留一个。

由于同一个文件存在不同的漏洞,因此我们选择以文件分类来分析漏洞。

0x03进攻挖掘

1,aposts.php文件

根据XRAY提供的信息:

挖洞神器之XRAY使用初体验

 

u参数存在问题,找到aposts.php,关键代码如下:

if(isset($_GET['u'])) {
        $uname = mysqli_real_escape_string($con, $_GET['u']);

     ....

    if(!$posts) {   
            $div_class = 'danger';
            $div_msg = 'Database error: ' . mysqli_error($con);
        } else {
            $post_count = mysqli_num_rows($posts);      
            if($post_count == 0) {
                $page_count = 0;
                $div_class = 'danger';
                $div_msg = "Sorry, no posts found for user <strong>'$uname'</strong>.";
            } else {
                $page_count = ceil($post_count / 8);
                $div_class = 'success';
                $div_msg = " Showing published posts for user <strong>'$uname'</strong>.";
                $div_msg .= " <a href='index.php'>Show All</a>";
            }
        }
    }

GET取得u参数后,通过mysqli_real_escape_string函数赋值给uname,然后判断posts参数,如果没有找到结果,输出uname

我们知道mysqli_real_escape_string函数主要是转义在SQL语句中字符串中的特殊字符,而不是XSS的过滤函数,因此运用最基本的语句:<script> alert(0)</ script>,可立即触发XSS漏洞:

挖洞神器之XRAY使用初体验

 

2,registration.php文件

根据XRAY提供的信息:

挖洞神器之XRAY使用初体验

 

用户名参数存在问题,找到registration.php文件,关键代码如下:

if(isset($_POST['submit'])) {
    // clean up inputs
    $username       = mysqli_real_escape_string($con, $_POST['username']);

  ...


    <div class="form-group">
                <label for="username" class="sr-only">Choose a Username</label>
                <input type="text" name="username" class="form-control" 
          value="<?php echo $username;?>" placeholder="Enter Desired Username *">
    </div>

问题和上一个文件类似,仅用mysqli_real_escape_string函数进行了过滤,最后在input标签内输出,因此只需要关闭input标签即可触发XSS:“> <script> alert(0)</ script>

挖洞神器之XRAY使用初体验

 

由于其他几个文件的XSS突破也是相似原理,因此不再赘述。

3,cposts.php文件

根据XRAY提供的信息:

挖洞神器之XRAY使用初体验

 

cid参数存在问题,找到cposts.php文件,关键代码如下:

if(isset($_GET['cid'])) {
        $cid = mysqli_real_escape_string($con, $_GET['cid']);

        // find total number of posts to determine number of pages for pagination
        $q = "SELECT * FROM cms_posts where post_cat_id = $cid";
        $result = mysqli_query($con, $q);
        $total_posts = mysqli_num_rows($result);
        $total_pages = ceil($total_posts / POSTSPERPAGE);

        // if $total_pages is 0, set it to 1 so pagination will not look for page 0
        if($total_pages < 1) {
            $total_pages = 1;
        }

  ...

    $q1 = "SELECT cms_posts.*, cms_users.user_image FROM cms_posts
                    INNER JOIN cms_users ON cms_posts.post_author = cms_users.user_uname
                    WHERE post_cat_id = '$cid' 
                    AND post_status = 'Published'
                    ORDER BY post_date DESC " . $limit_clause;

        // get category name from database to display in alert box
        $q2 = "SELECT cat_title FROM cms_categories WHERE cat_id = $cid";

        $result = mysqli_query($con, $q2);
        $cat_title = mysqli_fetch_array($result);

  ...

同样,仅对注入语句中的关键字符进行转义,但是关键点来了

$q = "SELECT * FROM cms_posts where post_cat_id = $cid";

压根不需要闭合单引号,直接取代了$ cid变量

根据XRAY提供的有效载荷测试如下:

挖洞神器之XRAY使用初体验

 

突破性的确实存在,可通过以下payload获取账号密码:

union all select concat(0x7e,user_uname,user_pass,user()) from cms_users limit 1,1
挖洞神器之XRAY使用初体验

 

4,cposts.php文件

根据XRAY提供的信息:

挖洞神器之XRAY使用初体验

 

存在问题参数的为user_name,找到cposts.php文件:

<?php
if(isset($_GET['source'])) {
    $source = $_GET['source'];
} else {
    $source = "";
}

switch($source) {
    case 'add_user':
        include 'admin_includes/admin_add_user.php';
        break;
    case 'edit_user':
        include 'admin_includes/admin_edit_user.php';
        break;
    case 'c':
        echo 'c';
        break;
    default:
        include 'admin_includes/admin_view_all_users.php';
}

?>

转到admin_edit_user.php文件,关键内容如下:

if(isset($_POST['updateusersubmit'])) {
        // get all input data
        $user_id = $_POST['user_id'];
        $user_uname = $_POST['user_uname'];

  ...


        if(empty($user_uname) || empty($user_email) || empty($user_pass1) || empty($user_pass2)) {
            $div_class = 'danger';
            $div_msg = 'Please fill in all required fields.';
        } elseif($user_pass1 !== $user_pass2) {
            $div_class = 'danger';
            $div_msg = 'Password fields do not match.';
        } elseif(!$user_email_val) {
            $div_class = 'danger';
            $div_msg = 'Please enter a valid email address.';       
        } else { 
            // encrypt password (see documentation on php.net)      
            $options =['cost'=>HASHCOST];
            $user_pass = password_hash($user_pass1, PASSWORD_BCRYPT, $options); 

            move_uploaded_file($image_tmp, "../images/$user_image");

            $q = "UPDATE cms_users SET user_uname = '$user_uname', 
                        user_pass = '$user_pass', user_fname = '$user_fname', 
                        user_lname = '$user_lname', user_email = '$user_email',
                        user_image = '$user_image', user_role = '$user_role', 
                        user_status = '$user_status' WHERE user_id = $user_id";

            $result = mysqli_query($con, $q);

      ...

通过POST获得用户名参数,然后进行任何过滤,直接带入更新型sql语句,因此导致了更新型sql注入,不过此注入在后台,属于后台注入(虽然后台可以越权访问)

其他几个sql注入,突破原理相似,也不过多分析。

5,users.php文件

根据XRAY提供的信息:

挖洞神器之XRAY使用初体验

 

属于struts系列突破中的s2-007扩展,但是这套程序是由PHP写的,因此属于误报。

0x04对比分析

重复现完之后我同样用awvs扫描一遍遍该站点,部分拆分列表如下:

挖洞神器之XRAY使用初体验

 

我统计了一下,AWVS一共测试出7个SQL注入漏洞,存在于6个文件,XRAY一共测试出11个SQL漏洞,存在于4个文件中。

其中XRAY没有测试出来而AWVS测试出的文件为:index.php,aposts.php以及sposts.php

AWVS没有测试出来而XRAY测试出的文件为:users.php

AWVS和XRAY共同测试出的文件为:cposts.php,post.php,posts.php

对于index.php,aposts.php以及sposts.php文件,我看了一下报问题的p参数,每个文件的核心代码如下:

if(isset($_GET['p'])) {
            $page = mysqli_real_escape_string($con, $_GET['p']);

            // the 1st number in LIMIT is a multiple of POSTSPERPAGE starting at 0
            $first_limit = ($page - 1) * POSTSPERPAGE; // POSTSPERPAGE = 10
        } else {
            // $first_limit is needed for LIMIT clause, $page is needed for setting
            // active class of pagination buttons
            $first_limit = 0;
            $page = 1;
        }

        // create LIMIT clause
        $limit_clause = "LIMIT $first_limit, " . POSTSPERPAGE;

$ first_limit =($ page-1)* POSTSPERPAGE;这句话将first_limit强制变成了数值类型,实际上我们是没办法控制注入语句的,AWVS基于以下信息:

URL encoded GET input p was set to \

Error message found:

You have an error in your SQL syntax

发现sql语法直接判断为注入,但实际上是因为预设的内容为-10导致出现了这个问题。

对于p参数,如果对齐的字符中第一个不是数字,那么返回的结果,first_limit都是-10,则将-10拆分到SQL语句后报错,如下图:

挖洞神器之XRAY使用初体验

 

以上三个文件允许awvs的误报(xray牛逼)。

对于XSS漏洞,AWVS一共测试出8个突破,存在于5个文件中,XRAY一共测试出46个突破,存在于7个文件中

其中XRAY没有测试出来而AWVS测试出的文件为:无

AWVS没有测试出来而XRAY测试出的文件为:posts.php,users.php

AWVS和XRAY共同测试出的文件为:aposts.php,cposts.php,post.php,sposts.php,registration.php

0x05总结

对于本CMS而言,评估之下,xray超过优势,而且具有被动性的优势,xray能够完成更深层次的测试,而那些扫描器无法扫描到地址,现在xray迭代更新比较快,高级版的插件也不断在开发中,植入,实际上xray的能力很受累的蠕虫性能(访问页面)的影响,爬取(访问)的页面越多,xray散布挖掘出的可能的,所以xray值得尝试。

总体而言,awvs更适合那些去写渗透测报告的朋友,而xray更适合那些去挖src的朋友,当你在突破挖掘的过程中开着xray的代理,或许能够带给你意想不到的结果

  • 8
    点赞
  • 2
    评论
  • 15
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法高效。 支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。 代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。 高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。 安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。 目前支持的漏洞检测类型包括: XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd_injection) 目录枚举 (key: dirscan) 路径穿越检测 (key: path_traversal) XML 实体注入检测 (key: xxe) 文件上传检测 (key: upload) 弱口令检测 (key: brute_force) jsonp 检测 (key: jsonp) ssrf 检测 (key: ssrf) 基线检查 (key: baseline) 任意跳转检测 (key: redirect) CRLF 注入 (key: crlf_injection) Struts2 系列漏洞检测 (高级版,key: struts) Thinkphp系列漏洞检测 (高级版,key: thinkphp) POC 框架 (key: phantasm) 其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。 设计理念 发最少的包做效果最好的探测。 如果一个请求可以确信漏洞存在,那就发一个请求。如果两种漏洞环境可以用同一个 payload 探测出来,那就 不要拆成两个。 允许一定程度上的误报来换取扫描速度的提升 漏洞检测工具无法面面俱到,在漏报和误报的选择上必然要选择误报。如果在使用中发现误报比较严重,可以进行反馈。 尽量不用时间盲注等机制检测漏洞。 时间检测受影响因素太多且不可控,而且可能会影响其他插件的运行。因此除非必要(如 sql)请尽量使用与时间无关的 payload。 尽量不使用盲打平台 如果一个漏洞能用回显检测就用回显检测,因为盲打平台增加了漏洞检测过程的不确定性和复杂性。 耗时操作谨慎处理 全局使用 Context 做管理,不会因为某个请求而导致全局卡死。 简易架构 了解 xray 的整体架构可以更好的理解 cli 和配置文件的设置,方便大家更好的使用。 整体来看,扫描器这类工具大致都是由三部分组成: 来源处理 漏洞检测 结果输出 来源处理 这一部分的功能是整个漏洞检测的入口,在 xray 中我们定义了四个入口,分别是 HTTP 被动代理 简易爬虫 单个 URL URL列表的文件 单个原始 HTTP 请求文件 漏洞检测 这一部分是引擎的核心功能,用于处理前面 来源处理 部分产生的标准化的请求。用户可以针对性的启用插件,配置扫描插件的参数,配置 HTTP 相关参数等。 结果输出 漏洞扫描和运行时的状态统称为结果输出,xray 定义了如下几种输出方式: Stdout (屏幕输出, 默认开启) JSON 文件输出 HTML 报告输出 Webhook 输出 使用教程见:xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法高效。 支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。 代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。 高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。 安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。 目前支持的漏洞检测类型包括: XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd_injection) 目录枚举 (key: dirscan) 路径穿越检测 (key: path_traversal) XML 实体注入检测 (key: xxe
©️2021 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值