【技术分享】简单混淆数据处理

admin 2026-06-26 07:08:35 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档分析了前端登录过程中的数据混淆技术,通过JavaScript代码示例展示如何对用户名和密码进行混淆处理。关键发现包括:系统根据用户名是否包含中文采用不同处理方式(中文进行URI编码,英文插入随机位置密钥后Base64编码),密码统一插入固定密钥后Base64编码,同时包含默认密码检测机制。可操作建议涉及混淆逻辑的逆向分析方法,帮助安全人员理解此类防护机制。 综合评分: 78 文章分类: WEB安全,安全开发,应用安全,代码审计,渗透测试


cover_image

【技术分享】简单混淆数据处理

原创

xioy xioy

我吃饼干

2026年6月24日 08:00 江苏

在小说阅读器读本章

去阅读

免责声明

  1. 本文所涉及的任何技术、信息或工具,仅供学习和参考之用。请勿利用本文提供的信息从事任何违法活动或不当行为。
  2. 任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。
  3. 作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。
  4. 使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。

01**

案例

1.1

案例

测试的目标站请求包数据被加密了,输入的账号:admin密码:123456

看到被加密的内容一眼base64,解码看看

YWRta0N5azE2dkZpbg==admkCyk16vFin
MTIzZmRzY0pLUTc0NTY=123fdscJKQ74567

可以看出来在目标字段中添加了无用字符,翻了一下找到了混淆逻辑,以下是完整代码。

<script&nbsp;language="javascript">&nbsp; &nbsp;&nbsp;//检查是否为默认密码&nbsp; &nbsp;&nbsp;function&nbsp;checkMrmm() {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;value =&nbsp;document.getElementById("password").value;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;flag =&nbsp;true;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;mrmm1 =&nbsp;'1234';&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(value == mrmm1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flag =&nbsp;false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;flag;&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;function&nbsp;login() {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;userinfo = {};&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;userkey = $("#unionIds").val();&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;username = $.trim($("#username").val());&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;password = $.trim($("#password").val());&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;passkey =&nbsp;'2BuZXZIPEhhicg98I';&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;namekey =&nbsp;'rNK8wMStBu88BHVch';&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;code = $.trim($("#verifycode").val());&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(""&nbsp;== username) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Dialog.alert("请输入用户名");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(""&nbsp;== password) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Dialog.alert("请输入密码!");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;//用户名如果包含中文就用encodeURI转码,如果是英文字符串就用base64转码&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;isChinese =&nbsp;false;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;for&nbsp;(var&nbsp;i =&nbsp;0; i < username.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(username.charCodeAt(i) >&nbsp;255) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isChinese =&nbsp;true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;var&nbsp;num =&nbsp;Math.floor(Math.random() *&nbsp;4&nbsp;+&nbsp;1);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(isChinese) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; username =&nbsp;encodeURI(username);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; userinfo["isChinese"] =&nbsp;window.btoa("true");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; username = username.slice(0, num) + namekey + username.slice(num);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; username =&nbsp;window.btoa(username);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; userinfo["isChinese"] =&nbsp;window.btoa("false");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; password = password.slice(0, num) + passkey + password.slice(num);&nbsp; &nbsp; &nbsp; &nbsp; password =&nbsp;window.btoa(password);&nbsp; &nbsp; &nbsp; &nbsp; userinfo["username"] = username;&nbsp; &nbsp; &nbsp; &nbsp; userinfo["password"] = password;&nbsp; &nbsp; &nbsp; &nbsp; userinfo["code"] = code;&nbsp; &nbsp; &nbsp; &nbsp; userinfo["userkey"] = userkey;&nbsp; &nbsp; &nbsp; &nbsp; $.ajax({&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;url:&nbsp;"http://127.0.0.1/spfys/loginuser.do",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;data: userinfo,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;type:&nbsp;'post',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;dataType:&nbsp;'json',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;success:&nbsp;function&nbsp;(data) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(!data.flag) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Dialog.alert(data.msg);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $("#verifycode").val("");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $("#verify").attr("src",&nbsp;"http://127.0.0.1/spfys/jyCode.do?timestamp="&nbsp;+&nbsp;new&nbsp;Date().getTime());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(userkey) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location.href&nbsp;=&nbsp;"http://127.0.0.1/spfys/parent.do";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;if&nbsp;(!checkMrmm()) {&nbsp;//默认密码校验&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Dialog.confirm("您当前密码为系统默认密码,请前往修改密码!",&nbsp;function&nbsp;() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location.href&nbsp;=&nbsp;"http://127.0.0.1/spfys/updateMm.do";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;else&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location.href&nbsp;=&nbsp;"http://127.0.0.1/spfys/parent.do";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp;error:&nbsp;function&nbsp;() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }</script>

1

.2

代码分析

这段代码判断密码是否为默认密码:1234,是则跳转修改密码功能(后面写),不是则执行其他操作

function&nbsp;checkMrmm() {&nbsp;&nbsp;var&nbsp;value =&nbsp;document.getElementById("password").value;&nbsp;&nbsp;var&nbsp;flag =&nbsp;true;&nbsp;&nbsp;var&nbsp;mrmm1 =&nbsp;'1234';&nbsp;&nbsp;if&nbsp;(value == mrmm1) {&nbsp; &nbsp; flag =&nbsp;false;&nbsp; }&nbsp;&nbsp;return&nbsp;flag;}

这段最重要的就是分别给passkey、namekey赋值,这个值在后续代码中用于用户名的混淆,其他代码不做解释都能看懂。

var&nbsp;userinfo = {};var&nbsp;userkey = $("#unionIds").val();var&nbsp;username = $.trim($("#username").val());var&nbsp;password = $.trim($("#password").val());var&nbsp;passkey =&nbsp;'2BuZXZIPEhhicg98I';var&nbsp;namekey =&nbsp;'rNK8wMStBu88BHVch';var&nbsp;code = $.trim($("#verifycode").val());if&nbsp;(""&nbsp;== username) {&nbsp;&nbsp;Dialog.alert("请输入用户名");&nbsp;&nbsp;return;}if&nbsp;(""&nbsp;== password) {&nbsp;&nbsp;Dialog.alert("请输入密码!");&nbsp;&nbsp;return;}

从这段代码中可以看出,这个系统是支持中文作为用户名进行登录的。 通过username.charCodeAt(i)获取第i个字符的Unicode编码值,如果字符的编码值大于255说明是非ASCII字符,如中文、日文、韩文等,将isChinese设为true并跳出循环。

如果小于等于255的则是ASCII字符,如英文、数字、标点等。

//用户名如果包含中文就用encodeURI转码,如果是英文字符串就用base64转码var&nbsp;isChinese =&nbsp;false;for&nbsp;(var&nbsp;i =&nbsp;0; i < username.length; i++) {&nbsp;&nbsp;if&nbsp;(username.charCodeAt(i) >&nbsp;255) {&nbsp; &nbsp; isChinese =&nbsp;true;&nbsp; &nbsp;&nbsp;break;&nbsp; }}

Math.random()生成0到1之间的随机小数(不含1),*4变成0到4之间(不含4),+1变成1到5之间(不含5)

Math.floor()向下取整,得到1、2、3、4中的一个,这个数字用于后续字符串插入位置。

var&nbsp;num =&nbsp;Math.floor(Math.random() *&nbsp;4&nbsp;+&nbsp;1);

如果用户名包含中文: encodeURI(username)将中文进行URI编码(如”你好”变成”%E4%BD%A0%E5%A5%BD”)

userinfo[“isChinese”] = window.btoa(“true”)将字符串”true”进行Base64编码后存入userinfo对象的isChinese属性

window.btoa(“true”)结果是”dHJ1ZQ==”

if&nbsp;(isChinese) {&nbsp; username =&nbsp;encodeURI(username);&nbsp; userinfo["isChinese"] =&nbsp;window.btoa("true");}

如果用户名不包含中文: username.slice(0, num)取出用户名从开头到第num个字符之前的部分,namekey是之前定义的固定字符串rNK8wMStBu88BHVch,username.slice(num)取出用户名从第num个字符到末尾的部分。

三段拼接:前半部分+namekey+后半部分,然后对整个字符串进行Base64编码。 userinfo[“isChinese”] = window.btoa(“false”)将”false”进行Base64编码后存入(结果是 “ZmFsc2U=”)

示例:假设username = “admin”,num = 2,namekey = “rNK8wMStBu88BHVch” 拼接后:”ad” + “rNK8wMStBu88BHVch” + “min” = “adrNK8wMStBu88BHVchmin” Base64编码后:”YWRyTks4d01TdEJ1ODhCSFZjaG1pbg==”

else&nbsp;{&nbsp; username = username.slice(0, num) + namekey + username.slice(num);&nbsp; username =&nbsp;window.btoa(username);&nbsp; userinfo["isChinese"] =&nbsp;window.btoa("false");}

密码也是同样的处理逻辑: 使用相同的随机数num作为插入位置,插入passkey固定字符串2BuZXZIPEhhicg98I,然后对整个字符串进行Base64编码。

示例:假设password = “123456”,num = 2,passkey = “2BuZXZIPEhhicg98I” 拼接后:”12″ + “2BuZXZIPEhhicg98I” + “3456” = “122BuZXZIPEhhicg98I3456″ Base64编码后:”MTIyQnVaWFpJUEVoaGljZzk4STM0NTY=”

password&nbsp;= password.slice(0, num) + passkey + password.slice(num);password&nbsp;= window.btoa(password);

将处理后的数据存入userinfo: username:处理后的用户名(Base64或URI编码) password:处理后的密码(Base64编码) code:验证码(原样,未处理) userkey:用户类型(原样,未处理)

userinfo["username"] = username;userinfo["password"] = password;userinfo["code"] = code;userinfo["userkey"] = userkey;

此时userinfo的结构

{&nbsp; &nbsp; isChinese:&nbsp;"dHJ1ZQ=="&nbsp;或&nbsp;"ZmFsc2U=",&nbsp; &nbsp; username:&nbsp;"YWRyTks4d01TdEJ1ODhCSFZjaG1pbg==",&nbsp; &nbsp; password:&nbsp;"MTIyQnVaWFpJUEVoaGljZzk4STM0NTY=",&nbsp; &nbsp; code:&nbsp;"验证码原文",&nbsp; &nbsp; userkey:&nbsp;"用户类型"}

通过psot方式向http://127.0.0.1/spfys/loginuser.do传递userinfo的内容,返回格式为json。

url:&nbsp;"http://127.0.0.1/spfys/loginuser.do",data: userinfo,type:&nbsp;'post',dataType:&nbsp;'json',

判断data.flag是否为false,如果是则弹出提示框显示服务器返回的错误信息data.msg。 接着清空验证码输入框,刷新验证码图片。找到id=”verify”的图片元素,重新设置src属性为验证码生成接口地址,后面添加时间戳参数(timestamp),防止浏览器缓存。

success:&nbsp;function&nbsp;(data) {&nbsp;&nbsp;if&nbsp;(!data.flag) {&nbsp; &nbsp;&nbsp;Dialog.alert(data.msg);&nbsp; &nbsp; $("#verifycode").val("");&nbsp; &nbsp; $("#verify").attr("src",&nbsp;"http://127.0.0.1/spfys/jyCode.do?timestamp="&nbsp;+&nbsp;new&nbsp;Date().getTime());&nbsp; }

如果data.flag是否为true,则跳入这个逻辑。 userkey有值,跳转到parent.do页面。

如果userkey为空,调用checkMrmm()检查密码是否为默认密码1234,checkMrmm()返回false表示是默认密码,!checkMrmm()为true时,弹出确认对话框提示用户修改密码,用户点击确认后,跳转到updateMm.do修改密码页面。

如果userkey为空且密码不是默认密码,跳转到parent.do页面。

else&nbsp;{&nbsp;&nbsp;if&nbsp;(userkey) {&nbsp; &nbsp; location.href&nbsp;=&nbsp;"http://127.0.0.1/spfys/parent.do";&nbsp; }&nbsp;else&nbsp;if&nbsp;(!checkMrmm()) {&nbsp;//默认密码校验&nbsp; &nbsp;&nbsp;Dialog.confirm("您当前密码为系统默认密码,请前往修改密码!",&nbsp;function&nbsp;() {&nbsp; &nbsp; &nbsp; location.href&nbsp;=&nbsp;"http://127.0.0.1/spfys/updateMm.do";&nbsp; &nbsp; });&nbsp; }&nbsp;else&nbsp;{&nbsp; &nbsp; location.href&nbsp;=&nbsp;"http://127.0.0.1/spfys/parent.do";&nbsp; }}

请求失败时的回调函数,为空函数,不做任何处理。

error:&nbsp;function&nbsp;() {}

02

脚本爆破

2.1

脚本爆破

摸系统时,在他的操作手册内找到了几个默认用户名:j001、j002、ysyh,加之还有默认密码。

上面搞清了混淆逻辑编写脚本,两种方式:固定用户名爆破密码、固定密码爆破用户名

不过最后很可惜,没有跑出管理员账号,只能作为案例记录一下。

往期文章推荐

【技术分享】小程序Appid、AppSecret泄露漏洞总结

【技术分享】逻辑漏洞逻辑漏洞还是逻辑漏洞

【技术分享】从渗透到逆向还原攻击过程

【技术分享】记一次从信息泄露到重置任意用户密码的渗透过程

团队中的师傅们都来自国内安全厂商在职的一线工程师,均具有良好的职业素养与丰富的从业经验。

渗透测试

Web渗透、APP渗透、小程序渗透、内网渗透

CTF

培训、竞赛、解题、AWD竞赛服务

考证

NISP考证、CISP考证

TNT文库

所有文章第一时间会发布在文库中,文库中的内容全部免费开放。

访问密码每周都会更换,最新访问密码请在公众号的菜单栏:资源获取-漏洞文库中获取。

edusrc邀请码

免费不限量提供edusrc邀请码,请在公众号的菜单栏:资源获取-edusrc邀请码中获取。

END

点个「推荐」 我的零食分你一半


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:我吃饼干 xioy xioy《【技术分享】简单混淆数据处理》

评论:0   参与:  0