常见Web开发漏洞解决方法

由于一般的web开发项目主要是内部使用的业务系统,所以对于安全性一般不是看的很重,基本上由于是内网系统。但有时候一些系统平台,需要外网也要使用,这种情况下,各方面的安全性就要求比较高了,所以往往会交付给一些专门做安全测试的第三方机构进行测试,然后根据反馈的漏洞进行修复,如果你平常对于一些安全漏洞不够了解,那么反馈的结果往往是很残酷的,迫使你必须在很多细节上进行修复完善。本文针对这些漏洞问题的修复方案,介绍在这方面的一些经验。

 

基本上,参加的安全测试(渗透测试)的网站,可能或多或少存在下面几个漏洞:SQL注入漏洞、跨站脚本攻击漏洞、登陆后台管理页面、IIS短文件/文件夹漏洞、系统敏感信息泄露。

 

1、测试的步骤及内容

 

这些安全性测试,据了解一般是先收集数据,然后进行相关的渗透测试工作,获取到网站或者系统的一些敏感数据,从而可能达到控制或者破坏系统的目的。

 

第一步是信息收集,收集如IP地址、DNS记录、软件版本信息、IP段等信息。可以采用方法有:

 

1)基本网络信息获取;

 

2)Ping目标网络得到IP地址和TTL等信息;

 

3)Tcptraceroute和Traceroute 的结果;

 

4)Whois结果;

 

5)Netcraft获取目标可能存在的域名、Web及服务器信息;

 

6)Curl获取目标Web基本信息;

 

7)Nmap对网站进行端口扫描并判断操作系统类型;

 

8)Google、Yahoo、Baidu等搜索引擎获取目标信息;

 

9)FWtester 、Hping3 等工具进行防火墙规则探测;

 

10)其他。

 

第二步是进行渗透测试,根据前面获取到的数据,进一步获取网站敏感数据。此阶段如果成功的话,可能获得普通权限。采用方法会有有下面几种

 

1)常规漏洞扫描和采用商用软件进行检查;

 

2)结合使用ISS与Nessus等商用或免费的扫描工具进行漏洞扫描;

 

3)采用SolarWinds对网络设备等进行搜索发现;

 

4)采用Nikto、Webinspect等软件对Web常见漏洞进行扫描;

 

5)采用如AppDetectiv之类的商用软件对数据库进行扫描分析;

 

6)对Web和数据库应用进行分析;

 

7)采用WebProxy、SPIKEProxy、Webscarab、ParosProxy、Absinthe等工具进行分析;

 

8)用Ethereal抓包协助分析;

 

9)用Webscan、Fuzzer进行SQL注入和XSS漏洞初步分析;

 

10)手工检测SQL注入和XSS漏洞;

 

11)采用类似OScanner的工具对数据库进行分析;

 

12)基于通用设备、数据库、操作系统和应用的攻击;采用各种公开及私有的缓冲区溢出程序代码,也采用诸如MetasploitFramework 之类的利用程序集合。

 

13)基于应用的攻击。基于Web、数据库或特定的B/S或C/S结构的网络应用程序存在的弱点进行攻击。

 

14)口令猜解技术。进行口令猜解可以采用X-Scan、Brutus、Hydra、溯雪等工具。

 

第三步就是尝试由普通权限提升为管理员权限,获得对系统的完全控制权。在时间许可的情况下,必要时从第一阶段重新进行。采用方法

 

1)口令嗅探与键盘记录。嗅探、键盘记录、木马等软件,功能简单,但要求不被防病毒软件发觉,因此通常需要自行开发或修改。

 

2)口令破解。有许多著名的口令破解软件,如L0phtCrack、John the Ripper、Cain 等

 

以上一些是他们测试的步骤,不过我们不一定要关注这些过程性的东西,我们可能对他们反馈的结果更关注,因为可能会爆发很多安全漏洞等着我们去修复的。

 

2、SQL注入漏洞的出现和修复

 

1)SQL注入定义:

 

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

 

SQL注入有时候,在地址参数输入,或者控件输入都有可能进行。如在链接后加入’号,页面报错,并暴露出网站的物理路径在很多时候,很常见,当然如果关闭了Web.Config的CustomErrors的时候,可能就不会看到。

 

另外,Sql注入是很常见的一个攻击,因此,如果对页面参数的转换或者没有经过处理,直接把数据丢给Sql语句去执行,那么可能就会暴露敏感的信息给对方了。如下面两个页面可能就会被添加注入攻击。

 

①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD... type='U' and status>0)>0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则

 

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name fromTestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。

 

为了屏蔽危险Sql语句的执行,可能需要对进行严格的转换,例如如果是整形的,就严格把它转换为整数,然后在操作,这样可以避免一些潜在的危险,另外对构造的sql语句必须进行Sql注入语句的过滤,如我的框架(Winform开发框架、Web开发框架等)里面就内置了对这些有害的语句和符号进行清除工作,由于是在基类进行了过滤,因此基本上子类都不用关心也可以避免了这些常规的攻击了。

 

/// <summary> 

       /// 验证是否存在注入代码(条件语句) 

       /// </summary> 

       /// <param name="inputData"></param> 

       public bool HasInjectionData(string inputData) 

       { 

           if (string.IsNullOrEmpty(inputData)) 

                return false; 

 

           //里面定义恶意字符集合 

           //验证inputData是否包含恶意集合 

           if (Regex.IsMatch(inputData.ToLower(), GetRegexString())) 

           { 

                return true; 

           } 

           else

           { 

                return false; 

           } 

       } 

 

       /// <summary> 

       /// 获取正则表达式 

       /// </summary> 

       /// <returns></returns> 

       private static string GetRegexString() 

       { 

           //构造SQL的注入关键字符 

           string[] strBadChar = 

           { 

                //"select\\s", 

                //"from\\s", 

                "insert\\s", 

                "delete\\s", 

                "update\\s", 

                "drop\\s", 

                "truncate\\s", 

                "exec\\s", 

                "count\\(", 

                "declare\\s", 

                "asc\\(", 

                "mid\\(", 

                "char\\(", 

                "net user", 

                "xp_cmdshell", 

                "/add\\s", 

                "execmaster.dbo.xp_cmdshell", 

                "net localgroupadministrators"

           }; 

 

           //构造正则表达式 

           string str_Regex = ".*("; 

           for (int i = 0; i < strBadChar.Length - 1; i++) 

           { 

                str_Regex += strBadChar[i] +"|"; 

           } 

           str_Regex +=strBadChar[strBadChar.Length - 1] + ").*"; 

 

           return str_Regex; 

       }

上面的语句用于判别常规的Sql攻击字符,我在数据库操作的基类里面,只需要判别即可,如下面的一个根据条件语句查找数据库记录的函数。

 

 

/// <summary> 

       /// 根据条件查询数据库,并返回对象集合 

       /// </summary> 

       /// <param name="condition">查询的条件</param> 

       /// <param name="orderBy">自定义排序语句,如Order ByName Desc;如不指定,则使用默认排序</param> 

       /// <param name="paramList">参数列表</param> 

       /// <returns>指定对象的集合</returns> 

       public virtual List<T> Find(string condition, string orderBy,IDbDataParameter[] paramList) 

       { 

           if (HasInjectionData(condition)) 

           { 

               LogTextHelper.Error(string.Format("检测出SQL注入的恶意数据,{0}", condition)); 

                throw new Exception("检测出SQL注入的恶意数据"); 

           } 

 

           ........................... 

       }

 

本文为Anyforweb技术分享博客,需要了解网站建设及更多web应用相关信息,请访问anyforweb.com。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值