<?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
$url=$_GET['url'];
if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
{
echo "Sorry,you can't use this.";
}
else
{
echo "Can you see anything?";
exec($url);
}
}
过滤了很多东西,直接读文件和反弹shell不太能用了,并且这里如果直接取反的话是无回显的,所以我们要么写文件要么反弹shell,但是正常写文件的>符号被过滤,反弹shell的bash、nc、&、>等符号都被过滤了,我直接无从下手了
这里就需要绕过关键字过滤,看了一下大佬们的wp
转义符\绕过
转义字符是用于在字符串中表示特殊字符的符号。它通常以反斜杠(\
)开头,后面跟随一个特定的字符,以表示该字符的特殊含义或防止其被解释为其他含义。在不同的编程语言或环境中,转义字符的实际含义可能会有所不同,但在许多情况下,它们用来处理以下几种情况:
1. 表示特殊字符:
某些字符在字符串中有特殊的意义,使用转义字符可以让它们被当作普通字符来处理。例如:
-
\'
:表示单引号字符。 -
\"
:表示双引号字符。 -
\\
:表示反斜杠字符。
2. 代表不可见或控制字符:
转义字符还可以用来表示不可见或控制字符,如:
-
\n
:换行符。 -
\t
:制表符。 -
\r
:回车符。
3. 编码字符:
某些程序或语言支持通过转义字符来表示Unicode字符,如:
-
\uXXXX
:表示对应的Unicode字符,其中XXXX
是四位十六进制数字。
示例:
command | tee [OPTION]... [FILE]...
在PHP中,转义字符在字符串中用来处理复杂的字符:
$example = "He said, \"Hello, World!\""; // 双引号需要转义
$path = "C:\\Program Files\\MyApp"; // 反斜杠需要转义
tee命令绕过>过滤
我们正常写文件要用到>符号,这里被过滤了,我们可以利用linux系统的tee命令来写文件
tee
命令是 Linux 中一个非常有用的命令行工具,它用于从标准输入读取数据,并将其同时输出到标准输出(通常是终端)和一个或多个文件中。它的名称来自于字母“T”,形象地表示数据分流的过程。
基本语法
command | tee [OPTION]... [FILE]...
常用选项
-
-a
:将输出追加到文件末尾,而不是覆盖文件。 -
-i
:忽略中断信号。
使用示例
-
基本用法: 将
echo
的输出同时显示在终端和文件中:echo "Hello World" | tee output.txt
这会将 "Hello World" 输出到终端,并同时写入
output.txt
文件。 -
追加到文件: 使用
-a
选项将内容追加到文件中:echo "Another line" | tee -a output.txt
这会将 "Another line" 添加到
output.txt
文件的末尾,而不会覆盖原有内容。 -
从其他命令获取输出: 将
ls
命令的输出同时传递给tee
命令:ls -l | tee output.txt
这会将
ls -l
的输出显示在终端上,并保存到output.txt
文件中。 -
多个文件: 将输出同时写入多个文件:
echo "Log message" | tee file1.txt file2.txt
这会将 "Log message" 同时写入
file1.txt
和file2.txt
。
解题
知道怎么绕过关键字过滤本题解法就一目了然了
首先查看根目录文件
?url=l\s / | tee 1.txt
然后我们访问1.txt就可以看到回显内容,看到flag文件flllllaaaaaaggggggg,我们访问
?url=tac /flllll\aaaaaaggggggg | 1.txt
由于la被过滤,所以l和a中间要加转义符,访问1.txt,拿到flag