某音乐类App评论相关API的分析及SQL注入尝试

时间:2022-04-28
本文章向大家介绍某音乐类App评论相关API的分析及SQL注入尝试,主要内容包括摘要:、目录:、正文、一、获取相关代码、2、寻找主要JS文件、3、Fiddler:将JS文件替换成本地JS文件 便于调试、4、Fiddler + Burpsuite对Fiddler 还不熟悉,在这里仅利用fiddler的替换功能,其它查看分析都在Burp中完成。、5、具体发送请求的JS代码 / 构造参数的代码、二、分析代码:、2、JSON.stringify(j7c)、3、最关键的加密函数b()、三、用Python完成JS加密函数的功能、2、Closure Compiler:JS简化压缩(失败尝试)、3、selenium + phantomjs、四、sqlmap使用自定义tamper、2、sqlmap尝试、五、总结:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

涉及工具/包:Fiddler、Burpsuite、Js2Py、Closure Compiler、selenium、phantomjs、sqlmap

摘要:

记录分析某音乐类App评论相关API的过程,以及一些工具/包的基本使用(部分工具对最后尝试没有影响,但在其它场景或许有用),最后结合sqlmap进行注入尝试。本文对于sql注入没有深入展开(水平不够…)。

想法来源:本想写个程序获取零评论的歌曲,去占沙发…分析发现获取评论的POST请求参数有点复杂…既然花时间研究了,顺便进行一下sql注入的尝试。

目录:

一、获取相关代码

1、获取评论的HTTP请求

2、寻找主要JS文件

3、Fiddler:将JS文件替换成本地JS文件 便于调试

4、Fiddler + Burpsuite

5、具体发送请求的JS代码 / 构造参数的代码

二、分析代码:

1、windows.asrsea()函数

2、JSON.stringify(j7c)

3、最关键的加密函数b()

三、用Python完成JS加密函数的功能

1、Js2Py包:直接将JS转换成Python(失败尝试)

2、Closure Compiler:JS简化压缩(失败尝试)

3、selenium + phantomjs

四、sqlmap使用自定义tamper

1、编写tamper

2、sqlmap尝试

五、总结


正文

一、获取相关代码

1、获取评论的HTTP请求

评论的分页功能一般会用到的参数:第几页、获取几条 等等。

但此处POST请求参数并不简单,直接加密成了一长串字符串。

2、寻找主要JS文件

这里的JS文件都是被混淆过的,但如果最后要构造/发送参数,参数名是不能被混淆的。因此,利用参数名encSecKey在JS内容中进行搜索,发现core.js中出现了3次,初步猜测相关的代码都在这里。

3、Fiddler:将JS文件替换成本地JS文件 便于调试

4、Fiddler + Burpsuite对Fiddler 还不熟悉,在这里仅利用fiddler的替换功能,其它查看分析都在Burp中完成。

Fiddler 好像没有Burp的截断暂停/方形功能? Burpsuite好像没有Fiddler 那么方便的替换文件功能?

只需要将Fiddler设置代理 将流量导向Burp的8080即可。

选择 Tools-Options 打开设置

5、具体发送请求的JS代码 / 构造参数的代码

搜索参数名encSecKey

进行调试 发现:

bLN7G对象、相关的 window.asrsea()成为关键

bLN7G.encText对应params bLN7G.encSecKey对应encSecKey

浏览器工具输出内容与Burp内容不完全一样,因为burp内容经过了URL编码

二、分析代码:

1、windows.asrsea() 函数

函数a()

返回一个固定长度的随机字符串,后续的a(16)可以直接取16个a,”aaaaaaaaaaaaaaaa”。

函数window.asrsea()即 函数d()

其中的c()函数传入的3个参数都是常数,猜测h.encSecKey就是一个常数,用抓到的请求包中的参数值直接代替,发现页面成功响应说明猜测正确。

到目前为止,window.asrsea()的有效参数只剩下第一个JSON.stringify(j7c)

2、JSON.stringify(j7c)

和评论API相关的 就是

在代码中直接修改 offset

发现页面获取的评论 出现偏移(首页热门评论消失,时间排序从第2条开始获取)。

到这里就和平时进行sql注入的情形很像了。

3、最关键的加密函数b()

发现CryptoJS对象的内容绕来绕去…代码量太多(这里就不贴出来了,太占篇幅)

想要寻找简单点的办法

三、用Python完成JS加密函数的功能

1、Js2Py包:直接将JS转换成Python(失败尝试)基本使用:

注意:Js2Py无法识别JS用法:

使用发生错误,还有很多JS的用法Js2Py不能识别。

想先将JS进行简化,再进行转换尝试。

2、Closure Compiler:JS简化压缩(失败尝试)

--compilation_level ADVANCED_OPTIMIZATIONS

智能模式如下 JS代码:

压缩后:自动删除所有无用的代码

注意:Compiler无法识别JS非严格模式的用法 解决办法: 1、arguments.callee被弃用:给函数增加一个函数名 2、delete parm修改为parm = null

简化压缩后,再次尝试Js2Py的转换,依然失败…

被混淆的JS代码,暂时没能力去修改到复核Js2Py的格式。

只能换个思路:Python调用浏览器,让浏览器去执行JS

PyV8,没安装成功…

3、selenium + phantomjs

selenium 结合 浏览器(比如Firefox需要下载 geckodriver)

selenium 结合 phantomjs(类似:不显示内容的浏览器) 速度更快

第一步、下载phantomjs、geckodriver并将路径添加到系统的PATH环境变量

第二步、本地服务器创建php文件,利用原有的JS进行加密然后输出:

</script>

第三步、selenium结合phantomjs:

四、sqlmap使用自定义tamper

1、编写tamper

2、sqlmap尝试

五、总结:

使用selenium效率肯定没有直接Python直接加密好,但对于混淆过的JS代码,可以省去很大的分析精力…对于类似存在加密的场景,也可以快速进行尝试。

对于应用开发来说,即使在前端对参数值进行加密,后端在使用中依然需要进行过滤。