在.NET Web应用中,XSS依然是最常见的安全漏洞之一。它的危害在于,攻击者可以将恶意脚本注入到应用的输出中,从而劫持用户会话、篡改页面内容,甚至实现远程控制。对于开发者和防御工程师来说,如何在应用中可靠地防御XSS,是一个必须掌握的技术点。
本文以通用XSS修复函数为切入点,详细讲解其设计原理、局限性以及在.NET环境下的工程实现方法。我们将通过代码示例与分析,展示如何将理论落地为实际可用的防御策略。
许多团队在遇到XSS报告时,倾向于编写一个“通用修复函数”,在输入阶段对用户数据进行清理。
首先,把最显眼的危险字符替换为实体,从而把输入变为安全的文本,很多团队把这作为第一道防线。
input = Regex.Replace(input, "&", "&");input = Regex.Replace(input, "'", "´");input = Regex.Replace(input, """, """);input = Regex.Replace(input, "<", "<");input = Regex.Replace(input, ">", ">");input = Regex.Replace(input, "/", "&;");
接着,反复 HtmlDecode
并规范化实体,阻止像 &amp;lt;
、&;
、& ;
等“多层编码”绕过。循环直到稳定,是为了解决编码混合或双重编码的问题。
do { previous = input; input = Regex.Replace(input, "(&#*\w+)[\x00-\x20]+;", "$1;"); input = Regex.Replace(input, "(&*[0-9A-F]+);*", "$1;", RegexOptions.IgnoreCase); input = Regex.Replace(input, "&(amp|lt|gt|nbsp|quot);", "&$1;"); input = HttpUtility.HtmlDecode(input);} while (previous != input);
随后,如果 >
出现在属性值里,替成 >
,防止属性被提前关闭。使用 lookbehind/lookahead 试图只在“属性的引号内”替换 >
。
input = Regex.Replace(input, "(?<=(<[\s\S]*=\s*"[^"]*))>(?=([^"]*"[\s\S]*>))", ">", RegexOptions.IgnoreCase);
on*
事件属性(如 onclick
、onerror
) 与 xmlns
,并把 javascript:
、vbscript:
打断,破坏协议式脚本注入。input = Regex.Replace(input, "(<[^>]+?[\x00-\x20"'/])(on|xmlns)[^>]*>", "$1>", RegexOptions.IgnoreCase);input = Regex.Replace(input, "([a-z]*)[\x00-\x20]*=...j a v a s c r i p t:", "$1=$2nojavascript...", RegexOptions.IgnoreCase);
免责声明:此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。任何未经授权的网络渗透、入侵或对他人网络破坏的活动而造成的直接或间接后果和损失,均由使用者为自身的行为负责并承担全部的法律和连带责任,与本号及作者无关,请务必遵循相关法律法规。本文所提供的工具仅用于学习和本地安全研究和测试,禁止用于其他方面。
以上相关的知识点已收录于新书《.NET安全攻防指南》,全书共计25章,总计1010页,分为上下册,横跨.NET Web代码审计与红队渗透两大领域。
上册深入剖析.NET Web安全审计的核心技术,帮助读者掌握漏洞发现与修复的精髓;下册则聚焦于.NET逆向工程与攻防对抗的实战技巧,揭秘最新的对抗策略与技术方法。
20+专栏文章
海量文档资源
专属成员交流群
已入驻的大咖们
欢迎加入我们
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...