靶场地址:
https://github.com/digininja/DVWA https://github.com/zhuifengshaonianhanlu/pikachu
0x01漏洞概述
csrf跨站请求伪造:是一种对网站的恶意利用。尽管听起来像跨站脚本,但它与xss非常不同,xss利用站点内受信任用户,而csrf则通过伪造来自受信任用户的请求来利用受信任的网站,与xss攻击相比,csrf则通过伪装来自受信任用户的请求来利用受信任的网站。与xss攻击相比,csrf攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比xss更具危险性。
本质来说就是在你访问网站信息的同时,盗用你的cookie,用你的身份进行一些非法操作。
危害:
攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做到的事情包括:以你的名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
0x02 DVWA靶场练习
LOW
首先进入初级页面我们知道这是一个修改密码的,当我们输入密码进行修改后,提示修改成功后,我们会发现这也是一个get型提交。
那我们就试试直接在地址栏中修改内容,看能否执行成功。(修改内容后,我们复制链接重新打开一个界面,然后输入网址进入页面,出现下图,要注意的是我们必须使用同一个浏览器,因为在访问页面时通常存在cookie认证,否则即使点击了恶意链接也没用。)
原密码失效
如上图所示,执行成功。
那么如何验证我们修改了呢,这时我们可以采用暴力破解模块。(如上图所示,成功利用了漏洞)
而在真实地攻击环境中,我们通常是给受害者发送一个链接,而在正常的情况下我们通常不会点击一个很长的看起来就不正常的链接,这个时候我们就需要好好学习社会工程学,学会利用人们的心理来达到我们的目的,诱使他们点击我们构造的链接通常情况下会把长链接构造成一个短链接,这个时候我们可以利用网上很多在线工具)
在线短链接生成
https://tool.chinaz.com/tools/dwz.aspxhttps://u.suolink.cn/mkdwz/shorturl/createTinyUrl
我们可以选择其中一个短连接发送给受害者,诱使他点击此链接即可。
我们可以通过构造一个页面。
修改密码的链接重定向到一个自己写的一个错误页面,用户点击之后以为出错了,实际已经执行了恶意代码。
点击进入链接,出现上图错误页面,但其实已经执行了语句。
如上图所示验证成功。
输入我们修改后的密码,证明我们已经成功把密码修改了。
Medium
进入下一关,我们用上一关界面试一下,发现错误。
对比数据包
我们发现一个有referer,一个没有。这时候查看源代码
原来是对referer做了限制,那么我们把地址栏抓到的数据包发送给重发器,把在页面数据包中的referer复制过来,然后查看结果。
如上图所示,成功修改。
High
在这一关,我们输入相关内容是发现地址带入了token,这个时候我们需要借助上一关的存储型xss来爆出token
我们首先进入存储型xss HIGH级别
<iframe src="../csrf/" οnlοad="alert(frames[0].document.getElementsByName('user_token')[0].value)"></iframe>
成功弹出token注意千万不要点击确定否则会被更新,点击确定之后新开启一个会话,token也会随之更新,我们把token加入到我们写的错误页面中地址栏的后面,诱使用户点击即可成功利用该漏洞。
注意:将low级别中的那个自己写的网页的名字改成对应的IP地址,例如192.168.179.79.html
放在攻击者服务器里,这样也可以绕过。
网页取名为ip地址是为了通过referer的验证,过滤规则是http包头的referer参数的值中必须与host相同
csrf的检测,抓取一个数据包如果去掉referer之后还有效,则可以确定存在csrf漏洞
0x03 皮卡丘靶场练习
第1关 CSRF(GET)
进入靶场发现是一个登陆界面,所以我们直接点击提示得到账号密码进行登录
发现有这么多账号,直接选择一个登陆。
我这里使用allen
这个账号登录,登录后是一个个人信息页面
点击修改个人信息进入修改界面点击submit进行修改
发现url没有变化,点击提交之后就跳转到上图这个显示个人信息的页面了,信息也修改成功了
所以这时候我们可以使用burpsuit进行抓包修改,在提交修改个人信息的时候,可以抓包,看到下面的内容
从上面的url可见,修改用户信息的时候,是不带任何不可预测的认证信息的。那么,这里应该是可以被利用的。
在allen登录状态下(其实这个链接里面是不包含用户名的,谁登录都无所谓,只要有人登录着就行,登录着的用户的信息就会被改成url提供的那些),试试改一改上面的链接,比如把电话号码改一改。浏览器地址栏输入payload:
http://www.pikachu.com:90/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=123456789&add=nbaluckhouse&email=allen%40qq.com&submit=submit
如果被攻击者此时登录状态或cookie/session没有过期,则她的信息被修改。
跳转到显示用户信息的地方,手机号已经被成功修改,攻击成功。
如下图:
浏览器地址栏输入这个短链接之后,allen成功变成女孩啦
第2关 CSRF(POST)
进入第二关,也是一个登陆界面,登陆的账号密码和第一关一样,依旧登陆allen账号进行修改
进入修改信息界面,点击submit进行抓包
可以看到下图
从上图的请求报文来看,和前一关一样,没有不可预测的认证信息,可以被利用。
但是这一关是post类型,URL不再显示修改参数,所以无法再使用上述办法(即通过URL来伪造请求)进行修改,但是抓包可以知道本页面中有的标签以及name,方便后面构造表单时使用。
此时,黑客可以通过构造恶意站点,将POST请求隐藏在站点中的表单中,然后诱骗用户进行点击,当用户点击后触发表单,数据自然就POST到存在CSRF漏洞的网站,用户的信息则被恶意修改。
将写好的表单部署到黑客站点,这里因为是本机做演示,所以我放到Pikachu/vul/csrf/
目录下
最后,当用户在登录状态下,访问黑客站点
http://www.pikachu.com:90/csrf.html
并点击提交按钮,那么其个人信息将会被恶意修改,可以在控制台中看到点击按钮后触发的POST请求。
点击前
点击后
<html> <script> <!-- 这个script是用来自动提交表单的 --> window.onload = function() { document.getElementById("submit").click(); } </script> <body> <form action="http://www.pikachu.com:90/vul/csrf/csrfpost/csrf_post_edit.php" method="POST"> <input type="hidden" name="sex" value="girl" /> <input type="hidden" name="phonenum" value="123456789" /> <input type="hidden" name="add" value="usa" /> <input type="hidden" name="email" value="caker@pikachu.com" /> <input type="hidden" name="submit" value="submit" /> <input id="submit" type="submit" value="Submit request" style="display:none"/> <!-- style设置为display:none起到隐藏submit按钮的作用 --> </form> </body> </html>
第三关 CSRF Token
这关是防范CSRF的常用方法的一个演示。
token验证原理
CSRF的主要问题是敏感操作的链接容易被伪造
每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对随机码进行验证
网页接受从后台发过来的token,类型不可见。将其一并提交给后台进行验证。每次刷新,后台发送过来的token都不一样,起到了防止伪造的作用。
试了一下,这关删除token是无法修改用户信息的,多抓几个包之后也没有看出token有什么规律。
在一个浏览器上以allen登录,到修改信息的页面,查看网页源代码获取token,再到另一个浏览器以lili登录,构造payload包含此token也是无法攻击成功的。
看一下代码,修改用户信息时,服务器会比较url中的token字段和session中的token字段,如果相同才能修改用户信息。
修改完用户信息之后,会用set_token()函数生成新的token,将其返回到html表单中并隐藏起来,以便下次用户修改信息时代入url。
set_token()函数如下图所示,在生成新token之前会先销毁老token,避免token重复使用。
0x04 小结
几种常见的攻击类型
GET类型的CSRF
GET类型的CSRF利用非常简单,只需要一个HTTP请求,一般会这样利用:
![](https://awps-assets.meituan.net/mit-x/blog-images-bundle-2018b/ff0cdbee.example/withdraw?amount=10000&for=hacker)
在受害者访问含有这个img的页面后,浏览器会自动向
http://bank.example/withdraw?account=xiaoming&amount=10000&for=hacker
发出一次HTTP请求。bank.example就会收到包含受害者登录信息的一次跨域请求。
POST类型的CSRF
这种类型的CSRF利用起来通常使用的是一个自动提交的表单,如:
<form action="http://bank.example/withdraw" method=POST> <input type="hidden" name="account" value="xiaoming" /> <input type="hidden" name="amount" value="10000" /> <input type="hidden" name="for" value="hacker" /> </form> <script> document.forms[0].submit(); </script>
访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。
POST类型的攻击通常比GET要求更加严格一点,但仍并不复杂。任何个人网站、博客,被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许POST上面。
链接类型的CSRF
链接类型的CSRF并不常见,比起其他两种用户打开页面就中招的情况,这种需要用户点击链接才会触发。这种类型通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击,例如:
<a href="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank"> 重磅消息!! <a/>
由于之前用户登录了信任的网站A,并且保存登录状态,只要用户主动访问上面的这个PHP页面,则表示攻击成功。
CSRF的特点
攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。 CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。
0x05 漏洞防御
增加token验证(常用的做法):
1.对关键操作增加token参数,token值必须随机,每次都不一样
关于安全的会话管理(避免会话被利用):
不要在客户端端保存敏感信息(比如身份认证信息) 测试直接关闭,退出时,的会话过期机制 设置会话过期机制,比如15分钟内无操作,则自动登录超时
访问控制安全管理:
敏感信息的修改时需要对身份进行二次认证,比如修改账号时,需要判断旧密码 敏感信息的修改使用post,而不是get 通过http 头部中的referer来限制原页面
增加验证码
一般用在登录,(防暴力破解),也可以用在其他重要信息操作的表单中,