0x00 系统介绍
GitHub:https://github.com/zhuifengshaonianhanlu/pikachu
- Burt Force(暴力破解漏洞)
- XSS(跨站脚本漏洞)
- CSRF(跨站请求伪造)
- SQL-Inject(SQL注入漏洞)
- RCE(远程命令/代码执行)
- Files Inclusion(文件包含漏洞)
- Unsafe file downloads(不安全的文件下载)
- Unsafe file uploads(不安全的文件上传)
- Over Permisson(越权漏洞)
- …/…/…/(目录遍历)
- I can see your ABC(敏感信息泄露)
- PHP反序列化漏洞
- XXE(XML External Entity attack)
- 不安全的URL重定向
- SSRF(Server-Side Request Forgery)
- More…(找找看?..有彩蛋!)
0x01 暴力破解
概述
“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。
理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括:
- 是否要求用户设置复杂的密码;
- 是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
- 是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
- 是否采用了双因素认证;
对暴力破解的理解:暴力破解=连续性的尝试+字典+自动化。
其实就是去猜可能的密码,经过不断的试账号和密码,找出正确的账号密码,达到暴力破解的目的。
最重要的部分就是字典,一个好的字典可以大大加快破解速度。
基于表单的暴力破解
尝试性登录,提醒用户名或密码不存在
在响应界面返回一个登录失败的界面
发送到 Intruder 模块
使用 Cluster bomb 模式进行爆破,在 Payloads 中配置第一个变量和第二个变量的字典
- Sniper模式逻辑:先将第一个变量也就是用户名替换,第二个变量不动。当第一个变量替换完之后,对第二个变量进行依次替换。直白一点就是说一个变,另外一个不变,第一个变完,变第二个。
- Battering ram模式逻辑:所有变量进行同时同样的替换。就是说你变我也变,你变什么我也变什么。
- Pitchfork模式逻辑:所有变量同时替换,但是各自变量替换各自的字典,同时进行,但是互不相干。替换时第一个变量的第一替换值对应第二个变量的第一个替换值,不进行排列组合,就是1对1,2对2。不会将密码进行随机的排列组合。
- Cluster bomb模式逻辑:与Pitchfork模式逻辑类似,不同点是Cluster bomb模式会进行随机的排列组合。
设置两个字典
根据返回数据包的长度进行判断是否成功
用破解出的账号密码登录
login success
验证码绕过(on server)
随机输入账号和密码,相应验证码,用 burpsuite 抓包,登录失败,验证码发生变化,将数据包发送到 Repeater 进行判断
将验证码设置为空,运行,出现错误提示,验证码不能为空
随机输入验证码,运行,出现错误提示,验证码不正确
经过判读,发现后台会对验证码进行校验,接下来对验证码是否在后台过期进行验证
获取一个新的验证码,返回数据包中,运行,提示用户名或密码不正确,接着修改账号和密码,验证码不变,运行,结果不变,说明验证码可重复使用
将数据包发送到 Intruder 模块,设置变量用户名和密码,验证码固定,使用 Cluster bomb 模式,进行爆破
总结:
- 验证码在后台不会过期,导致可以被长期使用
- 验证码校验不合格,逻辑出现问题
- 验证码设计过于简单和有规律
验证码绕过(on client)
验证码的作用:
防止登录暴力破解;
防止机器恶意注册;
验证码大概的的认证流程:
客户端 request 登录页面,后台生成验证码:
后台使用算法生成图片,并将图片 response 给客户端;
同时将算法生成的值全局赋值存到 SESSION 中;
校验验证码:
客户端将认证信息和验证码一同提交;
后台对提交的验证码与 SESSION 里面的进行比较;
客户端重新刷新页面,再次生成新的验证码:
验证码算法中一般包含随机函数,所以每次刷新都会改变;
随机输入账号和密码,输入相应验证码,使用 burpsuite 抓包
登录失败,验证码发生变化
查看源代码,发现验证码是由 js 生成,每点击一次函数运行一次,生成验证码
<script language="javascript" type="text/javascript">
var code; //在全局 定义验证码
function createCode() {
code = "";
var codeLength = 5;//验证码的长度
var checkCode = document.getElementById("checkCode");
var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的
for (var i = 0; i < codeLength; i++) {
var charIndex = Math.floor(Math.random() * 36);
code += selectChar[charIndex];
}
//alert(code);
if (checkCode) {
checkCode.className = "code";
checkCode.value = code;
}
}
function validate() {
var inputCode = document.querySelector('#bf_client .vcode').value;
if (inputCode.length <= 0) {
alert("请输入验证码!");
return false;
} else if (inputCode != code) {
alert("验证码输入错误!");
createCode();//刷新验证码
return false;
}
else {
return true;
}
}
createCode();
</script>
将数据包发送到 Repeater 模块中,对验证码进行判定,判断后台是否对验证码进行校验,尝试多次后发现返回的都是用户名或密码不存在,没有提示验证码错误
可以判断虽然验证码被提交,但是后台并没有验证,接下来的流程和基于表单的流程一样,将数据包发送到 Intruder 中,用 Cluster bomb 模式修改变量,因为验证码没有用,所以只选择用户名和密码
总结:
- 使用前端 js 实现验证码
- 将验证码在 cookie 中泄露
- 将验证码在前端源代码中泄露
token 防爆破
会话令牌(session token)本身并不直接用于防止密码爆破攻击。它主要用于验证用户身份或防止跨站请求伪造(CSRF)攻击。
//生成一个token,以当前的时间+一个5位的前缀
function set_token(){
if(isset($_SESSION['token'])){
unset($_SESSION['token']);
}
$_SESSION['token']=str_replace('.','',uniqid(mt_rand(10000,99999),true));
}
暴力破解防范措施
密码爆破攻击是一种尝试猜测用户密码的攻击方式。攻击者通过尝试多个可能的密码组合,直到找到正确的密码为止。要防止密码爆破攻击,可以采取以下措施:
- 强密码策略:确保用户使用足够强度的密码,包括字母、数字和特殊字符的组合,并限制密码长度。
- 密码锁定:在一定的尝试次数后,锁定用户账户,防止攻击者继续进行密码尝试。
- 延迟响应:在每次密码尝试失败后,增加一定的延迟时间,以防止攻击者快速尝试多个密码。
- 双因素认证:要求用户除了密码之外,还要提供额外的身份验证因素,例如手机验证码或指纹识别。
这些措施可以增加密码爆破攻击的难度,提高系统的安全性。会话令牌主要用于验证用户身份和防止CSRF攻击,可以与上述措施结合使用,但单独的会话令牌并不能完全防止密码爆破攻击。
的尝试次数后,锁定用户账户,防止攻击者继续进行密码尝试。
- 延迟响应:在每次密码尝试失败后,增加一定的延迟时间,以防止攻击者快速尝试多个密码。
- 双因素认证:要求用户除了密码之外,还要提供额外的身份验证因素,例如手机验证码或指纹识别。
这些措施可以增加密码爆破攻击的难度,提高系统的安全性。会话令牌主要用于验证用户身份和防止CSRF攻击,可以与上述措施结合使用,但单独的会话令牌并不能完全防止密码爆破攻击。