XSS一直被OWASP(Open Web Appliaction Secyritu Project,是世界上知名的Web安全与数据库安全研究组织) 组织评为十大安全漏洞中的第二威胁漏洞
HTML的script元素怒标记中间包含js,这使得浏览器知道:当遇到这一标记,不应将此标记内容处理成HTML或XHTML,从这一点开始,对于内容的控制权已经转移给另一个内置的浏览器代理——脚本引擎 处理。
弹处恶意警告框 :
<script>alert('xss')</script>
也可以是HTML代码段,不停刷新网页:
<meta http-equiv=" refresh " content="0;">
嵌入其他网站的链接:
<iframe src=http://www.baidu.com width=0 height=0></iframe>
反射型跨站脚本,主要将恶意脚本附加到URL地址的参数中,例如:
http://www.test.com/search.php?key="><script>alert('xss')</script>
http://www.test.com/logout.asp? out=1&javascript:alert(document.cookie)
反射型XSS恶意代码暴露在URL中,非常容易被发现,可以通过各种编码如十进制、十六进制、ESCAPE等转换解决
白盒测试是指知道程序内部的结构,也就是获得源代码的情况下对软件进行测试
黑盒测试则完全相反
灰盒测试介于两者之间
数据交互(即输入/输出)的地方最容易产生跨站脚本,因此我们着重对网站的输入框、URL参数进行测试。当然、所有来自Cookie、POST表单、HTTP头的内容都可能会产生XSS
在留言页面输入
<script>alert(/XSS/)</script>
,点提交页面没有任何迹象,因为用户提交的留言一般要通过后台管理员的审核才会显示登录后台管理员账号。看到我们输入的XSS被浏览器直接显示出来了,这种情况可能是对这条XSS进行了转义
查看源代码发现XSS代码被嵌入到
<textarea>
标签中,然后在浏览器直接显示出来重新修改XSS代码:
</textarea><script>alert(/XSS/)</script><textarea>
这种XSS攻击的对象是后台管理员,攻击者能利用此种XSS劫持管理员会话而执行任意操作,比如修改密码、备份数据库等
XSS Cheat Sheet
中文文档
英文文档
XSS Cheat Sheet几乎涵盖了目前所有可能触发XSS的测试用例
为了防御XSS,会在WEB应用中设计一个XSS Filter,即跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击、恶意的HTML或简单的HTML格式错误等
XSS Filter一般是基于黑白名单的安全过滤策略,即把要处理的数据分成白名单和黑名单两大列表,白名单存放的是可信赖、对应用程序不构成威胁的数据列表,黑名单则相反
XSS Filter的绕过
1、🐣 利用<>标记注射Html / js
XSS Filter首当其中要过滤和转义的就是
<>
和
<script>
如此一来
<script>shellcode</script>
这种形式就不复存在了
2、🐣利用HTML标签属性值执行XSS
很多HTML标记中的属性都支持
javascript:[code]
伪协议的形式,这个特殊的协议类型声明了URL的主体是任意的JS代码,由js的解释器运行
<table background="javascript:alert(/xss/)"></table>
<img src="javascript:alert(/xss/);">
利用IMG标记的src属性,如果没有弹出对话框,是因为不是所有Web浏览器都支持Javascript伪协议
并非所有标记的属性值都能产生XSS,只有引用文件的属性值才能触发XSS,可以用
href= lowsrc= bgsound= value= action= dynsrc=
要预防属性值的XSS,就要过滤js等关键字
3、🐣回车空格Tab
如果XSS Filter仅仅把敏感的输入字符列入黑名单处理,如对敏感字javascript而言,用户可以利用空格、回车和Tab绕过限制
<img src="javas cript:alert(/xss/);">
javas和cript间加上Tabjs语句通常以分号结尾,如果js引擎确定一个语句是完整的,而这一行结尾有换行符,那么可以省略分号,如果同一行中有多个语句,那么语句就必须使用分号来结束。除了在引号中分隔单词或强制结束语句外,额外的空白无论以何种方式添加都无所谓
4、🐣对标签属性值转码
此外,对普通HTML标记的属性值进行过滤,用户还可以通过编码处理来绕过,因为
HTML中属性值本身支持ASCII码形式
<img src="javascript:alert(/xss/);">
替换成
<img src="javascriptt:alert(/xss/);">
对应ASCII码表可以看出,t的ASCII值未116,用”t″表示, 冒号: 则表示为:还可以把、等字符插入的JavaScript或VBscript的头部,另外Tab符的ASCII码	、换行符的
、回车符的
可以插入到代码的任意地方,
末尾都需要加上分号
所以为了防范利用HTML标签属性编码的XSS,最好也过滤& # \ 等字符
5、🐣产生自己的事件
JS和HTML之间的交互是通过事件来实现的,事件就是用户或浏览器自身执行官的某种动作,比如click、mouseover、load等,而响应事件的函数就叫做事件处理函数(或事件侦听器)
<input type="button" value="click me" onclike="alert('click me')"/>
<img src="#" onerror=alert(/xss/)>
测试时间型的跨站,还有大量事件可以运用
6、🐣利用CSS跨站剖析