《XSS跨站脚本攻击剖析与防御》读书笔记

  • Post author:
  • Post category:其他


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间加上Tab

js语句通常以分号结尾,如果js引擎确定一个语句是完整的,而这一行结尾有换行符,那么可以省略分号,如果同一行中有多个语句,那么语句就必须使用分号来结束。除了在引号中分隔单词或强制结束语句外,额外的空白无论以何种方式添加都无所谓


4、🐣对标签属性值转码


此外,对普通HTML标记的属性值进行过滤,用户还可以通过编码处理来绕过,因为

HTML中属性值本身支持ASCII码形式



<img src="javascript:alert(/xss/);">

替换成

<img src="javascript&#116;&#58;alert(/xss/);">

对应ASCII码表可以看出,t的ASCII值未116,用”&#116″表示, 冒号: 则表示为&#58

还可以把&#01、&#02等字符插入的JavaScript或VBscript的头部,另外Tab符的ASCII码&#9、换行符的&#10、回车符的&#13可以插入到代码的任意地方,

末尾都需要加上分号

所以为了防范利用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跨站剖析



版权声明:本文为qq_55675216原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。