fuzz

微信公众平台

1.sql

{{ }}占位符标记,通常用于告知工具 / 脚本:此处需要动态填充内容(非固定值)。
48/(len(suser_sname())-{{int(0-10)}})
  • len(suser_sname())len()函数用于获取字符串长度,这里是获取当前数据库用户名称(suser_sname()返回值)的字符数。
  • {{int(0-10)}}:注入时动态变化的数值(0 到 10 之间),用于猜测用户名的可能长度范围。
  • 整体逻辑:通过判断分母是否为 0 来确定猜测是否正确:
    • len(suser_sname()) - 猜测的数值 = 0时,分母为 0,整个表达式会因除零错误导致数据库报错。
    • 当两者不相等时,分母不为 0,表达式返回 48 除以该差值的结果,不会报错。

注入者通过观察页面是否出现错误(或返回结果差异),可以确定当前数据库用户名的准确长度(即当表达式报错时,{{int(0-10)}}的数值就是用户名的长度)。

48/(ascii(substring(suser_sname(),{{int(1-6)}},1))-{{int(96-124)}})
  1. suser_sname():SQL Server 数据库的系统函数,用于返回当前登录的数据库用户名称(如 sadbo 等)。
  2. substring(suser_sname(), {{int(1-6)}}, 1)
    • substring(字符串, 起始位置, 长度) 是字符串截取函数。
    • 这里表示截取 suser_sname() 返回的用户名中,第 {{int(1-6)}} 位的字符({{int(1-6)}} 通常是注入时动态变化的位置,比如 1 到 6 之间的整数,用于逐个获取用户名的每个字符)。
  3. ascii(...):将截取到的单个字符转换为对应的 ASCII 码值(例如,字符 'a' 的 ASCII 码是 97,'A' 是 65,'0' 是 48 等)。
  4. {{int(96-124)}}:注入时动态变化的数值(96 到 124 之间),这个范围覆盖了常见字符的 ASCII 码(比如小写字母 a-z 的 ASCII 码是 97-122,下划线 _ 是 95,花括号等符号也在附近)。
  5. 整体逻辑
    表达式 48/(ascii(...) - {{int(96-124)}}) 的核心是通过 分母是否为 0 来判断条件是否成立:
    • 如果 ascii(截取的字符) - 动态数值 = 0(即字符的 ASCII 码等于该动态数值),分母为 0,整个表达式会报错(触发数据库错误)。
    • 如果不等,分母不为 0,表达式会返回一个数值(48 除以非零数),不报错。
    注入者通过观察页面是否报错(或返回结果差异),可以反推当前截取的字符的 ASCII 码,进而逐个字符猜解出完整的用户名。

2.

def decode_from_gbk_url(s):
    """将GBK URL百分号格式解码为字符串"""
    # 先替换百分号编码为字节
    import urllib.parse
    byte_array = urllib.parse.unquote_to_bytes(s)  # 第一步:URL解码为字节
    return byte_array.decode('gbk') # 第二步:用GBK解码字节为字符串

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注