前言
昨天看nepctf的梦里花开牡丹亭那题,最后遇到了有长度限制的命令执行,不过这题的命令执行长度限制在小于10个字符,直接构造即可。但是又想到自己之前还没有仔细学过有长度限制的命令执行,于是好好的来学一下。
9长度限制
也就是这道题了,怎么说呢,单纯的就获得flag来说,直接这样就可以了:
n\l /flag
剩下的就还是看接下来更短的命令执行的思路叭。
7长度限制
来源p神密友圈的7字符命令执行:
小密圈里的那些奇技淫巧
理解一下叭。比如这个命令:
echo Y2F0IC9mbGFn|base64 -d>feng
现在有了长度限制,能怎么办呢?思路就是把要执行的命令一点一点的写在文件名上,然后利用ls -t,按照时间对于文件进行排序,ls -t>0
,就可以把文件名按照时间顺序排序写进0文件中。p师傅这里用的是w命令然后写进文件,但事实上,前面的w也可以省略:
文件内容可控又怎么样呢?还需要知道3个东西。
- linux中可以用\使指令连接下一行,这样就可以写多行命令了。
- 文件中前面命令出错,会自动跳过,不影响后面命令的执行。
- 可以用sh,bash,source, .来执行一个脚本。
比如这样:
至于为什么要两个\
,是因为要转义,不然的话就会认为是当前的命令会连接下一行了:
此外,文件名中有空格之类的,同样需要转义。
这样写进0文件中的是这个:
0命令执行出错,执行下面的:
l\
s\
相当于这样:
这样的方式需要的最长的命令就是ls -t>0
了,需要7个长度。
放一下对开始那个命令的构造:
>eng\\
>\>f\\
>-d\\
>4\ \\
>se6\\
>ba\\
>n\|\\
>GF\\
>9mb\\
>IC\\
>F0\\
>Y2\\
>o\ \\
>ech\\
ls -t>0
. 0
5长度限制命令执行
相比前面的七长度限制,5长度限制更多的就是想办法构造出ls -t>g
。
这里需要知道这些一个知识点:
>> 是追加内容
> 是覆盖原有内容
此外,ls结果的默认排序是字符串的那种排序,以字母序来排序。
因此看看这样:
>l\\
>s\\
>\ \\
>\>0
>-t\\
可以发现非常有意思的事情,就是ls排在了最后面,-t>0
排在了最前面,因此可以利用追加:
注意中间的这里:
l\
s\
\
-t\
>0
成功拼接出了ls -t>0
因此接下来再执行这个a文件,就可以执行ls -t>0
了。
因此构造出ls -t>0
总的就是这样:
>l\\
>s\\
>\ \\
>\>0
>-t\\
ls>a
ls>>a
接下来就和之前的7长度一眼了,依次把命令写道文件名里面,然后ls -t>0
,再执行0文件,就可以实现任意命令执行了。
4长度命令执行
因为ls>>a
的长度是5,因此追加也就用不了了。大师傅们想出了一种极其巧妙的构造思路,学习一下。
需要知道这些东西,摘录自yulige师傅的博客:
dir:虽然基本上和 ls 一样,但有两个好处,一是开头字母是d ,这使得它在 alphabetical 序中靠前,二是按列输出,不换行。
- :相当于$(dir *),所以说如果文件名如果是命令的话就会返回执行的结果,之后的作为参数传入.
rev:可以反转文件每一行的内容。
比如这样:
就相当于执行$(dir *)
。
再摘录一下别的师傅的思想:
因为字符限制为4,ls>>?命令不能使用了,可以使用rev命令进行逆序。ls -t>g这个命令逆序也不能实现,因为t在字典序中是比s大。如果是逆序的话,需要一个比s小的字母。在ls中有个参数-h,它与-l一起使用,使输出更加具有可读性。与其他参数一起则没有影响。因此可以构造ls -th>g
看一下构造:
>dir
>sl
>g\>
>ht-
用dir的好处就在这里了,d可以排在前面,不影响这些。后面的g> ht- sl
逆序后正好是ls -th >g
。接下来这样:
*>v
>rev
*v>x
*
之前提到了,Linux会把第一个列出的文件名当作命令,剩下的文件名当作参数。就相当于这样:
*>v
就是把g> ht- sl
写进文件v中,然后再写一个名字是rev的文件,接下来这个*v>x
就非常巧妙了,满足*v
的就是rev v
,因此就相当于:
rev v>x
,把v文件中的内容逆序后写进x中,这样就成功把ls -th >g
写进了x,构造构造出了ls -th >g
。极其巧妙。
接下来就和之前一样了,还是命令写到文件名中,然后执行x文件即可。