sh脚本中==判断的几个情况
FLow

前言

今天看到一个脚本需要爆破密码,我在已知密码是18位的情况下,妄想写个脚本去爆破,肯定是失败的,最后看到正确的脚本,我注意到里面用到*,最开始的理解是通配符绕过去了,经过shell脚本大佬·群主老师·云淡__风轻的点拨,我了解到一个关于shell脚本的知识点,有必要写个笔记记录一下。

进入正题

==绕过

先看脚本

1
2
3
4
5
6
7
8
9
password='qwe123'

read -p "input pass:" input
if [[ $password == $input ]];then
echo "ok"
else
echo "not ok"

fi

逻辑就是定义一个password,然后我们的输入保存在input里,比较input和password看看o不ok

正常情况下我们要ok就应该输入‘qwe123’,和password去匹配

但是我们可以用到*, *在shell里叫glob,也叫通配符, *的作用可以用来匹配任何长度的任何字符,类似于正则里面的 *,

后来了解到glob有其他字符,各自有不同的功能,比如?可以匹配任意字符串,在我知道密码长度的情况下输入n个?,也能绕过

*没法用的情况1

如果脚本长这样

1
2
3
4
5
6
7
8
9
password='qwe123'

read -p "input pass:" input
if [[ $password == "$input" ]];then
echo "ok"
else
echo "not ok"

fi

注意到$input前后多了引号,这个时候再使用*去通配就会失败

原因是:给$input前后加上引号,会导致*没办法展开,所以通配不了,这个时候只能输入和password一模一样的字符才能ok

*没法用的情况2

这个时候的脚本长这样

1
2
3
4
5
6
7
8
9
password='qwe123'

read -p "input pass:" input
if [[ $input == $password ]];then
echo "ok"
else
echo "not ok"

fi

对比第一个脚本,在判断里面$input $password的位置调换了

这个东西有点抽象,群主当时给了例子

我自己复现了一下

接下来理解一下:*.txt能够代表很多个txt文件,他不能只等于1.txt,所以no,但是1.txt是 *.txt里面的一个,所以可以ok

通俗地讲就是多个文件不能等于特定的那一个,特定的一个文件属于多个文件里

回到input那里,我们给他输入*,就符合多个可能对应特定的一个,所以不能,所以not ok

*绕过的应用

了解到三个用法,有这个思路就可以用来爆破密码

1
2
3
4
5
6
7
8
9
10
import string
import subprocess

all = list(string.ascii_letters + string.digits) # 创建包含所有字母和数字的字符列表
password = "" # 初始化密码为空字符串
found = False # 初始化 found 变量为 False,表示密码尚未找到
while not found:
for character in all:
command = f"echo '{password}{character}*'|对应的脚本操作
...后续的判断

command = f”echo ‘{password}{character}*’注意这里最后就是有一个 *去通配,然后一位一位地去爆破密码

肯定不止这个用法,后续待更新

总结

肯定是要感谢群主的耐心指导

这个知识点现在理解了就觉得没什么,不过还是值得记录下来的

由 Hexo 驱动 & 主题 Keep