前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CTFweb类型(二十)5位、4位可控字符下的任意命令执行

CTFweb类型(二十)5位、4位可控字符下的任意命令执行

原创
作者头像
牛油果
修改2019-11-04 17:07:30
1.4K0
修改2019-11-04 17:07:30
举报

​​这次我们讲一个5个字符的,这个题目是黑客2017的一道题目。

网上解释得非常多,这边也讲一下代码其实比较简单跟之前的结构类似,传递的字符串小于5位就能够去执行。我们如何get shell,思路比较清晰,像这些都是拼接命令的过程,无所谓多长,都可以做一位一位的拼接。

这样做的目的是因为顺序问题,因为这些文件名它的顺序我们是不可控的,ls的时候它是有个默认排序,这个排序我们不可控,-t的话就能由时间顺序来做一个控制,在这边我们来可控。最后的话就是通过文件名来构成一个文件0,然后再去sh去执行0的一些内容,但是ls -t,这里有1234567有7位,这个7位的长度已经超过了它给我们5位的限制,所以说要做的其实就是突破。如何去构造ls -t。之前讲到的时候都是有一个命令在输出到文件名,但是实际上你再去实践的时候,比如说是w输出到e它是能够输出的,这个地方其实只要是去生成文件名就可以了,其实在之前的情况下,可以直接加文件名,这个地方就有4位可供字符,这样可以省一点字符。

之前是因为命令很长,有非常多的命令,导致它的顺序是不可控的,但是像这条命令其实它的非常短,就可能构造出一个顺序,符合我们要求的。因为这个顺序不可控才这样做,有可能刚好按照我们想要的顺序就是ls -t 0,我们假设给它割一下最明显的分割,就直接去分割它。比如说生成个ls再去生成一个-t再去生成一个0,然后ls去一个认一种,会发现就是-t 0,这种符号是排在前面的有这样一个特点,然后这样的话你会看到-t和0是符合我们要求的。   

这是符合我们要求,不符合我们的要求,它放在后面。那我们这时候希望ls能够排到前面去,那就是如何去构造让它排序的情况。其实这样做非常接近我们的一个目标,如果ls直接就输出到某个文件中,这个顺序是不很难去控制的,因为你没有参数去控制,就要考虑有没有可能去做其它操作。

那么像现在看起来ls如果说z是一个文件名,可能就是接下来做一个拼接,相当于我们这串东西去拼接上去,前面是ls,要注意到前面是ls的话,就是这个文件名就是某文件,如果说你这时候就想到上一个文件是有ls我们这个地方做拼接,这样讲z直接生成一个ls。 

然后生成一个-t生成一个0,看到ls的时候ls在前面,然后我们再把ls的顺序拼接一下就满足这个顺序了,满足了之后你会发现哪里有问题,ls这个是6位的这个地方是不满足的,其实这样已经非常接近我们想要的东西了。我们就要想我们想的东西和现在共同点在哪里,以及它的一些区分度在哪里,我们只要去沿着这些点去深挖,我们就可以找到它的解题思路。

再看,就是说现在这个文件名肯定是要短1位,单个字母文件。那么我们看一下我们刚才的整体操作,生成一个ls然后在ls输出到某文件名,那么这个时候的状态就会生成一个顺序,就是文件名。然后再一个ls就这两个文件顺序不一定是现在状态,依据我们刚才的思路去拼接,ls还有一个文件是-t 0然后还有个ls,这是默认情况下的排序,还有一个就是文件名,就是文件2号,我们第一步的时候,如果能够拼接成功,希望这个文件2排在ls的前面,这样的话ls -t能够直接拼接的,所以说这个地方的顺序,所以说那么这个文件名的特点就是要比符号要小,但是要排在l的前面,那么其实你就是小于l字母就可以了,申请ls然后再生成。在s生成一个a那么a就排在s的前面了,然后继续生成-t生成一个0然后再ls加到a里面去,就是能够拼接成功了,只不过现在它就是没有换行符的存在。

生成一个ls,然后ls输出到a再接下来就是ls肯定要跟拼接的换行符,所以说第一次生成ls文件名的时候,你在后面就要跟上这个符号去做,去考虑接下来的拼接的一个操作。然后的话,我们就再往下。那么这里这个内容已经有了。接下来就是-t还要做拼接,肯定还要然后再去生成一个a,因为这个输出到某个文件,比如说是0已经到文件位了,其实我们就不需要它换行符。当ls去追加到a上去,是不是这个思路就是这样子?在cat下a看一下是不是ls-t 0,那么它的效果就是这样子。

你会发现,好像并没有去执行我们想要的东西,它执行的其实只是一个ls这个东西。就第一行命令第二行命令,第三行命令第四行命令,第四号命令执行的,但是我们要第二行命令ls -t 0它是command not found,然后你可以注意看ls -t它为什么会这样子,它其实中间是没有做分割的,就是ls-t它中间少了个东西,那么我们就往里加个空格,还是说它这个文件名是空格,还要再换行12345刚好5位,所以它的实际可能要这样子才行。

我们再来试一次,在sh a因为发现应该会生成一个0的文件,你会看到这里多了一个0的文件名,那么可以看一下0的内容是什么,这个时候它就是实现了能够去执行ls -t的效果了。说起来其实就是说,你会看到ls -t它有个顺序存在,那这个顺序其实每个地方其实是不一致的。简单的提一下,就是这道题目你真的你要去做,需要三个操作系统,kali和centos然后Mac os下面去实现的一个就是说你会看到当时说出的是下划线的文件名,然后你会发现这三个操作系统下的我们来看一下,mac下的是ls -t -g文件名ls但是这个项目就是ls空格。

结果这一横线它是要排在大于号和。这个顺序其实就是有点问题了,不大符合感觉,你看它的顺序就是不一致的。这里的顺序就是命令应该是一致,但是它的排序顺序是不一样的,就是说它其实这个跟操作系统会有一定的关联性,虽然说好像我看之前有文章提到,就是说,ls的排序其实它有张默认的排序表还是怎么着的,有兴趣可以去看一下,这里我就不多说。

就是不同系统上你ls的它排序是有区别的。那么这个就是它的5位的一个实践,就是说其它的应该还好了,这样子生成一个就是我们这样的话就是用sh a去实现一个去执行这条命令去执行,就是ls -t >0。这条命令能够执行权,接下来就相当于就是file里面的内容就7位,7位的时候这条命令就是那就一样了,前面的拼接你咋拼接都行,刚才也提到了那这条命能执行,那你接下来这条4位肯定可以执行了,这些我就不讲了。 

到了四位的话就更变态了,它的区别在像我们刚才这样去做操作的时候,你会发现刚才这样是为了构造出这条命令,现在已经没法去构造这条命令,都已经构造不出来就是ls -t这条命令了。

但是它的关键点肯定还是在于这个地方,刚才就是命令拼接,然后sh空格文件名这些4位就是没办法去改变了,只有这一段是不满足条件的。

这个的话就要去非常多的一些储备知识,然后相当于做一个知识扩展。它4位的情况下就是因为像ls这些东西,这些命令好像感觉不能缩减了,但你其实要想办法就是能缩减的能略起来,那这个地方就要找到一个东西叫做通配符,就叫通配符了。那通配符是什么意思?可以看一下就是说比如说*,你会发现我如果这里输了*,你会发现是index.php未找到命令,echo不能打印信号的内容,你会发现星号的指代的其实就是当前目录下的文件,我这里输个123这里来一下。我这里生成一堆文件名。那么如果说我输个*,你会发现就是它会我怎么像ID额外的操作参数,我看一下我们打印一下*是什么内容。你会发现*的结果的话,它其实就是它匹配到的*是匹配所有东把它匹配到的东西合在一起就是相当于变成一句一个字符串,然后这个字符串当中命令去执行。 

像我们刚才这样子就已经没有办法去操作了,但是像通配符这样做*,理论上来说,真的非常长的一个命令,就有可能实现一个长命令的缩减。有了这种拼接,就是可能扩展命令长度的一种方法,最重要的一个点就在于我们还是不能去控制命令的顺序,我们需要最终目的就是ls -t输出到一个文件名里。它参数非常多的,其实你只要去找一个这种参数符合它的要求的,然后也不会影响排序的,那么它这个地方其实最终找到的就是一个H的效果,其实就是让它显示的显示大小更加人能够在快速理解的一种单位而已,它不会影响排序,它只会修改它的显示,所以说的话如果说这个地方去变成一个-th的时候,那么反过来就是ht-。

这个顺序又有了之后,输出到某个文件,只能输4位。

因为逆序过来的时候是是把每一行逆过来了它这个就不行了,ls之后,它是把每一个文件都作为一行去做一个输入的,这个地方应该是对的,就是说去生成的文件,也就都是是4位满足条件的。

把它用dir的话可以看一下效果,把它输出到一个a里,去看一下a的内容。然后你会发现,你会发现dir的效果和ls的效果是不一样的,就是我刚才讲到的就是一个rev的作用,是不是能够去把单行的做转化逆过来,如果这样的话,这个a是放在后面去就可以了。

这样就实现不了逆转,即使用*这地方也起不到作用,只有dir命令这个地方也是一个比较坑的一个点。这个地方也就是能起到一个命令替代的作用因为在windows之下,dir就类似于目录这种操作。就是dir加输出的时候你会发现已经4位命令字符给用掉了,没法去做操作了。

那么你就要又要想办法去做,这个地方又是新的一个点在这个地方,那么dir怎么办呢?dir命令再看我们这里去的一个情况。就是说如果说刚才我们讲到了,就是说*的作用是去把所有的命令都给它拼起来,所有文件名拼在一起,当命令来使用,那假设我这里输出个dir然后我还扣个*看一下。那么它其实是这样的一个情况,但是这个地方0是不是文件名我要是把它变成一个放在它的后面的,放在它的后面的一个情况,把这个放在字母在D和H之间的。比如说f重命名一下

这时候如果说我用*来看它的效果你会发现这时候*它就会把它第一个文件的内容当作命令来执行就文件名,因为它就它们这么一串动把当命令来执行这个的话,反正它就把当成命令来执行了,然后那么它就会列出它的一个结果。然后的话我这时候要是信号,把信号的结果输出到一个文件里去,因为我最后配合逆过来,肯定输到v里面去。我们在cat v的时候,那么在rev的时候,这个时候是不是ls -th输 出到f对吧?那么我就是变成一个*,生成一个rev然后再去做一个v的操作。然后这样的话,它就会把这个结果给逆过来。逆过来之后,我再把它去附给一个新的文件里去,附了一个0,那么我在cat 0,然后ls -th 到f里去了。这个时候再sh 0的时候,它就会生成一个f,就能够实现ls -th的到数据到某个文输出到某个文件的一个实现。

那么其它命令就跟之前一样了,整体思路其实就是这样子。所以它的最终实际上是这样子的。我们看一下0的内容ls -th到f,所以说它的整体效果就是这样子,那么命令有了之后,那么后面也是一样的了那么我这边就不再多说了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档