ssrp也就是伪造请求让服务器去请求,可以请求本地,也可以请求外网
SSRF 主要是由于一些危险函数与危险协议产生的。我们以 PHP 为例,列举一下这些危险函数。
file_get_contents()
fsockopen()
curl_exec()
SoapClient
危险协议
file://
gopher
dict
etc...
1.什么是SSRF
攻击者从外网通过 SSRF 攻击访问到内网,接着对内网的应用展开攻击,这些应用包括但不限于 MySQL,redis,SMTP 等等 ……
SSRF (全称:Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。
- 正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。
2.绕过的常见手法
- @绕过
URL的完整格式是:
[协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
- 进制绕过
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();
}
php 代码中通过正则对输入的 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
评论0
暂时没有评论