APP下载

某网站SQL注入漏洞修补

2017-09-04范义山

科技视界 2017年9期
关键词:修补

范义山

【摘 要】网站SQL注入漏洞风险性极大,并且非常普遍,要检查网站是否有SQL注入漏洞非常容易,但是要修补SQL注入漏洞,还是需要一定的编码能力和实际经验。本文以一个真实的SQL注入漏洞修补过程为例,讲解注入漏洞修补方法。

【关键词】SQL注入漏洞;修补;正则表达式

近日,我单位某部门网站被教育行业漏洞报告平台报告含有SQL注入漏洞,并给出了具体的路径、参数和截图,经我们验证漏洞确实存在。

1 漏洞现状

漏洞一为一个URL型注入漏洞,网址为http://**.***.com/more3.aspx?menuid=11&;&childid=21,在网址后面手工添加and 1=1,网页依然正常显示,而改成and 1=2之后,网页没有显示,说明手工添加的数据都作为参数提交到数据库执行了,说明存在注入漏洞,如果将添加的内容改为其他的SQL语句可以对数据库进行其他的非授权操作。

漏洞二为一个搜索型注入漏洞,网址为网站首页(http://**.***.com/),首页左侧有一个搜索信息功能,后台页面search.aspx没有对在该文本框中输入的搜索信息过滤,如果攻击者在搜索框中填写了特殊的SQL语句,也会提交到数据库执行,导致信息泄露,甚至数据库被破解,后台被掌控,带来很大的安全隐患。

漏洞三为一个登录型注入漏洞,网址为网站后台登陆页面(http://**.***.com/login.aspx),在用户名或密码框中输入拼接的SQL语句(如' or '1'='1),可以直接登陸后台,网站完全被黑客控制。

2 漏洞原理

SQL注入是攻击者在URL地址、提交的表单数据中人为构造畸形的SQL语句,欺骗后台程序对数据库执行未授权的查询、增、删、改等操作,进而获取网站的管理员账号,掌握网站控制权,篡改网页。

最简单的例子就是在密码框password中输入' or '1'='1,那么SQL查询语句就变成了:

select * from users where password='' or '1'='1'

这个查询永远为真,攻击者不需要用户名密码就可以登录后台。

3 修补原理'

根据SQL注入原理,要阻止SQL注入就是要过滤掉非法的数据提交,不让非法语句提交到数据库执行。如何识别非法数据,就成为漏洞修补的关键。可以从正反两方面来判断数据是否合法,如果能确定合法数据的字符组合特征,并且非法数据肯定不符合该字符组合特征,则可以从识别合法数据的角度来过滤数据。如果合法数据的字符组合特征也包含了非法数据的可能,而非法数据的特征比较明显,则可以从识别非法数据的角度来过滤数据。

设定合适的字符组合规则和选用合适的工具进行匹配就是数据过滤的关键。正则表达式(又称规则表达式,在代码中常简写为regex、regexp或RE)就是一个非常合适的匹配工具,可以用来对提交的数据与预先设定好的规则进行匹配。主流的程序设计语言都支持利用正则表达式进行字符串操作。

4 修补方案

4.1 漏洞一修补方案

因为menuid,childid两个参数的合法值全部为数字,而非法数据含SQL语句,肯定不会全部为数字,所以可以从识别合法数据的角度来进行数据过滤。

正则表达式设定为\d{1,5},即1到5位数字。采用if(!Regex.IsMatch(menuid, @"^\d{1,5}$"))来判断menuid参数是否不匹配该正则表达式,如果不匹配,则弹出警告,不提交到数据库中执行。其中^表示匹配字符串的开始,$表示匹配字符串的结束,@符号表示后面字符串中的转义序列“不”被处理。代码如下:

using System.Text.RegularExpressions; /*引入命名空间*/

if(!Regex.IsMatch(menuid,?@"^\d{1,5}$"))

{

Response.Write ("检测到SQL注入危险, 请勿非法操作!");

Response.End();

}

if(!Regex.IsMatch(childid,?@"^\d{1,5}$"))

{

Response.Write ("检测到SQL注入危险, 请勿非法操作!");

Response.End();

}

4.2 漏洞二修补方案

因为合法数据为字符串,而非法数据也为字符串,所以不好从识别合法数据的角度进行数据过滤。但非法数据中含select、update、delete、insert、or、and、=、等SQL语句中的关键词,可以从识别非法数据的角度来进行数据过滤。代码如下:

using System.Text.RegularExpressions;

string pattern =@"'|;|#|([\s\b+()]+(select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[\s\b+]*)";

Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);

if (rgx.IsMatch(title)) /* title为搜索框信息变量 */

{

Response.Write ("检测到SQL注入危险, 请勿非法操作!");

Response.End();

}

4.3 漏洞三修补方案

漏洞三的修补和漏洞二一样,也是从识别非法数据的角度进行过滤,只需将方案二中的title变量改成用户名、密码的变量username、password,然后分别检测即可。将漏洞二、漏洞三设置成两个类别的目的是为了提醒程序员,黑客可以从搜索框、用户名密码框进行注入。

5 系统调试

5.1 手工测试

对漏洞一,采用单引号测试法(在网址后面添加单引号)、1=1测试法(在网址后面添加 and 1=1或and 1=2),发现都会弹出注入警告,不再出现正常显示的网页或错误代码,证明非法数据被识别,未提交数据库执行。

对漏洞二、三,分别在搜索框、用户名密码框中输入' or '1'='1,发现都会弹出注入警告,不再出现正常显示的网页或错误代码或登录成功,证明非法数据未提交数据库执行。

5.2 工具软件测试

采用工具软件SQLMAP进行注入测试,均提示” [CRITICAL] all tested parameters appear to be not injectable” ,说明已经不可注入,证明漏洞已经修补。

6 结语

注入漏洞风险性极大,应该引起足够重视。正则表达式能有效的对数据进行合法性检验,过滤非法数据,保障网站安全。另外,还应在防火墙上做相应的防护策略,阻止黑客对网站的渗透测试,渗透测试虽然不一定能成功,但会严重占用服务器CPU、内存资源,降低网站反应速度,甚至对网站的稳定性、可用性带来很大威胁。最后,采用网页静态化技术可以有效降低网站被注入的危险,提高网站安全性。

[责任编辑:朱丽娜]endprint

猜你喜欢

修补
腹腔镜手术治疗胃穿孔疗效分析
技术的使命:在“修补”中完善设计
钢板粘贴法在某高桩码头加固改造中的应用
混凝土裂缝修补过程中新材料的作用