灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2268回复:0

XSS漏洞的出现与防范分享

楼主#
更多 发布于:2013-01-21 14:27

出现情况

简单来说,在使用模板变量输出源码时,忽略了本该转义的url、html或js,若变量的值包含特殊格式或攻击者人为构造出特殊格式时出现。

若这些模板变量:

1.未进行url转义①

示例:[table][tr][td=1,1,262]

常见模板变量出现场景
[/td][td=1,1,302]
源码
[/td][/tr][tr][td=1,1,262]
a标签的hred属性内
[/td][td=1,1,302]
<a href=”http:/mysite.com/pw_$vars”></a>
[/td][/tr][tr][td=1,1,262]
iframe、img、script、link等标签的src属性中
[/td][td=1,1,302]
< img src=” http:// mysite.com/pw_$vars”/>
[/td][/tr][tr][td=1,1,262]
js代码的被当做url使用的变量中
[/td][td=1,1,302]
var url = ‘http:// mysite.com/pw_$vars’
[/td][/tr][/table]

 

2.未进行html转义:②

示例:

常见模板变量出现场景
源码
title标签内
<title>pw_$user的个人中心</title>
Input的value值
< input value=” pw_$user”/>

 

3.未转义的js变量:③

示例:

常见模板变量出现场景
源码
页面内联script标签内的js 变量
var a = ‘pw_$a’
页面内dom元素0级事件内
<div onclick=”someFunction(pw_$param)”>
在异步所使用的模板中
pw_$callback{    pw_$obj   }

 

4.需要先进性html转义,后进行js转义:④

示例:

常见模板变量出现场景
源码
页面内联script标签内的js 语句内,后续将插入页面
dom.innerHTML = “pw_$vars”;或
document.write(“pw_$vars”)

 

5.需要先进性js转义,后进行html转义:⑤

示例:

常见模板变量出现场景
源码
页面内dom元素0级事件内方法的参数
<div onclick=”someFunction(pw_$param)”>

 

防治办法

根据上面的红色标记,主要采取下表的防治办法:

类型
smarty转义
其他
①   进行url转义
pw_$var|escape:”url”
类似于js内的encodeURIComponent,整体转义
转义字符:转义了除 ! ‘ ( ) * – . _ ~ 0-9 a-z A-Z 之外的所有字符,它们被转换成了各自对应的16进制的转义序列,中文字符在不同charset下得到的结果不一样
②   进行html转义
pw_$var|escape:”html”
Tangarm提供了一个利用js转义的方法baidu.string.encodeHTML,在利用js生成html模板时内部的变量可用
转义字符:smarty提供的方法转义了< > ‘ “4个字符,一般转义这4个即可,tangram提供的方法还多转义了 ; 字符,一共转义了5个字符
③   进行js转义
pw_$var|escape:”javascript”
转义字符:’ ” / n r
④   先进行html后进行js转义
pw_$var|escape:”html”|escape:”javascript”
实际上最终转义了字符:
“<” 转成 “<”
“>” 转成 “>”
“’” 转成 “’”
“”” 转成 “””
“” 转成 “\”
“/” 转成 “/”
“n” 转成 “n”
“r ”转成 “r”
⑤   先进行js后进行html转义
pw_$var|escape:” javascript “|escape:”html”
实际上最终转义了字符:
“<” 转成 “<”
“>” 转成 “>”
“;” 转成 “;”
“’” 转成 “'”
“”” 转成 “"”
“” 转成 “\”
“/” 转成 “/”
“n” 转成 “n”
“r” 转成 “r”

 

高级

1使smarty默认转义:在显示页面前先执行$smarty->default_modifiers = array(‘$’ => ‘escape:”html”‘);则所有的$开头的smarty变量都默认转义了,若需要取消转义,则对无需转义的变量使用pw_$var|smarty:nodefaults

2同域下的异步操作:尽量采用ajax的方式,少使用插入script标签的方式,可以减少因为callback函数名未转义而出现的xss漏洞

3请服务器端将json类型的数据Response的hearer 的contentType设置为“application/javascript”


喜欢0 评分0
游客

返回顶部