Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

Paros使ってみた

プロキシ型脆弱性スキャナの1つであるParosを使ってみました。


We wrote a program called "Paros" for people who need to evaluate the security of their web applications. It is free of charge and completely written in Java. Through Paros's proxy nature, all HTTP and HTTPS data between server and client, including cookies and form fields, can be intercepted and modified.

Parosがチェックする内容は、ユーザーガイドによると以下の通りです。

  • HTTP PUT allowed - check if the PUT option is enabled at server directories
  • Directory indexable - check if the server directories can be browsable.
  • Obsolete files existed - check if there exists obsolete files at
  • Cross-site scripting - check if cross?site scripting (XSS) is allowed on the query parameters
  • Default files on websphere server - check if default files existed on websphere server

使い方としては、ブラウザからプロキシ(Paros)経由で目的のサイトにアクセスしてチェック対象のURLパターンを覚えさせ、そのURLに対していろいろなパラメータを付けて脆弱性のチェックを行います。
たとえば、以下のようなダメなスクリプト(真似しないでね)

<?php
error_reporting(E_ALL|E_STRICT);

$id = '';
if (isset($_POST['empno']) ) {
    $id = $_POST['empno'];

    $dsn = 'sqlite:emp';
    try {
        $db = new PDO($dsn);
        $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $sql = 'SELECT * FROM emp ';
        if ($id !== '') {
            $sql .= 'WHERE empno = \'' . $id . '\' ';
        }
        $sql .= 'ORDER BY empno ';

        $stmt = $db->query($sql);

        $cnt = 1;
        $row = array();
        echo '<table border="1">';
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo '<tr>';
            echo '<th>' . $cnt++ . '</th>';
            foreach ($row as $column_name => $column_value) {
                echo '<td>' . $column_value . '</td>';
            }
            echo '</tr>';
        }
        echo '</table>';
    }
    catch (PDOException $e) {
        echo 'execution failed: ' . $e->getMessage();
        echo '    error code: ' . $e->getCode();
    }

    echo '<hr>';
}
?>
<form action="" method="post">
<input type="text" name="empno" value="<?php echo $id; ?>">
<input type="submit">
</form>

脆弱性をチェックする場合は以下のような手順です。

  1. Parosを起動する
  2. ブラウザのプロキシ設定をlocalhost:8080に変更する
  3. ブラウザからPHPスクリプトにアクセスする
    • 入力フォームを表示させ、検索条件として「7369」を指定しsubmitした状態
  4. [Analyze]-[Scan All]を実行
  5. 検出された脆弱性(可能性も含む)

検出は完全ではないですが、使い方によってはかなり効率的と思います。
なお、試す場合は絶対に余所様のサイトに向かってしないように。