1

私はブラウザをシミュレートしようとしました(そしてXSSをシミュレートしました)。誰かが PhantomJS を勧めてくれましたが、単純な JS コマンドの実行に問題がありました。

簡単な php ウェブサイトを作成しました: xss.php

<form id = "myform"  action="xss.php" method="POST">
<input id="x" name='x'  type="text" />
<input type="submit" value="ok" />
</form>
<?php
  echo $_POST['x'];
  $fp = fopen("logs.txt", "a");
  fwrite($fp, $_POST['x']);
  fclose($fp);
?>
<script>document.getElementById('x').value='payload';
document.getElementById('myform').submit();</script>

ブラウザーから実行すると、フォームが送信されます (そして、その結果が logs.txt に入れられます。ただし、PhantomJS 経由でその Web サイトを実行しようとすると、問題が発生します。

run.js:

var page = require('webpage').create();
var url = 'http://127.0.0.1/xss/xss.php';
page.open(url, function (status) {
    if (status !== 'success') console.log('Network error');
    else
    {
         var p = page.evaluate(function () {
        });
        console.log('DONE');

    }
    phantom.exit();
});

コマンドラインから実行します。./phantomjs run.js 私が理解している限り、このスクリプトはブラウザの動作をシミュレートし、上記のフォームを送信する必要があります。ただし、logs.txt には何もありません。これは、phantomjs がそのスクリプトを実行しなかったことを意味します。私が何を間違えたのか教えてください。

4

1 に答える 1

0

あなたのスクリプトはブラウザを永遠のループに陥らせ、ページ xss.php をリロードします。これにより、javascript の実行を停止するまで、「ペイロード」という単語が logs.txt に挿入されます。

フォーム送信をシミュレートしたい場合は、明示的に POST データを php スクリプトに送信する必要があります。

var page = require('webpage').create();
var url = 'http://127.0.0.1/xss/xss.php';
var data = 'x=phantom';
page.open(url, 'post', data, function (status) {
    if (status !== 'success') console.log('Network error');
    else
    {
        console.log('DONE');
    }
    phantom.exit();
});

これにより、POST データが xss.php に送られ、logs.txt に「phantom」という単語が追加されます。ただし、ブラウザとは異なり、PhantomJS は永遠のループに陥らず、リクエストを 1 回だけ送信することに注意してください。

于 2013-06-24T18:45:56.067 に答える