JS无限断点对抗
一、前言
在实战过程中恰好遇到了需要逆向js解密的sql注入站点,刚好他还不允许使用f12调试,接下来讲一下如何对抗js断点技术。
二、无限断点
无限断点就是一段代码进行断点然后解除断点,防止被调试,在软件对抗中也经常会遇到。
打开站点,发现访问网站正常
按下F12
发现直接断下来了,这个时候就没有办法调试了,当按下继续运行的时候,会继续触发断点
三、对抗方法
1.直接无视断点
按下图中按钮或者Ctrl+F8
弊端也很明显,没法去调试目标站点的了。
2.代码对抗
代码对抗是劫持目标js文件,替换成我们修改后的文件
前置要求:
什么是堆栈,线程,调用
我们在左侧可以看到目标的线程
我们点击跳到下个函数运行
然后我们到达目标
一看就是个断点,循环调用
1 doCheck: function(e) {
2 (function() {}
3 )["constructor"]("debugger")["call"](),
4 this.doCheck(++e)
5 }
我们找到替换,选择一个空的文件夹
我们第三步就是找到这个js文件,去替换他的死循环
搜索到debug
删除代码快,ctrl+s保存
我们再次回去访问网页
搞定,可以正常调试了。
低阶段JS解密数据
一、前言
在实战过程中恰好遇到了需要逆向js解密的sql注入站点,上面讲到了 ,但是新的问题出现了,他提交的数据包是加密的。
二、加密函数寻找
无限断点就是一段代码进行断点然后解除断点,防止被调试,在软件对抗中也经常会遇到。
访问网站找到个数据包提交
寻找方法
ctrl+f搜索 post的url和post的数据包字段或者是encrypt等字段,实战过程中是都要做,而且还要下断点确定是不是来自这里。
可以看到图中的post请求多个都是一个方法解密,那就冲就完了。
下断或者搜索
鼠标左键点击一下找到来源地址
byd露出鸡角了吧
1var CryptoJS = cryptoJs.exports;
2const secretKey = "93a0956dc0b1bfaa68e59fc3cc153997"
3 , iv = "0102030405060708";
4function encrypt(n) {
5 return CryptoJS.AES.encrypt(n, CryptoJS.enc.Utf8.parse(secretKey), {
6 iv: CryptoJS.enc.Utf8.parse(iv),
7 mode: CryptoJS.mode.CBC,
8 padding: CryptoJS.pad.Pkcs7
9 }).toString()
10}
三、解密方法
解析
1var CryptoJS = cryptoJs.exports;
2const secretKey = "93a0956dc0b1bfaa68e59fc3cc153997" //密钥很显然了
3 , iv = "0102030405060708"; //这也是个信息
4function encrypt(n) {
5 return CryptoJS.AES.encrypt(n, CryptoJS.enc.Utf8.parse(secretKey), { //utf8格式
6 iv: CryptoJS.enc.Utf8.parse(iv), //iv
7 mode: CryptoJS.mode.CBC, //CBC
8 padding: CryptoJS.pad.Pkcs7 //PAD7
9 }).toString()
10}
我们去搜一下解密理解
网址:http://tool.chacuo.net/cryptaes
看到了吗,下面写着加密模式 填充 密码 偏移量 字符集。
解密看看
然后就通过python的方式去实现加解密了。(去尝试哦,毕竟sqlmap自动化也需要python)
模板代码如下:
1from Crypto.Cipher import AES
2from Crypto.Util import Padding
3
4
5# 加密
6# 密钥(key), 密斯偏移量(iv) CBC模式加密
7def AES_Encrypt(key, data, vi):
8 # pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
9 data = Padding.pad(data.encode('utf-8'), block_size=AES.block_size, style="pkcs7")
10 # data = pad(data)
11 # 字符串补位
12 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
13 encryptedbytes = cipher.encrypt(data)
14 # 加密后得到的是bytes类型的数据
15 encodestrs = base64.b64encode(encryptedbytes)
16 # 使用Base64进行编码,返回byte字符串
17 enctext = encodestrs.decode('utf8')
18 # 对byte字符串按utf-8进行解码
19 return enctext
20
21
22
23'''测试'''
24encrypt_msg= AES_Encrypt("abc")
25print(encrypt_msg) # b'xc2xadLxabxefxaaxb1}x92xf22x83Lxecxf0x90'
26print(len(encrypt_msg)) # 16
四、思考
3、本人的下下次分享可能会有其他百分之30站点的实战,比如大型邮箱站点登录等等,基本上完成最后一节大型邮箱解密就吃完,就没什么对手了。
原文始发于微信公众号(听风安全):JS脚本的奇妙冒险
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论