记一次不存在的注入之再看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方式的路由,无法注入,这相当于又多了一层安全保障吧












