无字符rce
例题
1 |
|
思路
核心思路是,将非字母、数字的字符经过各种变换,最后能构造出a-z中任意一个字符。然后再利用PHP允许动态函数执行的特点,拼接处一个函数名,如“assert”,然后动态执行之即可。
方法一
递增运算
借助PHP的一个小技巧,PHP中可以递增,当字母a
经过自增就可以变换为b
,A
可以变成B
。也就是说,如果我们可以获取到a和A,就可以通过自增获取到所有的字母与数字。而数组是Array,刚好可以得到A和a,其实拿那两个字符都不重要,只是获取到这两个,可以让我们更方便使用而已。获取数组可以通过数组与字符串的转换实现。
放一个网上的脚本,无字符rce,通过'!'=='@'
获取到false 0,然后再通过自增,获取到相应的字母,之后执行ASSERT($_POST[_])
,由于php大小写不敏感所以大小写都无所谓。
1 |
|
方法二
异或
在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或结果是这个字母即可。
1 |
|
由于存在不可显字符,所以使用了url编码
最终的url
1 | $a=$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]); |
方法三
取反
方法二三其实思路差不多,方法二使用的是位运算里的“异或”,方法三使用的是位运算里的“取反”。
方法二利用的是UTF-8编码的某个汉字,并将其中某个字符取出来,比如'和'[2]
的结果是"\x8c"
,其取反即为字母s
:
一般利用汉字,因为汉字的uniocode占3字节。可以利用其构造字母。
1 | <?php |
以上就是在php5中可以使用的无字符rce了。