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