目录
一、SQL注入介绍
1.SQL注入漏洞原理
2.SQL注入漏洞的类型
3.SQL注入漏洞识别
4.攻击方式
5.SQL盲注
时间盲注
布尔盲注
报错盲注
6.SQL注入漏洞的危害
7.SQL注入漏洞的防范措施
8.SQL注入漏洞的绕过
一、SQL注入介绍
1.SQL注入漏洞原理
Web程序输入的数据传入到后台处理时,没有做严格过滤,导致其传入的数据拼接到SQL语句中后,被当作SQL语句的一部分执行,从而导致数据库受损
如查询数据、下载数据、写入webshell 、执行系统命令以及绕过登录限制等。漏洞产生原因(实现条件):● 用户对 sql 查询语句参数可控● 原本程序要执行的 SQL 语句,拼接了用户输入的恶意数据
2.SQL注入漏洞的类型
通过是否能在页面中显示注入后的结果信息来区分是显注还是盲注
显注类型:
1.联合注入
2.堆叠注入
3.宽字节注入
4.cookie 注入
5.XFF 头注入
6.UA 注入(user-agent 注入)
7,Referer 注入
8.二次注入
9,base64 注入
10.万能密码
11.文件读写
盲注类型:1.基于时间的盲注 sleep() benchmark()2.基于布尔的注入3.基于报错的注入 updatexml() extractvalue() floor() exp()
3.SQL注入漏洞识别
寻找搜索输入框,在输入参数后加‘查看是否报错;尝试简单payload 1 or1=1#
使用sqlmap工具扫描,sqlmap -u url --dbs 列出数据库名,sqlmap -u url -D 库名 --tables 列出表名,sqlmap -u url -D table_name -T 表名 -- columns 列出列名
4.攻击方式
拿到一个查询条件的Web页面,对输入框做以下事情
(1)判断是否存在注入(and 1=2或者输入’ 看是否有sql语句的报错),注入是字符型(如果是字符型就要考虑闭合单双引号等)还是数字型
(2)猜解SQL查询语句中的字段数(在使用union联合查询中,前后的字段数要保持一致)
(3)确定显示的字段顺序
(4)获取当前数据库
(5)获取数据库中的表
(6)获取表中的字段名
(7)下载数据
5.SQL盲注
盲注:即在SQL注入过程中,SQL语句执行查询后,查询数据不能回显到前端页面中,我们需要使用一些特殊的方式来判断或尝试,这个过程成为盲注
其实就是字面上意思的理解。后台对报错信息进行了屏蔽,当进行输入后,页面只会有正确或者错误的提示,或者干脆就什么提示都没有(我们无法根据报错的信息进行注入的判断)。
盲注类型:1.基于时间的盲注 sleep() benchmark()2.基于布尔的注入3.基于报错的注入 updatexml() extractvalue() floor() exp()时间盲注
sql时间类型的盲注本质是利用插入的sql语句执行造成时间延迟
如论我们输入的语句是否合法,页面的显示信息是固定的,即不会出现查询的信息,也不会出现报错信息。可以尝试基于时间的盲注来测试。根据页面响应的时间,来判断输入的信息是否正确。
布尔盲注
布尔盲注的本质是利用注入执行结果的布尔值,来判断是否盲注成功
盲注查询是不需要返回结果的,仅判断语句是否正常执行即可,所以其返回可以看到一个布尔值,正常显示为true,报错或者是其他不正常显示为False
报错盲注
报错盲注的本质是利用查询嵌套再通过报错函数将子查询的数据带出报错盲注将错误信息与子查询语句中查询的内容带出,并不局限与这种场景,只要能将mysql 错 ,误信息输出都可以尝试进行报错注入。报错盲注形式上一般是做两个嵌套查询,里面的称为子查询,执行顺序是先进行子查询,所以我们可以通过子查询查询我们想要的数据,然后通过报错函数将我们查询的数据带出。
6.SQL注入漏洞的危害
(1)攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
(2)可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
(3)如果网站目录存在写入权限,可以写入网页木马。攻击者进而可以对网页进行篡改,发布一些违法信息等。
(4)经过提权等步骤,服务器最高权限被攻击者获取。攻击者可以远程控制服务器,安装后门,得以修改或控制操作系统。
7.SQL注入漏洞的防范措施
1.预编译 (数据库不会将参数的内容视为 SQL 命令执行,而是作为一个字段的属性值来处理)2.PDO 预处理 (本地和 Mysql 服务端使用字符集对输入进行转义)3.正则表达式过滤 (如果用户输入了非法信息则利用正则表达式过滤)
代码层面
1.对输入进行严格的转义和过滤
2.使用PDO预处理和参数化 ( Parameterized )关于预处理和参数化详解:
这种方法一般是在PHP中进行处理的,具体是,
1.先预发送一个sql模板过去
2.再向mysql发送需要查询的参数(不管参数怎么注入,mysql都能知道这是变量,不会做语义解析,起到防注入的效果,这是在mysql中完成的。)网路层面
1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)
2.云端防护( 360网站卫士,阿里云盾等)
8.SQL注入漏洞的绕过
- 大小写绕过注入
- 双写绕过注入
- 编码绕过注入
- 内联注释绕过注入