2 软件安全测试
2.1 XSS注入
XSS(Cross SiteScripting),由于与层叠样式表(CascadingStyle Sheets,CSS)的缩写混淆。因此一般缩写为XSS。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。攻击代码,在XSS中称作PayLoad。
1. XSS原理
比如有以下一段HTML代码。
<input type='text'value='$var' name='username' /> 其中value的参数$var是由用户输入,通过以下jsp代码获得的。 <% Stringname=request.getPrarmeter("username"); %> <%=name%>
假设用户输入的$var参数为“<script>alert(/XSS/)</script>”,前端HTML代码为。
<input type='text'value='<script>alert(/XSS/)</script>' name='username' />
后端显示变为。
<script>alert(/XSS/)</script>
这样JavaScript程序被运行。虽然这段JavaScript注入代码(学名为PayLoad)非常简单,但是可以变为一段非常可怕的侵入代码,获取客户端包括操作系统内的所有信息。
2. XSS注入分类
XSS注入可以分为三类,“反射型XSS”“存储型XSS”和“DOM型 XSS”。
1)反射型XSS(Non-Persistent XSS)
反射型只是简单地把用户输入的数据反射给浏览器,黑客需要诱使用户点击链接。也叫“非持久型XSS”上一节中的注入就属于反射型XSS。
2)存储型XSS(Persistent XSS)
存储型XSS把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。比如博客产品将博文标题与内容存储在MySQL数据库中,然后通过jsp程序将其显示在网页上。
<% String title = rs.getTitle(); String content =rs.getContent(); %> <P> 文章标题:<%= title %><br/> 文章内容:<%= content %><br/> </P>
如果title或者content包含XSS PayLoad,这样页面就存在威胁了。
3)DOM型 XSS
在讲解DOM型 XSS前先简单介绍一下什么是DOM树。对于任何一个HTML网页都可以看作是从<html>标签到文本节点的一颗“树”,这颗“树”叫做DOM树。如8下面这段HTML代码的DOM树。
<html> <head> <title>文档标题</title> </head> <body> <a href="#">我的链接</a> <h1>我的标题</h1> </body> </html>
8 DOM树
DOM型 XSS注入在原有的HTML对应的DOM树中插入一个节点,然后在这个节点上注入XSS的PayLoad。请看如下代码。
<script> function test(){ var str=document.getElementById("text").value; document.getElementById("t").innerHTML ="<ahref='"+str+"'>testlink</a>" } <body> <divid="t"></div> <input type="text"id="text" value="" /> <inputtype="button" id="s" value="write"onclick="test()"/><br> <textareaname="input" rows="10"cols="40">'onclick=alert(/XSS/) // 或者输入: ' ><imgsrc=# onerror=alert(/XSS/) /><' </textarea> </form> </body>
JavaScript代码在id="t"的位置插入一个标签为<a>的DOM节点,标签<a>节点的href属性来源于id="text"的< input >属性的值。如果用户输入“'onclick=alert(/XSS/) //”,标签变为。
<a href=''onclick=alert(/XSS/)//'>testlink</a>
当点击testlink这个超链接,XSS PayLoad就被触发。或者如果用户输入“<ahref=''><img src=# onerror=alert(/XSS/) /><''>testlink</a>”,标签变为。
<a href=''><img src=#onerror=alert(/XSS/) /><''>testlink</a>
这个时候,不用点击testlink这个超链接,XSS PayLoad就被触发。
3. XSS会话挟持
如果将上面XSS PayLoad的alert(/XSS/)改为alert(document.cookie),看看会发现什么情形。代码如下。
… <% response.addHeader("Set-Cookie","username=jerry;Expires=Thu,01-Jan-203000:00:01 GMT;path=/"); response.addHeader("Set-Cookie","password=123456;Expires=Thu,01-Jan-203000:00:01 GMT;path=/"); %> … window.onload=function load(){ window.location.href="login11.jsp"} …
在login11.jsp有如下代码。
<inputtype="button" value="显示Cookies"onclick="javascript:alert(document.cookie)">
当点击【显示Cookies】的后就会把“username=jerry;password=123456”给显示出来。程序通常会在Cookie中设置一些用户隐私信息,这些信息一旦泄露,是否有一定威胁的。那么有什么办法可以不让用户获得Cookie信息呢?这个时候“HTTPOnly”这个武器就出场了。HttpOnly cookie最初是由Microsoft Internet Explorer开发人员于2002年在Internet Explorer 6 SP1的版本中实现。HttpOnly是Set-Cookie HTTP响应头中包含的附加标志。生成cookie时使用HttpOnly标志有助于降低客户端脚本访问受保护cookie的风险(如果浏览器支持它)。把上面代码修改一下。
… <% response.addHeader("Set-Cookie","username=jerry;Expires=Thu,01-Jan-203000:00:01 GMT;path=/;HttpOnly"); response.addHeader("Set-Cookie","password=123456;Expires=Thu,01-Jan-203000:00:01 GMT;path=/;HttpOnly"); %> … window.onload=function load(){ window.location.href="login11.jsp"} … <inputtype="button" value="显示Cookies"onclick="javascript:alert(document.cookie)">
在login11.jsp代码不变。这个时候当点击【显示Cookies】的后,username和password的cookie信息都不将被显示。HttpOnly在JavaScript、PHP、ASP、JSP脚本以及JBOSS、Tomcat、Apatch等WEB Service中均可以设置。比如在TomCattom中的/conf/ 目录下context.xml修改<Context useHttpOnly="true">即可将所有的Cookies设置HttpOnly。
4. XSS蠕虫
XSS蠕虫是一种危害最大的XSS注入PayLoad,通过AJAX技术使成千上万的网民中招,曾经在百度等各大网站上都发生过。如9所示。
9 XSS蠕虫效应
下面来简单介绍一下XSS蠕虫。微博系统的URL如下:http://www.mydomain.com。其中。
- http://www.mydomain.com/Listen.php:查看自己的微博。
- http://www.mydomain.com/forward.php?userid=7&articleid=23:编号为123的微博转发个编号为7的用户,其中123为微博号,7为用户号。
- http://www.mydomain.com?userinfo.php:查看自己的粉丝信息。
第一步:发表一个正常微博文章,记录文章的articleID, 假设为23
第二步:通过http://www.mydomain.com?userinfo.php获取所有userid,存在一个数组中。
第三步:在博文中添加下面代码。
<script> function GetUserId(){ …//通过AJAX获得UserId returnUserId; } function GetForWardUrl(){ foreach user{ var UserId = GetUserId(); var ForWardUrl ="http://www.mydomain.com/forward.php?userid="+ UserId+"&articleid=23" }} function ListenUser(){ varlistenUrl = "http://www.mydomain.com/Listen.php; …//通过AJAX或者其他方式查看 } function ForWard(){ varforWardUrl = GetForWardUrl(); …//通过AJAX或者其他方式访问此URL转发微博 } function attack(){ ForWard(); //把本文章转发给用户 ListenUser(); //查看自己的微博 } attack(); //蠕虫发作 </script>
第四步:通过ListenUser()方法查看这篇博文,蠕虫发作。这五个函数调用图如10所示。
10 XSS蠕虫代码函数调用图
攻击函数attack()先调用ForWard(),GetForWardUrl()遍历通过第二步存储的用户ID,产生一个把本微博发给每一个粉丝的超链接,并且让每一位粉丝访问这篇微博。然后调用方法ListenUser()查看自己微博,从而触发整个蠕虫病毒的发作。
星云测试
奇林软件
联合通测
顾翔凡言:
图是软件项目三角形。
图 软件项目三角形
下面做如下假设。
l 假设质量(Q)与范围(S)不变,时间(T)减少的情形下,必须雇佣高水平的人员或者先进的技术,即增大产品的成本(C)。同理,质量(Q)与范围不变,时间(T)增加的情形下,可以减少成本(C)。
l 假设质量(Q)与时间(T)不变,范围(S)增加的情形下,也必须增大成本(C)。同理,质量(Q)与时间(T)不变,范围(S)减少的情形下,可以减少成本(C)。
l 假设质量(Q)与成本(C)不变,时间(T)减少的情形下,范围(S)必须减少。同理,质量(Q)与成本(C)不变,时间(T)增加的情形下,可以加大范围(S)。
于是可以得到如下公式:
Q = TC/S
也就是说质量消耗单位模块的时间和金钱的乘积。从这里可以看出,完成一个功能,需要达到一定的质量,必须消耗有效的时间或者增加产品的成本投入,由此可以看出为了赶进度,盲目加班赶工是不可取的。