5. XSS测试方法
1)容易出现XSS注入的地方
XSS测试就是在容易出现XSS注入的地方输入被测代码,提交后观察其显示是否会触发JavaScript脚本。常用的XSS测试JavaScript脚本主要就下面两个。
- 隐示注入:<img src=# onerror=alert(/XSS/) />
- 显示注入:<script>alert(document.cookie)</script>
当然也要考虑与原有代码的上下文,通过一些符号屏蔽源代码,具体参见3所示。
3 容易出现XSS注入的地方
页面中容易出现的地方 |
JavaScript输出的地方 |
JavaScript输入的地方 |
|
HTTP请求参数 |
document.write() |
Windows.location(href,scr) |
|
POST参数 |
document.writeln() |
Windows.name |
|
HTTP头 |
XXX.innerHTML= |
Document.referrer |
|
JavaScript输入输出 |
XXX.outerHTML= |
Document.cookie |
|
隐含表单 |
innerHTML.replace |
Localstoage |
|
预定义值 |
document.attachEvent() |
XMLHttpRequest返回的数据 |
|
可选项 |
window.attachEvent() |
… |
|
留言板 |
document.location.replace() |
||
评论区 |
document.location.assign() |
||
用户信息 |
… |
||
… |
|||
2)关于富文本的测试
”等。在处理富文本XSS注入的时候要对允许出现的标签列入白名单,比如“
3)测试技巧
下面来介绍几个XSS注入的测试技巧。
①绕过长度
见下面代码。
如果输入type=text的值为:"\">alert(/1/)<span>,按理来说,</span><span>标签变为:</span>"\">alert(/1/)"maxlength="21" name="a"/><span>,可以形成注入的,但是有</span><strong>maxlength="21"</strong><span>存在,上面的字符串只能输入:</span><strong>"\">alert(/1/</strong><span>,后面部分全部被折断。在这里换一个注入字符串:</span>"onclick=alert(/1/)//<span>,字符串的长度为正好为</span>21<span>,注入以后</span><input><span>标签变为:</span><input type=textvalue=""onclick=alert(/1/)//" maxlength="21"name="a"/><span>,只要点击这个</span><input><span>文本框即可触发</span>XSS PayLoad<span>。</span></span></div><div style="text-align: justify; text-indent: 28px;"><span class="lake-fontsize-12"><span><br /></span></span></div><div style="text-align: justify; text-indent: 28px;"><span class="lake-fontsize-12">XSS PayLoad<span>的长度既然可以通过</span>maxlength<span>属性进行控制,那么如果把这个</span>PayLoad<span>放到</span>URL<span>参数中去,就可以绕过长度了。见下面代码。</span></span></div><div data-card-type="block" data-ready-card="codeblock" data-card-value="data:%7B%22mode%22%3A%22plain%22%2C%22code%22%3A%22%3Cinput%20type%3D%5C%22text%5C%22name%3D%5C%22a%5C%22%20onclick%3D%5C%22eval(location.hash.substr(1))%5C%22%3E%22%2C%22heightLimit%22%3Atrue%2C%22margin%22%3Atrue%2C%22id%22%3A%22p06FY%22%7D"></div><div><br /></div><div style="text-align: justify; text-indent: 28px;"><span class="lake-fontsize-12"><span>页面加载完毕,在</span>URL<span>后加入</span>#XSS PayLoad Code<span>(比如:</span>#alert(1)<span>),输入回车键,点击</span><input><span>文本框,</span>XSS PayLoad Code<span>就被触发了。</span></span></div><div style="text-align: justify; text-indent: 28px;"><span class="lake-fontsize-12"><br /></span></div><div style="text-align: justify; text-indent: 28px;"><span class="lake-fontsize-12">下面再来看看一个例子。</span></div><div data-card-type="block" data-ready-card="codeblock" data-card-value="data:%7B%22mode%22%3A%22plain%22%2C%22code%22%3A%22%3Cinput%20name%3D%5C%22a%5C%22type%3D%5C%22text%5C%22%20value%3D%5C%22%5C%22%20%2F%3E%20xxxxx%20%3Cinputname%3D%5C%22b%5C%22%20type%3D%5C%22text%5C%22%20value%3D%5C%22%5C%22%20%2F%3E%22%2C%22heightLimit%22%3Atrue%2C%22margin%22%3Atrue%2C%22id%22%3A%2223Rn1%22%7D"></div><div><br /></div><div style="text-align: justify; text-indent: 28px;"><span class="lake-fontsize-12"><span>这里存在两个文本输入框,一个里面输入“</span><strong>"><!--</strong><span>”,另一个里面输入“</span><strong>--><script>alert(/xss/);</strong></a></li><table><tbody><tr><td></td></tr><tr></tr></tbody></table><div><br /></div>