1.1 通过不同的响应枚举用户名(Username enumeration via different responses)
比如:
1.输入错误的用户名,返回Invalid username
错误信息.可以利用Invalid username
枚举出正确的用户名.
2.输入错误的密码,返回Incorrect password
错误信息.可以利用Incorrect password
枚举出正确的密码.
可以利用 Burp Suite 里面的组件 Intruder 或者 扩展 Turbo Intruder 来实现用户名和密码的枚举.
直到发现真正有效的用户名,以及跟用户名相匹配的密码.
执行过程如下:
With Burp running, investigate the login page and submit an invalid username and password.
- 1.运行 Burp,调查登录页面并提交无效的用户名和密码。
- 2.在 Burp 的 Proxy 标签下的 HTTP history 标签找到
POST /login
请求,并发送到 Burp Intruder. - 3.在 Intruder中,转到 Positions 选项卡,确保选择攻击类型
Sniper
. - 4.单击Clear §按钮,以删除任何自动分配的有效负载位置。 选择POST请求里面的
username
,然后单击 Add § 按钮,以将有效负载位置添加到此参数。 此位置将由两个§符号表示,例如:username =§invalid-username§
- 5.暂时先将密码保留为任何静态值。比如
password=1
- 6.在Payloads选项卡, 选择 payload 类型为
Simple list
. - 7.把候选的用户名单粘贴到Payload options里面,然后点击Start attack,攻击将会打开一个新的窗口.
- 8.攻击完成后,在“Results”选项卡上,检查“Length”列。 单击列标题以对结果进行排序。 请注意,其中一个条目与其他条目不同。
- 9.检查此响应。 请注意,其他响应包含消息“Invalid username”,但是此响应显示“Incorrect password.”。 记下该用户名。
- 10.关闭攻击,然后返回 Positions 标签。 再次单击 Clear §按钮,然后将username参数更改为刚确定的用户名。
将有效负载位置添加到
password
参数。username=刚确定的用户名&password=§invalid-password§
- 11.在“Payloads”选项卡上,清除用户名列表,并将其替换为候选密码列表。 然后点击Start attack按钮.
- 12.攻击完成后,请查看“Status”列。 请注意,每个请求都返回了200状态代码,直到最终一个请求返回
302
。这表明登录尝试已成功。 记下密码. - 13.返回浏览器,使用您标识的用户名和密码登录.
1.2 通过细微的不同响应枚举用户名(Username enumeration via subtly different responses)
例子:
- 1.在Burp运行的情况下,提交无效的用户名和密码。 将
POST / login
请求发送到 Burp Intruder,并将有效负载位置添加到username
参数。 - 2.在“Payloads”选项卡上,确保选择了有效载荷类型“Simple list”,并添加候选用户名列表。
- 3.在 Options 选项卡上的 “Grep - Extract” 下,单击 Add。 在对话框中,向下滚动响应,直到找到错误消息
Invalid username or password.
。 使用鼠标突出显示消息的文本内容。 其他设置将自动调整。 单击OK,然后开始攻击。 - 4.攻击完成后,请注意,还有一列包含您提取的错误消息。 使用此列对结果进行排序,以发现其中之有细微的不同
- 5.仔细查看此响应,请注意该响应在错误消息中包含一个错字-而不是
.
,而是尾随空格。即一般是Invalid suername or password.
而它却是Invalid username or password
记下该用户名。 - 6.关闭攻击窗口回到Positions选项卡. 插入刚确定的用户名,而且在password的参数添加payload即:
username=确定的用户名&password=§invalid-password§
- 7.在Payloads标签, 清除候选的用户名,添加候选的密码.然后点击Start attack.
- 8.攻击完成后,请注意,其中一个请求返回了302响应。 记下该密码。
- 9.返回浏览器,使用破解出来的用户名和密码登录。
1.3 通过响应时间枚举用户名(Username enumeration via response timing)
例子:
- 1.在Burp运行的情况下,提交无效的用户名和密码,然后将
POST / login
请求发送到 Burp Repeater。试用不同的用户名和密码。请注意,如果您进行过多无效的登录尝试,您的IP将被阻止。 - 2.确定支持
X-Forwarded-For
标头,这使您可以欺骗IP地址并绕过基于IP的暴力保护。 - 3.继续尝试使用用户名和密码。 请特别注意响应时间。 请注意,当用户名无效时,响应时间大致相同。 但是,当您输入有效的用户名(您自己的)时,响应时间会根据您输入的密码的长度而增加。
- 4.将此请求发送到Burp Intruder,然后将攻击类型选择为”Pitchfork”。 清除默认的有效负载位置,然后添加
X-Forwarded-For
标头。 - 5.为
X-Forwarded-For
标头和username
参数添加有效负载位置。 将密码设置为一个非常长的字符串(应该输入大约100个字符)。 - 6.在Payloads选项卡上,选择有效载荷集1.选择”Numbers”有效载荷类型。 输入范围1-100,并将步长设置为1。将最大分数位数设置为0。这将用于伪造您的IP达到欺骗服务器的目的。
- 7.选择有效负载集2并添加用户名列表,开始攻击。
- 8.攻击完成后,在对话框顶部,单击 “Columns”,然后选择”Response received”和”Response completed”选项。 现在,这两列显示在结果表中。
- 9.请注意,其中一个响应时间明显长于其他响应时间。 重复几次此请求以确保它持续花费更长的时间,然后记下该用户名。
- 10.为相同的请求创建新的Burp Intruder攻击。 再次添加
X-Forwarded-For
标头,并向其添加有效负载位置。 插入刚刚标识的用户名,并将有效负载位置添加到password
参数。 - 11.在Payloads选项卡上,将有效载荷组1中的数字列表添加到有效载荷组2中,并将密码列表添加到有效载荷组2中。发起攻击。
- 12.攻击完成后,找到状态为302的响应。 记下该密码。
- 13.返回浏览器,重新加载登录页面,以便您拥有有效的CSRF令牌。 然后,使用您记下的用户名和密码登录。 (该方法效果不是很明显,而且时间差的特征不稳定,至少在中国对外国网站发起攻击是如此)
1.4 暴力破解保护,IP阻塞.(Broken brute-force protection, IP block)
例子:
- 1.在Burp运行的情况下,调查登录页面。 如果您连续提交3个错误的登录,请观察您的IP被阻止。 但是,您可以通过在达到限制之前登录自己的帐户来重置计数器。
- 2.输入非法的用户名和密码,然后发送
POST /login
请求到 Burp Intruder.创建 pitchfork 攻击,在username
和password
位置都添加 payload. - 3.在Payloads标签,选择有效载荷设置为1. 添加在您的用户名和
carlos
之间交替的有效载荷列表。 确保您的用户名是第一位,并且carlos
至少重复了100次。 比如您有效的用户名和密码为:wiener:peter 要被攻击的用户名为:carlos 它的密码未知.要防止IP阻塞,那么就要交替登录有效用户和被攻击的用户。尝试登录顺序为:wiener:peter carlos:尝试密码1 wiener:peter carlos:尝试密码2 ... wiener:peter carlos:尝试密码n ...
- 4.编辑候选密码列表,并在每个密码之前添加您自己的密码。 确保您的密码与另一个列表中的用户名对齐。 将此列表添加到有效负载集2中并开始攻击。
- 5.将此列表添加到有效负载集2中并开始攻击。
- 6.攻击完成后,请按用户名和响应代码对结果进行排序。 成功登录到Carlos帐户的请求将收到302响应。
1.5 通过帐户锁定枚举用户名(Username enumeration via account lock)
例子:
- 1.在Burp运行时,调查登录页面并提交无效的用户名和密码。 将
POST / login
请求发送到Burp Intruder。 - 2.选择攻击类型”Cluster bomb”。 将有效负载位置添加到
username
参数。 在请求的末尾添加一个任意的附加参数,并向其添加第二个有效负载位置。例如: Burp Intruder:username=§invalid-username§&password=example&count=§0§
Turbo Intruder代替Burp Intruder那么有两个参数的Turbo Intruder配置如下:
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=50,
requestsPerConnection=1,
pipeline=True
)
for i in range(3, 8):
engine.queue(target.req, randstr(i), learn=1)
engine.queue(target.req, target.baseInput, learn=2)
for firstWord in open('/path/to/username'):
for secondWord in open('/path/to/count'):
engine.queue(target.req, [firstWord.rstrip(), secondWord.rstrip()])
def handleResponse(req, interesting):
if 'You have made too many incorrect login attempts' in req.response:
table.add(req)
- 3.在Payloads选项卡上,将用户名列表添加到第一个有效载荷集,并将数字1-5添加为第二个有效载荷集。 这将导致用户名重复5次(假设:有效的用户名尝试5次密码失败就被锁住),然后开始攻击。
- 4.在结果中,请注意,其中一个用户名的响应比使用其他用户名时的响应长。 仔细研究响应,并注意它包含不同的错误消息:You have made too many incorrect login attempts., 记下该用户名。
- 5.在
POST /login
登录请求上创建新的Burp Intruder攻击,但是这次选择”Sniper”攻击类型。 将username
参数设置为刚标识的用户名,并将有效负载位置添加到password
参数。 - 6.Burp Intruder:将密码列表添加到有效负载集中,并为错误消息创建grep提取规则。
Turbo Intrude:则把
handleResponse
条件改为if '200' in req.response
即可. 开始攻击。 - 7.Burp Intruder:在结果中,查看grep提取列。 请注意,有几个不同的错误消息,但是其中一个响应不包含任何错误消息。
Turbo Intruder:它有一列
Words
长度是不一样的,点击Words排序就很容易找到密码了 记下该密码。 (有时虽然提示已经阻塞的错误信息,但是依然可以发送登录信息). - 8.在浏览器中,等待一分钟(有些久的15分钟左右)以重置帐户锁定,然后使用您标识的凭据登录。
1.6 暴力破解保護,一個請求里面包含多個候選的密碼(Broken brute-force protection, multipe credentials per request)
例子:
- 1.運行Burp,研究登錄頁面.注意到
POST /login
請求提交登錄憑證是以JSON
的格式提交的。將該請求發送到Burp Repeater. - 2.在Burp Repeater,將password單一的密碼字符串替換爲包含所有候選密碼的數組.如下:
"username" : "carlos", "password" : [ "123456", "password", "qwerty", ... ]
- 3.發送請求,它將會返回
302
的響應. - 4.右鍵點擊該響應且選擇”Show the response in browser”.複製URL粘貼到瀏覽器且回車,該頁面會加載且將會以carlos用戶身份登錄.