SQLi-基础知识

此处介绍一些 mysql 注入的一些基础知识。

注入的分类 —— 仁者见仁,智者见智

个人认为分类已经是够全面了。理解不了跳过,当你完全看完整个学习过程后再回头看这段。

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

  • 基于错误的SQL注入
  • 联合查询的类型
  • 堆查询注射
  • SQL盲注
    • 基于布尔SQL盲注
    • 基于时间的SQL盲注
    • 基于报错的SQL盲注

基于如何处理输入的SQL查询(数据类型)

  • 基于字符串
  • 数字或整数为基础的

基于程度和顺序的注入(哪里发生了影响)

  • 一阶注射
  • 二阶注射

一阶注射是指输入的注射语句对WEB直接产生了影响,出现了结果;

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

基于注入点的位置上的

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

常用函数

系统函数(介绍几个常用的)

  • MySQL 版本 version()
  • 数据库用户名 user()
  • 数据库名 database()
  • 数据库路径 @@datadir
  • 操作系统版本 @@version_compile_os

字符串连接函数

详细介绍:SQL注入中连接字符串常用函数

  • 没有分隔符地连接字符串 concat(str1,str2,...)
  • 含有分隔符地连接字符串 concat_ws(separator,str1,str2,...)
  • 连接一个组的所有字符串,并以分隔符分隔每一条数据 group_concat(str1,str2,...) SEPARATOR str_val

一般用于尝试的语句

–+可以用#替换。#的url编码为%23

  • 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) 注释掉

union操作符的介绍

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

  • UNION语法

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

    1
    2
    3
    SELECT column_name(s) FROM table_name1
    UNION
    SELECT column_name(s) FROM table_name2
  • UNION ALL语法

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

    1
    2
    3
    SELECT column_name(s) FROM table_name1
    UNION ALL
    SELECT column_name(s) FROM table_name2

SQL中的逻辑运算

e.g. 下面三者有什么区别?

  1. select * from users where id=1 and 1=1
  2. select * from users where id=1 && 1=1
  3. select * from users where id=1 & 1=1

explain: 1和2是一样的,表达的意思是id=1条件和1=1条件进行与运算。而3的意思是id=1条件与1进行&位操作,id=1被当作 true,与1进行&运算结果还是1,
再进行=操作,1=1,还是1

&的优先级大于=

注入流程

我们的数据库存储的数据按照上图的形式,一个数据库当中有很多的数据表,数据表当中有很多的列,每一列当中存储着数据。我们注入的过程就是先拿到数据库名,在获取到当前数据库名下的数据表,再获取当前数据表下的列,最后获取数据。

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

猜数据库

1
select schema_name from information_schema.schemata

猜某库的数据表

1
select table_name from information_schema.tables where table_schema='xxxx'

猜某表的所有列

1
Select column_name from information_schema.columns where table_name='xxx'

获取某列的内容

1
Select xxxxx from xxxxx

refer: mysql注入天书,百度一下就能找到

梦想还是要有的,万一实现了呢?