这个 Python 登录实际上是不安全的吗?
Is this Python login practically insecure?
我正在制作一个机器人来在一个开源项目的网站上签名(不打算提及任何名字),我注意到我的机器人没有达到最大登录尝试禁令,无论有多少我尝试使用不正确的凭据登录的次数。
def login(account,passwd):
r = requests.post("http://nottheprojectname.com/~~app/action.php",
data={'act': "login",
'name': account,
'pass': passwd,
'keyid': ""
})
return r.text
我当时使用 Python 脚本(如上所示)登录,我决定制作一个测试脚本来演示帐户如何被暴力破解。
import re
import requests
def dictionary_crack(account):
attempts = 0
with open('giant_PW_list.txt', 'r') as f:
for passwd in f:
resp = login(account, passwd)
if re.findall("loggedin\"\:[a-z]+",resp) == [u'loggedin":true']:
return account + ": " + passwd
else:
attempts += 1
print trys
else:
input("All login attemts on "+account+" failed")
我向项目管理员展示了这个脚本,他们驳回了它,说它不起作用,因为登录尝试会很慢。但是,我在我创建的测试帐户上尝试了此操作,并且能够使用其中一个脚本 运行 每分钟 10,000 次登录尝试 进行预制。对于暴力攻击来说不是非常快,但它肯定不能忽略不计(特别是如果多次攻击是在同一个帐户上同时使用顺序字典同时进行的)。
这对我来说似乎很荒谬而且很容易解决。我在网络安全方面没有经验,所以我觉得纠正那些在网络安全领域比我知识渊博的人很矛盾。
服务器应通过用户名和密码跟踪错误的登录尝试。您需要将其存储在 app/global 状态,而不是会话。
甚至不用跟踪 IP 地址,blackhat 只会使用匿名代理。
在 U 错误的用户名登录尝试或 P 错误的密码尝试时,服务器应要求正确的 CAPTCHA 值或工作量证明†。
如果用户进行身份验证,return HMAC 的 "trusted user agent" cookie,这样用户以后就可以跳过验证码或工作量证明。
不要锁定他人的帐户,因为您只是在让黑客对他们进行拒绝服务。不要在服务器上 sleep() ,因为你保持连接打开的时间超过了必要的时间,可能是你自己 DoSing。
您可以使用 modsecurity 做很多这样的事情。
这是 OWASP 指南:https://www.owasp.org/index.php/Blocking_Brute_Force_Attacks
† 让网络浏览器计算一个真正的大数的质因数
站点管理员是正确的,因为当用户拥有良好的随机密码时,在线暴力破解是不合理的。让我们以长度为 7 个字符的所有可能密码为例。假设每个密码都是字母数字 [a-zA-Z]、0-9 或特殊字符 !@#$%^&*()_+-= 这给了我们 26(下)+ 26(上)+ 14 (特殊字符)= 每个字符有 66 种可能性。对于 7 个字符的密码,66^7 大致等于 5.4*10^12 或 5 万亿个密码。以每分钟 1000 个密码的速度单独测试每个密码大约需要 10,378 年。
这种情况确实做了一个错误的假设,因为用户有很好的随机密码。这已被一次又一次地证明是不真实的,并且很可能可以使用现成的密码列表来猜测用户密码。这是另一个海报推荐的阻止暴力破解技术有用的时候。
我正在制作一个机器人来在一个开源项目的网站上签名(不打算提及任何名字),我注意到我的机器人没有达到最大登录尝试禁令,无论有多少我尝试使用不正确的凭据登录的次数。
def login(account,passwd):
r = requests.post("http://nottheprojectname.com/~~app/action.php",
data={'act': "login",
'name': account,
'pass': passwd,
'keyid': ""
})
return r.text
我当时使用 Python 脚本(如上所示)登录,我决定制作一个测试脚本来演示帐户如何被暴力破解。
import re
import requests
def dictionary_crack(account):
attempts = 0
with open('giant_PW_list.txt', 'r') as f:
for passwd in f:
resp = login(account, passwd)
if re.findall("loggedin\"\:[a-z]+",resp) == [u'loggedin":true']:
return account + ": " + passwd
else:
attempts += 1
print trys
else:
input("All login attemts on "+account+" failed")
我向项目管理员展示了这个脚本,他们驳回了它,说它不起作用,因为登录尝试会很慢。但是,我在我创建的测试帐户上尝试了此操作,并且能够使用其中一个脚本 运行 每分钟 10,000 次登录尝试 进行预制。对于暴力攻击来说不是非常快,但它肯定不能忽略不计(特别是如果多次攻击是在同一个帐户上同时使用顺序字典同时进行的)。
这对我来说似乎很荒谬而且很容易解决。我在网络安全方面没有经验,所以我觉得纠正那些在网络安全领域比我知识渊博的人很矛盾。
服务器应通过用户名和密码跟踪错误的登录尝试。您需要将其存储在 app/global 状态,而不是会话。
甚至不用跟踪 IP 地址,blackhat 只会使用匿名代理。
在 U 错误的用户名登录尝试或 P 错误的密码尝试时,服务器应要求正确的 CAPTCHA 值或工作量证明†。
如果用户进行身份验证,return HMAC 的 "trusted user agent" cookie,这样用户以后就可以跳过验证码或工作量证明。
不要锁定他人的帐户,因为您只是在让黑客对他们进行拒绝服务。不要在服务器上 sleep() ,因为你保持连接打开的时间超过了必要的时间,可能是你自己 DoSing。
您可以使用 modsecurity 做很多这样的事情。
这是 OWASP 指南:https://www.owasp.org/index.php/Blocking_Brute_Force_Attacks
† 让网络浏览器计算一个真正的大数的质因数
站点管理员是正确的,因为当用户拥有良好的随机密码时,在线暴力破解是不合理的。让我们以长度为 7 个字符的所有可能密码为例。假设每个密码都是字母数字 [a-zA-Z]、0-9 或特殊字符 !@#$%^&*()_+-= 这给了我们 26(下)+ 26(上)+ 14 (特殊字符)= 每个字符有 66 种可能性。对于 7 个字符的密码,66^7 大致等于 5.4*10^12 或 5 万亿个密码。以每分钟 1000 个密码的速度单独测试每个密码大约需要 10,378 年。
这种情况确实做了一个错误的假设,因为用户有很好的随机密码。这已被一次又一次地证明是不真实的,并且很可能可以使用现成的密码列表来猜测用户密码。这是另一个海报推荐的阻止暴力破解技术有用的时候。