引用百度百科的话来说:

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。


之间都学习过一点,但未及时巩固基本都忘了,还是得写一写才能记得牢一点。


推荐使用sqli-labs,他是一个印度程序员写的,用来学习sql注入的一个游戏程序。同时该作者也发了一些教程等可以在youtube上观看(印度人将英语的口音太重了)

注入的分类

  • 基于从服务器接收到的响应
    1.基于错误的sql注入
    2.联合查询的类型
    3.堆查询注射(?)
    4.SQL盲注

    • 基于布尔的sql盲注
      基于时间的sql盲注
      基于报错的sql盲注
  • 基于注入点的位置上的

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

系统函数

  1. version()--------Mysql版本
  2. user()--------数据库用户名
  3. database()--------数据库名
  4. @@datadir--------数据库路径
  5. @@version_complie_os--------操作系统版本

字符串连接函数

  • concat(str1,str2,···)
    返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。没有分隔符地连续字符串

  • concat_ws(separator,str1,str2,···)
    和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符
    第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

  • group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
    通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

一般用于尝试的语句

  • or 1=1--+
  • 'or 1=1--+
  • "or 1=1--+
    (--+可以用#替换,在url提交中url编码后的#%23'编码后为%27)

union 操作符介绍

union操作符用于合并两个或多个select语句的结果集

  • union内部的select语句必须拥有想同属相的列
  • 列也必须拥有相似的数据类型
  • 每条select语句中的列的顺序必须相同

sql中的逻辑运算

当我们使用万能密码时,构成的sql语句为:

select * from admin where user='admin' and pass='' or 1=1#

我们可以看待三个条件:user='admin' and pass='' or 1=1
三个条件用andor 进行连接。

在sql中,and的运算优先级大于or的运算优先级
and的运算优先级大于or的运算优先级

information_schema数据库表说明:

  • information_schema.tables:
    information_schema数据库下的tables表名,含义:存储所有数据库下的表名信息的表。

  • information_schema.columns:
    information_schema数据库下的columns表名,含义:存储所有数据库下的列名信息的表。

查询语句中含义

  • Table_schema:数据库名

  • Table_name:表名

  • Column_name:列名

接下篇

关于sql注入学习记录(2)

最后修改:2020 年 12 月 18 日
如果觉得我的文章对你有用,请随意赞赏