1 CSRF漏洞介绍
说明:由于最近一个月出差比较忙,所以没有更新,给大家带来不便请谅解。
CSRF(Cross-Site Request Forgery,跨站请求伪造),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF .它是一种常见的 Web攻击方式。是一种劫持用户在当前已登录的Web应用程序上执行非本意操作一种攻击.
说的直白一点就是:别人盗用(劫持)你的身份去做坏事. (1)别人-->这里指的是攻击者 (2)你---->A站(web服务器)上注册的合法用户(客户端) (3)做坏事--->去请求合法站点A(比如web服务器)存在CSRF攻击的URL,实现类似发送恶意邮件/转账/创建账户/修改密码等"你不希望执行"操作.
危害
以用户的名义发邮件/发消息
转换/购买商品等;
修改密码;
删除文章等
2 CSRF漏洞的原理
CSRF漏洞产生的原因
(1)http协议使用session在服务端保存用户的个人信息,客户端浏览器用cookie标识用户身份;
(2)cookie的认证只能确保是某个用户发送的请求,但是不能保证这个请求是否是”用户自愿的行为”.
(3)这时,用户登录了某个web站点,同时点击了包含CSRF恶意代码的URL,就会触发CSRF
漏洞利用的条件
(1)用户必须登录A网站,生成了cookie
(2)登录的同时访问了恶意URL(包含CSRF恶意代码的URL).
原理图
CSRF和XSS的不同
(1)XSS主要用户获取用户的cookie信息,达到控制客户端的目的
XSS—->把你的腰牌(用户身份象征也就是cookie)偷到手,黑客自己去搞破坏.
CSRF主要是劫持用户身份,让客户端做一些不愿意做的事.
CSRF—->拿刀劫持你,”借助你的身份”来帮黑客做事.
(2)危害上来说,XSS更大;
(3)从应用难度上来说
CSRF需要满足登录某网站的状态,同时访问了恶意的URL,应用条件比较苛刻.
XSS只要一次点击或者存储到服务器即可.
3 CSRF之GET型代码分析
根据CSRF请求方式不同,分为GET型和POST型.
GET型CSRF代码举例
问题:
(1)但是URL直接写用户名和密码的方式太过于明显,我们可以通过访问页面的方式进行伪装;
(2)或者通过XSS页面,直接把这个恶意URL链接发给客户端,在客户登录页面的同时访问这个恶意URL,也可以创建用户;
(3)通过伪造页面诱导客户点击
4 CSRF之POST型代码分析
1.POST型CSRF举例
(1)有人说,GET方式容易出现CSRF攻击,那用post是不是就可以万无一失呢?
(2)当然不是,因为post只是提交的方式改变了,如果原始页面还是存在CSRF漏洞,我们自己创建一个POST页面来模拟用户提交数据,还是可以进行利用的
(3)post_csrf.php用来模拟存在csrf漏洞的web页面,代码如下:
(4)页面显示如下:
post型需要黑客自己来构造表单提交的参数
为了不易发现,提交表单的数据都直接隐藏hidden;
post.html代码如下:
5 DVWA中CSRF利用实战
挖掘CSRF的方法:
(1)使用burp抓包后修改Referer字段再重新提交,如果能请求就存在CSRF漏洞.
(2)其他CSRF工具,比如
CSRFTester就是通过抓取提交参数;
修改表单信息,重新提交;—–>伪造客户端请求
重新提交成功就存在CSRF漏洞.
DVWA中low级别CSRF:没有对输入做过滤,而且也没有原密码认证
DVWA中medium级别CSRF : 对Referer进行了检查
DVWA中medium级别CSRF : 对token进行了检查
(1)说明: 这里做了token防御,token会根据每次请求生成不同的随机值,从一定程度防止CSRF.
(2)但是这里的token以get方式提交,就不安全了,可以让黑客轻易获取。
(3)所以一般网站会放到cookie中,并且设置cookie为http-only,不能通过JS读取,既能防止XSS,又能防止CSRF.
(4)说明:不过这里绕过token的时候还是有一个小的注意点—>用burp抓取的第一个包要丢弃,否则一旦被提交,这个token也会失效.
6 Discuz脱库
Discuz安装:在www目录下创建Discuz2.5文件夹,下载Discuz2.5软件并解压,把加压后的文件放到该文件夹下.
根据需求修改连接数据库的信息,指定数据库IP,登录数据的用户名和密码.
我这里是本地安装,用户名和密码都是root,所以不用修改.
在浏览器访问URL,并进行安装
admin登录后台,获取正确备份的URL
两个备份文件的URL格式如下:
http://localhost/discuz2.5/upload/uc_server/admin.php?m=db&a=operate&t=export&appid=0&backupdir=backup_200812_6lYm0Qhttp://localhost/discuz2.5/upload/uc_server/admin.php?m=db&a=operate&t=export&appid=1&backupdir=backup_200812_6lYm0Q
为了实验更加明显,我们进入对应的备份目录,把之前的备份文件删除.
这是我的路径,供大家参考
D:\phpStudy\PHPTutorial\WWW\Discuz2.5\upload\data\backup_200812_6lYm0Q
注册一个普通用户,发布一个帖子; 并在帖子链接中插入之前获取的备份URL
http://192.168.10.1/discuz2.5/upload/uc_server/admin.php?m=db&a=operate&t=export&appid=0&backupdir=backup_200812_6lYm0Q%26backupfilename%3Dbbb(为了方便区分,我们给它一个文件名)
结果:
说明:这里用的是Discuz2.5版本,这个版本对备份做了优化,比如创建一个随机文件夹,多个请求URL等。有时候可能不成功,需要多测试几次——一定要注意随机文件夹会过几分钟就会改变。其实用Discuz1.5版本更容易成功,但是用的很少了。
8 CSRF漏洞防御
除了用户名和密码,添加验证码进行保护;
http头中使用referer字段
http头中使用token
修改密码时,需要原密码;
添加验证码字段
对客户来讲,不要点击来历不明的链接或图片;养成定时退出的好习惯;安装安全防护软件等
来源:freebuf.com 2020-08-25 16:58:39 by: zhijian
请登录后发表评论
注册