一、前言
结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬!
全部文章请访问专栏:《全栈安全测试教程(0基础)》
文章目录
- 一、前言
- SQL注入
- 1)什么是SQL注入
- 2)SQL注入漏洞对于数据安全的影响
- 3)SQL注入漏洞的方法
- 4)SQL注入类型
- 5)各个数据库注入方式
- 6)如何预防SQL注入
- 7)SQL注入工具
SQL注入
1)什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句。具体来说,它是利用现有应用程序,将SQL语句注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据,而不是按照设计者意图去执行SQL语句。应用为了和数据库进行沟通完成必要的管理和存储工作,必须和数据库保留一种接口。目前的数据库一般都是提供api以支持管理,应用使用底层开发语言如 Php,Java,asp,Python与这些api进行通讯。对于数据库的操作,目前普遍使用一种SQL语言(Structured Query Language语言,SQL语言的功能包括查询、操纵、定义和控制,是一个综合的、通用的关系数据库语言,同时又是一种高度非过程化的语言,只要求用户 指出做什么而不需要指出怎么做),SQL作为字符串通过API传入给数据库,数据库将查询的结果返回,数据库自身是无法分辨传入的SQL是合法的还是不合 法的,它完全信任传入的数据,如果传入的SQL语句被恶意用户控制或者篡改,将导致数据库以当前调用者的身份执行预期之外的命令并且返回结果,导致安全问题。
2)SQL注入漏洞对于数据安全的影响
SQL注入漏洞会:
可读取/修改数据库中的库和表
- 获取用户的账号,密码(可能被加密过),邮箱,联系方式
- 信用卡信息
- 修改产品价格
- 删除数据
可执行系统命令
- 修改权限,获取系统管理员权限
- 修改任意文件
- 安装后门
SQL注入原理如下:
3)SQL注入漏洞的方法
下图是一个常见的登录页面:
点击“submit”之后,web应用会执行:
- 接收发送的POST请求
- 获取用户名和密码:(bart, simpson)
- 构建SQL语句:
select * from users where username = 'bart' and password = 'simpson'
; - 发送给数据库服务器来验证
这个时候,我们可以对username进行变化
- 输入的用户名不是简单的bart,而是 bart’ and 1=1; –
- 这样整个语句变成如下:
select * from users where username = 'bart' and 1=1; -- ' and password = 'simpson'
; - 这个时候,–后面的都会变成注释,不用密码就能进行登录。
4)SQL注入类型
简单注入(simple SQL injection)
- 永真式:最后加入 or 1=1 来保证无论如何都能获取数据。
- 错误语句:让Web应用构造错误的SQL语句来抛异常,来判断数据库类型
- 结束注释:使用注释符注释剩余语句
- 联合查询:使用union all,后面可以写我要查询的真正语句
盲注(Blind SQL injection)
- 一般我们可以根据返回数据获取我们想要的信息。
- 但一些页面,我们是获取不到详细信息。信息只有正确或不正确。
5)各个数据库注入方式
- 注释符: --(MSSQL, MySQL), #(MySQL), /comment/(MySQL)
- 单行用分号隔开,运行多个SQL语句:MSSQL
- 判断(IF,ELSE语句)
MySQL:IF(condition,true-part,false-part) SELECT IF(1=1,'true','false')
MSSQL:IF condition true-part ELSE false-part IF (1=1) SELECT 'true' ELSE SELECT 'false'
Oracle:BEGIN IF condition THEN true-part; ELSE false-part; END IF; END; BEGIN IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;
- 字符串链接:
MSSQL:+
MySQL,Oracle:||
示例:
在DVWA,我们可以进行测试:
简单注入:
- 1’ and 1=1; # , 1’ and 1=1; # 判断是否可以被注入
- 1’ or 1=1; # 来尝试获取全部账号信息
- 1’ union all select 1, 2; # 来判断可以获取的参数个数
- 1’ union all select 1,(@@version); #来获取数据库版本
- 1’ union all select 1,(database()); #获取数据库名称
- 1’ union all select 1, group_concat(column_name) from information_schema.columns where table_name=‘users’ ; #获取表所有列名
6)如何预防SQL注入
数据库可以运行系统命令
- 用最小化权限的账户启动数据库
- 进制让数据库执行系统命令
连接数据库的用户权限过大
- 使用IDS,WAF等监控是否有异常操作
- 连接数据库的用户权限最小化
错误信息返回过多的信息
- 统一管理错误信息
- 禁止向用户提供错误信息
在服务器未进行过滤
- 过滤所有客户端数据
- 审核数据
7)SQL注入工具
SQLMAP
功能强大
界面不友好
AWVS/APPScan/WebInspect
可以查找各种类型的漏洞
速度较慢