V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pmispig
V2EX  ›  PHP

请大佬帮忙看看这段代码有被攻击的风险没

  •  
  •   pmispig · 2020-03-12 17:44:27 +08:00 · 3279 次点击
    这是一个创建于 842 天前的主题,其中的信息可能已经有所发展或是发生改变。
    <?php
    ob_start();
    echo file_get_contents($_GET['pdf_url']);
    ob_flush();
    ?>
    第 1 条附言  ·  2020-03-13 11:05:50 +08:00
    改成了
    $url = $_GET['pdf_url'];
    $arr = parse_url($url);
    谢谢大佬们指点
    16 条回复    2020-03-13 11:05:05 +08:00
    b821025551b
        1
    b821025551b  
       2020-03-12 17:45:58 +08:00
    有的,pdf_url 可传入反射型 XSS 攻击。
    pmispig
        2
    pmispig  
    OP
       2020-03-12 17:49:38 +08:00
    @b821025551b 这个危害倒是不大,主要是不知道有没有可执行命令 注入的风险
    b821025551b
        3
    b821025551b  
       2020-03-12 17:54:40 +08:00
    @pmispig #2 你贴出来得这段代码只可以知道有 XSS,但是是否会因为 XSS 的提权造成可注入的接口暴露就不一定了。
    javashell
        4
    javashell  
       2020-03-12 18:02:12 +08:00 via Android
    个人拙见,可以读取 php 源码 ,例如:
    echo file_get_contents('index.php');
    pmispig
        5
    pmispig  
    OP
       2020-03-12 18:06:01 +08:00
    @javashell 多谢提醒,我得试试能不能读取本地文件
    pmispig
        6
    pmispig  
    OP
       2020-03-12 18:08:38 +08:00
    @javashell 果然可以读取本地文件,神坑
    virusdefender
        7
    virusdefender  
       2020-03-12 18:10:22 +08:00
    任意文件读取啊
    D0n9
        8
    D0n9  
       2020-03-12 18:10:27 +08:00
    @pmispig 肯定可以读,而且还有 SSRF 风险

    更重要的是可以用 php:// 执行 PHP 代码
    pmispig
        9
    pmispig  
    OP
       2020-03-12 18:12:40 +08:00
    @D0n9 可怕,还好是单独放在 docker 里面
    onion83
        10
    onion83  
       2020-03-12 18:34:04 +08:00
    echo file_get_contents('/etc/passwd');
    dapking
        11
    dapking  
       2020-03-12 18:47:41 +08:00
    SSRF
    rekulas
        12
    rekulas  
       2020-03-12 19:04:37 +08:00
    写入和输出都是高危操作,涉及到这种语句的地方都要进行路径正则严格匹配、mime 检查、后缀检查才放心
    mengkun
        13
    mengkun  
       2020-03-12 19:57:44 +08:00
    /**
    * 防止 SSRF 攻击,curl、file_get_contents 前检测 url
    */
    function requestUrlSafe($url) {
    $link = trim(strtolower($url));
    $link = str_replace('\\', '/', $link);
    while (strstr($link,'../')) {
    $link = str_replace('../', '/', $link);
    }
    if( substr($link, 0, 6) != "ftp://" &&
    substr($link, 0, 7) != "http://" &&
    substr($link, 0, 8) != "https://" ) {
    return false;
    }
    return true;
    }
    xiri
        14
    xiri  
       2020-03-12 20:07:16 +08:00
    对传进来的参数做验证,强制加上 http/https 头应该就可以避免读取本地文件的情况了
    xiri
        15
    xiri  
       2020-03-12 20:08:42 +08:00
    function add_protocol_header($url) {
    $preg = '/^http(s)?:\\/\\/.+/';
    if (preg_match($preg, $url)) {
    $new_url = $url;
    } else {
    $new_url = 'http://' . $url;
    }
    return $new_url;
    }
    $new_url = add_protocol_header($_GET['pdf_url']);
    echo file_get_contents($new_url);
    onesec
        16
    onesec  
       2020-03-13 11:05:05 +08:00
    典型 任意文件读取漏洞
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2294 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:35 · PVG 18:35 · LAX 03:35 · JFK 06:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.