撰文编辑:Webshell1414
欢迎朋友圈各种姿势的分享
如需转载,请联系无极安全 微信号:wuji_security
前言
最近在学习php的代码审计,遂从网上找到一个线上APP的后台服务源码练习,记录下本次探索的过程和结果
1、代码分析
拿到代码老规矩先看一下代码结构
发现是用Yaf框架编写的,但是之前对这个框架没怎么了解过,于是度娘狠狠补习一波。 Yaf是一个C语言编写的PHP框架 ,对于Yaf的应用, 遵循类似下面的目录结构
好了其他不多说,因为不是开发不需要对Yaf了解太深,只需了解到默认控制器是在application目录下的controllers目录文件。本项目也是在这个目录下,只需查看controllers下的逻辑即可。
还是先将其放到RIPS上扫描一下吧!
大约查看了一下,都是一堆的误报,没发现有营养的,只能一个个去看了,还好不多。
下一步决定下载APP熟悉下应用逻辑,观察应用认证和授权流程,发现该服务授权和用户体系授权是分开的,用户登录app后,服务端会返回一个用户体系的token,然后再使用用户token换取一个服务的ticket票据,之后访问这个服务都是根据ticket识别用户,如下图:
(这里首先就想到能不能找到并破解生成ticket算法,这样就实现用户间越权)
整体大致浏览使用了一遍功能,发现客户端与服务端动态交互不多。好吧,既然项目不大交互不多,那我们就一个一个去看下那些问题!
2、Sql注入漏洞
老方法,直接搜索可修改的参数
可惜并不多,第一想法是有点凉了,还是慢慢摸索看看吧!
查看Search.php文件内容
在37行传参name到$name变量,在49行交给getTagByName()函数处理
跟进getTagByName函数看下
在函数中可以看到明显,只是校验了name字段是否有值就拼接到sql语句进行查询,就造成了sql注入拿他生产环境测试,
注入测试成功,本来想深入测试,但又怕影响业务,素质点,就此作罢
继续翻翻代码,用户可控制的变量实在不多,翻了半天代码没发现可利用的,而且其他变量都做了校验
这个漏洞应该是开发忘记校验了。
3、ticket伪造薅羊毛
继续去瞅瞅ticket生成算法吧,ticket算法在Ticket.php文件上
可以看到在23行ticket生成算法
在21行得到$ua变量,即用户的:User-Agent
生成的ticket之后放到redis中并设置一个小时的有效期
那么只剩$userId未知了,猜测应该和之前APP登录的id有关,查找谁在调用generateTicket
查看Plugin.php文件内容,找到131行
在这$userInfo['id']就是$userId,往上继续跟踪$userInfo,$userId由addUser($userInfo)生成,继续跟踪该函数
继续跟踪addGetInsertId()函数
在这里可以看到,$result其实就是插入数据库自增的id值,这是个正整数,那么ticket生成算法就可以知晓了,就是md5($ua . "userId:" . $userId),$ua就是User-Agent,这个不多可以遍历,$userId就是一个正整数,那么遍历$ua和正整数就可以将一部分用户的ticket遍历出来了,这里我拿自己的ticket(64b6cb4250ca9898c1d254ceb8a9c77b)就行测试
爆破成功$userId值为 911
碰到的问题
我开始觉得奇怪,这样的每个用户的ticket应该是固定值,但实际中发现它还是会变的
之后再研究代码时候发现用户超过24小时之后会重新更新数据库,实际意义就是将用户id移到当前最大递增的id值,从而实现用户ticket的有效变换(个人感觉这样实现好麻烦,而且用户一多性能就跟不上了)
4、总结
开发无论多注意,总归还是会遗漏一两个参数不小心忘记进行处理的,注意每个细节你会有意外的发现,对于开发要注意的是不要将在线的服务发布到互联网上,兴许一不小心就会被黑客盯上
前沿的安全趋势、安全技术、产品、观点、评论
思源安全团队解决方案,安全案例
领取专属 10元无门槛券
私享最新 技术干货