SQL注⼊攻击的常见⽅式及测试⽅法
本⽂主要针对SQL注⼊的含义、以及如何进⾏SQL注⼊和如何预防SQL注⼊让⼩伙伴有个了解。适⽤的⼈主要是测试⼈员,了解如何进⾏SQL注⼊,可以帮助我们测试登录、发布等模块的SQL攻击漏洞,⾄于如何预防SQL注⼊,按理说应该是开发该了解的事情~但是作为⼀个棒棒的测试,搞清楚原理是不是能让我们更加透彻地理解bug的产⽣原因呢~好啦,话不多说,进⼊正题~
如何理解SQL注⼊(攻击)?
SQL注⼊是⼀种将SQL代码添加到输⼊参数中,传递到服务器解析并执⾏的⼀种攻击⼿法。
SQL注⼊攻击是输⼊参数未经过滤,然后直接拼接到SQL语句当中解析,执⾏达到预想之外的⼀种⾏为,称之为SQL注⼊攻击。
SQL注⼊是怎么产⽣的?
1)WEB开发⼈员⽆法保证所有的输⼊都已经过滤
2)攻击者利⽤发送给SQL服务器的输⼊参数构造可执⾏的SQL代码(可加⼊到get请求、post请求、http头信息、cookie中)
3)数据库未做相应的安全配置
如何进⾏SQL注⼊攻击?
以php编程语⾔、mysql数据库为例,介绍⼀下SQL注⼊攻击的构造技巧、构造⽅法:
1、数字注⼊
在浏览器地址栏输⼊:/sql/article.php?id=1,这是⼀个get型接⼝,发送这个请求相当于调⽤⼀个查询语句:
sql="SELECT∗FROMarticleWHEREid=",id
正常情况下,应该返回⼀个id=1的⽂章信息。那么,如果在浏览器地址栏输⼊:/sql/article.php?id=-1 OR 1 =1,这就是⼀个SQL注⼊攻击了,可能会返回所有⽂章的相关信息。为什么会这样呢?
这是因为,id = -1永远是false,1=1永远是true,所有整个where语句永远是ture,所以where条件相当于没有加where条件,那么查询的结果相当于整张表的内容
2、字符串注⼊
有这样⼀个⽤户登录场景:登录界⾯包括⽤户名和密码输⼊框,以及提交按钮。输⼊⽤户名和密码,提交。
这是⼀个post请求,登录时调⽤接⼝/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'
sql语句优化方式因此,以上两种情况可能输⼊⼀个错误的密码或者不输⼊密码就可登录⽤户名为'user'的账号,这是⼗分危险的事情。
如何预防SQL注⼊?
这是开发⼈员应该思考的问题,作为测试⼈员,了解如何预防SQL注⼊,可以在发现注⼊攻击bug时,
对bug产⽣原因进⾏定位。
(1)严格检查输⼊变量的类型和格式
对于整数参数,加判断条件:不能为空、参数类型必须为数字
对于字符串参数,可以使⽤正则表达式进⾏过滤:如:必须为[0-9a-zA-Z]范围内的字符串
(2)过滤和转义特殊字符
在username这个变量前进⾏转义,对'、"、\等特殊字符进⾏转义,如:php中的addslashes()函数对username参数进⾏转义
(3)利⽤mysql的预编译机制
把sql语句的模板(变量采⽤占位符进⾏占位)发送给mysql服务器,mysql服务器对sql语句的模板进⾏编译,编译之后根据语句的优化分析对相应的索引进⾏优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进⾏执⾏,节省了sql查询时间,以及mysql服务器的资源,达到⼀次编译、多次执⾏的⽬的,除此之外,还可以防⽌SQL注⼊。具体是怎样防⽌SQL注⼊的呢?实际上当将绑定的参数传到mysql 服务器,mysql服务器对参数进⾏编译,即填充到相应的占位符的过程中,做了转义操作。
Processing math: 100%
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论