目录
CSRF跨站请求伪造攻击
CSRF定义
CSRF全称:Cross-site request forgery,即,跨站请求伪造,也被称为 “One Click Attack” 或 “Session Riding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。 CSRF一句话概括: 攻击者盗用(伪造)受害者的身份,以受害者的名义向服务器发送恶意请求,而这种恶意请求在服务端看起来是正常请求
CSRF攻击原理
用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A; 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A; 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B; 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A; 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。用户正常的访问正常网站A 生成cookie信息 在没有关闭网站A的情况下,打开网站B(恶意网站) 要求访问A网站,且为恶意访问 在用户不知情的情况下,带着合法的cookie信息和恶意参数访问了网站A
CSRF可以做什么
以受害者名义发送邮件,发消息,盗取受害者的账号,甚至购买商品,虚拟货币转账,修改受害者的网络配置(比如修改路由器DNS、重置路由器密码)等。造成的问题包括:个人隐私泄露、机密数据泄露、用户甚至企业的财产安全等 总结: 盗用受害者身份,受害者能做什么,攻击者就能以受害者的身份做什么
CSRF与XSS的区别
CSRF听起来很像跨站脚本攻击(XSS),但它与XSS有很大区别。 XSS 利用的是用户对指定网站的信任, CSRF 利用的是网站对用户网页浏览器的信任。
CSRF攻击类型
常见的攻击类型有2种:
GET型 POST型
CSRF漏洞利用条件
被害用户已经完成身份认证 新请求的提交不需要重新身份认证或确认机制 攻击者必须了解Web 请求的参数构造 诱使用户触发攻击的指令(社会工程学)
CSRF漏洞检测
检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。 Referer字段: 根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。
靶场练习
dvwa靶场和pikachu靶场
dvwa靶场
get类型
抓取数据包进行查看:GET请求
方式一:可以通过修改url来进行修改密码
观察源码:
编辑
验证是否可以登录:
方式二:构造一个html网页,诱惑用户点击,从而串改用户的信息或密码。
简单的构造:
复制修改密码时的url或者修改密码时进行抓包,将url复制下来,修改里面的密码信息,编辑到html当中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>错误</title> </head> <body> <h1>404</h1> <h1>无法正常访问</h1> <a href="http://192.168.100.130/dvwa/vulnerabilities/csrf/?password_new=passwd&password_conf=passwd&Change=Change#" >点击跳转</a> </body> </html>
保存该html文件,并复制到phpstudy目录的WWW目录下,然后通过浏览器,访问:
点击后会跳转到密码修改的界面,成功修改了密码。
同一个网段下(如果是服务器就是在公网下),在HTML中的跳转语句的url当中输入对方的IP地址,对方去访问时,会修改对方的信息。在对方毫不知情的情况下,修改信息。(利用社会工程学去诱惑对方点击链接)
中级medium:
中级模式下修改url信息,无法实现修改密码了
查看源码:
查看源码,medium级别中检查了保留HTTP_REFERER(HTTP包头的referer参数值,表示来源地址)中是否包含SERVER_NAME(HTTP中的host参数)
正常的修改,抓取数据包:
发现有Referer字段信息
Referer字段信息和Host信息的IP进行校验,要求源地址要一致,否则不通过
将此数据包发送到重发器进行保留,后面需要使用到里面的Referer信息
然后复制其url,进行修改密码信息,再次抓包:
观察数据包,发现没有Referer字段信息:
由于修改密码此过程需要验证Referer字段和Host字段的ip信息是否一致。
接下来我们要做的就是,将刚刚正常修改密码的Referer字段信息,复制过来,进行放包即可。
方式二:
同low模式中的方式二一样,创建html文件,诱惑用户去点击
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>错误</title> </head> <body> <h1>404</h1> <h1>无法正常访问</h1> <a href="http://192.168.100.130/dvwa/vulnerabilities/csrf/?password_new=passwd123&password_conf=passwd123&Change=Change#" >点击跳转</a> </body> </html>
诱惑用户去点击此页面
成功修改用户的信息,修改密码
pikachu靶场
POST型POST
根据提示随便选择一个用户进行登录
接下来进行修改信息,拦截数据包
将数据包发送给CSRF模块:
复制此代码,到WWW的目录下:
去访问此html前端界面:
点击后跳转:
成功修改了用户的信息!!!
GET请求和POST请求的区别
HTTP是一种在Web上进行数据传输的协议。其中,GET和POST是HTTP请求的两种方法,主要区别在于: GET请求把参数包含在URL中,而POST请求把参数放在请求体中。因此,GET请求可被缓存,且参数限制在URL长度之内,而POST请求不可缓存,参数可以很大,安全性也更高。 GET请求传递的参数可以在URL历史记录中被保存,而POST请求中的参数不会保存在历史记录中。 GET请求是幂等的,即多次请求同一个URL返回的结果是相同的,而POST请求不是幂等的。因此,多次发送相同的POST请求可能会导致服务器上创建多个资源或发生其他副作用。 GET请求一般用于无状态请求,即请求与服务器无关,仅用于获取某些资源。而POST请求一般用于有状态请求,即请求需要与服务器交互,可能更新服务器上的资源。 总之,GET和POST请求各有优缺点,应根据实际需求选择使用。例如,当需要获取资源时使用GET请求,当需要更新资源时使用POST请求。
get请求
post请求
漏洞利用
靶场:MetInfo CMS
利用方法:添加管理员用户
进入后台(可通过目录爆破或者查看源码文件),添加用户:
保存的同时,进行抓包:
发送给CSRF模块后,放包即可
修改HTML中的信息,复制代码,创建html文件保存到WWW目录下:
放在服务器的WWW目录下:
浏览器访问:
url:192.168.100.130/csrf.html网址:192.168.100.130/csrf.html
可以正常登录:创建用户成功
CSRF的漏洞防御
CSRF漏洞防御主要可以从两个层面进行,即服务端的防御、用户端的防御 服务端防御 目前服务器端防御CSRF攻击主要有5种策略: 1.验证HTTP Referer字段 2.在请求地址中添加token并验证 3.同源策略 4.在HTTP头中自定义属性并验证 5.使用验证码或者密码确认方式进行 客户端防御 养成良好的上网习惯 (1)、不要轻易点击网络论坛、聊天室、即时通讯工具或电子邮件中出现的链接或者图片; (2)、及时退出长时间不使用的已登录账户,尤其是系统管理员,应尽量在登出系统的情况下点击未知链接和图片 (3)、在连接互联网的计算机上安装合适的安全防护软件,并及时更新软件厂商发布的特征库,以保持安全软件对最新攻击的实时跟踪。