本文记录 PHP 代码审计的学习过程,教程为暗月 2015 版的 PHP 代码审计课程
1. 环境准备
1.1 测试运行环境
安装 wamp
1.2 PHP 编写工具
-
EditPlu
-
Notepad++
-
Zendstudio 10 百度云下载链接
1.3 代码审计工具
Seay源代码审计系统 百度云下载链接
1.4 代码审计平台
2. 注释
- 单行注释 => //单行注释
- 多行注释 => /*多行注释*/
3. 单引号和双引号
-
单引号不解析变量
-
双引号解析变量
aaa='123' echo '$aaa' => 结果为 $aaa echo "$aaa" => 结果为 123
4. 输出函数
-
echo 或者 print:最简单的输出方法
-
print_r、var_dump(var_export)、debug_zval_dump:输出变量数据值,特别是数组和对象数据
-
var_dump 会额外输出数据类型
-
print_r:输出格式很整齐,跟var_dump 的区别是没有类型数据,并且布尔值的 false 和 NULL 输出为空
-
var_export:所有的数据是可以作为组织好的变量输出的,都是能够作为直接赋值使用;需要注意的一点是, var_export 对于资源型的变量会输出NULL
-
debug_zval_dump:输出结果跟 var_dump 类似,唯一增加的一个值是 refcount,就是记录一个变量被引用了多少次,这是 php 的copy on write (写时复制) 的机制的一个重要特点。
5. 超全局变量
超全局变量——超全局变量是在全部作用域中始终可用的内置变量
1. 简介
-
在php 中可由用户操作的全局变量列表如下:
$GLOBALS — 引用全局作用域中可用的全部变量 $_SERVER — 服务器和执行环境信息 $_GET — HTTP GET 变量 $_POST — HTTP POST 变量 $_FILES — HTTP 文件上传变量 $_REQUEST — HTTP Request 变量 $_SESSION — Session 变量 $_ENV — 环境变量 $_COOKIE — HTTP Cookies
-
已经被弃用的超全局变量
$_HTTP_COOKIE_VARS $_HTTP_ENV_VARS $_HTTP_GET_VARS $_HTTP_POST_FILES $_HTTP_POST_VARS $_HTTP_SERVER_VARS
2. 超全局变量示例
-
$GLOBALS
# 例一: <?php $moon="1"; echo $GLOBALS['moon']; ?> # 显示结果为1 # 例二 <?php function test(){ echo $moon="2"; echo $GLOBALS['moon']; } $moon="1"; test(); ?> # 显示结果为 21 # 函数内部为局部变量,不被 $GLOBALS 所识别
-
$_SERVER
test1.php <?php print_r($_SERVER); ?> test2.php <?php $_SERVER='aaaaaa'; print_r($_SERVER); ?>
输出结果为服务器的配置信息
输出结果可以被覆盖
-
$_GET
test.php <?php print_r($_GET); ?>
输出结果为 URL 中的 GET 变量的数据
-
$_POST
test.php <?php print_r($_POST); ?>
输出结果为 URL 中的 POET 变量的数据
-
$_FILES
1. file.html <form action="test.php" method="post" enctype="multipart/form-data"> <lable for="file">Filename:</lable> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> 2. test.php <?php print_r($_FILES); ?>
输出结果为提交的文件的信息
-
$_REQUEST
test1.php <?php print_r($_REQUEST); ?> test2.php <?php $_REQUEST='aaaaaa'; print_r($_REQUEST); ?>
输出结果可以被覆盖
-
$_SESSION
test1.php <?php print_r($_SESSION); ?> test2.php <?php $_SESSION='aaaaaa'; print_r($_SESSION); ?>
输出结果可以被覆盖
-
$_ENV
test1.php <?php print_r($_ENV); ?> test2.php <?php $_ENV='aaaaaa'; print_r($_ENV); ?> test3.php <?php print_r($_ENV['OS']='bbbbbb'); ?>
输出结果可以被覆盖
-
$_COOKIE
test.php <?php print_r($_COOKIE); ?>
输出结果为 cookie 值