[HCTF 2018]WarmUp
打开题目
![[HCTF 2018]WarmUp image 30 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-30.png)
查看源代码
![[HCTF 2018]WarmUp image 31 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-31.png)
访问这个文件 发现大串代码
![[HCTF 2018]WarmUp image 32 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-32.png)
这题不弹出图片的条件有三个
![[HCTF 2018]WarmUp image 33 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-33.png)
1.file输入的内容不为空
2.file输入的内容为字符串
3.file输入的内容必须满足class类中的checkFile函数返回值为true
否则就输出图片
![[HCTF 2018]WarmUp image 34 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-34.png)
这段代码从上往下看
定义了一个class类 名字叫emmm
函数名为checkFile 白名单whitelist中有source和hint
![[HCTF 2018]WarmUp image 36 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-36.png)
先查看前两个if语句
![[HCTF 2018]WarmUp image 37 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-37.png)
第一个if的意思是 $page不能为空 并且$page为字符串也不能为空
否则返回flase
第二个if的意思是$page中的内容存在于白名单中 也就是说 file输入的内容包含hint 和 source
然后返回true
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
这段代码的意思是将$page进行筛选从第0位开始一直到第一次问号出现的位置结束进行截取传值给$_page
mb_substr用法:
mb_substr( str, start[, length[, encoding]] );
mb_substr 执行一个多字节安全的substr()操作基础上的字符数。从str的开始位置计算。第一个字符的位置为0。第二个字符的位置是1,依此类推。
str 被截取的母字符串。
start开始位置。
length 返回的字符串的最大长度,如果省略,则截取到str末尾。
encoding 参数为字符编码。如果省略,则使用内部字符编码。
例子mb_substr(1234567890,0,7,utf-8)
输出的结果为 1234567
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
语法:
mb_strpos (haystack ,needle )
haystack:要被检查的字符串。
needle:要搜索的字符串。
例
mb_strpos(1234567890,9)
输出的结果为 8
第三个if是对$_page的内容进行判断 判断$_page的内容的值是否存在于白名单中
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
这段代码是对$page进行url解码然后赋值给$_page
然后将$_page进行筛选从第0位开始一直到第一次问号出现的位置结束进行截取传值给$_page
最后一个if的意思是判断$_page的内容的值是否存在于白名单中
思路
使用file进行传值 传入的值必须不为空 hint.php或source.php放到第一位后面要跟上问号
payload1=source.php?file=hint.php?/../../../../ffffllllaaaagggg
payload2=source.php%3F%2F..%2F..%2F..%2F..%2Fffffllllaaaagggg
payload3=source.php%253f/../../../../ffffllllaaaagggg(因为浏览器会自动进行url解码而php文件里面会再次解码所以我们需要对?进行两次url加密 )
得到payload
![[HCTF 2018]WarmUp image 39 - [HCTF 2018]WarmUp](https://zfmy.info/wp-content/uploads/2022/04/image-39.png)