SQL 注入基础
SQL注入
SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为。
本质:把用户输入的数据当作代码执行。任何和数据库产生交互的地方便有可能存在注入.
SQL注入类型
数据传输: GET POST COOKIE
数据类型: 整型 字符型
注入模式: 联合查询 报错 布尔盲注 时间盲注 推查询
SQL注入的一般步骤
- 判断是否有注入
- 可控参数的改变是否影响页面的结果。
- 输入的SQL语句是否能报错.---->通过数据库报错,看到数据库的语句痕迹。
- 输入的SQL语句能否不报错.---->语句能够成功闭合。
- 判断注入类型
- 语句是否能够被恶意修改
- 是否能够执行
- 获取我们想要的数据
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
查询出数据库的内容。
本文来自博客园,作者:、晚风、,转载请注明原文链接:https://www.cnblogs.com/xgcl/p/14526212.html