记一下第25-26课的内容。弱口令爆破的四种模式与判断成功失败的三种方案;爆破中的验证码拦截+错误次数+IP限制+密码加密绕过 + IP获取的原理以及绕过CDN获取客户真实IP
一、弱口令的分类
1.常规弱口令:如123456,666666,888888等
2.默认弱口令:如防火墙、路由器出厂时的默认密码。
例,天融信防火墙的默认密码:
又例如,深信服防火墙默认密码Sangfor888
二、使用burp进行弱口令爆破
打开我们的靶场,找到admin登录页面后台登录
1.随便在后台输入登录信息,抓一个登录数据包,并选择"发送到Intruder"
2.通过文件加载字典,进行爆破
然后选择攻击类型为sniper,在密码处添加payload位置,设置好后,点击开始攻击:
通常而言,爆破成功所返回的"长度"字段的值要么会很大,要么会很小,会和正常返回的值不一样,不过此处登录成功和登录失败都有715的长度,这里的原因是,登录成功里面,url是非空的,登录失败里面,url是空的,然而登录成功的msg字段为"登录成功",登录失败的msg字段为"用户名或密码错误",正好抵消了字段长度差,因此具体情况要具体分析。
另外,我们在已知这里登录成功会出现"code":1字段的情况下,我们可以在攻击的结果页面,点击"设置",找到"检索-提取",选择"从相应包中获取以下项目",点击"添加",并拉选"1"的相应位置,点击"确认"。
然后我们回到结果页面,就会有相应的显示:
除了sniper类型的攻击外,burp共支持四种类型的攻击,如下图所示:
①Sniper,单向模式,就是我们刚才演示的,爆破用户名或密码
②Battering ram,可以同时爆破用户名和密码(或者其他多个变量),通常用于寻找用户名和密码相同的账户,这时就要将用户名的变量位置和密码的变量位置都添加payload位置
③Pitchfork,这里要导入多个字典。攻击同时遍历所有payload集,因此它使用每个集中的第一个payload,然后使用每个集中的第二个payload,依此类推。对于哪一个变量使用哪一个字典,遵循"从上至下,从左至右"的原则。而对于字典的设置,在payload->payload集中进行设置
④Clusterbomb,集束炸弹,类似于交集,取第一个字典中的第i个元素,与第二个字典的所有元素进行遍历。
然而在实际应用中,我们往往面临各种各样的问题,下面对几个常见的问题进行讲解:
三、实践中的问题
1.验证码校验无法爆破
我们打开有验证码登录的靶场:
随便输入用户名密码,输入对应的验证码,在burp中开启拦截,点击登录
如果我们不去请求验证码接口,验证码就不会改变,所以我们先把它send to Intruder,然后直接丢弃这个数据包。这时候页面会提示有未知错误:
如何验证网页是否存在验证码漏洞呢?我们可以在intruder里面,连续两次提交,如果都提示"用户名或密码错误",说明存在验证码漏洞,如果第一次提示"用户名或密码错误",但第二次提交就提示"验证码错误",说明这里的验证码不能这么办他。
至此总结验证码校验的绕过思路:
①在提交信息之后是否及时销毁掉了SESSION中的验证码,如果没有销毁,那么我们就可以无限调用。
②通过验证码识别软件或者某些burp插件去绕过。
③关于点触验证码(给一张图片让你依次点击文字)和滑动验证码的知识暂时不讲。
2.密码错误次数限制
实现过程:
①使用数据库进行验证,这个就很难进行爆破
②使用SESSION,就可以删除SESSION进行爆破
3.密码进行了某种加密
例如该网站的内容,我们随便输入用户名密码然后登陆,直接在网页中找到数据包,发现用户名和密码都被加密。
下面讲述尝试查看其如何加密的三种方法
在网页中找到用户名的位置,右键检查,发现其位置,并得知其name属性为username,id属性为u01。
然后进行查找,先查找其id在网页中出现的地方,发现并没有给我们提供有用的信息:
于是我们查找username,发现有相关内容,其加密可能是在此处进行的:
javascript
<!--
if (document.loginForm.username.value == '') {
document.loginForm.username.focus();
} else {
document.loginForm.password.focus();
}
//-->
var publicKeyString = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSUmOXyQmYYSnZacp0btvAZCOvCNPtzixAp7eJmzmAG4mgy/VgrY/s1BDLh9qTNHIRWXepUtwMrf1kYul/A45qE/2oxIbeeq4238YDWQ7ModOVXR9ytEHsT0jpCFvoYfYXYZnnoWRrLIBylQeXzqxbLDxxBxGCs4AjoRKh5S7nNQIDAQAB';
function rsa_encrypt(data) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKeyString);
return encrypt.encrypt(data);
}
function submitForm() {
time(document.getElementById("myform"));
var theForm = document.forms[0];
if (theForm.username.value != '' && theForm.password.value != '') {
if(theForm.username.value == 'sysadmin') {
theForm.username.value = 'admin'
}
theForm.password.value = rsa_encrypt(theForm.password.value);
theForm.username.value = rsa_encrypt(theForm.username.value);
theForm.submit();
}
}
// 提醒后连续三次登录失败锁定账号后,出现按钮登录倒计时
var wait = -2;
function time(object) { //如果没有缓存或者是登录锁定前,不进行按钮禁用
if (wait == 0 || (true)) {
object.removeAttribute("disabled");
} else {
object.setAttribute("disabled", true);
wait--;
if (wait == 0) {
object.value = "登录";
} else {
object.value = "请在" + wait + "秒后重新尝试";
}
setTimeout(function () {
time(object)
}, 1000);
}
}
通过查看代码,我们可以判断出这里使用了rsa加密,并且可以找到其公钥publicKeyString = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSUmOXyQmYYSnZacp0btvAZCOvCNPtzixAp7eJmzmAG4mgy/VgrY/s1BDLh9qTNHIRWXepUtwMrf1kYul/A45qE/2oxIbeeq4238YDWQ7ModOVXR9ytEHsT0jpCFvoYfYXYZnnoWRrLIBylQeXzqxbLDxxBxGCs4AjoRKh5S7nNQIDAQAB'
这样,我们就可以通过他的代码,对我们的输入进行加密,然后放到数据包里面,实现爆破。
或者也可以在burp里面实现简单的编码,要记得将最下面的框去掉勾选,此外我们可以多次编码,只需要多次add即可:
四、PHP中获取IP的原理以及绕过CDN获取客户真实IP
php
function getClientIP(){
//getenv()函数定义:取得系统的环境变量
if (getenv("HTTP_CLIENT_IP")) {
$ip = getenv("HTTP_CLIENT_IP");
} elseif (getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} elseif (getenv("REMOTE_ADDR")) {
$ip = getenv("REMOTE_ADDR");
} else {
$ip = "Unknow";
}
if ($ip == '::1'){
//本地
$ip = '127.0.0.1';
}
return $ip;
}