记一次前端逻辑绕过登录到内网挖掘

boyanx1天前技术教程2

前言

在测试一个学校网站的时候发现一个未授权访问内网系统,但是这个未授权并不是接口啥的,而是对前端 js 的审计和调试发现的漏洞,这里给大家分享一下这次的漏洞的过程

文章中涉及的敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打码处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担。

进入内网的过程


可以看到是一个图书馆的网站,但是只有登录了内网才能访问图书馆的资源,这个能够理解嘛,毕竟大学的图书馆资源都是内部资源

然后随便尝试登录一下


会检验我的 ip,ctf 学习的如何伪造 ip,可以用起来了


发现还是不可以,emmm,可能伪造得不对,fuzz 一波


全包 400 了,我去,检查一手


原来是给我们 url 编码了,所以这里给各位说一下,当你遇到这个问题的时候,你就需要去设置一个小东西


取消


没有区别,emmm 还是不行

难道真的要不行了吗

我尝试直接去 js 代码中看看,是不是在 js 中的限制,或者查找一下获取我的 ip 的逻辑,尝试有没有别的伪造方法


然后我们定位到 js 的代码

else if (state == '2'){
                    $("#login_error").html('您的IP不在授权区域');
                    return false;
                }

发现是根据 state 来确定的

var state = $.trim(msg);

而 state 又来自于 msg

然后我们发现了关键代码

function check_login($url)
    {
       varname   = $("#name").val();
    varpasswd= $("#passwd").val();
    varremme= $("#checkboxindex").val();
    if(remme == 1){
        setCookie('dydlname', name );
        setCookie('dydlpasswd', passwd );
        }
        else{
        setCookie('dydlname');
        setCookie('dydlpasswd');
            }

        $.ajax({
            type : "POST",
            async : true,
            url : "../ucheck.php",
            data : "name=" + name +"&passwd=" + passwd,
            success : function(msg) {
                varstate= $.trim(msg);
                //alert (state);
                //alert (msg);
                //state[0] = 6;
                if (state == '1') {
                    window.location.href=$url;
                    //alert ($url);
                    returntrue;
                } 
                elseif (state == '2'){
                    $("#login_error").html('您的IP不在授权区域');
                    returnfalse;
                }
                elseif (state == '3'){
                    $("#login_error").html('用户名或密码错误');
                    returnfalse;
                }
                elseif (state == '6'){
                    showNotice();
                    returnfalse;
                }
            }
        });
}

简单看一看

var name = $("#name").val();
var passwd = $("#passwd").val();
var remme = $("#checkboxindex").val();
  • o name 获取用户输入的用户名,使用的是 jQuery 来从 id 为 #name 的输入框中提取值。
  • o passwd 获取用户输入的密码,提取自 id 为 #passwd 的输入框。
  • o remme 获取用户是否选择了“记住密码”的选项,提取自 id 为 #checkboxindex 的复选框

记住密码的逻辑是

if(remme == 1){
    setCookie('dydlname', name );
    setCookie('dydlpasswd', passwd );
} else {
    setCookie('dydlname');
    setCookie('dydlpasswd');
}

如果用户选择了“记住密码”(remme == 1),代码会调用 setCookie 函数设置两个 cookie,分别存储用户名 (dydlname) 和密码 (dydlpasswd)。

如果用户未选择记住密码,代码会清除这些 cookie。

嘿嘿嘿,那如果能够获得别人的 cookie,那么我们就可以直接获取账号和密码了

我们看看 cookie 的逻辑

/* 添加/删除 cookie */
function setCookie(name, value, exdays, path) {
    var exdate = new Date();
    exdays = exdays || 365;
    exdate.setDate(exdate.getDate() + exdays);
    if(value === null) {
        value = '';
        exdays = -3;
    }
    document.cookie = name + '=' + encodeURIComponent(value) + ((typeof exdays === 'undefined') ? '' : ';expires=' + exdate.toGMTString()) ;
}

先就是设置一下 cookie 的过期时间,然后就是设置 cookie 的值

document.cookie = name + '=' + encodeURIComponent(value) + ((typeof exdays === 'undefined') ? '' : ';expires=' + exdate.toGMTString());

encodeURIComponentvalue 进行 URL 编码,防止特殊字符导致 Cookie 无效或出现错误。

我们看处理服务器响应的部分

状态码 1: 登录成功

if (state == '1') {
    window.location.href = $url;
    return true;
}
  • o 如果状态码是 1,则认为登录成功,跳转到传入的 $url 页面。

状态码 2: IP 不在授权区域

else if (state == '2'){
    $("#login_error").html('您的IP不在授权区域');
    return false;
}
  • o 如果状态码是 2,提示“您的 IP 不在授权区域”。

状态码 3: 用户名或密码错误

else if (state == '3'){
    $("#login_error").html('用户名或密码错误');
    return false;
}
  • o 如果状态码是 3,提示“用户名或密码错误”。

状态码 6: 显示通知信息

else if (state == '6'){
    showNotice();
    return false;
}
  • o 如果状态码是 6,调用 showNotice() 函数,可能会弹出一些通知或消息提醒。

首先看一下 6


然后我们检查回显


好的没有有用的信息,然后我们就回到改成 1


调试 js



成功进入了分支,然后会跳转 url


到 index.php

但是发现页面任然没有什么变化,????
尝试直接访问


直接 302 跳转了

但是必须进内网才可以啊

我又在这里磨了很久,发现早都成功了


其实虽然 302 了,但是资源还是可以访问到的


然后全是这个学校的内部的文献

sql 注入的发现

但是可惜的是只能在 bp 中操作,所以很不方便,我看源码,然后找到一些文件,尝试一下爆破目录,看看有没有价值的目录,比如 admin,因为内网的话弱口令很多的

当时爆了一会,这个网站直接就崩溃了,不敢爆了,全是别人学校的内步藏书

当时 502 差点没有把我吓死我去,然后就是


随便访问一下

不能爆破目录,只能去尝试 sql 注入了


然后成功了 wc

有 sql 注入,然后下面就开始 sql 注入吧


可以看到注释后成功了

sql 注入无限尝试

首先尝试万能密码


md,发不出去包

就很离谱

然后尝试一下基本的语句,看看哪里出了问题


连基本的 or 1=1 都不可以,发不出去包,很奇怪

or 被过滤了或者=被过滤了??

尝试一下

or


等于符号


都没有被过滤啊??,但是组合在一起就不可以了,奇怪啊

尝试 order by 看看


10000 都没有反应

尝试盲注

1'and%20length((select%20database()))>1%23


好像是可以的??

改成小于看看结果

1'and%20length((select%20database()))<1%23


但是没有任何区别???

奇怪了我去

尝试时间盲注

1'and%20sleep(5)%23


发不过去包了

我把 sleep 的数字给去掉就可以了


应该是过滤了 sleep(数字)这种类型??

还专门看了一下语法的错误


确实是没有问题的,本地都是可以的

然后灵机一动,我输入小数


本地是可以的,在环境中尝试一手


至此 sql 注入验证成功

sql 验证就够了,不敢乱打,sqlmap 我都害怕给它扫没有了

最后

再次声明

文章中涉及的敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打码处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担

相关文章

jQuery学习-----(一)JQuery的&#39;$&#39;符号用法

1.jQuery的三种$1)$可以是$(expresion),即css选择器、Xpath或html元素,也就是通过上述表达式来匹配目标元素。比如:$("a")构造的这个对象,是用CSS选择器构建了一个...

Vue-Web前端选择题(50题)

1、Vue有下列哪几种功能【多选题】(2分)ABCDA、解耦视图和数据 B、可复用的组件C、数据绑定 D、功能插件化2、Vue插值用下列那个符号(2分)CA、《》 B、<>C、{{}} D...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。