在做这道题时,我参考了这篇博客:
https://www.cnblogs.com/bkofyZ/p/17594549.html
认识到了自己的一些不足。
题目代码如下:
';
eval($code);
}
else{
die("你想干什么?????????");
}
}
else{
echo "居然都不输入参数,可恶!!!!!!!!!";
show_source(__FILE__);
}
此前我一直以为反引号是 shell 命令里才能用的东西,所以没往这边想。现在知道 PHP 是有的,不止 PHP ,其他各大语言也有。
既然碰到了,那就认真学一下,区分一下它们之间的区别。
PHP 支持一个执行运算符:反引号( `` )。
PHP 会将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。
使用反引号运算符( `` )的效果与函数 shell_exec ( ) 相同。
推荐文章:php 执行运算符
shell 反引号中的命令会先执行,将执行结果返回出来,再作为外部命令的一部分。
在 shell 命令中,反引号与 $() 作用相同,都是命令替换。
比如:
echo these are files in the directory :`ls`
# 或者
echo these are files in the directory :$(ls)
在这条命令中,ls 命令会先执行,再执行 echo 命令。返回结果:
these are files in the directory :index.html
推荐文章:shell中的 单引号’ '、双引号 " " 和 反引号`
python、go 中的反引号作用相同,即反引号包裹的是原始字符串,不做任何转义。
比如 \n 在反引号中不会被解释为换行,还是它原本的样子。
java 中的反引号有时可以作为标识符的一部分。
推荐文章:反引号 java
sql 语句中的反引号是为了区分MySQL的保留字与普通字符而引入的符号。
例如:
SELECT `select` FROM `test` WHERE select='字段值'
在这里,select 是关键字,使用反引号将其标识为普通字符,如果不使用,会出现语法错误。
此外,当标识符以数字开头时,也需要添加反引号,否则该标识符会被当成一个数字。
推荐博客:
在mysql语句中为什么要加反引号
mysql 标识符以数字开头
已知 PHP 反引号中的内容会被当成 shell 命令来执行,shell 命令在绕过关键字过滤时,最简单的方法有以下两种:
cat 替换为 c\at
cat 替换为 c''at 。
这样就没问题了。
查看根目录下的文件:
print(`l\s /`);
查看 flag 文件:
print(`c\at /fffffffffflagafag`);
拿到 flag :
疑问:
当我输入以下内容时,flag 没有输出:
print(`ca\t /fffffffffflagafag`);
然而下面的内容却能输出:
print(`ca''t /fffffffffflagafag`);
有大佬知道为什么吗?