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也没用;不过,在有些题目的环境中,是可以解码的。

  但总的感觉好像没思路一靠谱;至少给本地调试复现产生了麻烦。

 

posted @ 2022-02-26 18:01  hiddener  阅读(175)  评论(0编辑  收藏  举报