找回密码
 立即注册
首页 业界区 安全 记一次前端逻辑绕过登录到内网挖掘

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

崔瑜然 2025-5-30 14:34:37
前言

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


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

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

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

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

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

取消

没有区别,emmm 还是不行
难道真的要不行了吗
【----帮助网安学习,以下所有学习资料免费领!加vx:YJ-2021-1,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
我尝试直接去 js 代码中看看,是不是在 js 中的限制,或者查找一下获取我的 ip 的逻辑,尝试有没有别的伪造方法

然后我们定位到 js 的代码
  1. else if (state == '2'){
  2.                     $("#login_error").html('您的IP不在授权区域');
  3.                     return false;
  4.                 }
复制代码
发现是根据 state 来确定的
var state = $.trim(msg);
而 state 又来自于 msg
然后我们发现了关键代码
  1. function check_login($url)    {    var name   = $("#name").val();    var passwd = $("#passwd").val();    var remme  = $("#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) {                var state = $.trim(msg);                //alert (state);                //alert (msg);                //state[0] = 6;                if (state == '1') {                    window.location.href=$url;                    //alert ($url);                    return true;                }                 else if (state == '2'){
  2.                     $("#login_error").html('您的IP不在授权区域');
  3.                     return false;
  4.                 }                else if (state == '3'){                    $("#login_error").html('用户名或密码错误');                    return false;                }                else if (state == '6'){                    showNotice();                    return false;                }            }        });}​
复制代码
简单看一看
  1. var name = $("#name").val();
  2. var passwd = $("#passwd").val();
  3. var remme = $("#checkboxindex").val();
复制代码

  • name 获取用户输入的用户名,使用的是 jQuery 来从 id 为 #name 的输入框中提取值。
  • passwd 获取用户输入的密码,提取自 id 为 #passwd 的输入框。
  • remme 获取用户是否选择了“记住密码”的选项,提取自 id 为 #checkboxindex 的复选框
记住密码的逻辑是
  1. if(remme == 1){
  2.    setCookie('dydlname', name );
  3.    setCookie('dydlpasswd', passwd );
  4. } else {
  5.    setCookie('dydlname');
  6.    setCookie('dydlpasswd');
  7. }
复制代码
如果用户选择了“记住密码”(remme == 1),代码会调用 setCookie 函数设置两个 cookie,分别存储用户名 (dydlname) 和密码 (dydlpasswd)。
如果用户未选择记住密码,代码会清除这些 cookie。
嘿嘿嘿,那如果能够获得别人的 cookie,那么我们就可以直接获取账号和密码了
我们看看 cookie 的逻辑
  1. /* 添加/删除 cookie */
  2. function setCookie(name, value, exdays, path) {
  3.     var exdate = new Date();
  4.     exdays = exdays || 365;
  5.     exdate.setDate(exdate.getDate() + exdays);
  6.     if(value === null) {
  7.         value = '';
  8.         exdays = -3;
  9.     }
  10.     document.cookie = name + '=' + encodeURIComponent(value) + ((typeof exdays === 'undefined') ? '' : ';expires=' + exdate.toGMTString()) ;
  11. }
复制代码
先就是设置一下 cookie 的过期时间,然后就是设置 cookie 的值
  1. document.cookie = name + '=' + encodeURIComponent(value) + ((typeof exdays === 'undefined') ? '' : ';expires=' + exdate.toGMTString());
复制代码
 
encodeURIComponent 对 value 进行 URL 编码,防止特殊字符导致 Cookie 无效或出现错误。
我们看处理服务器响应的部分
状态码 1: 登录成功
  1. if (state == '1') {
  2.    window.location.href = $url;
  3.    return true;
  4. }
复制代码

  • 如果状态码是 1,则认为登录成功,跳转到传入的 $url 页面。
状态码 2: IP 不在授权区域
  1. else if (state == '2'){
  2.    $("#login_error").html('您的IP不在授权区域');
  3.    return false;
  4. }
复制代码

  • 如果状态码是 2,提示“您的 IP 不在授权区域”。
状态码 3: 用户名或密码错误
  1. else if (state == '3'){
  2.    $("#login_error").html('用户名或密码错误');
  3.    return false;
  4. }
复制代码

  • 如果状态码是 3,提示“用户名或密码错误”。
状态码 6: 显示通知信息
  1. else if (state == '6'){
  2.    showNotice();
  3.    return false;
  4. }
复制代码

  • 如果状态码是 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()))
您需要登录后才可以回帖 登录 | 立即注册