今天看在看《XSS跨站脚本攻击剖析与防御》的时候,里边提到了CSRF与SSRF,在网络查询了这部分的资料后,简单总结了下二者的关系与不同
CSRF
又称跨站请求伪造,XSS就是CSRF中的一种。二者区别,XSS利用的是用户对指定网站的信任,CSRF利用是网站对用户浏览器的信任。
发生条件
当用户在安全网站A登录后保持登录的状态,并在此时浏览了保存有恶意代码的另一个网站B。此时B站劫持用户的浏览器并以用户以登录的状态对A站发送非用户本人的操作。
当服务端没有对这次请求验证的情况下,将这次操作作为可信任的用户的操作。
发生地点
攻击者可以将恶意网址或者代码藏在论坛博客等任何用户生成内容的网站中。这意味着如果服务端没有适合的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。
类似于XSS一些html标签可以发送HTTP GET类型请求 像<img>,浏览器渲染img标签的时候,并不知道标签中src属性的值,是否为一个图片,浏览器发起一个HTTP GET请求
,并携带当前受害者当前浏览器在网站的cookie,获取返回结果。
对于很多网站来说,即使是一些重要的操作使用POST来提交请求,但是服务器再接收请求的时候并没有严格区分POST和GET。在PHP中滥用$_REQUEST就是例子。
如果服务端已经区分了GET,POST只用POST请求数据,可以通过制造一个隐藏的表单,并通过js代码自动提交伪造的表单。
GET伪造
POST伪造
防御
增加验证码机制,增加带有大量噪点的验证码,杜绝代码能够识别的简单验证码,当然了也经常被绕过
验证referer,采用同源政策,referer记录着数据包的来源地址,来判断请求的合法性,但是这个可以伪造
使用Token,令牌是一种将表单value的加密算法生成不同的加密结果,在服务器端进行验证。
在访问登录过一个网站,点击退出账户。
SSRF
又名服务端请求伪造攻击
有的大型网站在web应用上提供了从其他服务器获取数据的功能。使用户指定的URL web应用获取图片,下载文件,读取文件内容。攻击者利用有缺陷的web应用作为代理攻击远程和内网的服务器(跳板)
危害:
可对外网,服务器所在内网,受控服务器进行端口扫描,获取一些banner
对内网web应用进行指纹识别,通过访问默认文件实现
攻击内外网web应用,主要是使用get参数就可以实现分攻击
利用file协议读取本地文件
该漏洞存在的条件是对curl函数的滥用
比如:
-
if(isset($_POST['commit'])){
-
$link = $_POST['url'];
-
$filename = './curled/'.rand().'txt';
-
$curlobj = curl_init($link); //初始化连接
-
$fp = fopen($filename,"w");
-
curl_setopt($curlobj, CURLOPT_FILE, $fp); //设置输出文件,默认为STDOUT (浏览器)。
-
curl_setopt($curlobj, CURLOPT_HEADER, 0); //设置为0表示不返回HTTP头部信息。
-
curl_exec($curlobj); //执行curl请求
-
curl_close($curlobj); //关闭curl连接
-
fclose($fp);
-
$fp = fopen($filename,"r");
-
$result = fread($fp, filesize($filename));
-
fclose($fp); //关闭文件
-
echo $result;
-
}
并为对输入的命令进行过滤,导致服务器遭到攻击
修复方案:
过滤返回信息,如果web应用数去获取某一类型文件,在把结果返回给用户之前先验证信息是否符合标准。
例如:当攻击者利用"识别图片"下的该漏洞远程包含一个文件,可以通过在服务器上验证返回数据是否是纯像素,来进行过滤。
统一错误页
限制请求端口为http常用端口 80,443,8080,8090
内网IP黑名单,避免应用被用来获取内网数据,攻击内网