今天刷到了对字节长度限制的命令执行题目,通过看一些视频和博客学习到一些小技巧,在这里总结一下: 这类题目会对命令执行的点进行字符数目限制,导致大多常见的命令都被过滤,这就需要深入了解一些linux的命令进行拼接,缩短字符的同时达到同样的效果

字符长度限制命令注入的技巧

trick1

先来了解一个命令 >xx 创建xx xx为执行命令,但是xx是一个能显示代码的命令,之后通过执行 *>x 将xx执行写到x文件。 举一个利用的例子:

>ls
*>a

这样访问a文件就能看到全部ls所得到的内容 或者:

>cat

flag
*

这种形式会直接得到cat flag的结果,如果在>cat和>flag之后再linux的命令行里输入echo *就会输出cat flag的字符,所以这里的 * 等于cat flag 利用这种拼接的方法可以把长命令分割达到缩短字符的作用

trick2

在上面命令组装的时候还有一个问题,就是 * 会按字母顺序来输出字符,这就导致一些命令执行顺序被打乱 比如:

>ls

-l
echo *

这里的回显是 -t ls,那这里就有了反序的需求

反序命令

首先还是用>创建两个文件l-和sl,这样顺序恰好满足需求,现在就考虑如何恢复正常的顺序来执行 把l -sl组合放入一个v文件,最后用一个命令将其反转即可 但是当前目录是存在三个文件的: l ,-sl,v 因为存在v如果直接使用*>v存入的命令就会使l -sl v,干扰了命令执行 这里的解决办法是使用dir命令 在创建完l- sl后执行>dir命令,此时文件夹下应该存在这三个文件: dir l- sl 但是dir渝澳dir a b>c只会将a b写到c中,所以此时再执行*>v,那么v文件里就只剩l- sl了,接下来只要将他反序就行了 反序用到的命令是rev,先>rev创建一个名为rev的文件,此时目录内的文件结构是: dir l- rev sl v 这5个文件,在>rev后执行*v就能将v里面的内容反序成 ls -l了

三位数限制

在比较极端的限制3位的命令执行时,可以使用nl命令 nl: 命令读取 File 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。 在输出中,nl 命令根据您在命令行中指定的标志来计算左边的行。 payload:

>nl
*>a

之后再访问a也能得到目录下的文件 原理: 创建nl文件后,目录结构大致是这样: nl flag.txt robot.txt *>a就把nl flag.txt robot.txt的执行结果保存到a中

其他

从大佬的博客中还学到一种删除的思路

>rm
*>a

这个操作可以删除rm文件后面的文件,在一些特殊情况下可以使用