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

来源 :中国教育信息化·高教职教 | 被引量 : 0次 | 上传用户:tomjerry2005
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:使用.NET开发信息系统是近年来高校广泛采用的一种形式,因此针对它的攻击也日益增多,其中最为严重的SQL注入攻击,可以彻底摧毁数据库,并给攻击者打开登录系统的后门。本文以上海理工大学研究生信息系统和Web网站为研究样本,分析了流行的注入攻击代码,给出了修复此攻击的方法,并设计了一套行之有效的SQL注入防御系统,此方法在实际应用中得到了证明。
  关键词: .NET;SQL注入;存储过程;信息系统
  中图分类号:TP309.2文献标识码:A文章编号:1673-8454(2010)13-0011-03
  
  一、前言
  随着网络基础建设日趋成熟,信息系统的应用也越来越广泛,而同时产生的问题就是网络攻击的不断出现。在众多的攻击手段中,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//定义游标
  SELECT a.name,b.name FROM sysobjects a,syscolumns b
  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时
  OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T, @C
  WHILE( @@FETCH_STATUS = 0 )
  BEGIN
  EXEC (′update [′ @T ′] set [′ @C ′]=rtrim(convert(varchar,[′ @C ′])) ′′′′′ ) //将字段内容修改为挂马网站地址
  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=′ ′ // 这里是你要替换的字符
  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(object sender, EventArgs e)
  {
  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.html");
   }
  }
  四、对于.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).
  (编辑:隗爽)
其他文献
京津冀区域经济一体化作为我国具有代表性的经济发展区域,已成为我国三大经济增长极之一。京津冀一体化的发展能够加强区域内合作,而且可以带动周边区域经济的发展,进而促进
信息技术的发展为人们的生产和生活带来了巨大改变。文章从信息技术在高校的发展和对高校的影响出发,说明数字化校园的建设已经是势在必行,阐述了校园数字化所要达到的目的以
当前学术界针对“文学性”问题又展开了一系列的讨论,但是为什么“文学性”又成为一个问题?为什么文学终结论会与文学性扩散问题相结合?这都与文学生存空间的变化有关。对文学生
机电工程项目是目前较为普遍的应用,在铁路行业中发挥着不可替代的重要作用,因此应当做好项目质量控制,以提升铁路运行的稳定性。文章论述了铁路机电工程项目质量控制的原则,
在电力供电系统的综合运行中,110kV SF6断路器对于供电有很大的作用,通过形成多样化的控制要点,可以实现110kV SF6断路器的综合功能,实现电网运行的正常性。文章围绕110kV SF
在纪念辛亥革命100周年之际,由冯祖贻、曹维琼、敖以深主编的《辛亥革命贵州事典》近日由贵州人民出版社出版了,我有幸在第一时间得到冯老师的惠赐。品读之余,谈谈个人的几点感
随着现代服务业的快速发展及建设终身学习型社会理念的提出,数字化教育服务产业成为政府和社会关注的产业。本文根据供应链管理理论及服务供应链相关理论,对数字教育服务链的概
煤矿产煤质量的优劣与煤炭洗选设备有很大关系。基于传统洗选设备继电器控制系统的缺陷和不足,文章通过对煤炭洗选设备的工艺流程进行分析,提出了PLC控制系统,根据系统需求对
旅游业对社会经济发展和对外开放具有先导作用和关联作用,它将在西部大开发战略中发挥特殊作用,“西部大开发,旅游应先行”正在成为共识。在当今条件下,将民族文化资源转化为现实