CTFweb类型(二十一)无数字字母的命令执行及相关例题

您所在的位置:网站首页 数字命令 CTFweb类型(二十一)无数字字母的命令执行及相关例题

CTFweb类型(二十一)无数字字母的命令执行及相关例题

2024-07-15 23:19| 来源: 网络整理| 查看: 265

无数字字母get shell时候,假如你可以去传入一些参数,并且能够执行,但是你不能传数字和字母,要想得到get shell一定会用到一些函数,在之前的内容中都很多提到,不管是命令执行还是代码执行,它有非常多的一些函数在里头。如果现在不能传入字母,也就意味着无法传入这些函数,无法执行函数的时候就没有办法去get shell。

所以说无字母数字get shell的,它的最主要的目的是就是一个突破点在哪里,其实你就是如何在没有字母和数字的情况下去生成字母,这就是它的一个核心思想。

如何通过非字母数字的东西去生成一些字母和数字,思路非常简单,但是到底怎么实现,方法很多,这也提到了中心思想就是将非字母数字的字符经过各种变换,能够构造出a到z的中的任意一个字符,其实换句话来说,如果你能去控制ASCII,你变相的就能去控制它的结果,之前讲sql注入时提到过位运算。我们这地方有办法来实现位运算这里就讲到一种最常提到的异或。

1和0不相等,那么它的结果就是1,0和0去异或那么0和0是相等的,返回的就是0,如果两个数值是一致的,那么返回来就是一两个指示不一致的,返回的就是0,对应的ASCII中就是这样子的。 

如果说我们拿字母s异或b,这样异或是没办法因为它是字母,刚才讲到了就是说这种字母它的真实情况,它其实是ASCII,那么它转换成二进制字符串之后,它是可以做一个异或计算的,那么它就会有值能够显示出来了。如果是自己和自己异或就是空,任何数值和0异或的话,肯定是等于它的本身的。 

其实字母能够实现异或,符号是可以传的,我们就可以用符号去生成字母,但是一个一个去算就比较麻烦,很多时候我们就可以用fast的方法去做一个模糊测试。

符号随便敲,越多越好,因为符号越多对应的ASCII越多。然后对它自己就是异或做两次循环,就是遍历去循环。斯克码表中它是有非常多的不可显示字符,这些符号拿来是没有用的,也不是我们想要的东西,我们这里讲的目的就是让它的ASCII计算之后的结果在某个范围之内再输出来。我们给它做一个限制,比如说我这个限制成ASCII是64到91之间的,64到91就是到a到z,再一个96到122,我把所有字母都打印出来,最终会发现我们难点就在于不可控,就是字母无法输入,如果能输出字母,那意味着你也可以去输出数字。异或它是一种方法,通过符号去异或去再生成一个字母。

比如说echo它反过来就是一个b那么就是这样的一个效果,它就是实现符号,通过运算得到一个字母。其实字母能拿到的时候,符号不限制,你就可以做很多事情了。除了异或之外,其实还有什么方法,我们可以继续往下看。

第二种方法就是取反,这个非常奇特,我这里可以看到截图:

这里的话一个$a先做了一个3个字符的,比如说一个中文在jpk中,肯定是百分号,在UTF-8的时候就会变成百分号,所以说其实在一个和的时候,会发现它的长度是3,因为是这样的一个情形。 

比如说echo $a[0],echo $a[2],echo $a[3]你会发现它不显示,但是你可以用ord输出它的ASCII,它的百分号几几的十六十六进制的一个值,因为ord的作用,这里换成一个a的时候,97对应的就是它ASCII对应过来其实就是百分号后面16进制数的一个十进制值。这也可以了解一下,你通过去传入一个中文,也可以去拿到一些这种词。 

这里就讲取反的一个操作。

取反的话其实什么意思?这里拿和来举例子,刚才这里给了个截图是对和的。第二个百分号只做一个区分,你会发现就是说它的一其实是一百四十六,一然后对它一个取反。因为发现这个时候我就拿到了一个m就相当于和的就相当于取和的它的中间的那个东西。取反对其实还是对应二进制值的一个概念,就是说146,二进制的取反是01101101,十进制是109对应的ASCII是值是m所以说它其实这样去计算了之后,就会变成了109,这样的效果实现了一个从非字母非可显示字符的一个情况去转化出来,就是你传入的符号,不在这张ASCII表的某些范围之内,都是可以做一个传入的。

这种思路你要去延伸出来,可以变得千变万化,这边还是主要是一个基础概念的理解,然后加后期的一个想象力。就是各样取反的概念,这个时候可以通过传入一个中文来实现传播那些符号原理是一样的,你可以单独去把它抠出来,也可以去传递的。

146对应的16进制值对应的是92%,在php里面,可以直接去打印这个东西,但是这里的就不是用百分号来代替了,如果说你们看过sql注入的时候,GPK实际带入的参数应该是一个双引号之间的一个斜杠,一个x再加92,代表编码之前那个情形。

做一个转化直接传递是没有问题的,用url编码传递的时候前面变成百分号,这个地方就是取反的操作。比之前讲的是或操作更加容易一点,如果取反我要m这个字母,直接去拿到它的反就可以了,只要反之后不再表的范围之内,其实就OK。

还有一种操作就是自增,我们写循环的时候$a  $a++ 就是相当于这次用完之后,这个值会增加一次。自增也是有先后顺序之分的,我这里拿php手册中的一个截图,是递增递减的,不影响布尔值。

如果说去质证一下,就$a可以看一下它返回的是a实际上这时候再去输出$a的时候,它返回的是b相当于去返回$a++加它的一位,先会返回当前a的值,再去a作真。

先返回a再加1,这地方就先会返回$a再返回$a加1之后的值。如果是$a+会发现在前面先加载,可能直接返回一个c你再去输出a也就是c,其实对ASCII表中来说,不停的加,像我就比如说我是个不可显示字符,我这里是个@。

它这里手册中有没有提到,之前有看到过就是讲那个自增自减的一个效果。它下面有提到一段内容,就是说自增的时候,不像C中自增去增加ASCII值的。

然后到z的时候,变成a的一个情形。这地方就类似于变多了一个字母,也可以知道有可能也会出现一些变换。然后递增的话,有时候就是没有用的符号的话它是不会去变化,所以像我们刚才去递增之类的,是不会有变化的,而且只支持纯字母。

思路

通过其它的方式去获取到一个字母之后,我们接下来的话就可以让字母可控,比如说你拿到一个a的时候,意味着你可以通过a去自增去拿到任何一个字母,它不能减,但是也一样可控。

例题

用get方式传值,值长度不能大于40,然后它做一个匹配,这个配套就会发现a到c 、a到z 、0到9相当于字母和数字,那是不允许的,转进去后它会把你传入的字符当做代码去执行。去执行一个flag,选function,去get flag,意味着要传入的参数去执行,get flag其实这里的方法很多。这里简单想,如果说我们这地方能直接传入,这个字符串是不是就OK了?再想,如果要传的时候,我们缺的东西是什么?比如说符号,这两个括号我们是不是可以直接传没问题的。但问题在于我们如何去传入字母?那么刚才既然讲了异或,我们就可以看到简单的异或的问题,会发现它非常多的字母,现在又做了fast,去找一下这个字母慢慢找,其实很快就会找到了。

​另一种方法,之前提到的$a =“PHPinfo”,如果是在$a后面去跟括号的时候,它是这样就会去执行的。

依据这个思路的,因为function需要执行,可以把它去赋给一个变量,这样就能够执行的,这样的代码传进去,我们就能够实现一个执行。

因为get flag总共才七位的,异或出来相当于只要15位,其它的也不会超过去。当然这个思路有很多种,包括取反的方法肯定也是可以实现的,我这里就不讲了,有兴趣的话你们可以自己去试试看,这道题目的demo也比较简单,可以看一下。自己找一找,网上找一找,也是比较容易找到这道题目的。

​​​​​



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3