攻击者在不知道目标系统的账号密码的情况下,通过自动化工具和一个强大的字典进行连续性尝试的登录,碰撞出一些有效的账号密码
一、打开pikachu靶场
输入用户名和密码----Login(显示用户名或密码无效----登陆失败)
二、burpsuite抓包
Proxy(查看抓包结果)
上图position设置了两个,Attack Type选了Cluster bomb,所以需要两个字典,payload效果是两个字典条目的组合,数量是两个字典条目数的乘积。
配置字典↓
按顺序,两个字典像下图这样选simple list并把用户名字典load进来
如果:
考虑到用户名和密码有特殊字符的情况,这里把URL-encode去勾选
三、按start attack开始爆破
方法一:
完成后结果按Length排序,通过查看差异,发现那个特殊的字典值很有可能就是正确用户名和·密码(排名第一个的Length和其他都不一样的)
完成后结果按Length排序,通过查看差异,发现那个特殊的字典值很有可能就是正确用户名和·密码(排名第一个的Length和其他都不一样的)
四、我们将得到的用户名与密码输入到pikachu(登录成功)
要求用户设置复杂的密码;
设计安全的验证码(想想你买火车票时输的验证码~)或者手机otp) ;
对认证错误的提交进行计数并给出限制,比如连续5次密码错误,锁定2小时;
必要的情况下,使用双因素认证
客户端打开一个登陆页面,实际是像后端提交一个请求,后端收到这个请求时,会调用自动生成验证码函数,验证码以图片的形式输出到前端,
同时将生成验证码的值(算法)以session的形式存在缓存中,
客户端将认证信息和验证码提交时,后台会将提交的验证码和与session的验证码比较
一、打开pikachu靶场,开启代理
用户名和密码输入错误值,当验证码是错误值时,返回结果如下,提示验证码错误
用户名和密码输入错误值,当验证码是正确值时,返回结果如下,提示用户名或密码不存在
并且每次提交都会自动刷新验证码
现在试想一下,如果我们不在网页上点Login,不刷新网页,网页当前显示的验证码就一直有效呢?
二、burpsuite抓包
Proxy(查看抓包结果)(验证上面的试想↓)
用proxy查看刚刚抓到的包---------发给repeater
改成当前网页显示的验证码,send,发现response中提示的是用户名或密码不存在,说明验证码是对的
还是这个验证码,把密码改一下,send,发现response中提示的还是用户名或密码不存在,说明验证码还是对的
这就说明之前的猜想是正确的,只要网页没刷新,验证码在burp suite中可以多次使用
直接从repeater中把上图的请求包send to intruder
intruder(暴力破解模块)
在intruder中进行配置
上图position设置了两个,Attack Type选了Cluster bomb,所以需要两个字典,payload效果是两个字典条目的组合,数量是两个字典条目数的乘积。
配置字典↓
按顺序,两个字典像下图这样选simple list并把用户名字典load进来
如果:
考虑到用户名和密码有特殊字符的情况,这里把URL-encode去勾选
三、按start attack开始爆破
方法一:
完成后结果按Length排序,通过查看差异,发现那个特殊的字典值很有可能就是正确用户名和·密码(排名第一个的Length和其他都不一样的)
方法二:
也可以通过配置唯一标识,精准定位正确的密码
完成后结果按Length排序,通过查看差异,发现那个特殊的字典值很有可能就是正确用户名和·密码(排名第一个的Length和其他都不一样的)
四、我们将得到的用户名与密码输入到pikachu(登录成功)
一、打开pikachu靶场
用户名和密码输入错误值,当验证码是正确值时,返回结果如下,提示用户名或密码不存在
用户名和密码输入错误值,当验证码是错误值时,有弹框提示验证码错误,之前对用户名或密码的提示也没有清除
上面两张图,其中验证码错误时有弹框这张,
右键 查看网页源代码,发现前端有检验验证码的js脚本,
证明 用户名和密码是在后端验证的,但验证码是在前端验证的。
既然是前端检测,我们直接用burpsuite发请求报文绕过前端就可以
二、burpsuite抓包
proxy模块抓包(查看抓包结果)
intruder(暴力破解模块)
把burpsuite的proxy模块抓到的这个报文send to intruder
上图position设置了两个,Attack Type选了Cluster bomb,所以需要两个字典,payload效果是两个字典条目的组合,数量是两个字典条目数的乘积。
配置字典↓
按顺序,两个字典像下图这样选simple list并把用户名字典load进来
如果:
考虑到用户名和密码有特殊字符的情况,这里把URL-encode去勾选
三、按start attack开始爆破
方法一:
完成后结果按Length排序,通过查看差异,发现那个特殊的字典值很有可能就是正确用户名和密码(排名第一个的Length和其他都不一样的)
方法二:
也可以通过配置唯一标识,精准定位正确的密码
完成后结果按Length排序,通过查看差异,发现那个特殊的字典值很有可能就是正确用户名和密码(排名第一个的Length和其他都不一样的)
四、我们将得到的用户名与密码输入到pikachu(登录成功)
主要用来防御CSRF攻击
当我们打开登录页面,向后端提交一个请求,后端收到请求的同时生成一个token值(放到session中),并输出到前端的表单中
其目的是:当前端点击登陆时,后台对前端的账号,密码、token同时验证,每次刷新token都会变
如何破解带token请求?
一、打开pikachu靶场
若用户名或者密码输错会提示用户名或密码不存在(这关没有验证码了~)
本次实验和token有关,我们用burpsuite抓两次包,看看有啥区别?
二、burpsuite抓包
把proxy模块抓到的两次登录的报文send to comparer对比一下,确实两次的token不一样
repeater模块
把proxy模块抓到的报文send to repeater
(先不改动token——send——response中提示 csrf token error)
刚刚在查看response网页源代码中有一个type为hidden,name为token的input标签,value和request报文的token不一样,应该是下一个报文的token。
我们尝试把response中的token值替换掉request中的token值,再次send,返回了提示用户名或密码不存在,并且返回了下一次的token值
总结:
下一次request需要携带的token就是上一次response中html代码中的隐藏字段值,也就是说request中的token是可以从上一个response中提取的
intruder暴力破解模块
使用右键点击发送数据包 send to intruder
首先position除了username和password再增加token,此外要注意Attack type选Pitchfork
这里为啥要选Pitchfork而不能选Cluster bomb
因为Cluster bomb是三组payload排列组合,一个token用好几次显然不行
Pitchfork对payload的要求可能更高一些(需要提前整理好对应关系)
所以这里实验我们需要把用户名和密码payload列表(字典)改一下(admin-----对应------123456)
配置字典↓
按顺序,第一个和第二个字典像下图这样选simple list并把用户名字典load进来
第三个payload type设置为Recursive grep
问题来了,,上图这个payload options是在哪里设置的呢?(完成如下步骤,返回到这里就会出现)
小框框勾选上,然后点add,
弹出来的窗口要是下面啥也没有就点一下Refetch response
在response中的找到token,双击value后面的值
上面define start and end的地方就会自动生成正则表达式
最后点OK就行
此外还有一个需要注意的地方是线程要设置为1
这是因为每次都要用上次response中返回的token,多线程就会乱套了。
三、按start attack开始爆破
完成后结果按Length排序,通过查看差异,发现那个特殊的字典值很有可能就是正确用户名和密码(排名第一个的Length和其他都不一样的)
四、我们将得到的用户名与密码输入到pikachu(登录成功)