Hpdoger's Blog.

HITCON CTF命令执行绕过

Word count: 774 / Reading time: 3 min
2018/07/14 Share

写在前面

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

BabayFirst

题目给的源码

1
2
3
4
5
6
7
8
9
10
<?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的:

这里我们用

1"
1
2
3
4
5
6
7
8
9

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

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

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

l\
s \
-t\
>g

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

‘-t\’
‘>g’
‘a’
‘l\’
‘s \’

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

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

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

用echo和>>追加命令写shell

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

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

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

CATALOG
  1. 1. 写在前面
  2. 2. BabayFirst
  3. 3. linux写文件命令
  4. 4. 用echo和>>追加命令写shell