谈一谈PHP中关于非法参数名传参问题

在CTF中有些时候GETPOST等方法传参中参数名可能存在一些非法字符导致传参问题。下面讲述的也算是CTF比赛中常见的一种Trick

注意:这种Trick只能在PHP版本小于8时有效,当PHP版本大于等于8并不会出现这种转换错误

在PHP官方文档中有解释当变量名中出现空格时,PHP的处理方式
https://www.php.net/manual/zh/language.variables.external.php
在这里插入图片描述
谈一谈PHP中关于非法参数名传参问题_第1张图片
谈一谈PHP中关于非法参数名传参问题_第2张图片
这里的参数名为:$_REQUEST['mo chu.']
参数名中含有空格,可以看到当我们传入?mo chu.=xxx时,传入的参数名中点.空格都被替换为了下划线_,这样的参数名确实无法传参
谈一谈PHP中关于非法参数名传参问题_第3张图片
谈一谈PHP中关于非法参数名传参问题_第4张图片

$var = $_REQUEST['mo_chu.7'];

这里就有条件可以利用一个PHP8被修复的转换错误进行传参:https://github.com/php/php-src/commit//fc4d462e947828fdbeac6020ac8f34704a218834?branch=fc4d462e947828fdbeac6020ac8f34704a218834&diff=unified
PHP版本小于8时,如果参数中出现中括号[,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号[出现在前面,那么中括号[还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_

Payload如下:

?mo[chu.7=xxx

利用了如果传入的参数名出现了中括号[只替换一次的原理,使得传入的参数为:mo_chu.7
谈一谈PHP中关于非法参数名传参问题_第5张图片

多做几组测试来验证参数名从左到右如果先出现中括号[会导致之后的非法字符无法替换为下划线_
谈一谈PHP中关于非法参数名传参问题_第6张图片
接下来看看PHP8是否修复了这个转换错误
谈一谈PHP中关于非法参数名传参问题_第7张图片
谈一谈PHP中关于非法参数名传参问题_第8张图片
很明显在PHP8中这种转换错误被修复了,传入的参数名中非法字符一律全部转换为了下划线

你可能感兴趣的:(PHP非法参数名传参,CTF小技巧)