Pikachu SSRF(curl) 增加黑白名单
网站漏洞
原网站的意图只允许使用 http 协议访问 /pikachu/vul/ssrf/ssrf_info/info1.php
http://10.9.47.208/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
而此页面存在 SSRF 漏洞,未进行验证过滤,从而导致攻击者伪造正常的请求,以达到攻击的目的。
如
使用 file 协议查看 hosts 文件
http://10.9.47.208/pikachu/vul/ssrf/ssrf_curl.php?url=file:///c:/windows/system32/drivers/etc/hosts
使用 http 协议访问其他 url
http://10.9.47.208/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com
使用 dict 探测端口等操作
黑名单过滤
禁止 gopher、file、dict 协议
对输入的协议字段进行过滤
添加以下代码
// 定义黑名单协议
$black = array("gopher","file","dict");
// 提取协议名
$protocol = explode(":",$URL);
// 检测参数中的协议是否在黑名单内
if(in_array($protocol[0],$black)){
die("你干嘛~~嗨哟");
}
效果
-
dict 协议被禁止
-
file 协议被禁止
问题
此处只是单纯的禁止了 gopher、file 和 dict 协议,但仍能使用 http 访问其他文件
加固方法还可以设置文件的后缀名黑名单来禁止访问其他类型的文件
上篇文章有写到
但黑名但需要考虑的因素过多,相较于更加严格的白名单过滤,安全性稍差,比如仍能访问其他网站
如百度
白名单过滤
过滤规则
只允许访问 http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/
下的文件
$allow_url = "http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/";
$pre_url=substr($URL,0,strlen($allow_url));
if($allow_url != $pre_url){
die("你干嘛~~嗨哟");
}
效果
无法使用 file 协议访问 hosts 文件
无法使用 dict 协议探测端口
也无法使用 http 协议访问其他 url
问题
但仍能通过目录穿越等操作进行危险操作
可以添加黑名单,禁止 url 中出现 ../
等字样
网络安全需要多方面综合防护才能达到较为良好的效果,无法只通过某种手段而实现绝对的安全,此处只对的黑白名单防范进行了简单的演示