SQL注入测试

(一)SQL注入简介

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,

最终达到欺骗服务器执行恶意的SQL命令

SQL注入是怎么产生的?

1)WEB开发人员无法保证所有的输入都已经过滤

2)攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)

)数据库未做相应的安全配置

如何进行SQL注入攻击?

以php编程语言、mysql数据库为例,介绍一下SQL注入攻击的构造技巧、构造方法

1.数字注入

在浏览器地址栏输入:learn.me/sql/article.php?id=1,这是一个get型接口,发送这个请求相当于调用一个查询语句:

$sql = "SELECT * FROM article WHERE id =",$id

正常情况下,应该返回一个id=1的文章信息。那么,如果在浏览器地址栏输入:learn.me/sql/article.php?id=-1 OR 1 =1,这就是一个SQL注入攻击了,可能会返回所有文章的相关信息。为什么会这样呢?

这是因为,id = -1永远是false,1=1永远是true,所有整个where语句永远是ture,所以where条件相当于没有加where条件,那么查询的结果相当于整张表的内容

2.字符串注入

有这样一个用户登录场景:登录界面包括用户名和密码输入框,以及提交按钮。输入用户名和密码,提交。

这是一个post请求,登录时调用接口learn.me/sql/login.html,首先连接数据库,然后后台对post请求参数中携带的用户名、密码进行参数校验,即sql的查询过程。假设正确的用户名和密码为user和pwd123,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句:

SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'

由于用户名和密码都是字符串,SQL注入方法即把参数携带的数据变成mysql中注释的字符串。mysql中有2种注释的方法:

1)'#':'#'后所有的字符串都会被当成注释来处理

用户名输入:user'#(单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。等价于SQL语句:

SELECT * FROM user WHERE username = 'user'#'ADN password = '111'

'#'后面都被注释掉了,相当于:

SELECT * FROM user WHERE username = 'user' 

2)'-- ' (--后面有个空格):'-- '后面的字符串都会被当成注释来处理

用户名输入:user'-- (注意--后面有个空格,单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。等价于SQL语句:

SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'

SELECT * FROM user WHERE username = 'user'-- 'AND password = '1111'

'-- '后面都被注释掉了,相当于:

SELECT * FROM user WHERE username = 'user'

因此,以上两种情况可能输入一个错误的密码或者不输入密码就可登录用户名为'user'的账号,这是十分危险的事情。

(1)在url上添加参数请求查询:http://index.com/?id=1

以上是通过url查询id为1的数据,但如果我们在后面传参这样写:http://index.com/?id=1' or '1'='1

那么执行的查询语句就是where xx='1' or '1'='1',这样查询的就是全部的数据。

(2)或者是登录时的免密登录,在传参的时候将注释符号#传入,注释后面密码的查询和验证,这样就可以只通过用户名免密登录

用户名:' or 1=1#

这样查询语句执行的就是:where username='' or 1=1# and password='',直接注释掉密码的验证

(3)对数据表的恶意操作

传入的参数为 or 1=(drop xx from xx)等,可以对数据表进行删除操作,所以sql注入的安全性问题很重要,sql注入是在保证查询where语句恒真的情况下可以对数据表做任意操作

(4)资源枚举,其实就是通过枚举法也就是穷举法对数据库名,备份数据库名,数据表名,列名等进行猜测,然后通过服务器返回的错误提示中得到信息,便可以进行sql注入操作。

而为何一些表单提交和输入文本框中的请求可以sql注入呢,就是后端没有对用户输入的数据进行过滤验证。所以判断是否可以进行sql注入是我们即将进行sql注入攻击的第二步。

第一步是确定我们要进行sql注入的地方,判断后台数据库类型;

第二步尝试性地输入一个使where查询语句恒真的语句,通过返回的错误的提示可以知道该输入域是否对输入的字符串进行过滤

第三步可以通过猜测表名,列名等方法可以测试

(三)常用sql注入工具

1、Sqlmap

    Sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,日前支持的数据库是MS-SQL,,MYSQL,ORACLE和POSTGRESQL。SQLMAP采用四种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,堆查询和基于时间的SQL盲注入。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。sqlmap的功能强大到让你惊叹,常规注入工具不能绕过的话,终极使用sqlmap会有意想不到的效果。

2、Pangolin

Pangolin(中文译名为穿山甲)一款帮助渗透测试人员进行Sql注入测试的安全工具,是深圳宇造诺赛科技有限公司(Nosec)旗下的网站安全测试产品之一。

Pangolin能够通过一系列非常简单的操作,达到最大化的攻击测试效果。它从检测注入开始到最后控制目标系统都给出了测试步骤。Pangolin是目前国内使用率最高的SQL注入测试的安全软件,可以说是网站安全测试人员的必备工具之一。

(四)sql注入测试的测试点

1.输入域的值为数字型,用1=1,1=2法

若满足条件,则存在SQL注入漏洞,程序没有对提交的整型参数的合法性做过滤或判断

2.输入域的值为字符型,用 ’1=1’, ’1=2’ 法

若满足条件,则存在SQL注入漏洞,程序没有对提交的字符型参数的合法性做过滤或判断

3.输入域中的值为搜索型,用’and [查询条件] and ‘%’=’% 等

若满足条件,则存在SQL注入漏洞,程序没有对提交的查询的合法性做过滤或判断

4.用UNION查询语句

利用Union可以连接查询,从而从其他表中得到信息

5.大小写排查

程序员对大小写的过滤不充分时,会忽视大小写混合的情况,容易存在漏洞

6.用UNICODE字符集检查

用UNICODE字符集转化的输入,会把+号转为%2B,把%号转化为%25等,容易忽略过滤

7.用ASCII码检查

把输入的字符用ASCII码代替,如a=char(97),容易忽略过滤

8.用;号或—号检查

分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,容易忽略过滤

9.利用系统表

通过查询数据库的系统表名,可判断具体用的数据库类型

10.利用数据库服务器的系统变量user 等

可以得到数据库名,数据库的用户名,从而进行进一步攻击

11.利用相关函数

若字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

12.界面输入框中是否对SQL敏感字符进行了屏蔽

"exec" ,"xp_","sp_","declare","Union","cmd","+","//","..",";","'","--","%" 等命令关键字

13.是否对SQL脚本语法出错信息进行了屏蔽

有些SQL注入的目的就是为了看到报错的SQL命令,通过分析这些SQL命令,获取关键的数据库名,表名以及字段名等信息

14.在浏览器的地址栏中是否对一些恒等表达式进行了屏蔽

例如:http://www.321cn. Com /showdetail.asp?id=19 and 1=1

15.对于提交表单的浏览器地址是否进行了敏感字符或命令集的屏蔽

16.对于cookie参数提交部分,是否对于cookie文件进行了敏感字符或命令集的屏蔽

前提是设计或需求允许这样的操作

(五)防护sql注入

那么,如何防护sql的注入呢?

(1)永远不要相信用户的输入,必须对用户的输入进行校验,过滤,可以通过正则表达式,输入的字符长度限制但双引号,转义字符等,可以前后端进行结合对用户的输入验证

(2)重要的数据等不能明文显示,必须加密

(3)不要用管理员的权限登录数据库,可以在数据库的安全性文件夹-架构-新建架构,然后在数据表上添加架构的名称,查询数据表时需要在表明前面加上架构的前缀才能查询,这样有效防止对数据表名的猜测。

(4)对于系统的错误提示尽可能少,或者对其提示进行改变,隐藏不必要的系统信息。

 

参考转载自:https://www.cnblogs.com/evablogs/p/7823011.html

https://blog.csdn.net/github_36032947/article/details/78442189

https://www.cnblogs.com/CrazyRabbit/p/7661465.html

猜你喜欢

转载自blog.csdn.net/u012114090/article/details/81066700
今日推荐