1.注入的分类

基于从服务器收到的响应

  • 基于错误的SQL注入
  • 联合查询的类型
  • 堆查询注射
  • SQL盲注

    • 基于布尔SQL盲注
    • 基于时间的SQL盲注
    • 基于报错的SQL盲注

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

  • 基于字符串

  • 数字或整数为基础的

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

  • 一阶注射

  • 二阶注射

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

基于注入点的位置上的

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

    2.系统函数

    几个常用的函数:

  • version() —— MySQL版本

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

    3.字符串连接函数

  • concat(str1,str2,……) —— 没有分隔符的字符串拼接

  • concat_ws(separator,str1,str2,……) —— 含有分隔符的连接字符串
  • group_concat(str1,str2,……) —— 连接一个组的所有字符串,并以逗号分割每一条数据

    4.一般用于尝试的语句

    PS:—+ 可以用 # 替换,url 提交过程中 Url 编码后的 # 为 %23
    or 1=1—+
    ‘ or 1=1—+
    “ or 1=1—+
    ) or 1=1—+
    ‘) or 1=1—+
    “) or 1=1—+
    “)) or 1=1—+
    一般的代码为:
    $id=$_GET[‘id’];
    $sql=”SELECT * FROM users WHERE id=’$id’ LIMIT 0,1”;
    此处考虑两点,一是闭合前面的 ‘ 另一个是处理后面的 ‘ ,一般采用两种思路,闭合后面的引号或者注释掉,注释掉采用 —+ 或者 #

    5.union 操作符的介绍

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

    SQL UNION 语法

    SELECT column_name(s) FROM table_name1
    UNION
    SELECT column_name(s) FROM table_name2
    注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL 。

    SQL UNION ALL 语法

    SELECT columns_name(s) FROM table_name1
    UNION ALL
    SELECT columns_name(s) FROM table_name2
    另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

    6.sql中的逻辑运算

    问题:select from users where id = 1 and 1 = 1; 这条语句为什么能够选择出 id=1 的内容,and 1=1 到底起作用了没有?这里就要清楚sql语句的执行顺序了
    同时这个问题我们在使用万能密码的时候会用到。
    `select
    from admin where username = ‘admin’ and password = ‘admin’;<br />我们可以用 'or 1=1# 作为密码输入。原因是为什么? <br />这里涉及到一个逻辑运算,当使用上述所谓的万能密码后,构成的sql 语句为: <br />select from admin where username = ‘admin’ and password = ‘’ or 1 = 1 #;<br />Explain:上面的这个语句执行后,我们在不知道密码的情况下就登录到了admin 用户了。 <br />原因是在where 子句后, 我们可以看到三个条件语句username = ‘admin’ and password = ‘’ or 1 = 1。三个条件用and 和or 进行连接。在sql 中,我们and 的运算优先 级大于or 的元算优先级。因此可以看到第一个条件(用a 表示)是真的,第二个条件(用 b 表示)是假的,a and b = false,第一个条件和第二个条件执行and 后是假,再与第三 个条件or 运算,因为第三个条件1=1是恒成立的,所以结果自然就为真了。因此上述的语 句就是恒真了。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/8407779/1635389935431-0bb690ef-fce6-4e75-a8a6-cced3adafb9e.png#clientId=u038011df-2707-4&from=paste&height=245&id=u69844c90&margin=%5Bobject%20Object%5D&name=image.png&originHeight=245&originWidth=586&originalType=binary&ratio=1&size=10923&status=done&style=none&taskId=u3dd87812-3db5-4409-b746-0d3946393e9&width=586)<br />①select from users where id = 1 and 1 = 1; <br />②select from users where id = 1 && 1 = 1; <br />③select from users where id = 1 & 1 = 1; `
    上述三者有什么区别?① 和 ② 是一样的,表达的意思是 id=1 条件和 1=1 条件进行与运算。
    ③ 的意思是 id = 1 条件与 1 进行 & 位操作,id =1 被当作 true,与 1 进行 & 运算结果还是 1, 再进行 = 操作,1 = 1,还是 1(ps:& 的优先级大于 = )
    Ps : 此处进行的位运算。我们可以将数转换为二进制再进行与、或、非、异或等运算。必要 的时候可以利用该方法进行注入结果。例如将某一字符转换为ascii 码后,可以分别与 1,2,4,8,16,32.。。。进行与运算,可以得到每一位的值,拼接起来就是 ascii 码值。再从 ascii 值反推回字符。(运用较少)

    7.注入流程