环境
pikachu 靶场 ssrf
源码
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "ssrf_curl.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$FILEDIR = $_SERVER['PHP_SELF'];
$RD = explode('/',$FILEDIR)[1] . '/';
$RD = $RD == 'vul/' ? '' : $RD;
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
//payload:
//file:///etc/passwd 读取文件
//http://192.168.1.15:22 根据banner返回,错误提示,时间延迟扫描端口
if(isset($_GET['url']) && $_GET['url'] != null){
//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;
}
?>
可以看到没有任何过滤
漏洞利用
可以使用file,gopher,dict 等伪协议进行绝对路径访问
也可以使用目录穿越进行访问
黑白名单过滤思路
黑名单需要设置的太多容易遗漏,需要在url过滤file,gopher,dict ,还要设置不让其访问其他敏感文件,可以设置后缀名过滤
白名单设置比较简单,直接设置只能访问ssrf文件目录
黑名单
源码设置如下
过滤gopher,file,dict
$black = array("gopher","file","dict");
//array 定义数组
$split = explode(":",$URL);
//explode 以冒号为分割符,分割$URL变量里面所输入的
if(in_array($split[0],$black)){
// [0] 为被分割的第一部分也就是 file:/// 之类
exit("Stop! Hacker");
// 退出 可用exit或者die
}
过滤效果
后缀名过滤
这里仅过滤txt后缀文件
设置前
后缀黑名单
$black_houzhui = array('txt');
// 定义黑名单数组
$split_zhouhzui = explode(".",$URL);
// 以点分割 输入的url
if(in_array($split_zhouhzui[1],$black_houzhui)){
// 点分割的第二部分,也就是后缀名如果在黑名单数组里
exit("Stop view .txt file");
//禁止访问
}
过滤效果
白名单
写黑名单过滤,很复杂,不能一刀切,后缀名都禁止,所以设置起来很麻烦,就算精心制作,也可能会疏忽,白名单就很简单
后缀名白名单代码
$allow_url = "http://127.0.0.1/pikachu/pikachu-master/vul/ssrf/";
// 定义白名单
$pre_url=substr($URL,0,strlen($allow_url));
// 只允许访问ssrfinfo
if($allow_url != $pre_url){
// 不等于白名单禁止访问
die("禁止访问");
}
访问ssrf目录下文件
访问根目录下文件
可以配合黑名单禁用 ../来禁止目录穿越的问题