javascript是web应用的重要部分,是web应用动态交互及展示的关键所在,web应用开发者们往往会在javascript中编写大量的逻辑代码与后端接口进行交互,例如在javascript中编写ajax代码与后端接口进行异步请求等。因此javascript在web安全领域也是备受关注的,javascript代码中包含了大量的接口地址、接口请求方式、参数传递格式,甚至还会包含开发阶段的测试数据如测试账号、测试凭证等,而这些都是攻击者们非常感兴趣的可以进行利用的攻击点。下面就对实际web渗透中常用的javascript逆向调试手法进行简单的介绍。
javascript调试入门
使用浏览器打开https://googlechrome.github.io/devtools-samples/debug-js/get-started
这是一个学习使用chromedevtools对程序进行debug的demo应用。
分别在number1和number 2的输入框中输入数据,点击addnumber 1 and number 2按钮。
可以看到程序输出了1+2的结果为12,这明显是错误的,接下来就需要我们利用devtools对程序进行debug找到其中的错误并进行修正,使程序输出正确的答案。
我们在当前浏览器窗口中按下f12键,chrome浏览器就会弹出devtools工具的界面。
点击sources选项,可以对当前网页的所有资源列表进行查看,包括javascript代码文件、html代码文件、css代码文件等,如果javascript代码存在被压缩的情况,可以点击{}按钮对javascript代码进行格式化。
接下来我们需要对点击add number 1 and number 2按钮后发生的计算逻辑进行捕获,展开eventlistener breakpoints,选择mouse->click。
此时再点击addnumber 1 and number 2按钮,代码将会在点击按钮事件的入口处暂停。
此时可以使用f9按键进行单步调式,查看程序的运行逻辑,同时检查参数赋值情况。
从调试中可以看出,错误发生在get-started.js代码的第32行:
var sum =addend1 + addend2;
该行直接将输入的字符串类型数据进行相加,所以得到了错误的结果,可以使用parseInt函数进行修正
可以在console窗口中进行修正测试
parseInt(addend1)+parseInt(addend2);
修正后得到了正确的结果。
javascript逆向加密爆破
在实战中非常常见的一种场景是目标网站为了防止攻击者对登录入口进行爆破,会对登录数据包中的账号、密码字段进行加密,攻击者无法使用常规的明文字典进行爆破。这个时候由于账号、密码的加密都是在javascript中进行,可以通过调试对javascript代码进行逆向,找到相应的加密javascript代码,使用加密代码对明文字典进行批量转换后即可进行爆破。
以某站登录口为例,通过上面的调试技巧我们定位到如下的javascript加密函数。
将上图中91行到113行的代码完整复制到console窗口中。
修改传入的username、password的初始值,即v1、v2,同时使用console.log打印经过加密后的账号、密码的值。
如下:
在console窗口中回车运行上述代码,即可得到加密后的账号密码值,v1的值对应“admin”,v2的值对应“123456”。
通过浏览器插件或者其他工具调用上述代码即可批量对明文字典进行加密产生对应后的加密字典。
原文始发于微信公众号(第59号):javascript逆向调试初探
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论