|
5 | 5 | See the file 'doc/COPYING' for copying permission |
6 | 6 | """ |
7 | 7 |
|
| 8 | +import compiler |
8 | 9 | import httplib |
9 | 10 | import json |
| 11 | +import keyword |
10 | 12 | import logging |
11 | 13 | import re |
12 | 14 | import socket |
|
72 | 74 | from lib.core.settings import DEFAULT_CONTENT_TYPE |
73 | 75 | from lib.core.settings import DEFAULT_COOKIE_DELIMITER |
74 | 76 | from lib.core.settings import DEFAULT_GET_POST_DELIMITER |
| 77 | +from lib.core.settings import EVALCODE_KEYWORD_SUFFIX |
75 | 78 | from lib.core.settings import HTTP_ACCEPT_HEADER_VALUE |
76 | 79 | from lib.core.settings import HTTP_ACCEPT_ENCODING_HEADER_VALUE |
77 | 80 | from lib.core.settings import MAX_CONNECTION_CHUNK_SIZE |
@@ -831,23 +834,54 @@ def _randomizeParameter(paramString, randomParameter): |
831 | 834 | delimiter = conf.paramDel or DEFAULT_GET_POST_DELIMITER |
832 | 835 | variables = {"uri": uri} |
833 | 836 | originals = {} |
| 837 | + keywords = keyword.kwlist |
834 | 838 |
|
835 | 839 | for item in filter(None, (get, post if not kb.postHint else None)): |
836 | 840 | for part in item.split(delimiter): |
837 | 841 | if '=' in part: |
838 | 842 | name, value = part.split('=', 1) |
| 843 | + name = name.strip() |
| 844 | + if name in keywords: |
| 845 | + name = "%s%s" % (name, EVALCODE_KEYWORD_SUFFIX) |
839 | 846 | value = urldecode(value, convall=True, plusspace=(item==post and kb.postSpaceToPlus)) |
840 | | - evaluateCode("%s=%s" % (name.strip(), repr(value)), variables) |
| 847 | + evaluateCode("%s=%s" % (name, repr(value)), variables) |
841 | 848 |
|
842 | 849 | if cookie: |
843 | 850 | for part in cookie.split(conf.cookieDel or DEFAULT_COOKIE_DELIMITER): |
844 | 851 | if '=' in part: |
845 | 852 | name, value = part.split('=', 1) |
| 853 | + name = name.strip() |
| 854 | + if name in keywords: |
| 855 | + name = "%s%s" % (name, EVALCODE_KEYWORD_SUFFIX) |
846 | 856 | value = urldecode(value, convall=True) |
847 | | - evaluateCode("%s=%s" % (name.strip(), repr(value)), variables) |
| 857 | + evaluateCode("%s=%s" % (name, repr(value)), variables) |
| 858 | + |
| 859 | + while True: |
| 860 | + try: |
| 861 | + compiler.parse(conf.evalCode.replace(';', '\n')) |
| 862 | + except SyntaxError, ex: |
| 863 | + original = replacement = ex.text.strip() |
| 864 | + for _ in re.findall(r"[A-Za-z_]+", original)[::-1]: |
| 865 | + if _ in keywords: |
| 866 | + replacement = replacement.replace(_, "%s%s" % (_, EVALCODE_KEYWORD_SUFFIX)) |
| 867 | + break |
| 868 | + if original == replacement: |
| 869 | + conf.evalCode = conf.evalCode.replace(EVALCODE_KEYWORD_SUFFIX, "") |
| 870 | + break |
| 871 | + else: |
| 872 | + conf.evalCode = conf.evalCode.replace(ex.text.strip(), replacement) |
| 873 | + else: |
| 874 | + break |
848 | 875 |
|
849 | 876 | originals.update(variables) |
850 | 877 | evaluateCode(conf.evalCode, variables) |
| 878 | + |
| 879 | + for variable in variables.keys(): |
| 880 | + if variable.endswith(EVALCODE_KEYWORD_SUFFIX): |
| 881 | + value = variables[variable] |
| 882 | + del variables[variable] |
| 883 | + variables[variable.replace(EVALCODE_KEYWORD_SUFFIX, "")] = value |
| 884 | + |
851 | 885 | uri = variables["uri"] |
852 | 886 |
|
853 | 887 | for name, value in variables.items(): |
|
0 commit comments