攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup
攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup
题目介绍

题目考点
PHP代码审计
Writeup
打开 http://220.249.52.134:37877

常规操作 F12 看源码

url 输入 http://220.249.52.134:37877/source.php 得到
<?php
    highlight_file(__FILE__);
    class emmm
        {
            public static function checkFile(&$page)
            {
                //白名单列表
                $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
                //isset()判断变量是否声明is_string()判断变量是否是字符串
                if (! isset($page) || !is_string($page)) {
                    echo "you can't see it A";
                    return false;
                }
                //检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
                if (in_array($page, $whitelist)) {
                    return true;
                }
                //过滤问号的函数(如果$page的值有?则从?之前提取字符串)
                $_page = mb_substr(
                    $page,
                    0,
                    mb_strpos($page . '?', '?')//返回$page.?里?号出现的第一个位置
                );
                 //第二次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
                if (in_array($_page, $whitelist)) {
                    return true;
                }
                //url对$page解码
                $_page = urldecode($page);
                //第二次过滤问号的函数(如果$page的值有?则从?之前提取字符串)
                $_page = mb_substr(
                    $_page,
                    0,
                    mb_strpos($_page . '?', '?')
                );
                //第三次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
                if (in_array($_page, $whitelist)) {
                    return true;
                }
                echo "you can't see it";
                return false;
            }
        }
    if (! empty($_REQUEST['file'])
            && is_string($_REQUEST['file'])
            && emmm::checkFile($_REQUEST['file'])
        ) {
            include $_REQUEST['file'];
            exit;
        } else {
            echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
        }
?>
分析PHP源码看到

尝试访问 url http://220.249.52.134:37877/hint.php 得到flag提示 flag 在 ffffllllaaaagggg 中

回到之前的PHP源码,继续分析
整体来看,这段PHP代码,是一个 emmm 类和一个 if else 分支,emmm类里有一个 checkFile 函数
先看 下面的 if else
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
)
当前 请求的 file 非空 且 是字符串 且 emmm::checkFile返回为真 时,条件成立
我们可以先直接留心最后的if/else逻辑,为了不看到最后那张无语的图片,我们需要让第一个if语句成立,并且最关键在第三个函数上。同时我们需要注意include文件读取函数是直接读取file,从hint.php中我们知道flag在ffffllllaaaagggg中,所以这个字符串要想办法加入到 file 中进行读取。
关键代码:$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
函数简介:
mb_strpos():返回要查找的字符串在被检查的字符串中首次出现的位置
该函数有两个参数,该函数的返回值是第二个参数在第一个参数中首次出现的位置(index)。
mb_substr() :函数返回字符串的一部分
该函数有三个对应参数,第一个参数是操作字符串,第二个参数是操作起始位置,第三个参数是操作字符长度。、
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file']; //重要
exit;
那么整体思路就是 满足if 条件 绕过checkFile 函数, 最终要 通过 include 读取 flag
尝试构造解题 payload
http://220.249.52.134:30663/?file=hint.php?ffffllllaaaagggg 失败,无回显
我们其实已经可以从flag的文件名猜出一些真相了。我们需要将目录回退四次,就像这美妙的名字一样。
构造最终解题的 payload
http://220.249.52.134:30663/?file=hint.php?/../../../../ffffllllaaaagggg

总结
这道题用到的知识点有:
- 基础php代码审计,考察三个函数: in_array、mb_substr、mbstrpos
 - 考察include的一个小特性
 
攻防世界 WEB 高手进阶区 HCTF 2018 warmup Writeup的更多相关文章
- 攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup
		
攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup 题目介绍 题目考点 模板注入 Writeup 进入题目 import flask import os a ...
 - 攻防世界 WEB 高手进阶区 XCTF 4th-CyberEarth ics-06 Writeup
		
攻防世界 WEB 高手进阶区 XCTF 4th-CyberEarth ics-06 Writeup 题目介绍 题目考点 掌握暴力破解手段 Writeup 打开链接 http://220.249.52. ...
 - 攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup
		
攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup 题目介绍 题目考点 PHP代码审计 git源码泄露 Writeup 进入题目,点击一番,发现可能出现git ...
 - 攻防世界 WEB 高手进阶区 easytornado Writeup
		
攻防世界 WEB 高手进阶区 easytornado Writeup 题目介绍 题目考点 Python模板 tornado 模板注入 Writeup 进入题目, 目录遍历得到 /flag.txt /w ...
 - 攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup
		
攻防世界 WEB 高手进阶区 XCTF Web_python_template_injection Writeup 题目介绍 题目考点 SSTI模板注入漏洞 Writeup 知识补充 模板注入:模板引 ...
 - 攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup
		
攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup 题目介绍 题名考点 PHP反序列化漏洞 正则匹配 Writeup <?php class Demo ...
 - 攻防世界 WEB 高手进阶区 upload1 Writeup
		
攻防世界 WEB 高手进阶区 upload1 Writeup 题目介绍 题目考点 文件上传漏洞 一句话木马 中国菜刀类工具的使用 Writeup 使用burpsuite抓包 可见只是对上传文件的后缀进 ...
 - 攻防世界 WEB 高手进阶区 unserialize3 Writeup
		
攻防世界 WEB 高手进阶区 unserialize3 Writeup 题目介绍 题目考点 PHP反序列化 __wakeup漏洞 Writeup 题名 unserialize 是反序列化函数名 了解一 ...
 - 攻防世界 WEB 高手进阶区 PHP2 Writeup
		
攻防世界 WEB 高手进阶区 PHP2 Writeup 题目介绍 题目考点 url 二次解码 index.phps 文件(第一次使用dirsearch可能扫不到,需要加到工具字典里) php 简单语法 ...
 
随机推荐
- 华为云计算IE面试笔记-桌面云用户登录连接流程及故障处理?
			
1-10:桌面与系统验证成功 http协议 11-19:桌面list(VM列表)获取,选择 http协议 20-30: ...
 - Django边学边记--状态保持(cookie和session)
			
Cookie 概念: Cookie,也叫Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密),好比会员卡或餐票. 特点: Cookie是由服务 ...
 - win10连接mysql提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
			
win10中cmd连接mysql提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YE ...
 - phpspider PHP 爬虫
			
* 通过composer下载 composer require owner888/phpspider // composer.json { "require": { "o ...
 - LR11自带网站
			
LR自带的飞机订票系统 启动服务:安装路径\HP\LoadRunner\WebTours下的StartServer.bat 打开网页:地址 http://127.0.0.1:1080/WebTour ...
 - Python创建Excel表格,Word并写入数据
			
from tkinter import Tk from time import sleep from tkinter.messagebox import showwarning import win3 ...
 - USACO Section 4
			
前言 好久没更新这个系列了,最近闲的无聊写一下.有两题搜索懒得写了. P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/probl ...
 - P3309-[SDOI2014]向量集【线段树,凸壳】
			
正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 \(n\)个操作 在序列末尾加入一个向量\((x,y)\) 询问加入的第\(l\sim r\)个 ...
 - C++学习 1 数组
			
一维数组: 定义:1.数据类型 数组名 [ 数组长度 ]: int arr [5];//赋值 arr[0]=10; arr[1]=20; arr[2]=30; arr[3]=40; arr[4]=50 ...
 - CF850E Random Elections 题解
			
题目传送门 题目大意 没法描述,过于繁杂. 思路 果然自己是个菜鸡,只能靠读题解读题,难受极了,其实不是很难自己应该做得出来的....哎.... 不难发现可以统计 \(A\) 获胜的情况乘上 \(3\ ...