PHP|代码审计思路之PHP代码审计( 三 )


了解路由也是为了能快速定位漏洞位置 , 要不然 , 你通过审计源码找到的漏洞 , 却不知道在浏览器中用什么样的url去访问 , 这不是件很尴尬的事儿吗?
比如Thinkphp的路由有三种方式5.1. 普通模式关闭路由 , 完全使用默认的pathinfo方式URL:
‘url_route_on’ => false
路由关闭后 , 不会解析任何路由规则 , 采用默认的PATH_INFO 模式访问URL:
module/controller/action/param/value/…
module就是使用的应用 。
controller是控制器 , 跟文件名一致 。
action是方法 , 某控制器下的方法 。
param是需要的变量
value是参数
但仍然可以通过Action参数绑定、空控制器和空操作等特性实现URL地址的简化
5.2. 混合模式开启路由 , 并使用路由+默认PATH_INFO方式的混合:
‘url_route_on’ => true
该方式下面 , 只需要对需要定义路由规则的访问地址定义路由规则 , 其它的仍然按照默认的PATH_INFO模式访问URL 。
5.3. 强制模式开启路由 , 并设置必须定义路由才能访问:
‘url_route_on’ => true
‘url_route_must’=> true

这种方式下面必须严格给每一个访问地址定义路由规则 , 否则将抛出异常 。
首页的路由规则是 /
其实 , 在实际审计过程中 , 我一般会先去黑盒访问一遍功能点 , 分析后差不多也能知道路由怎样构成 , 如果有的地方不清楚 , 可以去源码中找路由文件
一般带有route关键词的文件 , 或文件夹与路由有关 。
分析好路径 , 之后就可以真正的开始审计 。
00×6 审计在人工审计之前 , 可以使用我之前提到的xcheck、Fotify、codeql等自动化审计工具先审计一遍 , 根据报告 , 验证一遍 , 再往下去根据下面的步骤审一遍 , 一个项目 , 也就能审个七七八八了 , 深层次的利用也就得看自身的实力与经验了 。
如果使用了框架 , 可以先看看此项目还有没有框架的漏洞存在 , 我就不再赘述了 。
6.1. 鉴权首先对于项目整体的一个权限认证做一个判断 , 判断是否存在越权 , 未授权访问的情况 。
一般来说 , 需要权限认证的地方 , 是后台管理 , 即admin应用下的 。
所以对于admin下的控制器这些方法 , 需要判断是否可以未授权访问 。
目前对于整个后台管理鉴权的方式 , 一般是采用写一个基类 , 比如Base.php或者common.php , 其中存在鉴权方法 , 然后在每个控制器类继承这个类 。
比如xiaohuanxiong漫画cms的后台 , 就是采用了这种方法 。


不过我也看到了 , 有的比较好的项目 , 自己二开框架 , 做了自己的组件 , 然后 , 每个类都继承了此组件 , 也是同样的原理
比如ThinkAdmin , 继承了自己组件的controller 。


我们知道了鉴权的方式 , 所以我们首先看的是 , 如果他没有这些鉴权方式 , 或者其他鉴权方式也没有 , 那么他就会存在未授权访问 , 即不登录也能访问后台功能 。 这是很危险的 , 一个是管理员才能看到的敏感信息 , 未授权就能看到 , 更危险的是 , 结合后台的漏洞 , 直接未授权getshell也是很有可能的 , 所以鉴权我们首先去看 , 而且容易去看的地方 。
6.2. 按照漏洞类型审计我认为对于我来说 , 比较好的审计方法是黑盒白盒一起 , 根据漏洞类型一个一个的去找寻可能存在漏洞的地方 , 然后再回溯查看是否用户可控 , 以此快速定位漏洞 。
所以一般我是根据漏洞类型 , 以及每个漏洞可能涉及的危险函数 , 去快速定位 。