【技术分享】简单混淆数据处理
原创
xioy
xioy
我吃饼干
2026年6月24日 08:00
江苏
在小说阅读器读本章
去阅读
免责声明
- 本文所涉及的任何技术、信息或工具,仅供学习和参考之用。请勿利用本文提供的信息从事任何违法活动或不当行为。
- 任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。
- 作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。
- 使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。
01**
案例
1.1
案例
测试的目标站请求包数据被加密了,输入的账号:admin密码:123456
看到被加密的内容一眼base64,解码看看
YWRta0N5azE2dkZpbg==admkCyk16vFin
MTIzZmRzY0pLUTc0NTY=123fdscJKQ74567
可以看出来在目标字段中添加了无用字符,翻了一下找到了混淆逻辑,以下是完整代码。
<script language=\"javascript\"> //检查是否为默认密码 function checkMrmm() { var value = document.getElementById(\"password\").value; var flag = true; var mrmm1 = '1234'; if (value == mrmm1) { flag = false; } return flag; } function login() { var userinfo = {}; var userkey = $(\"#unionIds\").val(); var username = $.trim($(\"#username\").val()); var password = $.trim($(\"#password\").val()); var passkey = '2BuZXZIPEhhicg98I'; var namekey = 'rNK8wMStBu88BHVch'; var code = $.trim($(\"#verifycode\").val()); if (\"\" == username) { Dialog.alert(\"请输入用户名\"); return; } if (\"\" == password) { Dialog.alert(\"请输入密码!\"); return; } //用户名如果包含中文就用encodeURI转码,如果是英文字符串就用base64转码 var isChinese = false; for (var i = 0; i < username.length; i++) { if (username.charCodeAt(i) > 255) { isChinese = true; break; } } var num = Math.floor(Math.random() * 4 + 1); if (isChinese) { username = encodeURI(username); userinfo[\"isChinese\"] = window.btoa(\"true\"); } else { username = username.slice(0, num) + namekey + username.slice(num); username = window.btoa(username); userinfo[\"isChinese\"] = window.btoa(\"false\"); } password = password.slice(0, num) + passkey + password.slice(num); password = window.btoa(password); userinfo[\"username\"] = username; userinfo[\"password\"] = password; userinfo[\"code\"] = code; userinfo[\"userkey\"] = userkey; $.ajax({ url: \"http://127.0.0.1/spfys/loginuser.do\", data: userinfo, type: 'post', dataType: 'json', success: function (data) { if (!data.flag) { Dialog.alert(data.msg); $(\"#verifycode\").val(\"\"); $(\"#verify\").attr(\"src\", \"http://127.0.0.1/spfys/jyCode.do?timestamp=\" + new Date().getTime()); } else { if (userkey) { location.href = \"http://127.0.0.1/spfys/parent.do\"; } else if (!checkMrmm()) { //默认密码校验 Dialog.confirm(\"您当前密码为系统默认密码,请前往修改密码!\", function () { location.href = \"http://127.0.0.1/spfys/updateMm.do\"; }); } else { location.href = \"http://127.0.0.1/spfys/parent.do\"; } } }, error: function () { } }); }</script>
1
.2
代码分析
这段代码判断密码是否为默认密码:1234,是则跳转修改密码功能(后面写),不是则执行其他操作
function checkMrmm() { var value = document.getElementById(\"password\").value; var flag = true; var mrmm1 = '1234'; if (value == mrmm1) { flag = false; } return flag;}
这段最重要的就是分别给passkey、namekey赋值,这个值在后续代码中用于用户名的混淆,其他代码不做解释都能看懂。
var userinfo = {};var userkey = $(\"#unionIds\").val();var username = $.trim($(\"#username\").val());var password = $.trim($(\"#password\").val());var passkey = '2BuZXZIPEhhicg98I';var namekey = 'rNK8wMStBu88BHVch';var code = $.trim($(\"#verifycode\").val());if (\"\" == username) { Dialog.alert(\"请输入用户名\"); return;}if (\"\" == password) { Dialog.alert(\"请输入密码!\"); return;}
从这段代码中可以看出,这个系统是支持中文作为用户名进行登录的。
通过username.charCodeAt(i)获取第i个字符的Unicode编码值,如果字符的编码值大于255说明是非ASCII字符,如中文、日文、韩文等,将isChinese设为true并跳出循环。
如果小于等于255的则是ASCII字符,如英文、数字、标点等。
//用户名如果包含中文就用encodeURI转码,如果是英文字符串就用base64转码var isChinese = false;for (var i = 0; i < username.length; i++) { if (username.charCodeAt(i) > 255) { isChinese = true; break; }}
Math.random()生成0到1之间的随机小数(不含1),\*4变成0到4之间(不含4),+1变成1到5之间(不含5)
Math.floor()向下取整,得到1、2、3、4中的一个,这个数字用于后续字符串插入位置。
var num = Math.floor(Math.random() * 4 + 1);
如果用户名包含中文:
encodeURI(username)将中文进行URI编码(如\"你好\"变成\"%E4%BD%A0%E5%A5%BD\")
userinfo[\"isChinese\"] = window.btoa(\"true\")将字符串\"true\"进行Base64编码后存入userinfo对象的isChinese属性
window.btoa(\"true\")结果是\"dHJ1ZQ==\"
if (isChinese) { username = encodeURI(username); userinfo[\"isChinese\"] = 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 { username = username.slice(0, num) + namekey + username.slice(num); username = window.btoa(username); userinfo[\"isChinese\"] = window.btoa(\"false\");}
密码也是同样的处理逻辑:
使用相同的随机数num作为插入位置,插入passkey固定字符串2BuZXZIPEhhicg98I,然后对整个字符串进行Base64编码。
示例:假设password = \"123456\",num = 2,passkey = \"2BuZXZIPEhhicg98I\"
拼接后:\"12\" + \"2BuZXZIPEhhicg98I\" + \"3456\" = \"122BuZXZIPEhhicg98I3456\"
Base64编码后:\"MTIyQnVaWFpJUEVoaGljZzk4STM0NTY=\"
password = password.slice(0, num) + passkey + password.slice(num);password = window.btoa(password);
将处理后的数据存入userinfo:
username:处理后的用户名(Base64或URI编码)
password:处理后的密码(Base64编码)
code:验证码(原样,未处理)
userkey:用户类型(原样,未处理)
userinfo[\"username\"] = username;userinfo[\"password\"] = password;userinfo[\"code\"] = code;userinfo[\"userkey\"] = userkey;
此时userinfo的结构
{ isChinese: \"dHJ1ZQ==\" 或 \"ZmFsc2U=\", username: \"YWRyTks4d01TdEJ1ODhCSFZjaG1pbg==\", password: \"MTIyQnVaWFpJUEVoaGljZzk4STM0NTY=\", code: \"验证码原文\", userkey: \"用户类型\"}
通过psot方式向http://127.0.0.1/spfys/loginuser.do传递userinfo的内容,返回格式为json。
url: \"http://127.0.0.1/spfys/loginuser.do\",data: userinfo,type: 'post',dataType: 'json',
判断data.flag是否为false,如果是则弹出提示框显示服务器返回的错误信息data.msg。
接着清空验证码输入框,刷新验证码图片。找到id=\"verify\"的图片元素,重新设置src属性为验证码生成接口地址,后面添加时间戳参数(timestamp),防止浏览器缓存。
success: function (data) { if (!data.flag) { Dialog.alert(data.msg); $(\"#verifycode\").val(\"\"); $(\"#verify\").attr(\"src\", \"http://127.0.0.1/spfys/jyCode.do?timestamp=\" + new Date().getTime()); }
如果data.flag是否为true,则跳入这个逻辑。
userkey有值,跳转到parent.do页面。
如果userkey为空,调用checkMrmm()检查密码是否为默认密码1234,checkMrmm()返回false表示是默认密码,!checkMrmm()为true时,弹出确认对话框提示用户修改密码,用户点击确认后,跳转到updateMm.do修改密码页面。
如果userkey为空且密码不是默认密码,跳转到parent.do页面。
else { if (userkey) { location.href = \"http://127.0.0.1/spfys/parent.do\"; } else if (!checkMrmm()) { //默认密码校验 Dialog.confirm(\"您当前密码为系统默认密码,请前往修改密码!\", function () { location.href = \"http://127.0.0.1/spfys/updateMm.do\"; }); } else { location.href = \"http://127.0.0.1/spfys/parent.do\"; }}
请求失败时的回调函数,为空函数,不做任何处理。
error: function () {}
02
脚本爆破
2.1
脚本爆破
摸系统时,在他的操作手册内找到了几个默认用户名:j001、j002、ysyh,加之还有默认密码。
上面搞清了混淆逻辑编写脚本,两种方式:固定用户名爆破密码、固定密码爆破用户名
不过最后很可惜,没有跑出管理员账号,只能作为案例记录一下。
往期文章推荐
【技术分享】小程序Appid、AppSecret泄露漏洞总结
项
目
承
接
团队中的师傅们都来自国内安全厂商在职的一线工程师,均具有良好的职业素养与丰富的从业经验。
渗透测试
Web渗透、APP渗透、小程序渗透、内网渗透
CTF
培训、竞赛、解题、AWD竞赛服务
考证
NISP考证、CISP考证
TNT文库
所有文章第一时间会发布在文库中,文库中的内容全部免费开放。
访问密码每周都会更换,最新访问密码请在公众号的菜单栏:资源获取-漏洞文库中获取。
edusrc邀请码
免费不限量提供edusrc邀请码,请在公众号的菜单栏:资源获取-edusrc邀请码中获取。
END
点个「推荐」 我的零食分你一半
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论