XSS简述

1.简介:

跨站脚本攻击(Cross Site Scripting)缩写为XSS,不会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。

2.同源策略:

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。---来自百度百科

所谓同源是指,域名、协议、端口相同。

同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。

同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源交互,用于隔离潜在恶意文件的关键的安全机制;

例:
//不同源---域名不一样
http://www.sec00.com //2级域名
http://sec00.com //顶级域名

//不同源---协议不一样
http://www.sec00.com
https://www.sec00.com

//不同源---端口不一样
http://www.sec00.com (默认是80)
http://www.sec00.com :50

//是同源
http://www.sec00.com/a.js
http://www.sec00.com/b.js

//是同源
http://www.sec00.com/1.html
http://www.sec00.com/en/2.html

在HTML语音中,有部分标签在引用第三方资源时,不受同源限制

<script>
<img>
<iframe>
<link>
等等

上述这种带SRC属性的标签,在加载时,实际上是生成一条get请求(http协议),向指定服务器申请资源。

例如:
www.secevery.com中的网页源代码:

<script type="text/javascript" src="http://zone.secevery.com/static/js/a.js"></script>

解释:

<script>在加载时,是生成一条get请求(http协议),向zone.secevery.com申请资源a.js,a.js虽然在zone.secevery.com,但是a.js现在在www.secevery.com,所以可以对www.secevery.com做操作。
嵌入页面后就属于当前页面

确定脚本的源,取决于加载脚本的位置,而非脚本存在的位置

3.xss漏洞:

原理:

恶意攻击者往Web页面里插入恶意Script代码,当用户浏览页面时,嵌入其中的Script代码会被执行,从而达到恶意攻击用户的目的。

跨站:

绝大多数xss攻击都会采用嵌入一段远程或者第三方域上的脚本资源。
为什么加载第三方js文件----因为很多时候输入内容处有长度限制,把代码放在自己的服务器上xx.js,然后再加载。

脚本:
xss.js是我们可以控制的一个文件,如果我们此脚本文件可以在第三方浏览器加载,那么xss.js就嵌入了第三方网站。

XSS漏洞是发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中,出现了不被预期的脚本指令被执行,XSS就会发生。

分类:

反射性型、存储型、DMO型

4.输出点位置:

输出点位置---查看页面源代码:

1.标签之间:<p>输出点</p>

<title>
<textarea></textarea>
<xmp></xmp>
<iframe></iframe>
<noscript></noscript>
<plaintext></plaintext>
这些标签必无法执行脚本,需先闭合标签,
比如:<title></title><script>alert(1)</script>

2.标签中:<input type="text" value="输出点">

如果输出点在单引号和双引号之间,先闭合,构造一个新的属性,执行js代码,比如on事件;

如果无法闭合

3.在<script>标签内;

<script>
var='输出点',
</script>
先闭合,加结束;,加入alert(1)
<script>
var='输出点' ;alert(1)// ',
</script>

<script>
var='输出点</script> <img/src=1>';
</script>

5、常见的XSS过滤

1.htmlspecialchars()函数
能将单引号'',双引号"",斜杠/,反斜杠 转义,也就是在这些符号前加上退意符。
但该函数默认编码双引号,正反斜杠(/,)
如果想要编码单引号,则需要加上一个参数

2.strip_tags函数
将尖括号编码

3.addslashes
将单双引号转移 就是在 '前加个\

4.addslashes()函数
将预定义字符 ' " NULL
函数会在这四个字符前加上 \

5.我在渗透测试过程中见到的基本上都是将关键符号如 <>"" '' ()等等
这些符号进行实体编码
或者直接将这些符号过滤掉
再或者将关键字alert script src img等等过滤掉
有些时候会通过前端JS校验,限制输入字符串长度,是你无法构建完整的XSS语句
不过你在页面中查看元素,找到对应代码,修改其中的限制即可
或者先输入一个合法的字符串,接着使用brupsuit抓包更改

查看元素与查看源码的区别
查看元素时,页面的代码是被渲染过的(规范书写后的)
不管程序员在书写属性的时候用的是单引号还是双引号,页面渲染后统一使用双引号
对于编码后的值,如果你不点编辑查看的话,它都是未编码的值

6、一些常见的XSS语句

<img/src=1 οnerrοr=alert`1`>
<img src=1 οnerrοr=alert`1`>
<script>alert`1`</script>
<script>alert(\1\)</script>
javascript:alert(1)

οnmοuseοver=alert(1)  //           (//的目的是注释掉后面的引号,记得在输入//前空格)
该事件的意思是当鼠标划过这里时,会出现弹窗。
需要注意的是 //是javascript里的注释符,html的注释符是<!-- -->(按道理来说//在html标签里是用不了的)
但onmouseover是javascript事件,它后面就是javascript环境,所以//可以解析

如果输出点在引号内
并且引号被编码或者过滤了
例子:

<script> 
 var aaa="xxxx";
</script>

我们可以使用如下方法

<script>
var aaa="xxxx</script><script>alert(1) //"
</script>

在JavaScript中 -号表示连接符
当遇到  value='' 输出在script标签之间
'-alert(1)-'
即:value=''-alert(1)-''

<>被过滤
onmouseover=alert(1)
on事件=后面执行的是js环境,比较严格;
alert(1)    //js单行注释
在=alert(1)后面加空格(%20)js环境结束

大家可以在这里练习一下,不会的话网上很多通过教程。XSS线上练习

标签: none

已有 2 条评论

  1. 血小板

    总结的很好,优秀,棒棒哒!!!

添加新评论