SSRF服务端请求伪造
0x00 SSRF服务端请求伪造
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。与CSRF跨站请求伪造不同,它是利用服务端向其他内外网服务器发送请求。
0x01 原理
很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。如果应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤,就可能存在服务端请求伪造的缺陷。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
0x02 危害
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
0x03 环境搭建
首先我们创建一个test.html,输入如下内容
1 |
|
ps:这里我修改css是为了截图时候能截取的全面点,可以不加。
然后写他对应的后台文件test.php
1 |
|
其中:
- curl_init — 初始化一个cURL会话
- curl_setopt — 设置一个cURL传输选项。
- CURLOPT_FILE — 设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。
- CURLOPT_HEADER — 启用时会将头文件的信息作为数据流输出。
- curl_exec — 执行一个cURL会话(在初始和设置选项完成后使用)
然后我们通过输入框输入想要访问的url,就会加载对应的url过来,比如我们输入百度主页:
就会返回:
至此我们环境搭建完成。
0x04 漏洞利用
我们上面提到了五种利用方式,我们拿其中的几种做一次实验。
首先是端口扫描,如果我们要对内网端口进行扫描,就可以在这里输入127.0.0.1和对应端口进行尝试。
如我们想查看mysql的banner信息,我们就可以输入127.0.0.1:3306
就可以看到一部分信息。
然后是访问web应用默认文件,比如我们尝试wamp默认界面。直接输入127.0.0.1,访问wamp的默认信息,可以搜集到很多有用的信息。
最后再来尝试一下利用file协议访问本地文件,file协议具体用法是
1 |
|
file后面与http不同,有三个斜杠,然后跟本地路径和文件,这里可以是任何格式的文件,虽然在网页上显示的时候会有部分无法显示。
我们尝试一个txt文件,发现可以读取。
再尝试一个存放ssh密钥的敏感目录,发现,配置文件和密钥内容其实都可以访问。
0x05 应对
1.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2.统一设置错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3.限制请求的端口仅为http常用的端口,比如,80,443,8080,8090。
4.将内网ip加入黑名单。
5.禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等。
0x06 总结
SSRF漏洞不如sql注入,xss,文件上传等漏洞有名,所以在很多地方疏于防范,其造成的危害不可小觑。
0x07 补充
php ssrf中的伪协议:
file;dict;sftp;ldap;tftp;gopher;http
Java ssrf 中的伪协议:
file;ftp;mailto;http;https;jar;netdoc;gopher
ssrf攻击负载生成工具:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!