刷题[HCTF 2018]WarmUp

解题思路

进入页面之后,一个大大的滑稽。

查看源码

查看源码发现有source.php 。打开

发现还有一个hint.php。打开发现

由此可知是代码审计了

解题

代码审计


先看此段代码,大致意思是。如果提交过来的file不是空的,并且是字符串,经过了emmm类中,checkFile函数的过滤。那么就执行包含文件。由此可知可能存在文件包含,目录穿越的漏洞。而要包含的就是ffffllllaaaagggg。
现在看如何绕过过滤

主要看这段代码,这段代码的意思是
获取传入的参数位数,然后截取前该位数的字符。
举个例子,传入参数是flag.php,首先经过mb_strpos获取位数,为8.然后经过mb_substr截取flag.php的前八位,也就是flag.php。
然后需要该参数在白名单里,也就是截取第一个?后的值为hint.php或source.php
然后经过url解码后再进行一次过滤,如果最后返回真,即可包含文件

文件包含

payload:?file=source.php%253F../../../../../ffffllllaaaagggg

确保url解码后能通过白名单。浏览器会解码一次,所以?二次编码,%253F,这里是php的一个特性:

?两次编码可以实现跨目录,#二次编码也可以

$page经过两次解码 $_page=source.php?../../../../../ffffllllaaaagggg
经过函数截取?前的内容,source.phph可通过白名单检验,然后通过此include $_REQUEST['file']
实现文件包含,因为source.php也被解析为目录,通过目录穿越即可到达,获得flag

总结思路

核心思路:

  • 查看源码得知本题考点为代码审计,文件包含,目录穿越
  • 确定获得flag值通过文件包含,本题共有四个可有true返回的条件,构造一个满足的条件即可
  • php将二次编码的?前的内容视为目录

知识点

  • 代码审计
  • 目录穿越
  • 文件包含
原文地址:https://www.cnblogs.com/karsa/p/12690020.html