PHP代码审计之WEB安全系列基础文章(八)之CSRF篇

【如需转载,请详细表明来源,请勿设置原创】

嗨,大家好,我是闪石星曜CyberSecurity创始人Power7089。

欢迎大家扫描下方二维码关注 “闪石星曜CyberSecurity” 公众号,这里专注分享渗透测试,Java代码审计,PHP代码审计等内容,都是非常干的干货哦。

公众号

今天为大家带来PHP代码审计基础系列文章第八篇之任意CSRF篇

这是【炼石计划@PHP代码审计】知识星球第二阶段的原创基础系列文章,拿出部分课程分享给零基础的朋友学习。本系列原创基础文章涵盖了PHP代码审计中常见的十余种WEB漏洞,是匹夫老师精心的创作,欢迎关注我的公众号跟着一起学习。

【炼石计划@PHP代码审计】是一个系统化从入门到提升学习PHP代码审计的成长型知识星球。这里不仅注重夯实基础,更加专注实战进阶。强烈推荐加入我们,一起来实战提升PHP代码审计。

公众号

PHP代码审计之CSRF(客户端请求伪造)

1.CSRF原理

​ CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:客户端请求伪造。在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为”one click”攻击。

1.1 CSRF与SSRF的区别?

​ 这个问题也是在面试中常被问到的一个问题,我在前两年参加工作的时候也被问到过这个问题。其实问题很简单,大家只要了解CSRF与SSRF的本质区别就很容易理解。

​ CSRF相当于我们欺骗的是客户端,在直白一点来说的话我们欺骗的是目标用户,通过构造恶意请求页面诱使用户去点击从而触发恶意请求达到我们的目的,而SSRF如果大家看了我2.6的内容的话,大家其实就知道SSRF相当于我们利用的是服务器,我们通过存在SSRF漏洞的服务器向内网主机发送恶意请求来达到我们的目的。

​ 一句话来说CSRF伪造的是客户端也就是欺骗的是用户,而SSRF伪造的则是服务器请求,欺骗的是内网主机或者内网服务器。

image-20220722143938412

2.CSRF危害

​ 攻击者盗用你的身份令牌以正常用户的身份发送恶意的请求,例如修改密码、添加用户、转账、购买商品、也可配合XSS打组合拳获取管理员登录凭证等一些敏感操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
场景:
攻击者在不知道后台登录密码的情况下想要直接修改XXX网站的后台登录密码。

正常的修改密码操作:
具有修改权限的用户登录XXX网站后台,在修改密码功能处进行密码修改。

假设我们可以正常注册一个用户,然后登录后台,在修改密码处发现POST请求包内容如下

http://www.xxx.com/changepwd.php?change=change

请求内容为

user=ceshi&newpwd=XXXX&repeatpwd=XXXX

由于请求包中没有任何校验内容,容易被攻击者伪造且该用户正处于登录状态下。当用户成功点击就相当于使用该用户的凭证去执行了我们想要执行的操作,所以我们就可以伪造该请求页面让从而诱使用户去点击从而修改别人的后台登录密码。

3.CSRF攻击方式

3.1 GET方式CSRF利用

当一个危险请求是通过GET方式传输的,且其中参数容易被攻击者进行伪造,那么该功能点处就可能存在CSRF。

例如:修改密码为http://XXXXXX.com/changepwd.php?user=ceshi&newpwd=XXXX&repeatpwd=XXXX&change=change

由于该链接无token保护且无任何防护,此时该链接可被伪造,将构造好的链接如:http://XXXXXX.com/changepwd.php?user=admin&newpwd=123456&repeatpwd=123456&change=change发送给目标用户点击就会触发CSRF,修改该用户的密码。我们也可以将该链接生成一个短链接来进一步诱骗用户点击,短链接生成网上有很多,例如:

image-20220722123753297

接下来我们使用2.7节搭建起来的pikachu靶场来演示一下GET型CSRF的效果

首先我们来到对应的CSRF GET模块,其中存在vince/allen/kobe/grady/kevin/lucy/lili密码都是123456,我们登录vince用户。

在修改个人信息处抓包发现该处功能点是GET方式传输并在参数中没有任何校验,这就造就了CSRF。

image-20220722130333783

我们将修改个人信息的请求包提取出来http://www.pikaqiu.com/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit,例如当前用户lili正在登录系统进行操作

image-20220722130821566

我们通过上述构造的数据包诱使正在登录系统的lili去点击,当lili点击了攻击者构造好的URL,就会在lili在知情的情况下,将lili的个人信息修改。

image-20220722131116499

我们可以观察一个修改个人信息的代码csrf_get_edit.php

代码示例:

在代码22-26行判断了该用户是否登录如果没有登录则跳转到登录页面csrf_get_login.php

image-20220722133255505

在代码31行通过get接收sex、phonenum、add、email四个参数,在代码33-36行对传入的内容保存到数据库中,在这个过程中没有任何的token以及refer等校验所以存在CSRF。

image-20220722133451297

在代码65-88行将当前登录的session用户进行查询并返回该用户的相应个人信息。

image-20220722134025367

3.2 POST方式CSRF利用

当一个危险请求是通过POST方式传输,且其中参数容易被攻击者进行伪造,那么该功能点处就可能造成CSRF。

我们还是使用pikachu靶场进行演示分析

我们还是登录vince用户,在修改个人信息处抓包发现该处功能点是以POST传递数据并数据包中没有token进行校验。

image-20220722135137742

由于需要POST传递数据所以我们无法使用URL来伪造请求,我们可通过Burp对生成该请求的CSRF代码。

image-20220722135816077

如下就是通过Burp生成的该请求CSRF前端代码,我们只需要将该请求放入HTML中让lili用户去点击,也会达到同样修改lili个人信息的效果。

image-20220722135933898

设置我们想要修改的参数

image-20220722140528692

当lili点击了攻击者精心构造的html文件,lili的个人信息将被修改。

image-20220722140650571

lili在登录情况下点击了左边html,个人信息就被修改了。

image-20220722141053016

我们可以观察一个修改个人信息的代码csrf_post_edit.php

代码示例:

代码中唯一的区别就在于31行处传递参数是以POST方式传递的,在这个过程中也没有任何的token以及refer等校验所以造成CSRF。

image-20220722141312628

4.CSRF代码审计

​ 在对CSRF进行代码审计的时候,其实主要观察该危险功能处是否存在token或者其他校验,由于CSRF成因是因为攻击者可以很容易的伪造该功能页面然后诱骗用户去点击,如果参数中存在攻击者无法伪造的内容则就不会存在CSRF。

​ 其实CSRF漏洞不用特别关注PHP代码,只需要在重要功能点处抓包查看其中是否存在攻击者不可伪造的内容,如随机的tonken值或者验证码等等。然后在PHP代码中查看该token是如何进行逻辑校验的即可。

5.CSRF代码审计总结

1
在关于CSRF代码审计中,我们不用将关注重点放在后端代码中,只需要关注一些危险功能点请求包或者请求内容中是否存在攻击者无法伪造的内容即可。CSRF可以配合XSS进行组合拳将危害最大化,如腾讯某分站ssrf+self xss、联想某处csrf+selfxss存储型跨站漏洞等等,感兴趣的小伙伴可以在baidu自行搜索。

PHP代码审计之WEB安全系列基础文章(八)之CSRF篇
http://example.com/2022/10/10/PHP代码审计之WEB安全系列基础文章(八)之CSRF篇/
作者
Power7089
发布于
2022年10月10日
许可协议