从CSRF原理到CMS漏洞利用 📅 2026/7/4 10:02:50 0x01 基础知识1、漏洞简介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?emailxiaoheiqq.comChangeChange然后他进行了这样一个操作把这个链接伪装一下在小明登录xxx网站后欺骗他进行点击小明点击这个链接后个人信息就被修改了小黑就完成了攻击目的。这种恶意的网址可以有很多种形式藏身于网页中的许多地方。此外攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛博客等任何用户生成内容的网站中。这意味着如果服务端没有合适的防御措施的话用户即使访问熟悉的可信网站也有受攻击的危险。通过例子能够看出攻击者并不能通过CSRF攻击来直接获取用户的账户控制权也不能直接窃取用户的任何信息。他们能做到的是欺骗用户的浏览器让其以用户的名义运行操作。CSRF的攻击过程需要满足以下两个条件目标用户已经登录了网站能够执行网站的功能。目标用户访问了攻击者构造的URL。4、常见的攻击类型CSRF原理很简单一般来说常见的攻击类型有以下2 种GET型POST型下面就以pikachu靶场为例演示下这几种类型的攻击流程。靶场下载4.1、GET类型的CSRFGET类型的CSRF利用很简单只需要构造一个HTTP请求就可以完成。示例某网站的个人信息页面如下修改个人信息并抓包从提交的请求可以看到系统并没有对用户设置 Token而且是通过GET请求来提交修改信息。那么我们拿到这个URL之后就可以改成自己想要修改的数据如把受害者的邮箱修改为自己的邮箱www.xx.com/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sexboyphonenum13676767767addnba76emailhacker%40pikachu.comsubmitsubmit然后通过各种手段让已经登录的用户访问这个链接攻击就完成了。当受害者点击链接后可以看到受害者的邮箱地址已经变成我们自己设置的了如图当然直接访问上面这个链接太可疑了因此可以利用短链接生成器进行伪装例访问生成的短链接同样执行成功。常用短链接网站http://tool.chinaz.com/tools/dwz.aspxhttps://www.985.so/4.2、POST类型的CSRF还是和上面一样修改个人信息抓包可以看到是POST类型参数是在请求体中提交的我们就不能通过伪造URL的方式进行攻击了。这种类型的 CSRF 利用起来通常使用的是一个自动提交的表单攻击者可以在自己的公网服务器上搭建一个站点在站点上做一个表单诱导受害者点击这个链接当用户点击时就会自动向存在CSRF的服务器提交POST请求修改个人信息。编写一个html 页面代码如下然后把此页面放到攻击者自己的Web服务器上这里为了演示方便放在虚拟机上了post.htmlhtmlheadscriptwindow.onloadfunction(){document.getElementById(postsubmit).click();}/script/headbodyformmethodpostactionhttp://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.phpinputidsextypetextnamesexvalueboy/inputidphonenumtypetextnamephonenumvalue1367676776/inputidaddtypetextnameaddvaluenab 76/inputidemailtypetextnameemailvaluehackerpikachu.com/inputidpostsubmittypesubmitnamesubmitvaluesubmit//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 漏洞检测1、手动测试常用的办法是寻找站内增删改的地方抓取一个正常请求的数据包修改链接或表单的参数再用验证过的浏览器打开链接或提交表单如果操作可以成功执行就代表存在CSRF漏洞。手动测试CSRF漏洞比较麻烦因此可以选择使用工具来进行高效的检测。下面简单介绍下几个常用的CSRF检测工具。2、使用CSRF检测工具常用的CSRF检测工具有CSRFTester、Burpsuite、CSRF Request Builder等这里介绍下前两个工具的使用方法。2.1、CSRFTesterCSRFTester测试流程使用代理抓取我们在浏览器中访问过的所有的连接以及表单等信息然后在CSRFTester中修改相应的表单参数等信息重新提交相当于一次伪造客户端请求如果修改后的测试请求成功被目标服务器接受则说明存在CSRF漏洞。同理 CSRFTester也可作为攻击工具。最新下载链接使用注意事项需要java环境并更改 run.bat中的 jre路径为你自己的设置HTTP代理端口为8008。双击 run.bat文件启动页面如下像这样就是正常启动了。点击Start Recording开启CSRFTester检测工作执行添加管理员操作抓取到数据包修改管理员用户名也可以在下面生成的表单中修改点击 Generate HTML 会生成一个 HTML 测试脚本使用同一浏览器打开此文件可以看到成功添加了账号说明网站存在CSRF漏洞。2.2、BurpSuiteBurpsuite中 Engagement tools 的 Generate CSRF PoC 模块也可以作为CSRF的测试工具。还是同样执行添加管理员操作抓包然后右键选择 Engagement tools 找到Generate CSRF PoC。修改参数生成测试表单右下角的 Test in browser 是在本地测试用的Copy HTML 可以复制下来HTML保存到攻击者服务器用来攻击点击会生成一个测试链接内容就是生成的测试页面打开链接这里浏览器必须开着bp的代理点击提交按钮并在bp中放包。可以看到成功执行了测试证明存在着CSRF漏洞。0x03 漏洞利用实例说了这么多不实际操作下还是纸上谈兵下面就以这两个本地CMS为例复现一下CSRF漏洞的实际利用过程。1、MetInfo CMScms版本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、骑士CMScms版本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攻击主要有三种策略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/1586164https://www.jianshu.com/p/4152a4947cdchttps://blog.csdn.net/kzadmxz/article/details/92076837https://www.cnblogs.com/54chensongxia/p/11693666.htmlhttps://www.secpulse.com/archives/78792.htmlhttps://shu1l.github.io/2020/04/03/csrf-lou-dong-xue-xi/https://shu1l.github.io/2020/04/03/csrf-lou-dong-xue-xi/