当前位置: 首页 > news >正文

Web 安全编程实战

Web 安全编程实战

Web 安全编程实战

Web 安全问题,很多时候会被程序员所忽略,因为他们相信会有专业的运维人员或者安全服务团队帮助他们寻找漏洞,并且指导他们修改这些漏洞。而对于小公司,没有这样专业的人员又怎么办呢?安全漏洞造成了很多不必要的维护和开发任务,产生的问题有时候更是致命的。实际上,只要程序员养成一些习惯,知道一些安全问题的基本原理,可以很大程度避免问题的出现,这也是一个优秀 Web 程序员的必备素质。本文用实际的 JSP 程序例子,讲解了 Web 安全问题的类型和其出现的原因,讲解基本解决方法,帮助 Web 程序员改善编程习惯。
1评论:
魏 强, 实习生, 东北大学软件学院
王 芹华, 研究员, IBM
邵 兵, 研究员, IBM
2010 年 12 月 09 日

  • 内容
    注:本文所有的例子虽然基于 JSP/Servlet 技术开发,但是漏洞和解决方法的原理适用于其他 Web 技术。

Web 安全现状

Web 安全现状不容乐观,近几年也存在 Web 攻击的重大实际案例,比如信息产业部官方报纸《中国电子报》网站被黑、大学生网络银行盗窃案等。另据调查显示,目前网站常见攻击手段中,SQL 注入、XSS 和跨站脚本攻击占了很大部分。攻击者往往没有明确的目的性,有些攻击并不能带给他们利益,只是出于初学的好奇和攻击成功的成就感,也就是说许多攻击由于初学者引起的。实际上,像很多初学骇客的攻击都可以被防御,只要我们了解其基本原理,就可以应付许多菜鸟骇客的攻击,减少运维费用。所以文章再一次强调 Web 程序员需要注意编程习惯,尽力保证网站的安全。
回页首

实战

文章从实际的 JSP 例子出发,尽力解释安全问题产生的原因。这些例子代码是本人初学 JSP,也是许多人在开始学习 JSP 时容易编写的问题代码。代码看起来并没有什么问题,但是往往存在巨大的漏洞。例子虽然简单,却很能说明问题。文章将用 6 个例子,分别讲述 6 种 Web 攻击手段及原理,以及程序员需要从哪些方便进行防御。可以从图片介绍中查看效果。讲解 6 种 Web 漏洞的顺序如下表,读者也可以选择感兴趣的部分点击查看。

  • 反射型 XSS 漏洞
  • 保存型 XSS 漏洞
  • 重定向漏洞
  • 本站点请求漏洞
  • 跨站点请求漏洞
  • SQL 注入漏洞
    在文章的附件代码中,包含上述各个列表项的示例程序,每个列表项对应了单独的项目文件夹,以漏洞名称命名,可以直接使用 Jee Eclipse 打开。
问题代码 — 反射型 XSS 漏洞

反射型 XSS 漏洞是一种非常常见的 Web 漏洞,原因是由于程序动态显示了用户提交的内容,而没有对显示的内容进行验证限制。因此这就让攻击者可以将内容设计为一种攻击脚本,并且引诱受害者将此攻击脚本作为内容显示,而实际上攻击脚本在受害者打开时就开始执行,以此盗用受害者信息。
例子是动态显示错误信息的程序,错误信息可以在 URL 中传递,显示时服务器不加任何限制,符合反射型 XSS 攻击的条件。

清单 1. index.jsp 主要代码
<form action="ReflectXSSServer" method="post"> 用户名:<input type="text" name="username" value=""/><br> 密 &nbsp; 码:<input type="password" name="password" value=""/><br> <input type="submit" value="提交"/> </form>
清单 2. ReflectXSSServe.java 主要代码
String username = request.getParameter("username"); String password = request.getParameter("password"); // 添加用户信息到 Cookie,方便下次自动登录 addToCookie(“username”, username); addToCookie(“password”, password); request.getRequestDispatcher(" error.jsp?error=password is wrong!").forward(request, response);
清单 3. error.jsp 主要代码
Error Message :<%=request.getParameter("error")%>

index.jsp 作为用户登录界面,提交登录请求给 ReflectXSSServe.java。ReflectXSSServe.java 处理登录请求,将用户名和密码记录到 cookie,方便用户下次登录。如果登录信息错误 ( 例子代码直接认为错误 ),就会跳转到 error.jsp,显示错误信息,错误信息是通过名为 error 的参数传递。
问题分析
代码很简单,似乎也很合逻辑,但是这个程序暴露出一个严重的问题就是错误信息是通过参数传递,并且没有经过任何处理就显示。如果被攻击者知道存在这样一个 error.jsp,攻击者就可以很容易的攻击用户并且获得用户的重要信息。
攻击此程序
可以设计这样一个 URL:http://localhost:8080/application/error.jsp?error=。这看起来有点复杂,让我们分析一下。http://localhost:8080/application/error.jsp?error= 这一部分,是 error.jsp 的地址,我们主要关心后面的错误信息内容,这是一段 javascript 脚本,document.cookie.match(new%20RegExp("password=([^;]/)”))[0],这样一句话,是为了获得 cookie 中名为 password 的值。然后,通过 window.location 重定向到攻击者的网站,并且把 password 作为参数传递过去,这样,攻击者就知道你的密码了。后面,只需要让被攻击者登录后点击这个 URL 就可以了。
为了让被攻击者可以点击这个 URL,攻击者往往会构建能够吸引被攻击者的网页,或者邮件,这个做法有个形象的称呼:钓鱼攻击。当被攻击者登录应用系统后,cookie 就保存了用户名和密码信息。由于设计的 URL 的主体是收信任的网站,被攻击者往往毫不犹豫的点击攻击者设计的 URL,那么设计好的 script 脚本被当做信息内容嵌入到 error.jsp 中时,就会作为脚本开始执行,用户名和密码也就被人盗取了。

图 1. 用户登录界面


用户输入用户名和密码分别为 user 和 pass,登录后受到钓鱼攻击,点击了攻击者设计的 URL。

图 2. 诱使用户点击 URL


攻击者设计的 URL 包含攻击脚本,攻击脚本执行后,password 的内容被传到另一个网站,这个应用程序是 attacter(附件中也会包含),password 信息被记录到攻击者的数据库。

图 3. 攻击成功界面


解决方法
尽量避免直接显示用户提交的数据,应进行一定的过滤,比如对于数据中存在的 < 和 > 等符号需要进行编码,这样就可以防止脚本攻击。

问题代码 — 保存型 XSS 漏洞

保存型 XSS 漏洞的危害会更大,它是将攻击脚本保存到被攻击的网页内,所有浏览该网页的用户都要执行这段攻击脚本。
这个例子,模仿了一个论坛发表评论的网页。对于用户的评论,系统不加任何限制和验证,直接保存到服务器的数据库中(例子使用全局对象代替数据库,作为例子演示)。并且当有其他用户查看网页时,显示所有评论。

清单 4. saveXSS.jsp 主要代码
<jsp:useBean id="tl" scope="application" class="java.util.LinkedList"></jsp:useBean> <% String topic = (String)request.getParameter("topic"); if (topic != null && !topic.equals("")) { tl.add(topic); } %> <div> <% for(Object obj : tl) { String str = (String)obj; %> <div><%=str%><div/> <% } %> </div> <form action="saveXSS.jsp" method="post"> 评论:<input type="text" name="topic"/><br> <input type="submit" value="提交"/> </form>

这里用了一个应用级的 List 对象存放评论列表,只是为了演示方便。用户可以在 form 中编写评论内容,提交到同一页面 saveXSS.jsp,提交以后,List 对象增加这个评论,并且显示出来。
问题分析
这个程序符合了保存型 XSS 攻击的所有条件,没有限制评论内容,程序会保存所有评论,显示给查看网页的用户。只要攻击者将攻击脚本作为评论内容,那么所有查看评论的用户都将执行这段攻击脚本而受到攻击。
攻击此程序
攻击这个程序所需要设计的攻击脚本和上文的错误显示内容一样,但是需要注意的是这次不需要编码,%20 改为空格,而 %2B 则变为 +,原因是上例是通过 URL 传递数据,而本例是直接通过表单传递数据,攻击脚本:,将这个内容作为评论发表,那么当其他用户查看这个网页时,攻击脚本代码被当做内容嵌入到网页中,攻击脚本就被触发执行,用户就会受到攻击,脚本执行过程和反射型 XSS 攻击一致。

图 4. 评论界面


发表的内容是攻击者设计的一个攻击脚本,这个脚本被直接保存到了网页中。任何查看此页面的其他用户,他们的信息都会被盗取。

图 5. 提交攻击脚本

参考资料

  • 参考 黑客攻防技术宝典 --Web 实战篇书籍,可以了解攻击手段的基本概念。
  • 查看文章“Rational AppScan: 全面检测 Web 安全漏洞的利器”,了解更多检测漏洞的方法。
  • 查看专区“developerWorks 中国:安全专区”,带领您学习如何开发安全的 IT 解决方案。
  • developerWorks Web development 专区:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。
  • developerWorks Ajax 资源中心:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。
  • developerWorks Web 2.0 资源中心,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过 Web 2.0 新手入门 栏目,迅速了解 Web 2.0 的相关概念。

原文链接:http://www.ibm.com/developerworks/cn/web/1012_weiqiang_webattack/

《网络安全从零到精通全套学习大礼包》

96节从入门到精通的全套视频教程免费领取

如果你也想通过学网络安全技术去帮助就业和转行,我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。

网络安全学习路线图

想要学习 网络安全,作为新手一定要先按照路线图学习方向不对,努力白费。对于从来没有接触过网络安全的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线,大家跟着这个路线图学习准没错。

配套实战项目/源码

所有视频教程所涉及的实战项目和项目源码

学习电子书籍

学习网络安全必看的书籍和文章的PDF,市面上网络安全书籍确实太多了,这些是我精选出来的

面试真题/经验

以上资料如何领取?

direct/92a6ab8e26034045b97ae8ac36b2a650.png)

以上资料如何领取?

http://www.jsqmd.com/news/697497/

相关文章:

  • Chrome插件(笔记篇)
  • 一辆智能汽车藏着上千个密钥!汽车行业 KMS 的 6 大核心应用场景深度解析
  • STM32 异步事件处理:中断、NVIC 与 EXTI 深度全书
  • 第十二天打卡 | 169.多数元素
  • 实测风速数据太长?手把手教你突破Bladed单点风100点限制的两种实用方法
  • 终极指南:如何用OpenVINO AI插件在Audacity中一键分离音乐人声与伴奏
  • 【无人机】固定翼无人机简化燃油燃烧仿真的模拟模型(Matlab代码实现)
  • 终极Windows键盘重映射指南:用SharpKeys免费解决键盘误触问题
  • C++26 contracts正式落地:从断言迁移、运行时/编译期混合检查到Profile-Guided Contract Pruning(PGCP)的5步跃迁
  • 2026年3月畅销的钢板供应商推荐,角钢/工字钢/无缝管/合金钢板/Q235B角钢/Q355B工字钢,钢板公司厂家销售 - 品牌推荐师
  • DDrawCompat:3步轻松解决Windows 11老游戏兼容性问题
  • 稀疏阵列设计避坑指南:IFT法、多阶加权怎么选?实测副瓣与计算成本对比
  • Starward:为米哈游游戏玩家打造的高效启动器与数据管理平台
  • ROS Gazebo仿真环境搭建避坑:为什么你的世界没有地面和太阳?
  • 2026 镀锌管,镀锌槽钢,镀锌角钢,镀锌方管厂家口碑推荐, 热镀锌无缝国标管材优选指南 - 海棠依旧大
  • 炉石传说脚本终极指南:快速实现自动化对战与卡组管理
  • 说明书
  • 别再死记硬背了!用这5类核心思想吃透LeetCode HOT 100(Java实现版)
  • Connery SDK:为AI应用构建标准化可执行动作的开发者工具
  • 5本免费计算机视觉入门书籍推荐与学习指南
  • 1Fichier下载管理器:突破限制的5个高效下载解决方案
  • 如何完全掌控你的微信聊天记录:免费开源工具WeChatMsg终极使用指南
  • 麒麟V10服务器多硬盘安装与分区实战:告别自动分区,手动分配/boot、swap和/根目录
  • 省级-文旅融合相关数据(2012-2022年)
  • 魔兽争霸III终极兼容性修复:让经典游戏在现代电脑重生
  • 2026年上海大型仿真模型定制与工业机械模型制造深度指南 - 企业名录优选推荐
  • 如何高效使用d2s-editor暗黑2存档编辑器:专业玩家的实战指南
  • [Rust][RISCV] 一、用 Rust 写 RISC-V BootROM —— 你需要知道的 Rust 基础
  • 如何永久保存微信聊天记录?WeChatMsg完整指南帮你一键搞定
  • 告别黑盒操作:深度解析ObjectARX自定义对象与特性面板(OPM)的通信机制