whctf由rr师傅出的两道Web|writeup

Cat

Capture the cat and get the flag

http://120.55.42.243:20010/

首先打开,发现是一个探测主机存活的应用。

当输入宽字节字符时,会显示Django报错

报错信息(html解码后转存)

定位到关键代码

刚开始以为是命令注入,在想方设法绕过正则waf

注意到

这里很诡异的将POST请求和FILE请求都合并在一起。

这里也很诡异的采用multipart/form-data方式传数据

需要猜测整个流程是怎么回事: 首先我们是通过一个php,get传参,然后php做中转post传get的参数至django搭的api上。而这个中转很有可能就是php-curl(结合multipart/form-data)。

其实到这里应该能想到使用curl的@+文件名做本地文件读取的,但是还是要第二天放了hint才往这方面想,一开始就日偏了。

这里可以fuzz一下特殊字符的,就会发现@不会报错,但是因为正则限制的很死,就没有去尝试。

可以看到,没有因为正则报 Invalid URL 错误。

所以可以通过@index.php读取 index.php的代码,再交给django处理,因为index.php中存在如上不能编码为gbk的unicode编码字符,所以引发报错,同时在debug界面会输出所有post内容,即可爆出index.php文件内容。

同理,可以读取其他文件,在django debug页面中,可以看到数据库的目录是

直接读取即可

Emmm

打开里面有个phpinfo.php

发现装了xdebug,并且xdebug.remote_connect_back选项为1,所以可以通过回连远程调试。 
通过在vps监听9000端口,同时在vps上访问带有调试参数的phpinfo.php, 就会收到connect_back回显调试信息。 
于是简单的思路就是vps上配置一个调试器,然后绑定监听在9000端口,下断点,等待回连。然后执行php任意函数。 
linux 就用vim的小插件就好了 
http://blog.csdn.net/dc_726/article/details/8809696

get flag 
附上赛后rr大佬自己的博文(其实有更好的用法,更多的用法) 
https://ricterz.me/posts/Xdebug%3A%20A%20Tiny%20Attack%20Surface

  • 用支付宝打我
  • 用微信打我

发表评论

电子邮件地址不会被公开。 必填项已用*标注