`

Web开发常见的几个漏洞解决方法

 
阅读更多

Web开发常见的几个漏洞解决方法

作者: 伍华聪  来源: 博客园  发布时间: 2014-04-11 16:57  阅读: 3458 次  推荐: 9   原文链接   [收藏]  

  平时工作,多数是开发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 from TestDB.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",
                "exec master.dbo.xp_cmdshell",
                "net localgroup administrators"
            };
            //构造正则表达式
            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 By Name 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注入的恶意数据");
            }
            ...........................
        }

  以上只是防止Sql攻击的一个方面,还有就是坚持使用参数化的方式进行赋值,这样很大程度上减少可能受到SQL注入攻击。

            Database db = CreateDatabase();
            DbCommand command = db.GetSqlStringCommand(sql);
            command.Parameters.AddRange(param);

  3、跨站脚本攻击漏洞出现和修复

  跨站脚本攻击,又称XSS代码攻击,也是一种常见的脚本注入攻击。例如在下面的界面上,很多输入框是可以随意输入内容的,特别是一些文本编辑框里面,可以输入例如<script>alert('这是一个页面弹出警告');</script>这样的内容,如果在一些首页出现很多这样内容,而又不经过处理,那么页面就不断的弹框,更有甚者,在里面执行一个无限循环的脚本函数,直到页面耗尽资源为止,类似这样的攻击都是很常见的,所以我们如果是在外网或者很有危险的网络上发布程序,一般都需要对这些问题进行修复。

  XSS代码攻击还可能会窃取或操纵客户会话和 Cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务。[建议措施]清理用户输入,并过滤出 JavaScript 代码。我们建议您过滤下列字符:

  [1] <>(尖括号)

  [2] "(引号)

  [3] '(单引号)

  [4] %(百分比符号)

  [5] ;(分号)

  [6] ()(括号)

  [7] &(& 符号)

  [8] +(加号)

  为了避免上述的XSS代码攻击,解决办法是可以使用HttpUitility的HtmlEncode或者最好使用微软发布的AntiXSSLibrary进行处理,这个更安全。

  微软反跨站脚本库(AntiXSSLibrary)是一种编码库,旨在帮助保护开发人员保护他们的基于Web的应用不被XSS攻击。

编码方法

使用场景

示例

HtmlEncode(String)

不受信任的HTML代码。 <a href=”http://www.cnblogs.com”>Click Here [不受信任的输入]</a>
HtmlAttributeEncode(String) 不受信任的HTML属性

<hr noshade size=[不受信任的输入]>

JavaScriptEncode(String)

不受信任的输入在JavaScript中使用

<script type=”text/javascript”>

[Untrusted input]

</script>

UrlEncode(String) 不受信任的URL

<a href=”http://cnblogs.com/results.aspx?q=[Untrusted input]”>Cnblogs.com</a>

VisualBasicScriptEncode(String)

不受信任的输入在VBScript中使用

<script type=”text/vbscript” language=”vbscript”>

[Untrusted input]

</script>

XmlEncode(String)

不受信任的输入用于XML输出

<xml_tag>[Untrusted input]</xml_tag>

XmlAttributeEncode(String) 不 受信任的输入用作XML属性

<xml_tag attribute=[Untrusted input]>Some Text</xml_tag>

        protected void Page_Load(object sender, EventArgs e)
        {
            this.lblName.Text = Encoder.HtmlEncode("<script>alert('OK');</SCRIPT>");
        }

  例如上面的内容,赋值给一个Lable控件,不会出现弹框的操作。

  但是,我们虽然显示的时候设置了转义,输入如果要限制它们怎么办呢,也是使用AntiXSSLibrary里面的HtmlSanitizationLibrary类库Sanitizer.GetSafeHtmlFragment即可。

        protected void btnPost_Click(object sender, EventArgs e)
        {
            this.lblName.Text = Sanitizer.GetSafeHtmlFragment(txtName.Text);
        }

  这样对于特殊脚本的内容,会自动剔除过滤,而不会记录了,从而达到我们想要的目的。

  4、IIS短文件/文件夹漏洞出现和修复

  通过猜解,可能会得出一些重要的网页文件地址,如可能在/Pages/Security/下存在UserList.aspx和MenuList.aspx文件。

  [建议措施]

  1)禁止url中使用“~”或它的Unicode编码。

  2)关闭windows的8.3格式功能。

  修复可以参考下面的做法,或者找相关运维部门进行处理即可。

  http://sebug.net/vuldb/ssvid-60252

  http://webscan.360.cn/vul/view/vulid/1020

  http://www.bitscn.com/network/security/200607/36285.html

  5、系统敏感信息泄露出现和修复

  如果页面继承一般的page,而没有进行Session判断,那么可能会被攻击者获取到页面地址,进而获取到例如用户名等重要数据的。

  一般避免这种方式是对于一些需要登录才能访问到的页面,一定要进行Session判断,可能很容易给漏掉了。如我在Web框架里面,就是继承一个BasePage,BasePage 统一对页面进行一个登录判断。

    public partial class UserList : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
          ...............
    /// <summary>
    /// BasePage 集成自权限基础抽象类FPage,其他页面则集成自BasePage
    /// </summary>
    public class BasePage : FPage
    {
        /// <summary>
        /// 默认构造函数
        /// </summary>
        public BasePage()
        {
            this.IsFunctionControl = true;//默认页面启动权限认证
        }
        /// <summary>
        /// 检查用户是否登录
        /// </summary>
        private void CheckLogin()
        {
            if (string.IsNullOrEmpty(Permission.Identity))
            {
                string url = string.Format("{0}/Pages/CommonPage/Login.aspx?userRequest={1}",
                    Request.ApplicationPath.TrimEnd('/'), HttpUtility.UrlEncode(Request.Url.ToString()));
                Response.Redirect(url);
            }
        }
        /// <summary>
        /// 覆盖HasFunction方法以使权限类判断是否具有某功能点的权限
        /// </summary>
        /// <param name="functionId"></param>
        /// <returns></returns>
        protected override bool HasFunction(string functionId)
        {
            CheckLogin();
            bool breturn = false;
            try
            {
                breturn = Permission.HasFunction(functionId);
            }
            catch (Exception)
            {
                Helper.Alerts(this, "BasePage调用权限系统的HasFunction函数出错");
            }
            return breturn;
        }
        protected override void OnInit(EventArgs e)
        {
            Response.Cache.SetNoStore(); //清除缓存
            base.OnInit(e);
            CheckLogin();
        }

  否则可能会受到攻击,并通过抓包软件发现页面数据,获得一些重要的用户名或者相关信息。

  还有一个值得注意的地方,就是一般这种不是很安全的网络,最好要求输入比较复杂一点的密码(强制要求),例如不能全部是数字密码或者不能是纯字符,对位数也要求多一点,因为很多人输入12345678,123456,123这样的密码,很容易被猜出来并登录系统,造成不必要的损失。

  6、总结性建议

  针对上面发现的问题,提出下面几条建议。

  1)在服务器与网络的接口处配置防火墙,用于阻断外界用户对服务器的扫描和探测。

  2)限制网站后台访问权限,如:禁止公网IP访问后台;禁止服务员使用弱口令。

  3)对用户输入的数据进行全面安全检查或过滤,尤其注意检查是否包含SQL 或XSS特殊字符。这些检查或过滤必须在服务器端完成。

  4)关闭windows的8.3格式功能。

  5)限制敏感页面或目录的访问权限。

分享到:
评论

相关推荐

    ASP.NET Web应用程序常见网络安全漏洞解决方案分析.pdf

    本文将深入探讨*** Web应用程序中常见的网络安全漏洞,并提供相应的解决方案。 首先,跨站点脚本攻击(XSS)是Web应用中最普遍和最危险的漏洞之一。XSS攻击者通常会将恶意的JavaScript代码注入到网站页面中,当其他...

    Web编程常见漏洞与检测

    本文将深入探讨几种常见的Web漏洞及其检测方法,帮助Web设计者和管理者提升应用的安全性。 1. **SQL注入**:SQL注入是最常见的Web安全漏洞之一,它允许攻击者通过输入恶意的SQL代码来操纵数据库。当应用程序没有...

    web常见漏洞思维导图.rar

    在实际工作中,我们需要结合这些思维导图和具体的安全测试工具,深入理解每个漏洞的细节,结合业务场景进行安全评估,以提升Web应用的安全性。同时,定期进行安全培训和漏洞扫描,及时更新系统和软件,是构建稳固...

    常见网络安全漏洞常规漏洞.pdf

    利用这个漏洞,攻击者可以执行任意代码或获取敏感文件。 5. 不安全的对象引用(Insecure Direct Object References) 不安全的对象引用是指应用程序暴露了内部实现对象的直接引用(如文件路径、数据库键值等)。...

    web漏洞概述

    下面将详细讨论标题和描述中提到的几个关键的Web漏洞类型及其防范方法。 首先,物理路径泄露是由于服务器处理用户请求时出现错误导致的。攻击者可能通过提交超长请求、构造特殊请求或请求不存在的文件来暴露服务器...

    多种上传漏洞及常见系统的利用方法整理

    根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 一、上传漏洞概述 上传漏洞是Web应用中常见的安全问题之一,它允许攻击者通过上传恶意文件(如包含后门的脚本)来控制服务器或窃取敏感数据。在ASP...

    asp漏洞分析和解决方法

    总之,理解和防范ASP漏洞是每个Web开发者和系统管理员的必备技能。通过深入分析漏洞类型,运用合适的检测方法,并采取有效的解决措施,可以大大提高ASP应用程序的安全性,保障网站的稳定运行。同时,持续学习和关注...

    超级Web漏洞扫描器

    1. **自动检测**:SWebVulnsScan能够自动化地扫描Web应用,检查一系列常见的安全漏洞,如SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)、文件包含漏洞、未授权访问等。 2. **深度扫描**:工具深入分析HTTP(S)...

    Web应用安全漏洞分析

    在深入探讨Web应用安全漏洞分析之前,需要对以下几个方面进行详细阐述: 首先,Web应用安全漏洞按照风险程度分为高、中、低三个等级。高风险漏洞可能允许攻击者完全控制受影响的系统,而低风险漏洞可能仅导致有限的...

    椰树WEB漏洞扫描器

    综合以上信息,椰树WEB漏洞扫描器提供了全面的Web安全解决方案,不仅针对基本的SQL注入和XSS漏洞,还关注旁站扫描、CMS安全及漏洞数据库更新,对于维护网络安全具有重要意义。配合压缩包中的配置文件和库,用户可以...

    Web应用SQL注入漏洞检测工具的设计与实现.pdf

    在设计Web应用SQL注入漏洞检测工具时,需要关注的几个关键点包括: 1. 采用网络爬虫技术建立URL库:通过网络爬虫技术爬取需要检测的Web应用URL,为后续的SQL注入检测提供基础数据。 2. 精心构造基于SQL注入模板的...

    web安全开发培训

    在Web安全开发中,有以下几个核心知识点: 1. **SQL注入**:这是最常见的Web应用漏洞之一,攻击者通过输入恶意的SQL代码,获取、修改或删除数据库中的敏感信息。防御方法包括参数化查询、预编译语句和使用ORM(对象...

    百度2008WEB开发笔试题

    根据这些信息,我们可以推测,2008年百度的WEB开发笔试可能涉及以下几个关键知识点: 1. **HTML与CSS**:作为网页构建的基础,理解HTML标记语言和CSS样式表是必要的,可能会有编写符合W3C标准的静态页面、布局设计...

    Web 程序 SQL 漏洞检测工具.zip

    Web应用程序的SQL漏洞是网络安全领域中的一个重要话题,它涉及到数据库查询语句的不安全执行,可能导致数据泄露、数据篡改甚至整个系统的瘫痪。SQL(Structured Query Language)注入是一种常见的攻击手段,攻击者...

    phpweb的文件破解并修复万能密码漏洞

    "phpweb的文件破解并修复万能密码漏洞"是一个关于如何识别、分析以及解决PHPWeb系统中常见安全问题的主题。这个话题聚焦于`post.php`文件,这是一个处理HTTP POST请求的关键文件,很可能涉及用户输入的数据验证和...

    四种主流Web开发技术的比较

    ### 四种主流Web开发技术的比较 #### 摘要与引言 本文通过比较四种主流Web开发技术,旨在帮助开发者理解不同技术的特点、优势与局限性,从而更好地选择适合特定应用场景的技术栈。主要比较内容包括:按请求执行...

    F5 Web安全解决方案

    - **BIG-IP Advanced WAF的防御能力**:F5的BIG-IP Advanced WAF可以抵御常见的应用层攻击,并整合由WhiteHat威胁研究中心验证的扫描结果,生成针对每个漏洞及应用程序的虚拟补丁。 该解决方案提供端到端的Web应用...

    Java.Web开发实战1200例.第2卷光盘资源下载地址

    它通常包括但不限于以下几个方面的知识点: 1. **Servlet**:Servlet是Java Web开发的基础组件,用于处理客户端请求并生成动态响应。它是运行在服务器端的小程序,能够根据HTTP请求生成HTTP响应。 2. **JSP (Java...

Global site tag (gtag.js) - Google Analytics