SQL 注入基础

SQL注入

SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为。

本质:把用户输入的数据当作代码执行。任何和数据库产生交互的地方便有可能存在注入.

SQL注入类型

数据传输: GET POST COOKIE

数据类型: 整型 字符型

注入模式: 联合查询 报错 布尔盲注 时间盲注 推查询

SQL注入的一般步骤

  1. 判断是否有注入
    1. 可控参数的改变是否影响页面的结果。
    2. 输入的SQL语句是否能报错.---->通过数据库报错,看到数据库的语句痕迹。
    3. 输入的SQL语句能否不报错.---->语句能够成功闭合。
  2. 判断注入类型
  3. 语句是否能够被恶意修改
  4. 是否能够执行
  5. 获取我们想要的数据

SQL注入的基础知识

数据库结构

数据库---->表---->字段---->值

SQL5.0版本之后MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中有三个重要的表名schemata,tables,columns

schemata表存储该用户创建的所有数据库的库名,字段名为schema_name

tables表存储该用户创建的所有数据库的库名和表名,数据库库名和表名字段分别为table_schema,table_name

columns表存储所有的库名,表名,字段名,它们的字段名分别为table_schema,table_name,column_name

查询语句

select 要查询的字段名 from 库名.表名
select 要查询的字段名 from 库名.表名 where 已知条件的字段名 = '已知条件的值'
select 要查询的字段名 from 库名.表名 where 已知的条件字段名1 = '已知条件的值1' and 已知条件2的字段名 = '已知条件2的值'

limit用法

limit m,n

m表示记录开始的位置,从0开始表示第一条记录;n指取n条记录。

重要的函数

database()		当前网站使用的数据库。
version() 当前的MySQL版本。
user() 当前MySQL的用户。
@@datadir 数据库路径。
@@version_compile_os 操作系统版本
concat(str1,str2,...)					没有分隔符地连接字符串
concat_ws(separator,str1,str2,...) 含有分隔符地连接字符串
group_concat(str1,str2,...) 连接一个组的所有字符串,并以逗号分隔每一条数据

注释符

常见的注释表达方式为:#	--空格	/**/
在url中表示为: %23 --+

Union注入攻击

order by和union select

通过order by 数字查询该数据表的字段,当数据库不报错时就查出了数据库的字段数量;在数据库中查询参数ID对应的内容,然后将数据库的内容输出到页面上union select 1,2,3(数字个数为数据库的字段数量),数字可以替换为字段名,通过union select 查询出数据库的内容。

上一篇:通过sqli-labs学习sql注入——基础挑战之less1


下一篇:Linux常用到的指令汇总