PHP的无数字字母shell
预备知识:
函数:我们常用的PHP内置“函数”里,其实有一些并不是函数,而是“语法结构”。具体是不是函数,可以用【function_exists】判别。
动态拼接执行:PHP支持把字符串变量内容作为函数名进行命令执行;此处的函数必须是真实存在的。特别的,在PHP7及以上版本,assert函数也不被允许进行动态拼接执行。
直接与间接动态拼接执行:直接给出样例便于理解。
前两张图所示的,都是间接动态拼接执行,PHP5和PHP7均允许。
后两张图则是直接动态拼接执行,PHP5不允许直接动态拼接执行,而PHP7允许。(第一张图,PHP5直接报语法错;第二张图有点奇怪:PHP7不允许动态执行assert,它报错了,但也执行了)
动态变量:在PHP中如果在一个变量名称前面放$符号,PHP就会取右边的变量的值,然后,将该值作为“真正”的变量名称。
(变量$_POST、$_GET都是Array类型)
extra:正则表达式元字符“\w”等价于[0-9,A-Z,a-z,_],注意还有个下划线;PHP支持下换线作为变量名,但‘+‘作为变量名非法。
题目原型:
注意,以下的思路对应的代码需要能够执行,即他们不能被存在某个变量中,而应直接出现在代码段中。比如说,题目中有多个POST参数,代码的逻辑是用这些参数进行赋值。
我们需要通过类似注入的方式,让参数出现在代码段中。
eg:上面这个,若user、pass都是原样插入且没有过滤,我们在user末尾写【;)/*】,在pass开头写【*/】之后就可以在pass里写代码了。
思路一:获得“A”,自增。
变量名好说,可以用下划线。
利用数组强转字符串后变为“Array”,就可以获得A。后面的自增也好说。
思路二:不可见字符异或运算生成数字字母。
在PHP中,两个字符(串)类型的数据执行异或操作之后,得到的还是字符(串)类型的数据。
('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`') //“assert”
有个问题,我的本地环境%xx不解码,切换成PHP5.6也没用;不过,在有些题目的环境中,是可以解码的。
但总的感觉好像没思路一靠谱;至少给本地调试复现产生了麻烦。