当前位置:首页 >> 互联网 >>

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


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 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, ID bDataParameter[] 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 攻击。 编码方法 使用场景
不受信任的

示例

<a href=”http://www.cnblogs.com”>Click Here [不受信任的输

HtmlEncode(String)

HTML 代 入]</a> 码。

不受信任的 HtmlAttributeEncode(String) HTML 属性

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

<script type=”text/javascript”>
不受信任的 输入在

… [Untrusted input]

JavaScriptEncode(String)
JavaScript 中使用

… </script>

<a
不受信任的 UrlEncode(String) URL

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

<script type=”text/vbscript” language=”vbscript”>
不受信任的 输入在

… [Untrusted input]

VisualBasicScriptEncode(String)
VBScript 中使用

… </script>

不受信任的

XmlEncode(String)

输入用于 XML 输出

<xml_tag>[Untrusted input]</xml_tag>

不 受信任

<xml_tag attribute=[Untrusted input]>Some
XmlAttributeEncode(String) 的输入用作

Text</xml_tag>
XML 属性 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.Te xt); }

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

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.as px?userRequest={1}", Request.ApplicationPath.TrimEnd('/'), HttpUtility.Url Encode(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)限制敏感页面或目录的访问权限。


相关文章:
常见WEB安全漏洞及整改建议
常见WEB安全漏洞及整改建议_计算机软件及应用_IT/...一个图片上的随机字 符串,这个方案可以完全解决 ...6.2 整改建议: 在编码阶段开发者对敏感页面缺乏...
Web应用中常见39种不同的安全漏洞漏洞分析及检查方法
Web 应用中常见 39 种不同的安全漏洞漏洞分析及...xss filter Xss filter 往往是一个文本文件,里面...其他修复方案 1) 开发者应该严格按照 openid 和 ...
web应用常见安全漏洞
web应用常见安全漏洞_互联网_IT/计算机_专业资料。...有一 个安全的密钥分发和应急处理的方案; 安全误配置...开发人员需要和网络管理人员共同确保所有层次都合理...
java开发常见漏洞及处理说明
java开发常见漏洞处理说明 - 本文专门介绍针对java web程序常见高危安全漏洞(如:SQL注入 、 XSS跨站脚本攻击、文件上传)的过滤和拦截处理
常见WEB安全漏洞及整改建议创新
常见WEB安全漏洞及整改建议创新_建筑/土木_工程科技_专业资料。常见 WEB 安全...(所有表单都包含同一个伪随机值): 这可能是最简单的解决方案了,因为攻击者不...
WEB开发安全漏洞修复方案
WEB开发安全漏洞修复方案_其它_工作范文_实用文档。web开发过程中可能遇到的问题...Web开发常见的几个漏洞解... 12页 免费 web开发安全技术培训教程... 137页...
常见安全漏洞的处理及解决方法
常见安全漏洞的处理及解决方法 - 相关名词解释、危害与整改建议 1、 网站暗链 名词解释 “暗链”就是看不见的网站链接,“暗链”在网站中的链接做的非 常隐蔽,...
网站常见三种漏洞攻击及防范方法
网站常见三种漏洞攻击及防范方法_互联网_IT/计算机_专业资料。国内外黑客组织或者...我们也应该注意到这些威胁大是 基于 Web 网站发起的攻击, 在给我们造成不可...
关于Web安全漏洞的心得及解决方案
关于Web安全漏洞的心得及解决方案_IT/计算机_专业资料...(嵌入远程脚本加载,与上面实例相同 如果开发人员将...这里 就分享几个可能常用的 php 和 apache 的配置...
web应用的漏洞分类
泄露漏洞是由于 Web 服务器或应用程序没有正确处理...对 Web 应用开发者而言 大部分 Web 应用常见漏洞,...应用漏洞漏洞,可以从如下几个方面入手进行防御: 不...
更多相关标签: