【CTF日记】

WarmUp

题目介绍

  • 这道题来自BUUCTFWeb组的第一题。
  • 设计的知识点包括:
    • PHP代码审计
    • 远程文件包含

题目代码

<?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; } if (in_array($page, $whitelist)) { return true; } $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } $_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); 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\" />"; } ?>

函数解析

  • isset ( mixed $var , mixed $... = ? ) : bool
    • 判断变量var是否被设置并且非NULL
  • is_string ( mixed $var ) : bool
    • 检测变量var是否是字符串。
  • in_array ( mixed $needle , array $haystack , bool $strict = false ) : bool
    • 检查数组haystack中是否存在某个值needle
    • 若数组为键值数组,则匹配值。
  • mb_substr ( string $str , int $start , int $length = NULL , string $encoding = mb_internal_encoding() ) : string
    • 根据字符数执行一个多字节安全的 substr() 操作。
    • 取字符串strstart开始length长度的子串。
  • mb_strpos ( string $haystack , string $needle , int $offset = 0 , string $encoding = mb_internal_encoding() ) : int
    • 查找字符串needle在字符串haystack中首次出现的位置。
  • urldecode ( string $str ) : string
    • 解码已编码的 URL 字符串str
  • include
    • 后跟要被包含的文件名,表示引入该文件。

代码逻辑

主函数

  • 40行的if语句判断了
    • 提交的参数file是否为空;
    • 参数file是否为字符串;
    • 函数checkFile是否返回true
  • 上述条件满足就将file对应的文件打开,不满足则显示滑稽

checkFile函数

  • 在第5行中将参数file赋值给变量page
  • 7行给出白名单,分别是source.phphint.php
  • 8行判断变量page是否已设置为字符串,若没有,则滑稽伺候。
  • 13第一次判断page是否属于白名单,若是则包含文件。
  • 17行裁剪原始变量page_page留下第一个?之前的字符串。
  • 22第二次判断page是否属于白名单。
  • 26行对变量page进行URL编码的解码,赋值给_page

注意:page取自URL,作为参数传入会先进行一次解码。

  • 27行裁剪解码后的变量_page
  • 32第三次判断_page是否属于白名单。

hint.php

  • 提示给出了flag所在文件夹。
flag not here, and flag in ffffllllaaaagggg

EazySQL

解题过程

  • 在上述我标红的三次判断中,可以设置不同状态的page得到文件包含。
  • 第一次判断时,对变量page没有做任何改变,满足条件只有参数file(原始传入的page)为source.phphint.php,很明显无法包含文件ffffllllaaaagggg
  • 第二次判断时,考虑到裁剪之后需要满足?前包含source.phphint.php,之后的部分可以任意修改。

包含后就已经绕过了第一个判断。

  • 尝试包含到文件ffffllllaaaagggg,在?之后不断添加访问上级目录符号../,例如。
source.php?../../ffffllllaaaagggg
  • ../达到8个时,出现flag

  • 这里出现了多解,使用第三次判断仍然可以实现。

  • 由于URL会对特殊字符进行编码,故利用代码中的二次解码,将?设计为经过两次编码的码值。

? => %3f => %253f
  • 使用%253f替换?位置之后,传入服务器时变成%3f,此时即可绕过前两次判断。
  • 第三次判断前,urldecode()%3f转化为?,完成判断。
  • 给出第三次判断的Payload
source.php%253f../../../../../../../../ffffllllaaaagggg

题目介绍

  • 这道题来自BUUCTFWeb组的第二题。
  • 涉及的知识点包括:
    • SQL注入

题目解析

  • 很单纯的登录界面,需要输入用户名和密码。

  • 此时你输入的字符串将被用于数据库查询对应的用户,通过这样的机制,即可构造SQL注入攻击。

SQL注入具体知识参考我的一篇博客

解题过程

  • 观察攻击场景,通常来说用户名和密码都为字符串输入,故此处猜测为字符型注入。
  • 假设查询语句模型。
SELECT * FROM user WHERE user_id='${User-Name}' and passwd='${User-Passwd}';
  • 尝试使用注释#屏蔽后面代码,下面给出用户名和密码的Payload
' or 1=1#
  • 得到flag

  • 若注释符被屏蔽,使用'构造查询字符串闭合,给出Payload
' or '1'='1

__EOF__

本文作者ch3uhx9
本文链接https://www.cnblogs.com/cheuhxg/p/14514169.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   CH3UHX9  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示