ssrf-lab踩坑记录

详细安装见Centos7下安装Docker(详细安装教程)

可以配置镜像加速器,在阿里云找docker节点

ssrf-lab踩坑记录_第1张图片
在这里插入图片描述

解决办法Linux -bash: git: 未找到命令的解决方法

呃。。不过最后还是有点问题没有解决。。

还是要转到phpstudy进行搭建

先来简单了解一下ssrf

概念:
SSRF(Server-Side Request Forgery),服务器端请求伪造,利用漏洞伪造服务器端发起请求,从而突破客户端获取不到数据限制。
原理:
很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。

正常情况下,一个客户端发送指定的url给服务器去请求一个东西,当服务器收到这个请求后首先查看这个url是否合法,然后再去向内网资源去请求这个url需要的资源,然后服务器再将资源返回给客户端。
而如果恶意用户传入的url没有被过滤的话那么他就能够通过ssrf访问到内网的一些本来不允许访问的资源(也就是客户端直接去访问内网资源是不被允许的,而服务器可以,这就是ssrf)

在php中会导致ssrf的函数:

file_get_contents()
fsockopen()
curl_exec()

basic

访问.../ssrf-lab-master/basics/www/

 
	// create curl resource 
	$ch = curl_init(); 

	// set url 
	curl_setopt($ch, CURLOPT_URL, $_POST["handler"]); 

	//return the transfer as a string 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

	// $output contains the output string 
	$output = curl_exec($ch); 

	// close curl resource to free up system resources 
	curl_close($ch);

	echo $output;
?>

函数学习

curl_init初始化一个cURL会话

curl_setopt设置 cURL 传输选项

curl_exec执行 cURL 会话

curl_close关闭一个cURL会话

curl_setopt ( resource $ch , int $option , mixed $value ) : bool
{
ch:由 curl_init() 返回的 cURL 句柄
option:需要设置的CURLOPT_XXX选项。
value:将设置在option选项上的值。

而代码中的第二个参数是CURLOPT_URL:就是获取后面参数的url 第三个参数就是第二个参数的值,这里是post的handler
}
curl_exec ( resource $ch ) : mixed—执行给定的 cURL 会话(关键就在这里,没有对我们传入的参数做任何的过滤,那么我们就可以执行一些恶意的代码)

ssrf-lab踩坑记录_第2张图片
打开页面,在OUTGOING WEBHOOK 部分输入的https://yourhandler.io/events是有 REST API 监听的需要测试项目(就是在 SEE THE RESULT 部分会显示请求响应的结果和状态码)。在https://yourhandler.io/events的位置进行输入就可以作为一个测试点

先用http://127.0.0.1进行测试

ssrf-lab踩坑记录_第3张图片

会发现回显,说明没有对内网ip进行限制

还要了解一下 URL 的结构

scheme://user:pass@host:port/path?query=value#fragment

通过url结构可以看出SSRF的利用姿势,可以进行协议、URL 绕过

先尝试用file协议

测试点Linux使用file:///etc/passwd,windows使用file:///C:/Windows/System32/drivers/etc/hosts

ssrf-lab踩坑记录_第4张图片
因为url没有经过过滤,可以查看到用户信息,也可以通过这样的方式获得其他文件

很多SSRF 协议中的利用都是结合 Redis 服务的,所以可以先在ssrf-basics容器里面安装该服务

docker ps #查看容器编号
docker exec -it 容器名 /bin/bash #进入容器
apt-get install redis-server # 安装redis服务
redis-server #开启redis服务

不过我这里是在phpstudy搭建的,没办法进行演示了。。

大体上是开启redis服务之后会得到一个端口信息

所以利用dict协议dict://127.0.0.1:端口/info可获取本地redis服务配置信息

还可以利用dict://127.0.0.1:端口/KEYS *获取redis存储的内容

还可以利用Gopher 协议详情见Gopher协议与redis未授权访问

内网中的redis存在未授权访问漏洞,当Redis服务以root 权限运行时,利用 Gopher 协议攻击内网中的 Redis,通过写入定时任务可以实现反弹shell

还是未能具体操作,就来学习一下师傅的博客利用 Gopher 协议拓展攻击面

advanced1

访问...advanced1/webserver/www/

 
	
	$handler = $_POST["handler"];
	if (preg_match('#^https?://#i', $handler) !== 1) {
     
		echo "Wrong scheme! You can only use http or https!";
		die();
	} else if(preg_match('#^https?://10.0.0.3#i', $handler) === 1) {
     
		echo "Restricted area!";
		die();
	}

	// create curl resource 
	$ch = curl_init(); 

	// set url 
	curl_setopt($ch, CURLOPT_URL, $_POST["handler"]); 

	//return the transfer as a string 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

	// $output contains the output string 
	$output = curl_exec($ch); 

	// close curl resource to free up system resources 
	curl_close($ch);

	echo $output;
?>
	if (preg_match('#^https?://#i', $handler) !== 1) {
     
		echo "Wrong scheme! You can only use http or https!";
		die();
	} else if(preg_match('#^https?://10.0.0.3#i', $handler) === 1) {
     
		echo "Restricted area!";
		die();
	}

preg_match函数会执行匹配正则表达式,限制了对内网IP的访问

尝试http://10.0.0.3

ssrf-lab踩坑记录_第5张图片
发现被限制Restricted area!

师傅们是这么操作的:

因为IP地址有多种表达方式,我们可以用这些方式来绕过上面那么直白的限制

先用整数表达http://167772163发出请求

ssrf-lab踩坑记录_第6张图片
呃。。不行。。

如果正常回显的话会是这样
ssrf-lab踩坑记录_第7张图片
分析IP地址的表达方式

IP 地址是由四个字节组成的,一旦包含了小数点,就必须考虑到大小端表示,因为这个会影响 IP 地址的解析。不过好在所有的网络地址都是大端表示法,只需要注意这一点即可

学习 IP 地址的表达方式

字符串: 10.0.0.3

二进制: 00001010 . 00000000 . 00000000 . 00000011

十六进制: 0A.00.00.03

整数: 167772163

这些表达方式都能被curl命令解析为正确的 IP 地址,之后如果我们要访问的IP地址被简单粗暴地过滤了就可以试试这种方法。
除了上面的表达方式之外,还可以用 16 进制0x0A000003表示IP地址,还有一个很少人知道的绕过小姿势,就是用 8 进制代替 10 进制来表示 IP 地址。在计算机的世界里,一旦在20前面加个0就会变成8进制,比如http://01200000003实际上还是http://10.0.0.3。
上面两个表达方式,PHP 的 curl 模块能解析出来。

总结几种变形

十六进制: http://0x0A.0x00.0x00.0x03
八进制: http://012.00.00.03
八进制溢出:http://265.0.0.3

八进制的变形好像只适用于 NodeJS 应用的服务器,点分十进制的最大值为255,一旦超出了这个数,将会被重置,这个时候最后一个变形就会变回http://10.0.0.3。具体为什么可以通过这样的可能要从TCP/IP 解析 IP 地址的逻辑入手(应用层的限制总能被巧妙地绕过,不是很可靠)

其他绕过方法

可以使用DNS泛域名
附上大佬博客泛域名解析的安全案例

还有一些其他的方法SSRF漏洞的利用与学习

大佬tql

advanced2

访问...advanced2/flask-webserver/frontend

呃。。后面的步骤又不行了。。

还是推荐规规矩矩的在centos里docker来刷吧

SSRF 漏洞学习实验环境推荐及过程记录

说实话有点水。。

你可能感兴趣的:(ssrf-lab踩坑记录)