渗透测试中如何处理前端加密?

在渗透测试过程中难免会遇到很多参数前端加密处理的情况,对我们接下来Fuzz、爆破/注入等操作引入很多麻烦,结合之前遇到的几种场景,整理总结了以下解决方法,常见场景如:
1、遇到一个SQL注入,但是注入参数被魔改base64了,我们需要写tamper处理payload,如何高效处理?
2、请求带一个防重放攻击的校验hash,该hash是开发者自定义加密算法生成的,如何分析并达到批量目的?
3、…

1、execjs

1
2
3
4
5
6
7
8
9
10
>>> import execjs
>>> execjs.eval("'red yellow blue'.split(' ')")
['red', 'yellow', 'blue']
>>> ctx = execjs.compile("""
... function add(x, y) {
... return x + y;
... }
... """)
>>> ctx.call("add", 1, 2)
3

某些情况下用execjs不可以直接调用,会报一个无效变量的错误,猜测应该是js文件中使用了匿名函数的原因?需要手工处理一下js代码,具体技术细节未深入了解。

2、Selenium

常见的高级爬虫环境Python + Selenium + ChromeDriver,基本上浏览器能做的它都可以做(其实就是一个浏览器…),环境配置也比较简单,于是写了个简单的验证程序:

upload successful

看起来有点笨重,也有点大材小用的感觉。

3、js2py

顾名思义,js代码转python代码,官方的介绍:

1
JavaScript to Python Translator & JavaScript interpreter written in 100% pure Python

把负责加密的js扒下来,转为可用的python代码:

1
2
3
4
5
6
# this will translate example.js to example.py
>>> js2py.translate_file('example.js', 'example.py')
# example.py can be now imported and used!
>>> from example import example
>>> example.someFunction()
...

转换结果形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from js2py.pyjs import *
# setting scope
var = Scope( JS_BUILTINS )
set_global_object(var)

# Code follows:
var.registers([u'$'])
@Js
def PyJsHoistedNonPyName(x, this, arguments, var=var):
var = Scope({u'this':this, u'x':x, u'arguments':arguments}, var)
var.registers([u'x'])
var.get(u'console').callprop(u'log', var.get(u'x'))
PyJsHoistedNonPyName.func_name = u'$'
var.put(u'$', PyJsHoistedNonPyName)
pass
var.get(u'$')(Js(u'Hello, World!'))
pass

直接导入即可调用:

1
2
3
4
5
6
7
8
9
10
11
# sqlmap/tamper/escapequotes.py

from lib.core.enums import PRIORITY
from jsfile import jsfile
__priority__ = PRIORITY.LOWEST

def dependencies():
pass

def tamper(payload, **kwargs):
return jsfile.encMe(payload)

jsfile是js2py.translate_file的结果。

4、jsEncrypter

jsEncrypter 是一个处理前端加密非常好用的burp suite插件,该插件使用phantomjs启动前端加密函数对数据进行加密,方便对加密数据输入点进行fuzz,比如可以使用于前端加密传输爆破等场景。
GitHub:https://github.com/c0ny1/jsEncrypter
详细使用方法参考项目主页,用法比较简单,作者给出一个phantomjs模板:

...
/* 1.在这引入实现加密所有js文件,注意引入顺序和网页一致 */
loadScript("script-1.js");
loadScript("script-2.js");
loadScript("script-n.js");
/**********************************************/

...

function jsEncrypt(burp_payload){
    var new_payload;
    /* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */

    /*********************************************************/
    return new_payload;
}
...  

第一步从网站前端扒下来包含加密核心代码的js文件,在phantomjs模板文件中引入;
第二部处理jsEncrypt函数返回,运行phantomJS.exe encrypt.js,开启插件即可;

总结

Burp suite插件能解决的问题首选jsencrypter,如果需要写脚本处理,比如sqlmap的tamper,选js2py!