PHP代码审计环境准备
一. 实验目的
1、掌握PHP环境的安装
2、掌握Sublime编辑器的安装与使用
3、了解Firefox浏览器中Hackbar插件的使用
二. 实验原理
PHP代码审计所需要的工具与环境
三. 实验内容
1、Firefox中Hackbar插件的使用
2、Sublime编辑器的安装与使用
3、Phpstudy的安装与使用
四. 实验环境描述
1、Windows 7操作系统(administrator / 123456)
2、Firefox浏览器 + Hackbar插件
3、Phpstudy生成PHP服务器环境
4、Sublime编辑器
五. 实验步骤
1、Firefox浏览器与Hackbar环境的安装与使用
a. Firefox浏览器直接到互联网上下载安装即可(由于本实验不能连接外网,所以已预安装完毕)
b. 在Firefox浏览器的菜单栏 - “附加组件” - “扩展”中搜索Hackbar
c. 点击搜索出来的第一个hackbar插件,然后进入Hackbar插件安装页面,点击安装即可(此实验环境由于不能连接互联网,Hackbar插件已提前安装完毕)
d. F12快捷键打开开发人员工具,即可看到Hackbar插件(再次F12即可关闭开发人员工具页面)
2、PhpStudy的安装与使用
a. Phpstudy是一个Apache、PHP、MySQL的集成环境,在目录C:\Users\admin\Downloads下找到Phpstudy的安装包,解压并直接点击解压出来的phpStudySetup.exe文件即可安装
b. 路径选择直接可以用默认的C:\\phpStudy,然后点击“是”即可
c. 安装过程中如果跳出升级版本的页面,选择否即可,如果提示:系统没有安装VC11、VC14运行库,直接关掉提示信息页面即可。
d. 接着在打开的phpstudy页面点击启动按钮即可启动Apache与MySQL应用
e. 然后在Firefox浏览器的地址栏里面输入localhost,如果显示以下页面,即表明PHP环境安装完成
f. Apache的主目录为:C:\phpstudy\phptutorial\www,如果需要搭建一些PHP网站,把源代码放到此目录即可。
3、Sublime安装
a. Sublime是一个编辑器软件,在目录C:\Users\admin\Downloads下找到Phpstudy的安装包,点击安装即可。(注意出现如下图所示的页面是,把add to explorer context menu选中,这样后期我们要用某个Sublime打开文件时,右击此文件,即有使用Sublime打开此文件的选型)。
至此,PHP代码审计的基础环境已安装完毕。
代码执行漏洞审计之eval与assert
一. 实验目的
1、了解代码执行漏洞产生原因
2、了解代码执行漏洞函数eval()、assert()
二. 实验原理
1、应用在调用一些能将字符串转化成代码的函数时,没有考虑到用户是否能控制这个字符串(未对用户输入进行过滤或过滤不严),用户可以将代码注入到应用中执行,这就是所谓的代码注入漏洞。
2、PHP代码执行漏洞和 Sql注入、PHP命令注入漏洞的区别:
● Sql注入漏洞是将Sql语句注入到后台数据库中进行解析并执行
● 命令注入漏洞是指注入可以执行的系统命令(如windows中的CMD命令、linux中的Bash命令)并执行
● PHP代码执行漏洞是将PHP代码注入到Web应用中通过Web容器执行
3、相关函数:
● PHP:eval() assert() call_user_func_array() preg_replace() call_user_func()等常规函数和动态函数$a($b) (比如$_GET($_POST["xxx"])
● Python:exec
● Java:没有类似函数,但采用的反射机制和各种基于反射机制的表达式引擎(OGNL、SpEL、MVEL等)有类似功能
三. 实验内容
代码执行漏洞就是通过编程语言的漏洞去执行我们构造的代码,该漏洞是PHP危害最为严重的漏洞之一。 本课程主要通过代码层来了解以下问题:
1、什么是代码执行漏洞?
2、代码执行漏洞相关函数eval()、assert()的作用?
四. 实验环境描述
1、Sublime编辑器
2、Firefox浏览器(Hackbar插件)
3、Phpstudy(MySQL:root/root)
4、Windows7(administrator/123456)
五. 实验步骤
1、eval()函数介绍
a. 首先了解下eval()函数的作用
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
b. eval()函数语法
eval(phpcode) //phpcode必需,规定要计算的PHP代码
c. eval()函数的注意事项
eval()函数的参数的字符串末尾一定要有分号,在最后还要另加一个分号(这个分号是php限制)。
注意单引号,双引号和反斜杠的运用。如果参数中带有变量时,并且变量有赋值操作的话,变量前的$符号钱一定要有\来转义,如果没有赋值操作可以不需要。
2、在目录C:\\phpstudy\PHPTutorial\WWW\CodeExec\中使用Sublime打开CodeExec1.php文件,查看文件中的源代码
具体代码内容如下:
<?php $id = $_GET['id']; eval("\$honk = $id;"); echo $honk; ?>
代码解释:变量$id 获取 get 方式传递的变量名为 id 的变量值(值为一个字符串),然后通过eval()函数对$honk赋值,最后再使用echo输出$honk的值。
3、打开桌面的phpstudy,启动环境
打开Firefox浏览器,在浏览器地址栏输入地址: http://localhost/CodeExec/CodeExec1.php,此时页面如下图所示没有任何回显
4、接着我们在地址后面输入?id=666时,发现页面内容显示666
5、如果我们在地址后面输入?id=phpisthebest时,发现页面内容显示phpisthebest
6、由于1与phpisthebest都是非恶意的输入,所以并没有造成恶意影响。但是如果我们尝试输入一些php的敏感函数,例如?id=phpinfo(),从下图可以看到后台成功解析了phpinfo()函数,并返回了 phpinfo 页面,显然这不是我们希望用户看到的,暴露了很多Web容器相关配置,这将带来许多未知的危险。
7、接下来我们来解释下为什么输入phpinfo()时,页面会返回phpinfo的页面信息
a. phpinfo()被赋值给$id,之后执行代码: eval("\$honk = phpinfo();");
b. 实际上相当于执行:$honk = phpinfo();
c. 而php代码是从右往左执行,所以phpinfo()函数直接就先执行返回了phpinfo页面,这时后台php代码等同于:
<?php $id = $_GET['id']; eval("$id;"); ?>
d. 因此,此漏洞产生的原因主要是未对用户的输入进行有效过滤
8、assert()函数介绍
a. 首先了解下assert()函数的作用
assert这个函数在php语言中是用来判断一个表达式是否成立,返回true 或 false。
如果参数是字符串,它将会被 assert() 当做 PHP 代码来执行。
b. assert()函数语法
●PHP 5:
bool assert ( mixed assertion [, stringdescription ] )
●PHP 7:
bool assert ( mixed assertion [, Throwableexception ] )
●assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动
c. assert()与eval()区别
● eval()函数正确执行需要满足php的代码规范,而assert()函数则不存在这个问题,对于php的代码规范要求不高
● eval(a ) 中的参数 a)中的参数a)中的参数a只能是字符串,assert(a ) 中参数 a)中参数a)中参数a可以是php代码(表达式或者函数),也可以是php代码的字符串,assert(a ) 的 a)的a)的a如果是字符串形式不能有2个以上的分号,如果有2个以上的分号只执行到第一个,使用assert来执行多条php语句可借助eval来实现
9、在目录C:\\phpstudy\PHPTutorial\WWW\CodeExec\中使用Sublime打开CodeExec_assert.php文件,查看文件中的源代码
<?php $id = $_GET['id']; assert("\$honk = $id");#assert()函数内部没有`;` echo $honk; ?>
10、打开Firefox浏览器,在地址栏输入地址:http://localhost/CodeExec/CodeExec_assert.php,发现页面回显空白
11、然后在地址后面加入?id=phpinfo(),如下图所示,也返回了phpinfo页面,说面此页面也存在安全隐患。
命令注入漏洞审计
一. 实验目的
命令注入攻击可被攻击者用来导入代码到某特定的计算机程序,以改变程序的运行进程或目的。 PHP命令注入则是由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。
二. 实验原理
三. 实验内容
四. 实验环境描述
windows密码:123456
五. 实验步骤
第一类函数
a) 第一类函数包括system()、exec()、shell_exec()、passthru()可以直接传入命令执行并返回结果,其中system()最简单,不需要输出函数,会自动打印命令执行结果,所以这里我们先讲解system()函数。
打开Sublime Text查看cmdinject1.php 代码
代码如下:
这就是一个简单的页面:用$id获取GET方式传递的bash变量名的值,传入sysytem()函数当做命令执行。
b)启动phpstudy并启动服务
c) 用firefox 访问localhost/cmdinject/cmdinject1.php?bash=whoami
返回了web的用户所在的目录地址。 我们再输入?bash=net user hak 123456 /add
用dos命令查看当前用户
d)其他几个函数类似,只是需要手动打印而已,比如exec()函数:
这里就不再赘述。
2.第二类函数 a)第二类函数包括popen()、proc_open(),当使用这类函数传入命令时,命令会执行,但不会返回执行结果,这里我们使用popen()函数进行详细的讲解:
先看看popen()函数说明: resource popen ( string $honk, string $mode )
打开一个指向进程的管道,该进程由派生给定的 honk命令执行而产生。
看不太明白?不存在的,简单地说这个函数有两个参数:
第一个参数 $honk会被当作命令执行。 第二个参数 $mode 决定执行模式,有两个取值r 或者 w ,来指明是读还是写. 使用Sublime Text查看 cmdinject3.php 代码
b) 打开Firefox输入url:localhost/cmdinject/cmdinject3.php?bash=echo 123 >d:\123.txt:
页面同样没有任何回显,但其实命令已经执行,我们去d盘查看去验证:
结果图所示,可以看到已经成功在D盘新建了123.txt文件
3.第三类函数
a)第三类函数只有pcntl_exec(),此函数是php的多进程扩展,在处理大量任务的情况下会使用到,使用此函数需要额外安装。
pcntl_exec()函数说明: void pcntl_exec ( string $path [, array $args [, array $envs ]] )
以给定参数执行程序:
path : path必须时可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径标头的脚本(比如文件第一行是#!/usr/local/bin/perl的perl脚本)。 args: args是一个要传递给程序的参数的字符串数组。
envs : envs是一个要传递给程序作为环境变量的字符串数组,这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。 KaTeX parse error: Expected 'EOF', got '#' at position 42: …sh脚本,则需要在文件头加上 #̲!/bin/bash来标识可执…args 表示传递给p a t h 程序的参数, path程序的参数,path程序的参数,envs 则是执行这个程序的环境变量。