Web 安全编程实战Web 安全编程实战Web 安全问题很多时候会被程序员所忽略因为他们相信会有专业的运维人员或者安全服务团队帮助他们寻找漏洞并且指导他们修改这些漏洞。而对于小公司没有这样专业的人员又怎么办呢安全漏洞造成了很多不必要的维护和开发任务产生的问题有时候更是致命的。实际上只要程序员养成一些习惯知道一些安全问题的基本原理可以很大程度避免问题的出现这也是一个优秀 Web 程序员的必备素质。本文用实际的 JSP 程序例子讲解了 Web 安全问题的类型和其出现的原因讲解基本解决方法帮助 Web 程序员改善编程习惯。1评论魏 强, 实习生, 东北大学软件学院王 芹华, 研究员, IBM邵 兵, 研究员, IBM2010 年 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 actionReflectXSSServer methodpost 用户名input typetext nameusername value/br 密 nbsp; 码input typepassword namepassword value/br input typesubmit 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?errorpassword 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攻击者就可以很容易的攻击用户并且获得用户的重要信息。攻击此程序可以设计这样一个 URLhttp://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 idtl scopeapplication classjava.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 actionsaveXSS.jsp methodpost 评论input typetext nametopic/br input typesubmit 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)以上资料如何领取