前言

本文介绍一下ssrf的一个特性,是前端时间作UNCTF的赛题get到的新知识,以此来记录一下,不正确的地方还请各位师傅多多指正。

正文

先看一下题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
echo'<center><strong>welc0me to 2020UNCTF!!</strong></center>';
highlight_file(__FILE__);
$url = $_GET['url'];
if(preg_match('/unctf\.com/',$url)){
if(!preg_match('/php|file|zip|bzip|zlib|base|data/i',$url)){
$url=file_get_contents($url);
echo($url);
}else{
echo('error!!');
}
}else{
echo("error");
}
?>

可以看到很多伪协议都被过滤掉了,而且url里面还要包含unctf.com,那就想一下其他办法,在这里需要了解一下PHP的file_get_contents函数。

file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。

大致就是让一个文件的内容输出到一个字符串变量中,但是注意一下(知识点来了):

当PHP的 file_get_contents() 函数在遇到不认识的伪协议头时候会将伪协议头当做文件夹,造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。

简单点将就是我们只需要随便输一个不存在的协议头构造url就可以了,下面拿真题来示范:

ssrf

跳转目录的时候尽量多跳转几个,如果没有跳转到根目录的话同样不会成功。
好了,以上就是我get到的一个小知识点,朋友之前跟我说比赛最重要的就是赛后看writeup,现在看来正是如此。加油!