CTF特训营:技术详解、解题方法与竞赛技巧
上QQ阅读APP看书,第一时间看更新

4.4 实例

XDCTF(LCTF)2015中Web 300就是一道与SSRF相关的题目。

首先,通过file协议读取源代码,具体如下:


// file://index.php
<?php
    if (isset($_GET['link'])) {
        $link = $_GET['link'];
        // disable sleep
        if (strpos(strtolower($link), 'sleep') || strpos(strtolower($link), 'benchmark')) {
                die('No sleep.');
            }
        if (strpos($link,"http://") === 0) {
        // http
            $curlobj = curl_init($link);
            curl_setopt($curlobj, CURLOPT_HEADER, 0);
            curl_setopt($curlobj, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
            curl_setopt($curlobj, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($curlobj, CURLOPT_TIMEOUT, 5);
            $content = curl_exec($curlobj);
            curl_close($curlobj);
            echo $content;
        } elseif (strpos($link,"file://") === 0) {
        // file
            echo file_get_contents(substr($link, 7));
        }
    } else {
    echo<<<EOF

继续读取系统敏感文件,/etc/hosts文件内容如下:


# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 9bd5688225d90ff2a06e2ee1f1665f40.xdctf.com

可见,在hosts文件中本机IP还绑定了另外一个域名,由此可以推测这台服务器上一定还有其他的网站。

直接通过SSRF漏洞请求域名,发现与直接通过IP访问并没有区别,考虑出题人可能会将HTTP服务开在其他端口,因此利用SSRF漏洞对本机进行端口扫描。扫描后发现本机3389端口处于开放状态,带上域名访问发现是一个Discuz!7.2的论坛。

利用Discuz!7.2的faq.php中的SQL注入漏洞,读取数据库内容发现管理员admin的密码即为flag。