详细安装见Centos7下安装Docker(详细安装教程)
可以配置镜像加速器,在阿里云找docker节点
解决办法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()访问.../ssrf-lab-master/basics/www/
<?php // 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 会话(关键就在这里,没有对我们传入的参数做任何的过滤,那么我们就可以执行一些恶意的代码)
打开页面,在OUTGOING WEBHOOK 部分输入的https://yourhandler.io/events是有 REST API 监听的需要测试项目(就是在 SEE THE RESULT 部分会显示请求响应的结果和状态码)。在https://yourhandler.io/events的位置进行输入就可以作为一个测试点
先用http://127.0.0.1进行测试
会发现回显,说明没有对内网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
因为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/webserver/www/
<?php $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
发现被限制Restricted area!
师傅们是这么操作的:
因为IP地址有多种表达方式,我们可以用这些方式来绕过上面那么直白的限制
先用整数表达http://167772163发出请求
呃。。不行。。
如果正常回显的话会是这样 分析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/flask-webserver/frontend
呃。。后面的步骤又不行了。。
还是推荐规规矩矩的在centos里docker来刷吧
SSRF 漏洞学习实验环境推荐及过程记录
说实话有点水。。