web漏洞-csrf及ssrf漏洞
前言
介绍csrf及ssrf漏洞的原理、防护。
CSRF漏洞
原理
CSRF漏洞(Cross-site request forgery)跨站请求伪造。原理是在用户登录某些网站的时候访问了攻击者的网站,攻击者会请求用户已登录的网站api接口,由于请求是在用户的浏览器发起的,且此时用户已登录,导致网站后台会以为就是用户发起的请求而执行,达到攻击目的。
防护
当用户发起重要请求时需要输入原始密码
设置随机token
检测referer来源
设置验证码
如何确认网站是否有csrf漏洞
自己写一个网页做请求伪造,看目标网站是否执行伪造请求。
csrf漏洞示例
用pikachu靶场做例子。项目地址:https://github.com/zhuifengshaonianhanlu/pikachu。
![](https://github.com/kouyou-momiji/easyimage-image/blob/master/image-20221111093209750-3.png?raw=true)
![](https://github.com/kouyou-momiji/easyimage-image/blob/master/image-20221111093656340-3.png?raw=true)
![](https://github.com/kouyou-momiji/easyimage-image/blob/master/image-20221111093916317-3.png?raw=true)
![](https://github.com/kouyou-momiji/easyimage-image/blob/master/image-20221111093958515-3.png?raw=true)
![](https://github.com/kouyou-momiji/easyimage-image/blob/master/image-20221111094943349-3.png?raw=true)
SSRF漏洞
原理
SSRF(Server-Side Request Forgery)服务端请求伪造,漏洞的原理为如果一个网站有提供远程访问链接的功能,那么攻击者就有可能实施让网站访问网站服务器内网获取敏感信息等操作。也就是相当于让网站服务器作为攻击者的中间代理服务器。
漏洞常见地方
如果网站有提供下面的功能就有可能有SSRF漏洞。原因是他们都有通过网站服务器访问我们提供的链接。或者是url中包含关键字【结合谷歌语法找到入手点】 share wap url link src source target u 3g display sourceURL imageURL domain
也可能存在漏洞。
- 分享:通过URL地址分享网页内容
- 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
- 在线翻译:通过URL地址翻译对应文本的内容。
- 图片加载与下载:通过URL地址加载或下载图片。
- 远程图片、文章收藏功能
- 未公开的api实现及其他调用URL的功能。
防护
过滤输入输出的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准
统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态
限制请求的端口,比如80,443,8080,8090
禁止不常用的协议,仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题
使用DNS缓存或者Host白名单的方式
ssrf漏洞示例
编写一个php脚本作示例。
<?php
if(isset($_GET['submit'])){
$request_url = $_GET['request_url'];
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $request_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
echo "<br>";
}
?>
<form method="get">
Please enter the url link:<input type="text" name="request_url">
<input class="sub" type="submit" name="submit" value="submit"/>
</form>
![](https://github.com/kouyou-momiji/easyimage-image/blob/master/image-20221111104823726-3.png?raw=true)
![](https://github.com/kouyou-momiji/easyimage-image/blob/master/image-20221111105228572-3.png?raw=true)