范义山
【摘 要】网站SQL注入漏洞风险性极大,并且非常普遍,要检查网站是否有SQL注入漏洞非常容易,但是要修补SQL注入漏洞,还是需要一定的编码能力和实际经验。本文以一个真实的SQL注入漏洞修补过程为例,讲解注入漏洞修补方法。
【关键词】SQL注入漏洞;修补;正则表达式
近日,我单位某部门网站被教育行业漏洞报告平台报告含有SQL注入漏洞,并给出了具体的路径、参数和截图,经我们验证漏洞确实存在。
1 漏洞现状
漏洞一为一个URL型注入漏洞,网址为http:/
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))
{
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



