[HCTF 2018]WarmUp 题解(较为详细的)
页面上除了一张图什么也没有(而且图还没出来
从源代码看提示,发现有 source.php 提示,被注释掉的
跟着提示访问/source.php,发现是一些代码
把代码粘过来看看,从最后面那个图片发现是刚才页面的源码,分析一下看看
php 函数:
isset():检测变量是否已设置并且非 NULL
如果一次传入多个参数,则检测所有的变量都已设置且不是NULL
才会返回TRUE
,若检测到的有一个变量未设置或为NULL
,则立即返回FALSE
,并且不继续执行*null 字符("\0")
并不等同 php 的 NULL 常量
*var
:要检测的变量,...
:其他变量。如果 var
存在并且值不是 NULL
则返回 TRUE
,否则返回 FALSE
**mb_strpos()**:查找第二个参数在第一个参数中首次出现的位置,返回一个 int 型变量
查找 string 在一个 string 中首次出现的位置。基于字符数执行一个多字节安全的 strpos() 操作。 第一个字符的位置是 0,第二个字符的位置是 1,以此类推。
参数:
haystack
要被检查的 string。
needle
在 haystack
中查找这个字符串。 和 strpos() 不同的是,数字的值不会被当做字符的顺序值。
offset
搜索位置的偏移。如果没有提供该参数,将会使用 0。负数的 offset 会从字符串尾部开始统计。
encoding
encoding
参数为字符编码。如果省略,则使用内部字符编码。
mb_substr():获取部分字符串
根据字符数执行一个多字节安全的 substr() 操作。 位置是从 str 的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。
参数:$str 是被提取的参数
$start:若为正数,从 str 开始第 start 位开始提取;若是负数,从末尾第 start 位开始提取
$length:提取的长度,此参数若忽略或设置为 null,则提取到字符串末尾
$encoding:字符编码,若省略,则使用内部字符编码
返回一个字符串,值为 start 和 length 指定部分
既然这里要 if 中的条件为真,那就要 get 或者 post 方法(显然这里是 get 方法)传入的参数 file 不能为空,得是一个字符串,还要让 emmm::checkFile($_REQUEST['file'])的返回值为真就去看那个 checkFile 函数(写代码注释里了)
访问 hint.php 发现 flag 不在
添加"/"让 hint.php?变成一个目录,但是这个目录并不存在,Include 函数就会取执行后面的,跳转到上层目录
(这里让变量_page 变成白名单里的文件名就可以返回 true,但是 flag 并不在白名单的文件里,所以要利用 Include 函数去跳转到别的目录(flag 是在 ffffllllaaaagggg 里,但是不知道这个长名字的文件在哪)
所以构造 payload
/?file=hint.php?/../../../../ffffllllaaaagggg
版权声明: 本文为 InfoQ 作者【Geek_3da8ab】的原创文章。
原文链接:【http://xie.infoq.cn/article/53d38996c4759ee560d0aec92】。文章转载请联系作者。
评论