HITCON CTF命令执行绕过

#HITCON CTF命令执行绕过

写在前面

最近开始暑假生活,基本上是吃喝玩乐。但是过两天还有一场peakgeek,不想让自己松懈,学习一道命令执行的题目,由于没有自己的服务器来搭小马,我就大致在自己的linux进行绕过操作,才发现自己linux命令学的狗屁不是,构造能力也特别垃圾

BabayFirst

题目给的源码

<?php
    $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    @mkdir($sandbox);
    @chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {
        @exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        @exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

linux写文件命令

题目大致意思是给每个人创建一个不同的目录,然后你在当前目录下进行命令执行。

命令的长度不能超过5
这里有一篇文章:
从七个字符长度的任意命令执行到GetShell

文章讲了一种方法,通过>命令建立空文件,再用ls -t>把当前目录的文件名当作文件内容导入到一个新的文件中。新的文件中也包含当前文件名,内容按照ascii码表排序换行。

linux还有一个小技巧,\可以对命令进行换行,是命令的拼接操作,具体如下

先看一下它是如何Work的:

这里我们用ls语句把当前文件夹下的文件名写成一个新文件叫做down,可以看到我们用>来创建空文件,文件名包含反斜杠\,这样我们执行sh的时候就可以拼接命令。从图也可以看到,遇到错误命令会报错,但是不会终止,依旧输出了1。也就是”echo 1”

值得注意的是,若文件名有反斜杠,则要用\\来写,还有空格、>要用\\>来写,用转义符。

根据图片的ls可以看到,我们的文件名是按ascii码表排的,生成文件的话命令是杂乱的,也是无效的。所以我们用ls -t>按照时间顺序来写入文件。

但是这题有长度限制, ls -t>已经超过5个字符。
网上思路是把ls -t>也写成一个文件,用sh执行,那么就需要构造这个文件了。
构造思路纠结了我很久,后来看到一种巧妙的方法,借助>>来文件追加
写文件过程:

>l\\
>s \\
>-t\\
>\>g

接着执行ls>a,得到a中文件内容应该是这样的:

'-t\'
'>g'
'a'
'l\'
's \'

如果我们追加ls>>a则内容应该是这样的:

'-t\'
'>g'
'a'
'l\'
's \'
'-t\'
'>g'
'a'
'l\'
's \'

前三行和后三行命令无效,只有中间部分的命令有效。所以a文件的可执行内容就只是:ls -t>g

接着还要构造curl请求来下载一个小马。这点还没有学会,以后再记

用echo和>>追加命令写shell

这个是偶然看到郁离歌的博客里写的,对长度限制不是那么严格的时候可以用。

但是看到别人博客写,有时候这样php文件不能执行,原因就在于换行。最好可以把POST[]写到一行。所以这个方法不是很好,大多数是用wget或者curl下载小马,但是我还没学会

相关链接:
浅谈CTF中命令执行与绕过的小技巧

not found!