SQL注入
SQL注入
即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL
注入步骤
-
SQL注入漏洞要满足两个条件
- 参数用户可控
- 参数被带入数据库查询
-
SQL注入有很多种
按数据类型可以分为数字型、字符型和搜索型
,
按提交方式可分为GET型,POST型,Cookie型和HTTP请求头注入
,
按执行效果有可以分为报错注入、联合查询注入、时间注入,盲注和堆查询注入
1.寻找注入点,构造特殊的语句
传入SQL语句可控参数分为两类
- 数字类型,参数不用被引号括起来,如
?id=1
- 其他类型,参数要被引号扩起来,如
?name="phone"
2.用户构造
SQL语句
(如:'or 1=1#;admin'#
(这个注入又称PHP的万能密码,是已知用户名的情况下,可绕过输入密码)
之后
-
将SQL语句发送给DBMS数据库
-
DBMS收到返回的结果,并将该请求解释成机器代码指令,执行必要得到操作
-
DBMS接受返回结果,处理后,返回给用户
因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活)
sql
常用注入攻击
- 基于执行效果
联合查询注入攻击
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。
每条 SELECT 语句中的列的顺序必须相同。
字段查询
union order by <number>
对第几列排序,通过是否报错判断表的列数
回显位查询
union select 1,2,3
使用union联合查询判断显示位。先使union前面的语句为假,这样就只会显示union后面的查询结果
数据库查询
上一步获取了回显位,假如是
2,3
,利用回显位获取数据
union select 1,database(),version()
输出security,2.33
利用连接函数
concat()
方便输出
concat(database(),version()),3
表名查询
information_schema
记录了所有的表名,看下面关键库
了解由上一步的数据库名查询表
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'
结果 emails,referers,uagents,users
查询列
由上一步的表名查询列字段
union select 1,group_concat(column_name),3 from inf