gentos 执行sh文件_CTFweb类型(十九)15位、7位可控字符下的任意命令执行

59e644cecce8c07f017eeffaf948eb60.gif

点击上方蓝色字体,关注我们

某些特殊情况下命令执行的Getshell中对应某个函数的内容可控,可控字符长度分为长可控和短可控。我们先来看15个字符可控。

9bf39ad8a5c2ef19396f88eb41fb33bd.png

条件:get方式传值,能够传的最大字符串数是14个,传shell_exec  

fdfee521d8198a3576a7fe5b0b42b257.png

思路:如果要getshell,相当于我们在里面写进去一个文件。这个文件是来自于我们服务器发给目标服务器,或者说是除我们之外的其它服务器在带给目标服务器的。

如果是从其他服务器送到服务器里面去的,就是让其他服务器向目标受害服务器发起一个下载请求,那么外部文件就会下载进去了。那么怎么去下载?我们这里是14个字符串可控,可用wget,比如说存在一个URL/1.php,相当这个1.php写进去了,但这里已经14个字符串了 

64e0b5a288d2c0d1a4956249a270c168.png

如果不能控制这么短的域名,可以稍微长一点,比如1.php就是个1,那么就相当于在里面能够去写入一个1,就会多一个文件1,就知道我们已经写入一个文件了。我们只要把它再次变成我们想要的文件就可以了。比如说mv 1重命名为1.php。

7e4a6f097a7b746a8f34f4d60478ae3a.png

演示:

文件名是A,wget一下,输入localhost,就会有a出来,但这个长度已经超过了。然后mv a a.php,这时候这个文件就已经变成可控的,可以进行getshell了。

 

a54ce3ac1f5afb7154a4ba883fbbd3f9.png

如果直接写入生成,echo能够直接把内容输出到一个文件里面去,如果跟1.php,它自己占用十一个字符,只能再输四个字母,即使开头不是,输进去是有点困难的。

05f3e199b803f3e3ad0ec738783f1267.png

所有符号都有特殊意义,?没有目录,就要对?做转义, 如果只写1的话,就等于你能构成最短的一个shell的结构,最短的shell的结构是php,然后eval(),$_ GET比POST短,然后数组形式,里面加个1,这样子,这个就是比较短的一种形式。

换行分割一下, a等于\php >1。这里就是十四位,刚好可以执行。

69907dd11f5c558961d949a028af8599.png

 接下来想写入的时候,其实是不希望写出的内容把原来我们已经写的内容给它覆盖掉,想做的是追加,如果数据内容能够直接写到后面最好,否则我们就换行写,那么如果用追加的形式,比如说echo,用两个尖括号,结果如图:

d4b91346671d870c8a79f3c3b697b45b.png

如果是字符串的形式,如图

13446d4cca09ab8cc674fdf4aab6af41.png

我们发现如果是字符串的话,用数字的时候一定要加空格分割,不是数字的时候,就不用空格分割,在重命名之后,它能够正常运行。

我们中间能控制的字符就是六位字符。$因为是关键字,肯定不能分割

ec843a4bca0f165d6feecef6821e8630.png

59a999ac719a95962def59cd6c65df5a.png

注意,写$_GET的$的时候肯定要加反斜线。这里其实要加两个反斜杠才能生效。我们来整理一下写了哪些内容。

396c4e7f08fabe42675a2b2f82e4bd82.png

ddd91e81c59eb0ce6d5c9f2c895ae7e7.png

15个字符的方法就是这样,而且技巧性也不是非常高,基本思路就是这些,接下来的所有思路都是基于这种方式的一个扩展。

接下来看就是15个可控字符的一个基本的思路。

408b7a3af949c634f2b3fdc8b0d2212c.png

七个字符

9fff59a8db33f139ad91e97b4e450a38.png

执行的结果作为内容输出类似文件名,如果存在,会直接覆盖原有文件,如果不存在,会生成这个文件,并把前面的内容输出到文件里面。

例如:如果要ls输出一个a,你会发现a里面的内容是1.php、2.php a,包括它生成的新的a,如果没有也是会生成的。如果ls是命令,l并不是命令,理论上执行不了,但是还是会去执行后面输出的这个环节。虽然命令不存在,但也会去生成a文件。

9492885e5d12dabfe1f4fa486d14bad1.png

ls输出到a时,a里面有两个内容,比如a index.php。我们去控制ls的结果,去输到a里面,ls的结果我们可控。

46ab7637365b134d140719ee0d621e1d.png

思路:ls输出一个a,就是文件名。如果能控制文件名就能控制a,这中间欠缺的就是顺序,sh后面跟一个文件名称的话,而且里面是可执行的内容,就能够去执行。如果所有内容都写入a,内容可控,再用sh写入a,构成了一句shell。

76f5d9a73180c434aed26fc78b99481e.png

欠缺点在哪里?第一个,就是文件名顺序不可控。

f6a7bc53aa03cb9cd55a86d387cfb7aa.png

 第二个,文件名写得非常短。

c5aeb0285df6d7a38ecaf2e70fef8ef4.png

 

9c04cc7174321835fd13c29401ccbfe6.png

 文件顺序怎么控制?ls展示命令的默认情况下,应该是根据文件名的大小写来控制的,其实排序的方式非常多,那么基于时间排序,比如说ls -t、比如说l>bbbb那么abb index.php,ls -t的时候,我们看到bbbb排到最前面去了,就会把最新的文件排在最前面。

8d2e08d31133f4a9db5825ff23da8075.png

cb242f58f46568b2fe0704260b03d6de.gif思路:

生成文件名,然后ls一下写入,但是如果只用ls的话,它是不可控整个顺序的。所以说解决的方法就是ls -t生成文件之后,就用-t来代替了,然后执行写入的a,就能换行分割。

示例

ECHO 1下写一个很长一串shell,可以用base64转一下符号,会发现任何特殊的符号都会不存在,然后用base64 -D去做一个解码就可以了。你就能够拿到一个文件名,最后再把它追加到比如说1.php里面。

bd6c3158af4739d841d10ed64cc81805.png

它能够写入一个phpinfo的文件,接下来只对它做一个分割就可以了,最终会实现一个demo。用脚本来构造一下结构。 

4468b145fcc9b7792cef94931538bf99.png

177d2224b1c1cd2c1414d2f5111e6d5c.png

cb242f58f46568b2fe0704260b03d6de.gif思路

生成文件名,ls -t去控制它的顺序,然后SH执行生成文件的内容,才能去执行任何命令,只不过就在于去如何去构造命令,然后用这个来做分割。

321d64d296f95a9511d233d3242ac7a1.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值