首页 » PHP教程 » phpshowall技巧_挖洞神器之XRAY运用初体验

phpshowall技巧_挖洞神器之XRAY运用初体验

duote123 2024-11-20 0

扫一扫用手机浏览

文章目录 [+]

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

本文以 cms 的漏洞挖掘为根本,然后说说自己利用的感想熏染。

phpshowall技巧_挖洞神器之XRAY运用初体验

0x02 准备事情

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

phpshowall技巧_挖洞神器之XRAY运用初体验
(图片来自网络侵删)

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:

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

由于是测试环境,以是我们可以开启上岸选项:

说不定挖掘的东西更多

其他配置就和 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 供应的信息:

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 漏洞:

2、registration.php文件

根据 XRAY 供应的信息:

username 参数存在问题,找到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>

由于其他几个文件的 XSS 漏洞也是相似事理,因此不再赘述。

3、cposts.php文件

根据 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 供应的 payload 测试如下:

漏洞的确存在,可通过以下 payload 获取账号密码:

union all select concat(0x7e,user_uname,user_pass,user()) from cms_users limit 1,1

4、cposts.php文件

根据 XRAY 供应的信息:

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

<?phpif(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 取得user_name参数往后,未经任何过滤,直接带入 update 型sql 语句,因此导致了 update 型 sql 注入,不过此注入在后台,属于后台注入(虽然后台可以越权访问)

此处注入的 payload 就不给出了,有兴趣的朋友可以自己布局。
其他几个 sql 注入,漏洞事理相似,也不过多剖析。

5、users.php文件

根据 XRAY 供应的信息:

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

0x04 比拟剖析

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

我统计了一下,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 syntax直接剖断为注入,但实际上是由于传入的内容为-10导致涌现了这个问题。

对付 p 参数,如果传入的字符中第一个不是数字,那么返回的结果,first_limit 都是 -10,传入-10 拼接到 SQL 语句后报错,如下图:

以上三个文件均为 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 的代理,或许能够带给你意想不到的结果

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0