相关函数(php)
file_get_contenes()
fsockopen()
curl_exec()
fopen()
发掘漏洞
- 当一个服务器有可以解析或读取一个url的时候
- 抓包发现某些参数带有url关键字 可能存在ssrf漏洞
- 有某个参数的值是http://的链接
原理
- 由于函数使用不当造成的
- file_get_contents()
- fsockopen()
- curl_exec() 让php可以访问web网页内容
- 当前服务器通过http协议去获取其他服务器的文件
利用方法
常见利用协议
-
file:// :读取本地文件常用协议
- ?url=file://c:\windows\system32\drivers\etc\hosts
-
dict:// : 端口扫描常用文件
- ?url=dict://127.0.0.1:3306
gopher:// :
危害
- 端口扫描 :
- 如果A服务器访问B服务器的请求 攻击者可控 把目标地址改为127.0.0.1 就会变成A服务器访问自己 如果访问3306端口 有消息回应 就可以判断3306端口开启
- 如果A服务器访问B服务器的请求 攻击者可控 把目标地址改为127.0.0.1 就会变成A服务器访问自己 如果访问3306端口 有消息回应 就可以判断3306端口开启
-
访问内网用户的信息
- 如果受害者处于内网环境中 可以更改别的设备的ip来查看 别的服务器是否开放了某些端口 如果在10.9.23.100的主机 就可以尝试访问10.9.23.200是否开了80
-
读取内部文件的内容
- file://c:\windows\system32\drivers\etc\hosts
防御
-
因为ssrf漏洞有关键字
- 请求报文中有url地址为127的
-
限制协议
- 只允许HTTP和https请求
-
限制ip
- 禁止127.0.0.1 禁止lock host等关键字
- 避免获取内网数据
-
限制端口
- 限制常用的端口 80 443 8080 8090
- 白名单限制只有80端口可以访问
- 限制常用的端口 80 443 8080 8090
-
过滤返回信息
- 验证远程服务器的请求响应
- 返回信息中有关键字的都拒绝
- 验证远程服务器的请求响应
-
统一错误信息
- 避免用户根据错误信息来判断端口状态
- 把错误信息都返回到另一个网页 不显示404
- 避免用户根据错误信息来判断端口状态
防御代码 白名单
explode($delimiter,$string)函数会按照数值截断数据。
- `$delimiter`:分隔符,用于指定在哪些字符处分割字符串。
- `$string`:要分割的字符串。
$b = explode(".",$URL);
$a = explode(":",$URL);
if($a[0]!=="http"&&"https"){
die("no");
}else if($b[1]!=="php"){
die("noo");
}else{
标签:请求,SSRF,url,端口,访问,file,服务器,伪造
From: https://www.cnblogs.com/XingZin/p/18093067