*本文作者:molibird,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
关键字:APIfen、工具使用、sql注入
涉及工具/包: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代码 / 构造参数的代码
搜索参数名
进行调试 发现:
bLN7G对象、相关的 window.asrsea()成为关键
对应
对应
浏览器工具输出内容与Burp内容不完全一样,因为burp内容经过了URL编码
二、分析代码:
1、windows.asrsea() 函数
函数:
返回一个固定长度的随机字符串,后续的a(16)可以直接取16个a,”aaaaaaaaaaaaaaaa”。
函数即 函数
其中的函数传入的3个参数都是常数,猜测就是一个常数,用抓到的请求包中的参数值直接代替,发现页面成功响应说明猜测正确。
到目前为止,的有效参数只剩下第一个
2、JSON.stringify(j7c)
和评论API相关的 就是
在代码中直接修改 :
发现页面获取的评论 出现偏移(首页热门评论消失,时间排序从第2条开始获取)。
到这里就和平时进行sql注入的情形很像了。
3、最关键的加密函数b()
发现对象的内容绕来绕去…代码量太多(这里就不贴出来了,太占篇幅)
想要寻找简单点的办法
三、用Python完成JS加密函数的功能
1、Js2Py包:直接将JS转换成Python(失败尝试)基本使用:
注意:Js2Py无法识别JS用法:
使用发生错误,还有很多JS的用法Js2Py不能识别。
想先将JS进行简化,再进行转换尝试。
2、Closure Compiler:JS简化压缩(失败尝试)
智能模式如下 JS代码:
压缩后:自动删除所有无用的代码
注意:Compiler无法识别JS非严格模式的用法
解决办法:
1、被弃用:给函数增加一个函数名
2、修改为
简化压缩后,再次尝试Js2Py的转换,依然失败…
被混淆的JS代码,暂时没能力去修改到复核Js2Py的格式。
只能换个思路:Python调用浏览器,让浏览器去执行JS
PyV8,没安装成功…
3、selenium + phantomjs
selenium 结合 浏览器(比如Firefox需要下载 geckodriver)
selenium 结合 phantomjs(类似:不显示内容的浏览器) 速度更快
第一步、下载phantomjs、geckodriver并将路径添加到系统的PATH环境变量
第二步、本地服务器创建php文件,利用原有的JS进行加密然后输出:
第三步、selenium结合phantomjs:
四、sqlmap使用自定义tamper
1、编写tamper
2、sqlmap尝试
五、总结:
使用selenium效率肯定没有直接Python直接加密好,但对于混淆过的JS代码,可以省去很大的分析精力…对于类似存在加密的场景,也可以快速进行尝试。
对于应用开发来说,即使在前端对参数值进行加密,后端在使用中依然需要进行过滤。
*本文作者:molibird,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
领取专属 10元无门槛券
私享最新 技术干货