<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Php on s7fy&#39;s blog</title>
    <link>https://s7fy.net/tags/php/</link>
    <description>Recent content in Php on s7fy&#39;s blog</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Mon, 30 Mar 2026 10:41:45 +0900</lastBuildDate>
    <atom:link href="https://s7fy.net/tags/php/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>first_security_report</title>
      <link>https://s7fy.net/posts/first_security_report/</link>
      <pubDate>Mon, 30 Mar 2026 10:41:45 +0900</pubDate>
      <guid>https://s7fy.net/posts/first_security_report/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;&#xA;&lt;p&gt;卒業を控えた2月末、WordPressのプラグインから脆弱性を発見し、報告することができました。 &lt;br&gt;&#xA;今回は、脆弱性調査から実際に報告した流れを記します。&lt;br&gt;&#xA;CVEが発行された場合はまた別の記事にでも書こうと思います。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91&#34;&gt;きっかけ&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%E8%AA%BF%E6%9F%BB%E5%AF%BE%E8%B1%A1%E3%81%AE%E9%81%B8%E5%AE%9A&#34;&gt;調査対象の選定&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%E5%A0%B1%E5%91%8A%E3%81%99%E3%82%8B%E6%A9%9F%E9%96%A2&#34;&gt;報告する機関&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#%E7%B0%A1%E6%BD%94%E3%81%AB%E4%BC%9D%E3%81%88%E3%82%8B&#34;&gt;簡潔に伝える&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;きっかけ&#34;&gt;きっかけ&lt;/h1&gt;&#xA;&lt;p&gt;Webセキュリティの脆弱性について触れることが多くなり、この学びをどこかに発散したかった。&lt;br&gt;&#xA;そして、脆弱性の第一発見者になってみたかったから。 &lt;br&gt;&#xA;また、他校の卒業展にて未知の脆弱性の発見, 報告が題材の出展があり、お話を聞いたことが引き金でもあります。&lt;br&gt;&#xA;特にRCEなどマシンを掌握する脆弱性についてはハッカー感が満載でロマンがあります。&lt;br&gt;&#xA;密かに在学中にCVE採番を目指していました。&lt;/p&gt;&#xA;&lt;h1 id=&#34;調査対象の選定&#34;&gt;調査対象の選定&lt;/h1&gt;&#xA;&lt;p&gt;まずは調査したい対象のシステムを探します。&lt;br&gt;&#xA;セキュリティに強いひとたちの話や、バグハンター記事を探すと、大きいコアシステムではなく、小さいサブシステムが穴場である。という情報を得ました。&lt;br&gt;&#xA;それらを踏まえて、プラグインなどの小さい規模のプログラムに目を向けることにしました。&lt;br&gt;&#xA;ただ、やみくもに調査することは時間が足りませんし、疲れてしまいます。&lt;br&gt;&#xA;ユーザ入力を受け取る箇所と実際に発火する関数の箇所を見るほうが断然に楽です。&lt;/p&gt;&#xA;&lt;p&gt;製品名は伏せますが、とあるWordPressのプラグインに着目しました。&lt;br&gt;&#xA;例えば、以下のようなコードがあればかなり怪しいです。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;isset&lt;/span&gt;($_POST[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;user_input&amp;#39;&lt;/span&gt;]) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $user_input &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $_POST[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;user_input&amp;#39;&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $user_input &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ユーザ入力をそのまま受け取って &lt;code&gt;$user_input&lt;/code&gt; に格納しています。&lt;br&gt;&#xA;ユーザ入力から何が渡されるかはわからないので、有害な文字列を受け取ってもおかしくないです。&lt;br&gt;&#xA;例えば、&lt;code&gt;;cat+%2Fetc%2Fpasswd#&lt;/code&gt; という文字列を受け取ってしまう場合を考えると、コード内部で &lt;code&gt;shell_exec()&lt;/code&gt; や &lt;code&gt;exec()&lt;/code&gt; や &lt;code&gt;system()&lt;/code&gt; や &lt;code&gt;passthru()&lt;/code&gt; などに &lt;code&gt;$user_input&lt;/code&gt; を引き渡していると、PHPでOSコマンドインジェクションが成立してしまいます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$user_input &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;;cat /etc/passwd#&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$origin_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;test&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;exec&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;mv&lt;/span&gt; $origin $user_input) &lt;span style=&#34;color:#75715e&#34;&gt;// ファイル名を任意の名前に変更できる想定&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;値を入れて組み立てると、以下のようになります。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;exec&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;mv&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;test&lt;/span&gt; ;&lt;span style=&#34;color:#a6e22e&#34;&gt;cat&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;etc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;passwd&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こうなると、 &lt;code&gt;mv&lt;/code&gt;コマンドのフォーマットが崩れ、実行されなくなります。&lt;br&gt;&#xA;その後、セミコロンから後のコマンドが解釈されて、 &lt;code&gt;cat&lt;/code&gt;コマンドが実行されます。&lt;br&gt;&#xA;また、シャープはPHPにおける一行コメントアウトです。&lt;br&gt;&#xA;&lt;code&gt;exec&lt;/code&gt;関数がまだ後ろに続く場合、コメントアウトすることによって、エラーや別の処理を止めます。&lt;br&gt;&#xA;このように、コードを眺め、&lt;code&gt;$_POST&lt;/code&gt; や &lt;code&gt;$_GET&lt;/code&gt; などのメソッドをどういった使い方をしているかを中心に調べて行きました。&lt;br&gt;&#xA;また、WordPressはCSRFの対策を明示的にしないといけない(WordPress側にはセキュアな処理がない)ので、OSコマンドインジェクションとCSRFを探しました。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
