【CTF日记】
WarmUp
题目介绍
- 这道题来自BUUCTF,
Web
组的第一题。 - 设计的知识点包括:
PHP
代码审计- 远程文件包含
题目代码
函数解析
- 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() 操作。
- 取字符串
str
从start
开始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.php
、hint.php
。 - 第
8
行判断变量page
是否已设置为字符串,若没有,则滑稽伺候。 - 第
13
行第一次判断page
是否属于白名单,若是则包含文件。 - 第
17
行裁剪原始变量page
,_page
留下第一个?
之前的字符串。 - 第
22
行第二次判断page
是否属于白名单。 - 第
26
行对变量page
进行URL
编码的解码,赋值给_page
。
注意:
page
取自URL
,作为参数传入会先进行一次解码。
- 第
27
行裁剪解码后的变量_page
。 - 第
32
行第三次判断_page
是否属于白名单。
hint.php
- 提示给出了
flag
所在文件夹。
EazySQL
解题过程
- 在上述我标红的三次判断中,可以设置不同状态的
page
得到文件包含。 - 第一次判断时,对变量
page
没有做任何改变,满足条件只有参数file
(原始传入的page
)为source.php
或hint.php
,很明显无法包含文件ffffllllaaaagggg
。 - 第二次判断时,考虑到裁剪之后需要满足
?
前包含source.php
或hint.php
,之后的部分可以任意修改。
包含
?
后就已经绕过了第一个判断。
- 尝试包含到文件
ffffllllaaaagggg
,在?
之后不断添加访问上级目录符号../
,例如。
- 当
../
达到8
个时,出现flag
。
-
这里出现了多解,使用第三次判断仍然可以实现。
-
由于
URL
会对特殊字符进行编码,故利用代码中的二次解码,将?
设计为经过两次编码的码值。
- 使用
%253f
替换?
位置之后,传入服务器时变成%3f
,此时即可绕过前两次判断。 - 在第三次判断前,
urldecode()
将%3f
转化为?
,完成判断。 - 给出第三次判断的
Payload
。
题目介绍
- 这道题来自BUUCTF,
Web
组的第二题。 - 涉及的知识点包括:
SQL
注入
题目解析
- 很单纯的登录界面,需要输入用户名和密码。
- 此时你输入的字符串将被用于数据库查询对应的用户,通过这样的机制,即可构造
SQL
注入攻击。
SQL
注入具体知识参考我的一篇博客。
解题过程
- 观察攻击场景,通常来说用户名和密码都为字符串输入,故此处猜测为字符型注入。
- 假设查询语句模型。
- 尝试使用注释
#
屏蔽后面代码,下面给出用户名和密码的Payload
。
- 得到
flag
。
- 若注释符被屏蔽,使用
'
构造查询字符串闭合,给出Payload
。
__EOF__

本文作者:ch3uhx9
本文链接:https://www.cnblogs.com/cheuhxg/p/14514169.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/cheuhxg/p/14514169.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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