本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程
1. 简介
-
反射型XSS 漏洞
它通过给别人发送带有恶意脚本代码参数的URL,当URL 地址被打开时,特有的恶意代码参数被HTML 解析、执行。
它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。 -
_SERVER 变量参数
$_SERVER[‘PHP_SELF’] //直接在URL中输出执行XSS
$_SERVER[‘HTTP_USER_AGENT’] //HTTP头中构造XSS
$_SERVER[‘HTTP_REFERER’] //Referer头中构造XSS
$_SERVER[‘REQUEST_URI’] //显示 URL 中的XSS内容
-
防御
htmlspecialchars() 函数
预定义的字符是:
& (和号) 成为 & " (双引号) 成为 " ' (单引号) 成为 ' < (小于) 成为 < > (大于) 成为 >
2. 漏洞演示
-
变量的直接输出
<?php echo $_GET['xss']; ?>
浏览器执行 http://127.0.0.1/test.php?xss=alert(123);
输出结果为一个弹窗
浏览器执行 http://127.0.0.1/test.php?xss=alert(document.cookie);
输出结果为 cookie 的弹窗,把 alert() 括号里的值换成 document.cookie 即可
-
$_SERVER 变量参数
-
$_SERVER[‘PHP_SELF’] //直接在URL中输出执行
<?php echo $_SERVER['PHP_SELF']; ?>
浏览器执行 http://127.0.0.1/test.php/xss=alert(123);
-
$_SERVER[‘HTTP_USER_AGENT’] //HTTP头中构造XSS
<?php echo $_SERVER['HTTP_USER_AGENT']; ?>
-
$_SERVER[‘HTTP_REFERER’] //Referer头中构造
<?php echo $_SERVER['HTTP_REFERER']; ?>
-
$_SERVER[‘REQUEST_URI’]
<?php echo $_SERVER['REQUEST_URI']; ?>
-
3. 防御
-
htmlspecialchars() 函数
预定义的字符是:
& (和号) 成为 & " (双引号) 成为 " ' (单引号) 成为 ' < (小于) 成为 < > (大于) 成为 >
如需把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数
htmlspecialchars(string,flags,character-set,double_encode)
语法格式中可以选择编码单引号或者双引号以及编码字符集