记一次不存在的注入之再看tp路由问题
背景
一套cms
基于tp6
发现api
接口中存在一个类似于注入的地方
1 | public function lst(Request $request, $cid) |
cidByArticleList
方法为
1 | public static function cidByArticleList($cid, $page, $limit, $field = 'id,title,image_input,visit,add_time,synopsis,url') |
很奇葩的判断方式
(int)$cid
并不会改变后面拼接的cid
的值
但是怎么都访问不到,访问如下
猜测应该是定义了路由
调用堆栈
index.php
入口http.php
的run
方法->runWithRequest
方法->dispatchToRoute
方法route.php
的dispatch
方法- 加载定义的路由
- 此时重新调用
http.php
的loadRoutes
方法,包含定义的路由文件
剩下的就是对路由进行检查的部分,直接定位路由文件
可以看到存在很多的未授权接口,刚才以为有漏洞的接口也在这里
但是调用这个接口后依然不能注入,就很懵逼
正常访问时下面这个样子
但是只要添加特殊符号,就直接404
,查找根源
跟踪流程直接到相应的路由检查的地方
在匹配完成之后发现这个路由存在一个正则
就是cid
参数值只能是字母数字下划线,不确定这是tp
原生的还是cms
重新定义的,继续查找根源
跟进buildRuleRegex
方法
继续跟进buildNameRegex
方法
之前的article
和list
由于不存在<
,所以直接return
了
但是cid
变量传递进来的是<cid>
发现,刚才分析的正则表达式是config
传递过来的
跟进config
方法
发现这是thinkphp
自带的过滤机制
遂得出一个结论,在使用自定义路由的时候
get
方式的路由,无法注入,这相当于又多了一层安全保障吧