绕过请求签名进行sql注入

Posted by Jaqen Blog on March 26, 2019

绕过请求签名进行sql注入

在测试中遇到请求数据包如下图所示
图片1
其中通过sign参数对请求参数做了签名,目测是md5。这里的orderby参数按照经验应该是容易存在注入的,因为预编译sql语句不会处理order by后面的参数包括limit。
图片2
由于sign参数的值目测是md5值,但是对所有参数进行md5发现不相等,于是对每个参数的值进行更改来判断计算md5值要剔除的参数,但都返回sign invalid。于是转换思路看下能否找到签名算法,js文件都进行了混淆压缩,搜索sgin、orderby等关键字,水平有限没法通过分析js构造出签名算法。
图片3
图片4
于是重新思考,想到是否可以在签名前替换orderby的值,查看数据包可以看到”goods_price desc”,由于js混淆压缩虽然变量名、函数名都改变了,但是保留了原始的字符串。通过搜索“goods_price desc”关键字,找到了部分js代码如下
图片6
图片5
通过对比html对应位置class名可以确认,于是通过bp替换此字符串为单引号测试返回包。注入存在,oracle
图片7
图片8
使用(select dbms_xdb_version.checkin((select ‘ahtest’ from dual)) from dual)报错注入获取当前数据库用户名,成功返回
图片9
图片10

那如何进行自动化注入

1.通过调试js找出sign值的计算方式。
2.通过python的selenium模块模拟浏览器,在签名前替换参数值后模拟浏览器提交进行自动化注入。

对js进行动态调试

我这是使用chrome进行调试,因为是点击时间出发的请求,于是设置对cllick事件进行断电。
图片11
通过跟js代码找到了处理签名的代码块,这里之前其实可以通过搜索md5关键字来找到签名函数,但是之前我没忽略大小写导致没有搜到这里的Md5,额。。。。
图片12
可以看到其实是针对{“command”:”/goodsinfo/queryIndexList”,”token”:null,”sign”:””,”time”:”2019-03-26 20:31:54”,”data”:”{"trading_mode":"","searchtext":"","goods_class":"","area":"","express_type":"","start_date":"","end_date":"","goods_weight_min":"","goods_weight_max":"","goods_pricemax":"","goods_pricemin":"","time":"","city":"","province":"","limit":"20","offset":"0","order":" goods_price desc "}”,”nonce”:”df07439d-8200-46df-aebf-114a477ff413”}计算md5值作为签名。跟我黑盒判断确实有出入,下面验证下用bp计算md5值结果是否相同
图片13
图片14
没有问题,到这里就可以自己对数据包进行篡改和重签名了。

python模拟浏览器

最新selenium不再支持phantomjs,于是我下载了chromedriver http://npm.taobao.org/mirrors/chromedriver/,通过这样模拟浏览器和渲染是没有问题的,但是没有找到方法在渲染之前替换请求的js文件内容。。。。于是这个思路到这就断了。之后有思路再补充