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伪造的则是服务器请求,欺骗的是内网主机或者内网服务器。
2.CSRF危害
攻击者盗用你的身份令牌以正常用户的身份发送恶意的请求,例如修改密码、添加用户、转账、购买商品、也可配合XSS打组合拳获取管理员登录凭证等一些敏感操作。
1 |
|
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,修改该用户的密码。我们也可以将该链接生成一个短链接来进一步诱骗用户点击,短链接生成网上有很多,例如:
接下来我们使用2.7节搭建起来的pikachu靶场
来演示一下GET型CSRF的效果
首先我们来到对应的CSRF GET模块,其中存在vince/allen/kobe/grady/kevin/lucy/lili密码都是123456,我们登录vince用户。
在修改个人信息处抓包发现该处功能点是GET方式传输并在参数中没有任何校验,这就造就了CSRF。
我们通过上述构造的数据包诱使正在登录系统的lili去点击,当lili点击了攻击者构造好的URL,就会在lili在知情的情况下,将lili的个人信息修改。
我们可以观察一个修改个人信息的代码csrf_get_edit.php
代码示例:
在代码22-26行判断了该用户是否登录如果没有登录则跳转到登录页面csrf_get_login.php
在代码31行通过get接收sex、phonenum、add、email四个参数,在代码33-36行对传入的内容保存到数据库中,在这个过程中没有任何的token以及refer等校验所以存在CSRF。
在代码65-88行将当前登录的session用户进行查询并返回该用户的相应个人信息。
3.2 POST方式CSRF利用
当一个危险请求是通过POST方式传输,且其中参数容易被攻击者进行伪造,那么该功能点处就可能造成CSRF。
我们还是使用pikachu靶场进行演示分析
我们还是登录vince用户,在修改个人信息处抓包发现该处功能点是以POST传递数据并数据包中没有token进行校验。
由于需要POST传递数据所以我们无法使用URL来伪造请求,我们可通过Burp对生成该请求的CSRF代码。
如下就是通过Burp生成的该请求CSRF前端代码,我们只需要将该请求放入HTML中让lili用户去点击,也会达到同样修改lili个人信息的效果。
设置我们想要修改的参数
当lili点击了攻击者精心构造的html文件,lili的个人信息将被修改。
lili在登录情况下点击了左边html,个人信息就被修改了。
我们可以观察一个修改个人信息的代码csrf_post_edit.php
代码示例:
代码中唯一的区别就在于31行处传递参数是以POST方式传递的,在这个过程中也没有任何的token以及refer等校验所以造成CSRF。
4.CSRF代码审计
在对CSRF进行代码审计的时候,其实主要观察该危险功能处是否存在token或者其他校验,由于CSRF成因是因为攻击者可以很容易的伪造该功能页面然后诱骗用户去点击,如果参数中存在攻击者无法伪造的内容则就不会存在CSRF。
其实CSRF漏洞不用特别关注PHP代码,只需要在重要功能点处抓包查看其中是否存在攻击者不可伪造的内容,如随机的tonken值或者验证码等等。然后在PHP代码中查看该token是如何进行逻辑校验的即可。
5.CSRF代码审计总结
1 |
|