用过我的jsEncrypter插件的朋友,可能会有一个遇到一个大坑: 当编写前端加密调用脚本代码存在错误时,phantomJS不会报错,而且会进入假死,不能继续执行的状态。

    如果前端的加密逻辑比较简单还好,当前端加密涉及多个js文件,逻辑比较复杂时,编写调用代码存在错误在所难免。这时如果phantomJS运行该脚本不报错提示就特别难受了,修改bug将变得很苦逼。这个问题在很久之前我已经能隐约感觉到了,而上周这个坑大大影响到了我的渗透测试,不得已只能百忙之中挤点时间来填坑。

0x01 解决方案一:编码调式

    在上周的渗透测试中,我遇到了一个前端加密传输的登录表单,涉及3个js文件,逻辑比较复杂。我编写前端加密调用脚本存在错误,phantomJS运行该脚本不报错不退出退出也不继续执行,我完全不知道出错在哪里。

    当时是通过console.log()函数进行调式的。一个值一个值的使用console.log()进行输出,在每个关键的判断语句内使用console.log('run to here')来确定逻辑走到哪里了。经过反复编码调式,最终锁定了错误位置和原因,原来是有一个值没有进行初始化。这个过程很费时间和精力orz!

0x02 解决方案二:升级服务端脚本

    今晚有点时间,思考了下编码调式虽然能解决问题,但升级服务端脚本,使其支持运行错误代码时能提示出错误信息以及涉及的代码行数才算治标治本。我在重新查看了phantomJS的官方文档后,给项目的phantom_server.js脚本添加了以下错误捕捉的代码,完整代码已经更新至github项目了。

1
2
3
4
5
6
7
8
9
10
11
12
13
try{
...
}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();
}

我使用升级后的脚本模板,重新加入上周编写错误的前端加密调用代码。这次完美的报错了,提示如下:

图1-phantomjs_server.js报错

这里简单跟大家说明下报错信息的含义。

Message为错误消息,内容如下。大概知道错误为类型错误,a.pad未定义。

1
TypeError: undefined is not an object (evaluating 'a.pad')

STACK为堆栈跟踪,根据堆栈跟踪信息可以知道以下信息:

1
2
3
4
5
6
7
8
8.错误在函数_doFinalize()|文件aes.js 28行
7.错误在函数finalize()|文件aes.js 25行
6.错误在函数encrypt()|文件aes.js 29行
5.错误在函数encrypt()|文件aes.js 25行
4.错误在函数encrypt()|文件aes.js 25行
3.错误在函数encrypt()|文件encrypt.js 27行
2.错误在函数js_encrypt()|文件phantomjs_server.js 20行
1.错误在phantomjs_server.js 38行

    这样就跟我们的编程语言当中的报错堆栈跟踪很类似了。我们根据报错信息,然后顺着报错堆栈跟踪链很快就能定位到错误位置和原因了XD。

填坑先到这里吧,也不早了,晚安!

参考文章