SSRF(服务器请求伪造)

相关函数(php)

file_get_contenes()

fsockopen()

curl_exec()

fopen()

发掘漏洞

  • 当一个服务器有可以解析或读取一个url的时候
  • 抓包发现某些参数带有url关键字 可能存在ssrf漏洞
  • 有某个参数的值是http://的链接

原理

  • 由于函数使用不当造成的
    • file_get_contents()
    • fsockopen()
    • curl_exec() 让php可以访问web网页内容
  • 当前服务器通过http协议去获取其他服务器的文件

利用方法

常见利用协议

  • file:// :读取本地文件常用协议

    • ?url=file://c:\windows\system32\drivers\etc\hosts
  • dict:// : 端口扫描常用文件

    • ?url=dict://127.0.0.1:3306

gopher:// :

危害

  • 端口扫描 :
    • 如果A服务器访问B服务器的请求 攻击者可控 把目标地址改为127.0.0.1 就会变成A服务器访问自己 如果访问3306端口 有消息回应 就可以判断3306端口开启
      image.png

image.png

  • 访问内网用户的信息

    • 如果受害者处于内网环境中 可以更改别的设备的ip来查看 别的服务器是否开放了某些端口 如果在10.9.23.100的主机 就可以尝试访问10.9.23.200是否开了80
  • 读取内部文件的内容

    • file://c:\windows\system32\drivers\etc\hosts
    • image.png

防御

  • 因为ssrf漏洞有关键字

    • 请求报文中有url地址为127的
  • 限制协议

    • 只允许HTTP和https请求
  • 限制ip

    • 禁止127.0.0.1 禁止lock host等关键字
    • 避免获取内网数据
  • 限制端口

    • 限制常用的端口 80 443 8080 8090
      • 白名单限制只有80端口可以访问
  • 过滤返回信息

    • 验证远程服务器的请求响应
      • 返回信息中有关键字的都拒绝
  • 统一错误信息

    • 避免用户根据错误信息来判断端口状态
      • 把错误信息都返回到另一个网页 不显示404

防御代码 白名单

explode($delimiter,$string)函数会按照数值截断数据。
- `$delimiter`:分隔符,用于指定在哪些字符处分割字符串。
- `$string`:要分割的字符串。

    $b = explode(".",$URL);
    $a = explode(":",$URL);
    if($a[0]!=="http"&&"https"){
            die("no");
    }else if($b[1]!=="php"){
        die("noo");
    }else{
posted @ 2024-03-24 21:08  XingZin  阅读(46)  评论(0)    收藏  举报