Sqli-labs学习

sqli-labs

前言

https://github.com/Audi-1/sqli-labs

第一部分(page-1 Basic Challenges)

Background-1 基础知识

  1. 注入的分类

    • 基于从服务器接收到的响应

      • 基于错误的SQL注入
      • 联合查询注入
      • 堆查询注入
      • 盲注(布尔盲注、时间盲注、报错盲注)
    • 基于如何处理输入的SQL查询(数据类型)

      • 基于字符串
      • 数字或整数为基础的
    • 基于程度和顺序的注入(哪里发生了影响)

      • 一阶注入

      • 二阶注入

      一阶注射是指输入的注射语句对 WEB 直接产生了影响,出现了结果;二阶注入类似存 储型 XSS,是指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间 接的对 WEB 产生危害,这样的就被称为是二阶注入.

    • 基于注入点的位置上

      • 通过用户输入的表单域的注射
      • 通过cookie注射
      • 通过服务器变量注射(基于头部信息的注射)
  2. 系统函数

    • version() –MySQL版本
    • user() –数据库用户名
    • database() –数据库名
    • @@datadir –数据库路径
    • @@version_compile_os –操作系统版本
  3. 字符串连接函数

    函数具体介绍 http://www.cnblogs.com/lcamry/p/5715634.html

    • concat(str1, str2, …) – 没有分隔符的连接字符串
    • concat_ws(separator, str1, str2, …) – 有分隔符的连接字符串
    • group_concat(str1, str2, …) – 连接一个组的所有字符串,并以逗号分隔每一条数据
  4. 一般用于尝试的语句

    ps:--+可以用 # 替换, url提交过程中url编码后的#%23

    1
    2
    3
    4
    5
    6
    7
    or 1=1 --+
    ' or 1=1 --+
    " or 1=1 --+
    ) or 1=1 --+
    ') or 1=1 --+
    ") or 1=1 --+
    ")) or 1=1 --+

    一般的代码为:

    1
    2
    $id=$_GET['id']; 
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

    此处考虑两个点,一个是闭合前面你的',另一个是处理后面的 ',一般采用两种思路,闭合后面的引号或者注释掉,注释掉采用–+ 或者 #(%23)

  5. union操作符的介绍

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的 列的顺序必须相同。

    1
    select column_name(s) from table_name1 union select column_name(s) from table_name2

    默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL

    1
    select column_name(s) from table_name1 union all select column_name(s) from table_name2

    UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

  6. SQL中的逻辑运算

  7. 注入流程

    image-20200413190947414

Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们利用该表可以进行一次完整的注入。以下为一般的流程。

猜数据库

1
select schema_name from information_schema.schemata 

猜某库的数据表

1
select table_name from information_schema.tables where table_schema=’xxxxx’ 

猜某表的所有列

1
Select column_name from information_schema.columns where table_name=’xxxxx’ 

获取某列的内容

1
Select *** from ****

Less-1

Less-2

Less-3

Less-4

Background-2 盲注的讲解

Less-5

Less-6

Less-7

Less-8

Less-9

Less-10