[SWPUCTF 2021 新生赛]hardrce
[SWPUCTF 2021 新生赛]hardrce
|
|
通过 eval($wllm);
可以把传进来的内容执行,此为RCE漏洞
获取 flag 内容需要去找对应文件,例如查看当前目录下有哪些内容,代码是:system('ls');
但是代码中过滤了黑名单 ($blacklist) 里的内容以及大小写字母,直接传入system('ls');
不可行
bypass:利用取反操作符 ~
取反操作符 ~
会将数据按位取反,在传进去之前用 ~
将system('ls');
处理,并在处理后的数据前补上 ~
就能绕过过滤代码,当执行到 eval($wllm);
时 ~
又会再把数据按位取反,就还原成system('ls');
并执行
|
|
得到 payload :(~%8C%86%8C%8B%9A%92)(~%D8%93%8C%D8);
%8C%86%8C%8B%9A%92
和 %D8%93%8C%D8
是 system
和 ls
按位取反后且经过 URL 编码的结果
Q : 为什么要经过 URL 编码?
A : 字符串包含了非常多的二进制数据,对其进行按位取反会导致结果混乱,无法得到有意义的输出。因此,输出看起来像乱码。
将其进行 URL 编码后,原始字符串中的字符都被转换为
%
后跟两个十六进制数字的形式,这种形式的字符是安全的,不会导致显示问题。URL 编码并不改变原始字符串的含义,而只是为了确保其安全传输。
Q : 为什么不直接把
system('ls');
整串一起处理?A : 在使用取反编码再取反进行绕过时,想要执行指定的代码,传入的 payload 必须要满足
(函数名)(参数)
的形式,否则在取反之前 PHP 解释器并不知道是要执行一个函数,取反之后就算是一个函数也不会被当作代码执行。
接下来就不断去查询上级目录,直到查询到与 flag 相关的文件,查看内容
欲将心事付瑶琴。知音少,弦断有谁听?