首页
学习
活动
专区
工具
TVP
发布

记一次PHP代码审计

撰文编辑: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、总结

开发无论多注意,总归还是会遗漏一两个参数不小心忘记进行处理的,注意每个细节你会有意外的发现,对于开发要注意的是不要将在线的服务发布到互联网上,兴许一不小心就会被黑客盯上

前沿的安全趋势、安全技术、产品、观点、评论

思源安全团队解决方案,安全案例

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180408G123KH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券