PHP 黑白名单过滤

环境

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目录下文件 

访问根目录下文件

 可以配合黑名单禁用 ../来禁止目录穿越的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值