基础

常见名词

域名

主站安全性高,则可选用次级站点(子域名)作为突破口,进行渗透提权

子域名

域名分为顶级域名和二级域名等,而在安全信息收集中,子域名一般指三级以上的域名

baidu.com 的子域名可以是 tieba.baidu.comzhidao.baidu.com

旁站入侵

旁站是指同一服务器上的其他网站,不一定属于同一家公司,注意区别子域名

很多时候某些网站不容易入侵,则可以查看该网站所在的服务器是否还有其他网站,若有,可以先拿下其他网站的 webshell,再提权拿到服务器权限,最后突破该网站

C 段

IP 地址第 24 位之后的 IP 段

如对于 120.240.100.229 ~ 120.240.100.254,则 C 段是 229 ~ 254

DNS(Domain Name System,域名系统)

区别 DNS 和 DNS 协议:

DNS 是互联网的一种服务,本质是域名和 IP 地址相互映射的一个分布式数据库

DNS 协议域名 <-> IP 地址 相互转换(双向转换)的一种解析服务协议

DNS 劫持

又称为域名劫持,这类攻击一般是通过恶意软件、修改缓存、控制域名管理系统等方式取得DNS解析控制权,然后通过修改DNS解析记录更改解析服务器方式,将用户引导至不可达的站点或受攻击者控制的非法网站,以非法获取用户数据,谋取非法利益

DDoS 攻击

DDoS 即 Distributed Denial of Service,分布式拒绝服务,是 DoS(拒绝服务) 的一种

攻击者使用僵尸网络创建不同端点,在同一时间段向受害者域名服务器直接发送海量 DNS 请求,这种攻击会在短时间内产生大量流量,利用无数请求堵塞 DNS 服务器,让其无法响应,从而达到拒绝正常用户访问的目的

僵尸网络

DDoS 攻击涉及多个连接的在线设备,统称为僵尸网络

僵尸网络是一组被劫持的连接设备,用于网络攻击,通常包括个人电脑、手机、不安全的物联网设备,甚至来自公共云服务的资源

攻击者使用恶意软件和其他技术来破坏设备,将其变成攻击者僵尸网络中的“僵尸”

CDN(Content Delivery Network,内容分发网络)

CDN 是将源站内容分发至全国所有的节点,从而缩短用户查看对象的延迟,提高用户访问网站的响应速度

image-20230223215243727

CDN 分层结构

img

CDN 的存在对安全测试有什么影响?

CDN 的存在会导致测试人员无法直接访问网站主体,而是访问 CDN 缓存

如何判断目标存在 CDN 服务?

利用多节点技术进行请求返回判断,即用超级ping查看是否多节点

image-20230227174549373

如何绕过 CDN?

子域名查询

子域名有可能与主站在同一网段(1 - 254)甚至同一 IP,可以通过子域名查询主站 IP

邮件服务查询

大公司都有自己的邮件服务器,且一般不会配备 CDN 服务,可以通过邮箱查询 IP

国外请求

一般公司会根据需求部署 CDN 服务,若国内访问量居多,则国外可能不会部署 CDN,可通过国外 IP 访问主站

另外,用小国或冷门国家的 IP 成功率较高

遗留文件全网扫描

借助工具进行全网扫描,收集所有 CDN 节点的信息,通过 IP 地址进行区分,再确定主站 IP

黑暗搜索引擎

黑暗搜索引擎:撒旦、钟馗之眼

DNS 历史记录

通过查询使用 CDN 前的 DNS 历史记录,查询 IP 地址

DDoS 暴力破解

使用 DDOS 攻击将所有 CDN 流量耗尽,之后就能访问到真实的ip地址

WAF(Web Application Firewall,Web 应用程序防火墙)

WAF 是一类新兴的信息安全技术,用于解决传统防火墙无法防御的应用安全问题

与传统防火墙不同,WAF 工作在应用层,旨在保护 Web 应用免受各类应用层攻击,如 XSS、SQL 注入、cookie 篡改等

Cookie 篡改(也称为会话劫持)是一种攻击策略,攻击者可以伪造、劫持或篡改发送回服务器的有效 Cookie,以盗取数据、绕过服务器安全检查等

WAF 通过过滤、监控和拦截恶意 HTTP 或 HTTPS 流量的访问来保护 Web 应用,并能够阻止未经授权的数据离开应用

总之,WAF 是通过执行一系列针对 HTTP/HTTPS 的安全策略来专门为 Web 应用提供保护的一种技术

传统防火墙

防火墙分类很多,根据采用的技术,可分为包过滤防火墙代理防火墙

包过滤防火墙

包过滤是所有防火墙最核心的功能,包过滤规则一般存放于路由器的 ACL 中

包过滤防火墙工作在网络层,因此处理数据包的速度快、效率高

ACL(Access Control List,访问控制列表)

ACL 使用包过滤技术,在路由器上读取传输层至网络层的数据包中的信息,如源地址、目的地址、源端口、目的端口等,根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的

代理防火墙

代理服务器能在应用层实现防火墙功能,针对每一个应用都有一个特定的程序,通过代理可以实现比包过滤更严格的安全策略

代理服务器是基于软件的,对整个 IP 包的数据进行扫描,不允许直接通过防火墙,安全性更高

Webshell

Webshell 是黑客经常使用的一种恶意脚本,其目的是获得对服务器的执行操作权限,如执行系统命令、窃取用户数据、删除 web 页面、修改主页等

黑客通常利用常见的漏洞,如 SQL 注入、RFI(远程文件包含)、FTP、XSS(跨站脚本攻击) 等方式作为攻击手段,最终控制网站服务器

加密算法

散列算法(哈希算法)

散列算法最大的特点是不可逆,常见的有 MD5、SHA 系列

散列算法常用于密码加密,通过比较两个加密后的字符串是否一样来确认身份

注意,不可逆不代表不可破解,网上很多自称可以破解 MD5 密码的网站,其原理就是有一个巨大的资源库,存放了许多字符串及对应 MD5 加密后的字符串,通过输入的 MD5 加密串来进行比较。如果密码复杂度低,则很大概率会被破解

MD5

MD5(MD5 Message-Digest Algorithm,消息摘要算法)是一种被广泛使用的密码散列算法,可以产生一个 128 bit(16 字节)的散列值(Hash Value),通常用十六进制表示为 32 个字符

  • 无论输入的数据长度是多少,计算出来的 MD5 值长度相同
  • 出现 MD5 值相同的原数据的概率很低

算法大致步骤:

  1. 填充

    要求填充后的数据长度对 512 取余为 448,后接 64 bit 的原始信息长度

    注意,若对 512 取余刚好是 448,仍要填充,填充长度为 512 bit

  2. 分组

    每 512 bit 为一组,每组再细分为 16 个小分组,小分组长度 32 bit

  3. 位运算

    对每个分组进行位运算,最终获得 128 bit 的 MD5 结果

SHA1

SHA(Secure Hash Algorithm,安全散列算法)是一个密码散列算法家族,SHA1 是其中一种

SHA1 与 MD5 一样,也是消息摘要算法,但是 SHA1 安全性更强,会产生一个 160 bit 的消息摘要

HMAC

HMAC(Hash-based Message Authentication Code,哈希运算消息认证码)基于哈希算法(MD5、SHA1等),输入一个密钥(key)和一个消息,输出一段消息摘要

HMAC 发送方和接收方基于 key 进行计算,而没有 key 的第三方,则无法计算出正确的散列值,可防止数据被篡改

对称加密

一种早期的加密算法,在对称加密过程中,使用的密钥只有一份,发送方和接收方使用相同的密钥进行加密和解密,要求双方都要知道该密钥

image-20230224171651767

加密:

发送方将明文(原始数据) 和加密密钥一起经过加密,生成复杂的密文进行发送

解密:

接收方收到密文后,若想读取原数据,则需要使用加密使用的密钥相同算法的逆算法对密文进行解密

DES

DES(Data Encryption Standard,数据加密标准)是一种比较古老的对称加密算法,密钥长度 56 bit

DES 是一种分组加密算法,又称为块加密算法,以 64 bit 为一组对数据进行加密

3DES

3DES (Triple DES)是 DES 向 AES 过渡的算法,使用 3 份 56 bit 的密钥对数据进行三次加密,安全性更高

AES

AES(Advanced Encryption Standard,高级加密标准)密钥长度默认 128 bit,可选 192 bit、256 bit

AES 本身就是为了取代 DES,具有更好的安全性和加密速度

AES 也是一种分组加密算法,以 128 bit 为一组对数据进行加密,不足 128 bit 时会进行填充

非对称加密

与对称加密相比,非对称加密需要两份密钥,一个公钥(public key)和一个私钥(private key),使用不同的密钥进行加密和解密

image-20230224174347884

  • 若使用公钥加密,则只能使用对应私钥进行解密
  • 若使用私钥加密,则只能使用对应公钥进行解密
  • 公钥和私钥的概念只是相对的,本质上就是一对密钥

例子:

A 生成一对密钥,把其中一份作为公钥对所有人公开

B 得知该公钥,使用该公钥加密数据后,发送给 A

A 使用自己保存的另一个密钥(私钥)进行解密

RSA

RSA 是由 Ron Rivest、Adi Shamir、Leonard Adleman 三个提出者的姓氏开头字母拼接而成

RSA 是当前影响力最广的非对称加密算法,公钥可以公开,私钥自己保存

其原理是两个大素数相乘简单,对其乘积进行分解困难

由此可以将其乘积 N 作为选取密钥的基础,具体公钥私钥的选取比较复杂,略

编码算法

严格来说,编码算法不属于加密算法,常见的有 Base64、HEX、URL 编码

Base64

Base64 最初是为了解决邮件中不能传文件和图片问题而使用的,将无法阅读的二进制码转化成字符形式

原理是将 3 个 8 bit 转化为 4 个 6 bit,然后在 6 bit 前面补两个 0,变成 8 bit 一字节的形式

最后如果剩下不足 3 个 8 bit,则用 0 填充,输出 =,所以编码结果的后门可能会出现一至二个 =

URL 编码

URL 一般只允许英文、数字、某些符号,而对于特殊字符、中文等不允许使用,因此若要在 URL 中加入中文,需要进行编码

原理是在十六进制前面加上 % 表示,比如对于一些特殊字符是 %xx,对于中文是 %xx%xx%xx,其中 xx 由十六进制编码决定

中间人攻击

img

中间人攻击(Man-in-the-Middle Attack,MITM)是一种窃听攻击,在这种攻击中,攻击者阻碍了发送方和接收方之间的通信和数据传输,试图拦截、窃取、修改数据,并向任何一方发送恶意链接

IP 欺骗

攻击者通过伪造 IP 地址,发送虚假 IP 源地址的数据包,冒充某台主机执行恶意操作,且通常难以被检测到

IP 欺骗 DDoS 攻击

IP 欺骗包括三种常见形式:

  • 分布式拒绝服务 (DDoS) 攻击

    在 DDoS 攻击中,黑客使用带有欺骗性 IP 地址数据包攻击目标服务器,这使他们能够在隐藏身份的同时使服务器崩溃

  • 隐藏僵尸网络设备

    IP 欺骗可用来通过僵尸网络获取对计算机的访问权限,每台受害者计算机运行一个专用机器人,该机器人代表攻击者执行恶意活动

    IP 欺骗允许攻击者掩蔽僵尸网络,因为网络中的每个机器人都有一个欺骗 IP 地址,这使得恶意行为难以被追踪

  • 中间人攻击

    IP 欺骗还可以通过中间人攻击来截取两台计算机之间的通信数据,从而窃取或修改数据、将用户引导至非法网站等

DNS 欺骗

通过改变 DNS 服务器的 IP 地址来尝试启动网络钓鱼攻击或注入恶意软件

攻击者劫持浏览器对某个网站的请求,将其重定向至另一个网站,该网站模仿原网站,从而盗取用户的敏感信息

ARP 欺骗

攻击者发送欺诈性的 ARP (地址解析协议)信息,欺骗其他设备,使其认为已经与正常用户进行通信,从而窃取、拦截数据

HTTPS 欺骗

在 HTTS 欺骗中,攻击者欺骗浏览器,使其认为非法网站是合法的,改变基于 HTTPS 的地址请求,将其重定向到恶意网站

SSL 劫持

若访问一个 URL 以 HTTP 开头的不安全网站,有 SSL 安全的浏览器会自动将其重定向到 HTTPS 安全版本的 URL

在 SSL 劫持中,攻击者拦截改变重定向路线,窃取敏感数据

Web 漏洞

在挖漏洞前,做好信息收集

在分析漏洞时,首先要考虑的是漏洞危害和等级,这点非常重要

分类

Snipaste_2023-02-26_16-42-51

  • 上图右侧是常见漏洞,在比赛、实战等各种场景均有出现

  • 上图左侧相对出现较少,但不代表不重要

平时学习的重点内容:

  • CTF

    SQL 注入、文件上传、反序列化(重点的重点)、代码执行

  • SRC(Security Response Center,安全应急响应中心

    均会出现,其中以逻辑安全居多

  • 红蓝对抗

    高危漏洞较多,与实战接近,涉及权限安全

高危漏洞

SQL 注入、文件上传、文件包含、代码执行、未授权访问、命令执行

此类漏洞涉及:权限获取、敏感数据获取(泄露)

中危漏洞

反序列化、逻辑安全

相对高危漏洞有一部分影响

低危漏洞

XSS 跨站、目录遍历、文件读取

小部分信息泄露(网站源码、部分用户信息泄露)

SQL 注入

两个条件,缺一不可:

  • 可控变量,如 SELECT * FROM users WHERE id=$id LIMIT 0,1 的变量 id
  • 代入数据库查询
// 以下均可能存在注入点
www.xxx.com/index.php?id=666
www.xxx.com/?id=666
www.xxx.com/index.php?id=666&x=777

www.xxx.com/index.php // 可能存在 POST 注入,参数在请求体
    
// 另外,第 1、2 两条是等效的,index.php 可以省略
// 假设仅参数 x 有注入点
www.xxx.com/news.php?y=666 and 1=1&x=777
www.xxx.com/news.php?y=666&x=777 and 1=1
www.xxx.com/news.php?y=666 and 1=1&x=777 and 1=1
www.xxx.com/news.php?xxx=666&xx=777 and 1=1
    
// 第 2、3 两条注入测试正确

分类

  • 盲注
    • 布尔注入:只能从应用返回数据中判断 SQL 语句执行后的布尔值
    • 时间注入:没有明确的回显,只能用特定的时间函数来判断
  • 报错注入:应用会显示全部或部分报错信息
  • 堆叠注入:有的应用加入 ; 后,可执行多条 SQL 语句

如何判断数据库类型?

根据前后端

  • asp:SQL Server,Access
  • .net:SQL Server
  • php:MySQL,PostgreSQL
  • java:Oracle,MySQL

根据端口

  • Oracle:默认端口1521
  • SQL Server:默认端口1433
  • MySQL:默认端口3306

根据特有函数

len 和 length
  • len():SQL Server 、MySQL 以及 db2 返回长度的函数
  • length():Oracle 和 INFORMIX 返回长度的函数
version 和 @@version
  • version():MySQL 查询版本信息的函数
  • @@version:MySQL 和 SQL Serve r查询版本信息的函数
substr 和 substring
  • MySQL 两个函数都可以使用
  • Oracle 只可调用substr
  • SQL Server 只可调用substring

根据字符串处理方式

MySQL
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab' 
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab' 
Oracle
http://127.0.0.1/test.php?id=1 and 'a'||'b'='ab' 
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab' 
SQL Server
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab' 

根据数据库特有的表

MySQL
http://127.0.0.1/test.php?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1
Oracle
http://127.0.0.1/test.php?id=1 and (select count(*) from sys.user_tables)>0 and 1=1
SQL Server
http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1

如何判断注入点?

方法一定要灵活,不要局限于老套路

老办法

and 1=1 页面正常
and 1=2 页面错误
可能存在注入点

如
SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 正常
SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 错误
由此可判断存在逻辑运算,即存在注入点
注意此处是 and 不是 or

特殊情况:

如果测试过程中出现 404 错误,并跳回主页,说明该网站对输入进行了安全检测,一般就没有注入点

判断注入点的一般过程

  • 猜列数(字段数),用 order by 测试,order by 1order by 2order by 3 直到报错,最后的数量即是列数

  • 报错后,进行猜解准备:http://1.1.1.1:8848/index.php?id=1 union select 1,2,3

    目的是看哪些列会进行显示

    image-20230226232549004

    这里表示 2,3 是显示位,可以显示数据,由此可将 2,3 替换成某些函数

  • 下一步,信息收集

    数据库版本 version()

    数据库名 database()

    数据库用户 user()

    操作系统 @@version_compile_os

    image-20230226232841561

    在 MySQL 5.0 以上版本中,存在一个 information_schema 数据库,它存储着所有数据库名、表名、列名

    • 高版本可以通过它来获取指定数据库下的表名或列名信息

    • 低版本则只能暴力查询或结合读取查询

  • 查询数据库名称和数据库版本

    http://219.153.49.228:48354/new_list.php?id=-1 union select 1,database(),version(),4
  • 查询数据库用户和操作系统

    http://219.153.49.228:48354/new_list.php?id=-1 union select 1,user(),@@version_compile_os,4
  • 查询指定数据库名 mozhe_Discuz_StormGroup 下的表名信息

    http://219.153.49.228:48354/new_list.php?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=‘mozhe_Discuz_StormGroup’
  • 查询指定表名 StormGroup_member 下的列名信息

    http://219.153.49.228:48354/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=‘StormGroup_member’
  • 查询账号密码

    http://219.153.49.228:48354/new_list.php?id=-1 union select 1,name,password,4 StormGroup_member

root 型注入点

root 用户与普通用户不同,它具有数据库最高权限,可以实现同一 MySQL 服务的跨数据库攻击

换句话说,用户权限的高低,决定了从数据库中获取数据的多少

如何防御 SQL 注入?

加入转义字符

SELECT * FROM Users where username="admin\" OR \"\"!=\"" AND password="xxxx"

\" 引号经过转义后,只会被当成单纯的一个字符,而不是句子结构的一部分

扩展:

SQL 语句中,AND 运算符的优先级高于 OR 运算符

所以执行顺序是

xxxx OR (xxxx AND xxxx)

预编译 SQL

在 Java 中,预编译 SQL 通过 PreparedStatement 和占位符 ? 来实现

使用预编译后的 SQL 语句,输入的数据不会再次编译,只会当成参数来处理,比如 AND OR 就不会被处理

XSS(Cross Site Scripting,跨站脚本攻击)

目前,网页渲染的方式无非两种:

  • 前端渲染,即客户端渲染,在前端通过 JavaScript 脚本操作 DOM 节点,动态调整 HTML 网页内容
  • 后端渲染,即服务端渲染,在后端渲染好 HTML 网页后,返回给浏览器进行显示

无论采用哪种方式,本质上都是将数据拼接在 HTML 代码中,渲染后呈现给用户

XSS 与 SQL 注入都是典型的代码注入攻击,SQL 注入是将恶意代码插入 SQL 语句中,XSS 则是将恶意代码插入 HTML 代码中

XSS 有三大类:存储型 XSS、反射型 XSS、DOM 型 XSS

存储型、反射型属于后端漏洞,DOM 型属于前端漏洞

存储型和反射型的区别:存储型 XSS 的恶意代码存储在目标数据库中,反射型 XSS 的恶意代码是存储在 URL 中

存储型 XSS

  1. 攻击者将恶意代码提交到目标网站数据库中
  2. 用户打开网站时,服务器将恶意代码从数据库中取出,拼接到 HTML 代码中,并返回给浏览器
  3. 浏览器接收 HTML 网页后解析执行,其中的恶意代码也随之执行
  4. 攻击者窃取用户数据

存储型 XSS 常见于具有保存用户数据功能的网页,如论坛发帖、商品评论、用户私信等

反射型 XSS

  1. 攻击者构造恶意 URL
  2. 用户打开恶意 URL,网站服务器将恶意代码从 URL 中取出,拼接在 HTML 代码中,并返回给浏览器
  3. 浏览器接收 HTML 代码后解析执行,其中的恶意代码也随之执行
  4. 攻击者窃取用户数据

反射型 XSS 常见于网页搜索、链接跳转等

由于需要用户主动打开 URL,攻击者会用多种手段诱导用户点击

POST 提交也可以触发反射型 XSS,但条件比较苛刻(需要构造表单),所以比较少见

DOM 型 XSS

  1. 攻击者构造恶意 URL
  2. 用户打开恶意 URL
  3. 浏览器接收对应 URL 响应后解析执行,前端 JavaScript 取出恶意代码并执行
  4. 攻击者窃取用户数据

DOM 型 XSS 与前两者类似,只不过 DOM 型是由浏览器取出恶意代码,属于前端 JavaScript 自身的漏洞

如何防御 XSS?

防御存储型、反射型

防御这两种 XSS,有两种办法:

  • 改为纯前端渲染,当然接下来要考虑防御 DOM 型
  • 转义 HTML 代码,此时要使用业内成熟的转义库

防御 DOM 型

DOM 型实际上是前端代码不够严谨,把用户输入当作代码执行

核心思想是避免在代码中拼接不可信数据,比如将 innerHTML() 改为 innerText()

文件上传

网站对文件的上传没有做严格的过滤,导致攻击者可以上传一些恶意文件,从而获取网站权限、窃取用户数据

恶意文件可以是木马、脚本、病毒等

注意区别后台权限、网站权限

文件类型绕过

网站仅在前端检测上传文件的类型,这样可以通过抓包,然后修改请求内容进行绕过

文件头绕过

网站使用文件头字节来检测文件类型,这样可以在文件头加入对应的字节来绕过

image-20230302170001705

文件后缀绕过

在 Windows 系统中,上传 index.php. 会被重命名为 .

也可以尝试 index.php%20 index.php:1.jpg

如何查找和判断文件上传漏洞?

黑盒测试

黑盒测试,即不知道网站源码的情况下进行漏洞分析

使用扫描工具,扫描网站,找到上传入口

白盒测试

直接分析源代码

CSRF(Cross Site Request Forgery,跨站请求伪造)

HTTP 协议是无状态的,需要通过 Cookie 等手段将用户信息保存在浏览器中,当发起 HTTP 请求后,浏览器自动携带 Cookie 进行认证

利用这一点,攻击者可以诱导用户在 Cookie 已认证的情况下,执行恶意操作

比如,用户已登录一个网上银行账户,攻击者诱导用户点击一张图片,其中含有转账 URL,一旦用户点击,就会在不知情的情况下向攻击者转账,触发 CSRF 攻击

CSRF 攻击可以分为 GET 型和 POST 型

上述例子中,转账是 GET 请求发出的,但是 POST 请求也未必安全

虽然 POST 请求无法通过链接触发,但可以通过表单提交触发

如何防御 CSRF 攻击?

CSRF 攻击的一个特点是,虽然攻击者可以冒充用户携带 Cookie 进行认证,但是无法知道具体的 Cookie 内容

那么就可以要求用户每次提交请求都要携带一个特殊的 Token,服务器通过校验 Token 来区分正常的请求和 CSRF 攻击

令牌校验

每次用户打开网页,服务器给用户发送一个 Token,且该 Token 经过了加密,并保存在服务器 Session 中

对于 GET 请求,浏览器将 Token 作为参数附加在 URL 链接之后

对于 POST 请求,浏览器将 Token 附加在表单参数中

验证码校验

加入手机验证码校验,每次提交请求,就要求用户提供手机验证码,这样可以彻底防止 CSRF 攻击