模拟XSS攻击

时间:2013-06-23 23:45:32

标签: php javascript xss phantomjs

我试图模拟浏览器(并模拟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运行该网站时出现问题:

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没有运行该脚本。你能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:0)

您的脚本将浏览器置于永久循环中,重新加载页面xss.php。这会将“payload”一词放入logs.txt,直到你停止javascript执行。

如果要模拟表单子目录,则必须将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,并将“phantom”一词附加到logs.txt。但请注意,与浏览器不同,PhantomJS不会进入永久循环,只会发送一次请求。