关闭

记一次成功的SQL注入入侵检测附带SQL性能优化

发表于:2011-9-30 09:53

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:jqbird    来源:51Testing软件测试网采编

  很多同学和园友都遇到过sql注入的,其中大部分都是代码的不严谨造成的,都是犯过很多错误才学会认真起来。

  但是如果是让你接手一个二等残废的网站,并让你在上面改版,而且不能推翻式改版,只能逐步替换旧的程序,那么你会非常痛苦,例如我遇到的问题:

  问题1

  老板对你说,以前刚做完网站好好了,没有出现木马,怎么你来了,就会出现木马,先别说了,赶紧解决问题,我彻底无语,但是如果争吵,其实证明你和老板一样无知,拿出证据和事实分析来让公司其他稍微懂技术的一起来证明,公司网站被挂马不是你来了的错。

  如是我通过网站目录仔细排查将通过fck上传的网马删除并修补fck的上传漏洞并记下了这篇  Fckeditor使用笔记 ,其实很多人都遇到过,也解决过,都是小问题,但是让你老板明白比解决漏洞问题更蛋疼,我那解释的叫一个汗啊,恨不得把公司所有稍微懂点技术的都叫上让他们看什么是大马什么是小马,然后演示怎么上传木马,奶奶的,黑客教程普及啊。

  问题2

  网站又出现问题,上次的问题解决了不过两个月,网站又被入侵挂马,如是老板这次再说因为我来了才出问题,立马走人,这就是为什么不能更不懂技术的人硬碰硬,更不能和你的老板来说,说了你又不懂。

  但是要命的是网站是以前的技术开发的二等残废,在别个的cms上修改的,我必须保证网站在的开发的同时旧的模块还可以使用,通过逐步更新的方法将网站底层翻新,但是那么多页面,你很难一个一个去检测那个页面有漏洞,如是写出下面的检测代码,没想到这么简单的就搞定了,并且可以通过此方法优化你的sql。

  第一步建立一个sql日志表

  • CREATE TABLE [dbo].[my_sqllog](  
  •     [id] [bigint] IDENTITY(1,1) NOT NULL,  
  •     [hit] [bigintNULL,  
  •     [sqltext] [varchar](maxCOLLATE Chinese_PRC_CI_AS NULL,  
  •     [paramdetails] [varchar](maxCOLLATE Chinese_PRC_CI_AS NULL,  
  •     [begintime] [datetime] NULL,  
  •     [endtime] [datetime] NULL,  
  •     [fromurl] [varchar](maxCOLLATE Chinese_PRC_CI_AS NULL,  
  •     [ip] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,  
  •     [lastelapsedtime] [bigintNULL,  
  •  CONSTRAINT [PK_my_sqllog] PRIMARY KEY CLUSTERED   
  • (  
  •     [id] ASC 
  • )WITH (IGNORE_DUP_KEY = OFFON [PRIMARY]  
  • ON [PRIMARY]
  •   记录sql语句、此sql语句被执行次数,参数及值,记录开始时间,结束时间,来自哪个页面,ip和此条语句执行时间(暂时没用)

      第二步在sqlhelper里写记录代码

      两个方法本来可以写成private的,但是此二等残废的网站其他地方用的别的sqlhelper类,就直接调用此处通过合理优化的sqlhelper类的方法了。

      代码1:插入日志

  • public static int ExecuteSqlLog(CommandType commandType, string commandText, params DbParameter[] cmdParams)  
  •         {  
  •             #region 参数处理  
  •             string colums = "";  
  •             string dbtypes = "";  
  •             string values = "";  
  •             string paramdetails = "";  
  •             if (cmdParams != null && cmdParams.Length > 0)  
  •             {  
  •                 foreach (DbParameter param in cmdParams)  
  •                 {  
  •                     if (param == null)  
  •                     {  
  •                         continue;  
  •                     }  
  •                     colums += param.ParameterName + " ";  
  •                     dbtypes += param.DbType + " ";  
  •                     values += param.Value + ";";  
  •                 }  
  •                 paramdetails = string.Format(" {0},{1},{2}", colums, dbtypes, values);  
  •             }  
  •             string fromurl = "";  
  •             if (System.Web.HttpContext.Current!=null)  
  •             {  
  •                 fromurl = System.Web.HttpContext.Current.Request.Url.ToString();  
  •             }  
  •            // commandText = commandText.Replace("'","‘").Replace(";",";");  
  •             SqlParameter[] parameters = new SqlParameter[]  
  •                                           {  
  •                                               new SqlParameter("@hit",1),  
  •                                               new SqlParameter("@sqltext",commandText),  
  •                                               new SqlParameter("@paramdetails",paramdetails),  
  •                                               new SqlParameter("@begintime",DateTime.Now),  
  •                                               new SqlParameter("@endtime",DateTime.Now),  
  •                                               new SqlParameter("@fromurl",fromurl),  
  •                                               new SqlParameter("@ip",Web.PressRequest.GetIP()),  
  •                                               new SqlParameter("@lastelapsedtime",0),   
  •                                           };  
  •              
  •             #endregion  
  •             using (DbConnection connection = Factory.CreateConnection())  
  •             {  
  •                 connection.ConnectionString = GetRealConnectionString(commandText);//ConnectionString;  
  •                 string sql = "";  
  •                 // 执行DbCommand命令,并返回结果.  
  •                 int id =  
  •                     Utils.TypeConverter.ObjectToInt(ExecuteScalarLog(CommandType.Text,  
  •                                                                   "select top 1 id from my_sqllog where sqltext=@sqltext",  
  •                                                                   new SqlParameter("@sqltext", commandText)));  
  •                 if (id > 0)  
  •                 {  
  •                     sql = "update my_sqllog set hit=hit+1,ip=@ip,endtime=@endtime,fromurl=@fromurl where id=" + id;  
  •                 }  
  •                 else 
  •                 {  
  •                     sql = "insert into my_sqllog(hit,sqltext,paramdetails,begintime,endtime,fromurl,ip,lastelapsedtime) values(@hit,@sqltext,@paramdetails,@begintime,@endtime,@fromurl,@ip,@lastelapsedtime)";  
  •                 }  
  •                 // 创建DbCommand命令,并进行预处理  
  •                 DbCommand cmd = Factory.CreateCommand();  
  •                 bool mustCloseConnection = false;  
  •                 PrepareCommand(cmd, connection, (DbTransaction)null, commandType, sql, parameters, out mustCloseConnection);  
  •                 // 执行DbCommand命令,并返回结果.  
  •                 int retval = cmd.ExecuteNonQuery();  
  •                 // 清除参数,以便再次使用.  
  •                 cmd.Parameters.Clear();  
  •                 if (mustCloseConnection)  
  •                     connection.Close();  
  •                 return retval;  
  •             }  
  •             
  •         }
  • 31/3123>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号