从CSRF原理到CMS漏洞利用

0x01 基础知识:

1、CSRF漏洞简介:

CSRF全称:Cross-site request forgery,即,跨站请求伪造,也被称为“One Click Attack”或“Session Riding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。举个生活中的例子:就是某个人点了个奇怪的链接,自己什么也没输,但自己的qq号或其他的号就被盗了。即该攻击可以在受害者不知情的情况下以受害者名义伪造请求,执行恶意操作,具有很大的危害性。

2、与XSS的区别:

CSRF听起来很像跨站脚本攻击(XSS),但它与XSS有很大区别,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。两者的攻击流程如下图:

在这里插入图片描述

3、攻击的细节:

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个用户曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了Web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

CSRF攻击流程如下:

举个例子

场景需求:坏人小黑想要修改小明在购物网站www.xx.com上填写的会员地址。

小黑想要修改小明的信息,他需要拥有:1、登录权限 2、修改个人信息的请求。

但是小明又不会把自己的账号密码告诉小黑,那小黑怎么办?于是小黑自己跑到www.xx.com上注册了一个账号,然后修改了一下自己的个人信息(比如email地址),他发现修改的请求是:`http://www.xxx.com/edit.php?email=xiaohei@qq.com&Change=Change`

然后,他进行了这样一个操作:把这个链接伪装一下,在小明登录xxx网站后,欺骗他进行点击,小明点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。

这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。

通过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户的浏览器,让其以用户的名义运行操作。

CSRF的攻击过程需要满足以下两个条件:

  1. 目标用户已经登录了网站,能够执行网站的功能。

  2. 目标用户访问了攻击者构造的URL。

4、常见的攻击类型:

CSRF原理很简单,一般来说,常见的攻击类型有以下2 种:

  • GET型

  • POST型

下面就以pikachu靶场为例,演示下这几种类型的攻击流程。靶场下载

4.1、GET类型的CSRF:

GET类型的CSRF利用很简单,只需要构造一个HTTP请求就可以完成。

示例

某网站的个人信息页面如下:
在这里插入图片描述
修改个人信息并抓包:
在这里插入图片描述
从提交的请求可以看到,系统并没有对用户设置 Token,而且是通过GET请求来提交修改信息。那么我们拿到这个URL之后,就可以改成自己想要修改的数据,如把受害者的邮箱修改为自己的邮箱:

www.xx.com/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=13676767767&add=nba+76&email=hacker%40pikachu.com&submit=submit

然后通过各种手段让已经登录的用户访问这个链接,攻击就完成了。

当受害者点击链接后,可以看到受害者的邮箱地址已经变成我们自己设置的了,如图:
在这里插入图片描述
当然,直接访问上面这个链接太可疑了,因此可以利用短链接生成器进行伪装,例:
在这里插入图片描述
访问生成的短链接同样执行成功。
在这里插入图片描述

常用短链接网站:

http://tool.chinaz.com/tools/dwz.aspx
https://www.985.so/

4.2、POST类型的CSRF:

在这里插入图片描述
还是和上面一样,修改个人信息,抓包:
在这里插入图片描述
可以看到是POST类型,参数是在请求体中提交的,我们就不能通过伪造URL的方式进行攻击了。

这种类型的 CSRF 利用起来通常使用的是一个自动提交的表单;攻击者可以在自己的公网服务器上搭建一个站点,在站点上做一个表单,诱导受害者点击这个链接,当用户点击时,就会自动向存在CSRF的服务器提交POST请求修改个人信息。

编写一个html 页面,代码如下,然后把此页面放到攻击者自己的Web服务器上(这里为了演示方便,放在虚拟机上了)

post.html:

<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php">
    <input id="sex" type="text" name="sex" value="boy" />
    <input id="phonenum" type="text" name="phonenum" value="1367676776" />
    <input id="add" type="text" name="add" value="nab 76" />
    <input id="email" type="text" name="email" value="hacker@pikachu.com" />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

目标服务器:127.0.0.1

攻击者服务器:192.168.50.130

把上面的构建好的页面放在kali上的var/www/html目录下(别忘开启apache服务),访问链接为:

http://192.168.50.130/post.html

然后把该URL发送给受害者,只要受害者一点击这个链接,就会自动发送POST请求,修改其邮箱地址。

点击链接是这个页面,然后会自动提交数据。
在这里插入图片描述
在这里插入图片描述
修改成功。( ̄︶ ̄)↗ 

0x02 CSRF漏洞检测:

1、手动测试:

常用的办法是:寻找站内增删改的地方,抓取一个正常请求的数据包,修改链接或表单的参数,再用验证过的游览器打开链接或提交表单,如果操作可以成功执行就代表存在CSRF漏洞。

手动测试CSRF漏洞比较麻烦,因此可以选择使用工具来进行高效的检测。下面简单介绍下几个常用的CSRF检测工具。

2、使用CSRF检测工具:

常用的CSRF检测工具有CSRFTester、Burpsuite、CSRF Request Builder等,这里介绍下前两个工具的使用方法。

2.1、CSRFTester:

CSRFTester测试流程:使用代理抓取我们在浏览器中访问过的所有的连接以及表单等信息,然后在CSRFTester中修改相应的表单参数等信息,重新提交,相当于一次伪造客户端请求,如果修改后的测试请求成功被目标服务器接受,则说明存在CSRF漏洞。同理 CSRFTester也可作为攻击工具。最新下载链接

使用注意事项:

  • 需要java环境,并更改 run.bat中的 jre路径为你自己的:
    在这里插入图片描述

  • 设置HTTP代理,端口为8008。

双击 run.bat文件启动,页面如下:
在这里插入图片描述
像这样就是正常启动了。

点击Start Recording,开启CSRFTester检测工作,执行添加管理员操作,抓取到数据包:
在这里插入图片描述
修改管理员用户名(也可以在下面生成的表单中修改),点击 Generate HTML 会生成一个 HTML 测试脚本:
在这里插入图片描述
使用同一浏览器打开此文件
在这里插入图片描述
可以看到,成功添加了账号,说明网站存在CSRF漏洞。

2.2、BurpSuite:

Burpsuite中 Engagement tools 的 Generate CSRF PoC 模块也可以作为CSRF的测试工具。

还是同样执行添加管理员操作,抓包,然后右键选择 Engagement tools 找到Generate CSRF PoC。
在这里插入图片描述
修改参数,生成测试表单
在这里插入图片描述
右下角的 Test in browser 是在本地测试用的(Copy HTML 可以复制下来HTML,保存到攻击者服务器,用来攻击),点击会生成一个测试链接,内容就是生成的测试页面,打开链接(这里浏览器必须开着bp的代理):
在这里插入图片描述
点击提交按钮并在bp中放包。
在这里插入图片描述
可以看到成功执行了测试,证明存在着CSRF漏洞。

0x03 CSRF漏洞利用实例:

说了这么多,不实际操作下还是纸上谈兵;下面就以这两个本地CMS为例,复现一下CSRF漏洞的实际利用过程。

1、MetInfo CMS:

cms版本:MetInfo5.3.1
环境:phpStudy集成环境
cms下载:https://pan.baidu.com/s/1ZgKx3BE3hmJkflJxundYSA 提取码:pek6

解压到www目录下,访问目录开始安装
在这里插入图片描述
按照提示一步一步完成配置,进入网站

在这里插入图片描述
访问 /网站首页/admin 进入后台管理页面,并登录,找到添加管理员模块,添加一个管理员。
在这里插入图片描述
浏览器开启代理后,使用我们的 CSRFTester工具抓取数据包
在这里插入图片描述
找到对应的请求,修改参数。这里用户名改为hacker,然后点击Generate HTML 保存表单。
在这里插入图片描述
删除多余的请求表单后,放到攻击者的服务器上,访问链接为(这里放本地了):http://127.0.0.1/Me/index.html

然后诱导网站管理员访问链接
在这里插入图片描述
成功添加。

使用添加的用户登录,账号:hacker 密码:admin
在这里插入图片描述
登陆成功,攻击完成

2、骑士CMS:

cms版本:74cms_v4.1.24
环境:phpStudy集成环境
cms下载:https://pan.baidu.com/s/1U-I28J2DDTZkY1esQr9H4A 提取码:75sx

解压后访问 upload目录开始安装:
在这里插入图片描述
按照提示一步一步完成配置,进入网站
在这里插入图片描述
进入后台管理页面,找到添加管理员页面

在这里插入图片描述
使用bp抓包,使用 Generate CSRF PoC 构造攻击页面

在这里插入图片描述
点击 Copy HTML 保存到本地,为诱惑管理员点击,可以添加一些具有诱惑性的东西,举个例子:(忽略这个很丑的页面→_→)

在这里插入图片描述
然后放到攻击者的服务器上(这里就放到本地了),访问链接为:http://127.0.0.1/74/lol.html
在这里插入图片描述
然后诱导管理员点开链接并提交,成功执行。

使用刚才创建的账号密码进行登录测试,账号 hacker 密码 admin
在这里插入图片描述
登录成功,攻击完成。

0x04 如何防御CSRF攻击:

CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强网站对CSRF的防护能力来提升安全性。

在服务器端防御CSRF攻击主要有三种策略:

1、验证HTTP Referer字段:

Referer字段存在于 HTTP请求头中,它记录了该 HTTP请求的来源地址。正常情况下请求的 Referer 值是 请求发出所在页面的URL,当检测到 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

例如黑客要对银行网站实施 CSRF 攻击,他只能在他自己的服务器构造请求,当用户点击黑客的链接发送请求到银行时,该请求的 Referer 是指向黑客自己的网站,就会拒绝该请求。

2、添加Token,并验证:

Token介绍:

  • token是服务端生成的一串随机数,作为客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token并返回给客户端。

Token验证:

  • 在 HTTP请求中以參数的形式添加一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,假设请求中没有token 或者 token 内容不对,则可能是 CSRF 攻击而拒绝该请求。
    3、关键请求添加验证码:
    当进行一些敏感操作时,如修改密码、添加管理员等操作,可以通过增加网站的验证手段,例如增加图形验证码或短信验证码等,只有通过验证的请求才算合法。

    最后:

    🆗,本次的CSRF学习就到这了,本次学习 收获颇丰,继续加油!最后提醒大家,一定不要随便点别人发的链接!

参考文章:
https://cloud.tencent.com/developer/article/1586164
https://www.jianshu.com/p/4152a4947cdc
https://blog.csdn.net/kzadmxz/article/details/92076837
https://www.cnblogs.com/54chensongxia/p/11693666.html
https://www.secpulse.com/archives/78792.html
https://shu1l.github.io/2020/04/03/csrf-lou-dong-xue-xi/
https://shu1l.github.io/2020/04/03/csrf-lou-dong-xue-xi/


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2058751973@qq.com

×

喜欢就点赞,疼爱就打赏