APP下载

基于.NET的信息系统SQL注入防御研究*

2010-08-15葛昕杨小东岳敏楠

中国教育信息化 2010年13期
关键词:上海理工大学攻击者日志

葛昕,杨小东,岳敏楠

(1.上海理工大学网络中心,上海200093;2.上海理工大学研究生部,上海200093)

基于.NET的信息系统SQL注入防御研究*

葛昕1,杨小东2,岳敏楠1

(1.上海理工大学网络中心,上海200093;2.上海理工大学研究生部,上海200093)

使用.NET开发信息系统是近年来高校广泛采用的一种形式,因此针对它的攻击也日益增多,其中最为严重的SQL注入攻击,可以彻底摧毁数据库,并给攻击者打开登录系统的后门。本文以上海理工大学研究生信息系统和Web网站为研究样本,分析了流行的注入攻击代码,给出了修复此攻击的方法,并设计了一套行之有效的SQL注入防御系统,此方法在实际应用中得到了证明。

.NET;SQL注入;存储过程;信息系统

一、前言

随着网络基础建设日趋成熟,信息系统的应用也越来越广泛,而同时产生的问题就是网络攻击的不断出现。在众多的攻击手段中,SQL注入式攻击是较易掌握并容易获得成功的一种攻击方式,特别是一些自动化的SQL注入工具的出现,如NBSI2、DOMAIN3等,更是使得许多动态站点成为SQL攻击下的牺牲品。而造成这种情况的一个主要原因就是程序员在编写程序时没有对用户提交数据的合法性进行验证,从而使得程序存在隐患。SQL注入是从正常的WWW端口访问,表面看起来跟一般的Web页面访问没什么区别,这类攻击属于应用层攻击,所以以往的基于包过滤法、基于状态检测法等完全无效。要解决SQL注入攻击问题,就必须在应用层进行充分的防范来确保系统的安全。上海理工大学研究生部的多个应用系统都采用了.NET+SQL作为开发环境,本文就是以此为平台进行研究。

二、SQL注入攻击代码分析

SQL注入攻击的具体过程为:发现SQL注入位置;判断后台数据库类型;确定XP_CMDSHELL可执行情况;发现Web虚拟目录;上传ASPX木马;得到管理员权限。[1]发现SQL注入位置是整个攻击的源头,攻击者将某些经过精心构造的特殊的SQL字符串插入到Web表单的输入域,欺骗服务器执行恶意的SQL命令,即可判断出是否存在注入点。[2]SQL注入的手法相当灵活,在注入时通过构造巧妙的SQL语句,可以使系统错误地授权给攻击者,帮助其成功获取想要的数据,或者修改数据,进而在网站进行挂马操作。以下是近来最为流行的注入攻击的存储过程,其结果可以将数据库中多数类似varchar字段的内容修改为木马地址来进行系统挂马。

DECLARE@T varchar(255),@C varchar(255)

DECLARE Table_Cursor CURSOR FOR//定义游标

SELECTa.name,b.nameFROM sysobjectsa,syscolumnsb

WHERE a.id=b.id AND a.xtype=′u′AND(b.xtype =99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) //当表字段类型为ntext、text、xtype、nvarchar、varchar时

OPENTable_CursorFETCHNEXTFROM Table_Cursor INTO@T,@C

WHILE(@@FETCH_STATUS=0)

BEGIN

EXEC(′update[′+@T+′]set[′+@C+′]=rtrim (convert(varchar,[′+@C+′]))+′′<script src=http://挂马网站地址/1.js></script>′′′)//将字段内容修改为挂马网站地址

FETCH NEXT FROM Table_Cursor INTO@T,@C

END

CLOSE Table_Cursor DEALLOCATE Table_Cursor

这种方式利用系统代码中存在的漏洞进行注入,先遍历数据库中某些特定字段类型,将记录中该字段插入含有js文件的恶意script标签,即木马的地址。虽然这些js文件的内容不同,但是他们都尝试利用已经被修复的Microsoft产品的漏洞或者第三方ActiveX控件的漏洞。由于这些脚本被单独存储,因此很容易被更新以利用客户端更新的漏洞,也更容易按照不同浏览器来定制。对于这种破坏,我们只要采用类似注入攻击的方法将注入代码中间部分替换为如下代码,运行后即可将数据库中的恶意代码删除。

DECLARE@str varchar(500)//声明要替换的字符

set@str=′<script src=http://挂马网站地址/1.js></ script>′//这里是你要替换的字符

OPEN Table_Cursor FETCH NEXT FROM Table_ Cursor INTO@T,@C

WHILE(@@FETCH_STATUS=0)

BEGIN

EXEC(′update[′+@T+′]set[′+@C+′]=replace (cast([′+@C+′]as varchar(8000)),′′′+@str+′′′,′′′′)′) //清除记录内容中含有的木马地址

FETCH NEXT FROM Table_Cursor INTO@T,@C

END

三、SQL注入防御系统

为了能够主动地防御SQL注入攻击,我们可以将所有传入的SQL参数全部使用存储过程来实现,但对于一些已经在使用的系统显然不现实,而且使用分页存储时如果进行拼接字串来替换危险字符仍会有漏洞。为了保护原有代码不做修改,可以采用另一种方法,对传入参数进行过滤。本文设计了一个综合防御系统,包括三个部分:检测模块、过滤模块和记录模块。检测模块用于检测系统数据库是否已受注入破坏,过滤模块对所有要传入的参数做SQL关键字符过滤,日志模块用于对尝试注入的攻击进行日志记录,帮助管理员进行日常安全性分析与维护。对于所有使用.NET+SQL构造的信息系统,只要将过滤模块加载在所有要使用数据库系统的页面中即可实现对SQL注入的防御。以下只列出最为核心的过滤模块和日志模块中的关键代码。

//判断用户请求字符是否含有SQL注入攻击字符

private bool ProcessSqlStr(string Str)//Str为用户提交数据

{bool ReturnValue=true;

try{if(Str.Trim()!="")

{string SqlStr="and|exec|insert|select |delete|update|count|*|chr|mid|master|truncate|char| declare";//用户可自行定义过滤参数

string[]anySqlStr=SqlStr.Split(′|′);

foreach(string ss in anySqlStr)

{if(Str.ToLower().IndexOf(ss)>=0)

{ReturnValue=false;

break;}

}

}

}

catch{ReturnValue=false;}

return ReturnValue;

}

在服务器上建立一个文件夹AttackLog,创建日志文件log.aspx用于存放每天SQL攻击操作产生的日志。以下为记录日志部分核心代码。

public partial class ErrorLog_Log:System.Web.UI.Page

{

protected void Page_Load(objectsender,EventArgse)

{

Log(HttpUtility.UrlDecode(Request["PreUrl"]));

}

private void Log(string url)

{

DateTime dt=DateTime.Now;

string fileName=Server.MapPath("/AttackLog") +"\Log"+dt.ToString("yyyy_MM_dd")+".log";

string content=dt.ToString()+","+Request. UserHostAddress+","+url+" ";

File.AppendAllText(fileName,content);

//Response.Redirect("/errorPage.htm l");

}

}

四、对于.NET信息系统的安全建议

对于.NET开发的信息系统,被攻击的根本原因还是程序编码有漏洞,故在编写程序时,可以参考以下建议,加强程序代码的安全性。

第一,在构造动态SQL语句时,使用类安全的参数代码机制。

第二,限制表单或查询字符串输入的长度,这可以很大程度上增加攻击者在SQL命令中插入有害代码的难度。

第三,检查用户输入的合法性,确信输入的内容只包含合法的数据。为了弥补客户端验证机制脆弱的安全性,数据检查在服务器端也需要执行。

第四,在部署应用前,对所有的编码做安全审评。不把敏感数据在数据库里以明文存放。敏感数据应该在单向加密过后再存放。将用户输入的数据加密后,再与数据库中保存的数据比较,相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。

第五,检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。

第六,只给访问数据库的Web应用功能所需的最低权限。

五、小结

本文分析了流行的SQL注入方法及恢复手段。设计了一个简单有效的防御系统,可对常见SQL注入进行阻断,其日志功能在记录攻击数据形式的同时为我们进一步完善系统指出了方向。系统采用页面调用形式,可移植性强、部署简单,并可自定义过滤参数。上海理工大学研究生部采用.NET+SQL Server开发了多个信息应用系统,从Web站点到综合教务管理系统在前期都不断受到各种SQL注入攻击的考验。在部署了本防御系统后,经过长期运行,在各个应用系统上都起到了很好的拦截效果,为保证信息系统的稳定运行提供了可靠的保障。☉

[1]张洪星,褚建立.基于ASP.NET的SQL注入攻击及防范解决方案[J].电脑知识与技术,2006(35).

[2]戴诗发.校园网SQL注入攻击与防范技术研究[J].昆明理工大学学报,2005.Vol.30(3).

(编辑:隗爽)

book=11,ebook=16

TP309.2

A

1673-8454(2010)13-0011-03

*本文受上海市研究生教育创新计划资助,项目编号:SLCXPY1001。

猜你喜欢

上海理工大学攻击者日志
一名老党员的工作日志
《上海理工大学学报》征稿简则
上海理工大学
扶贫日志
《上海理工大学学报(社会科学版)》征稿简则
《上海理工大学学报(社会科学版)》征稿简则
雅皮的心情日志
正面迎接批判
正面迎接批判
游学日志