我正在尝试用字典中的键替换SQL查询字符串OR NOT "[low_level_rand_num]"="[rand_num]"
中的字符:
replacements = {
'"[low_level_rand_num]"': str(random.randint(1, 13)),
'"[rand_num]"': str(random.randint(13, 26)),
'"[comment]"': random.choice(["--", "/*", "#", "*/", "'", '"', "`", "-"]),
'"[rand_string]"': "asdf",
'"[query]"': "test_col",
'"[big_int_1]"': str(random.randint(10000000000, 99999999999)),
'"[big_int_2]"': str(random.randint(10000000000, 99999999999)),
'"[encoding]"': random.choice(["utf8", "utf16", "utf32", "ascii"]),
'"[sleeper]"': str(random.randint(3, 9))
}
使用string.replace()
函数如下:
def build_payloads(template):
replacements = {
'"[low_level_rand_num]"': str(random.randint(1, 13)),
'"[rand_num]"': str(random.randint(13, 26)),
'"[comment]"': random.choice(["--", "/*", "#", "*/", "'", '"', "`", "-"]),
'"[rand_string]"': rand_string_gen(),
'"[query]"': random_column(),
'"[big_int_1]"': str(random.randint(10000000000, 99999999999)),
'"[big_int_2]"': str(random.randint(10000000000, 99999999999)),
'"[encoding]"': random.choice(["utf8", "utf16", "utf32", "ascii"]),
'"[sleeper]"': str(random.randint(3, 9))
}
for k in replacements.keys():
if k in template:
print template.replace(k, replacements[k])
但是,每次运行此函数时,我都会得到输出:
OR NOT 7="[rand_num]"
OR NOT "[low_level_rand_num]"=21
它似乎正在替换字符串,但它并没有让它们被替换,我对错误的字符串不会被替换的地方做错了怎么办?如何解决这个问题并获得OR NOT 7=21
的预期输出?
答案 0 :(得分:0)
字符串替换不是就地完成的,更换后更新模板:
...
for k in replacements:
if k in template:
template = template.replace(k, replacements[k])
print template
作为旁注,当在字典键上进行迭代时,您可以删除.keys
调用,因为直接在字典上进行迭代将运行其键。
答案 1 :(得分:0)
您只是输出替换结果,template
本身并没有改变。
template = "foo"
print template.replace("foo","bar") #outputs 'bar'
print template #outputs 'foo'
template = template.replace("foo","bar")
print template #outputs 'bar'