【个人用】信息安全面试资料整理
漏洞原理和常用工具
OWASP TOP 10
SQL 注入
原理
Web 应用程序对用户输入数据的合法性没有判断,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
利用
这里以一道 SQL 注入的 CTF 题目为例。
判断回显字段个数:
1' order by 4#
确定回显位置:
-1' union select 1, 2, 3, 4#
获取表名:
-1' union select 1, group_concat(table_name), 3, 4 from information_schema.tables where table_schema=database()#
查询表中字段名:
-1' union select 1, group_concat(column_name), 3, 4 from information_schema.columns where table_name='fl4g'#
查询字段内容:
-1' union select 1, skctf_flag, 3, 4 from fl4g#
绕过姿势
防范
- 在服务端正式处理之前,对提交数据的合法性进行检查
- 封装客户端提交信息
- 替换或删除敏感字符和字符串
- 屏蔽出错信息
XSS 跨站脚本攻击
原理
恶意攻击者往 Web 页面里插入恶意 JavaScript 代码,当用户浏览该页之时,嵌入其中 Web 里面的 JavaScript 代码会被执行,从而达到恶意攻击用户的目的
分类
防范
- 特殊字符进行HTML实体转码,如
''
、""
、<>
、\
、:
、#
、&
等; - 设置标签事件属性的黑白名单,过滤输入的特殊字符;
- 在服务器端设置 Cookie 的时候设置 HTTP-ONLY,防止用户通过 JS 获取 Cookie;
- 将不可信数据作为 URL 参数值时需要对参数进行 URL 编码。
CSRF 跨站请求伪造
原理
防范
- 尽量使用 POST,少用 GET;
- 将 Cookie 设置为 HTTP-ONLY;
- 在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务端进行 token 校验;
- 验证
HTTP Referer
字段。
SSRF 服务器端跨站请求伪造
原理
攻击者想要访问主机 B 上的服务,但是由于存在防火墙或者主机B是属于内网主机等原因导致攻击者无法直接访问主机 B。而服务器 A 存在 SSRF 漏洞,这时攻击者可以借助服务器 A 来发起 SSRF 攻击,通过服务器 A 向主机 B 发起请求,从而获取主机 B 的一些信息。
利用
- 内外网的端口和服务扫描;
- 攻击运行在内网或本地的应用程序;
- 对内网 Web 应用进行指纹识别,识别企业内部的资产信息;
- 攻击内网的 Web 应用,主要是使用 GET 参数就可以实现的攻击(比如 Struts2 漏洞利用,SQL 注入等);
- 利用
file:///
协议读取本地敏感数据文件等。
防范
- 过滤返回的信息,如果 Web 应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准;
- 统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态;
- 限制请求的端口;
- 禁止不常用的协议,仅仅允许 HTTP 和 HTTPS 请求。可以防止类似于
file:///
、gopher://
、ftp://
等引起的问题; - 使用 DNS 缓存或者 HOST 白名单的方式。
文件上传
原理
服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件,从而获取执行服务端命令的能力。
绕过姿势
防范
- 文件上传的目录设置为不可执行;
- 在判断文件类型时,可以结合使用 MIME Type、后缀检查等方式;
- 使用白名单;
- 使用随机数改写文件名和文件路径;
- 单独设置文件服务器的域名;
- 使用安全设备防御;
- 限制上传文件的大小。
DoS 和 DDoS 攻击
DoS:Deny of Service 拒绝服务攻击
DDoS:Distribute Deny of Service 分布式拒绝服务攻击
原理
首先攻击者向被攻击的服务器发送大量的虚假 IP 请求,被攻击者在收到请求后返回确认信息,等待攻击者进行确认,该过程需要 TCP 的三次握手,由于攻击者发送的请求信息是虚假的,所以服务器接收不到返回的确认信息,在一段时间内服务器会处与等待状态,而分配给这次请求的资源却被有被释放。当被攻击者等待一定的时间后,会因连接超时而断开,这时攻击者在次发送新的虚假信息请求,这样最终服务器资源被耗尽,直到瘫痪。
防范
- 在时间段内,限制 SYN 的半连接数(time_wait);
- 缩短 timeout 的超时时间,针对已经进行 SYN 半连接的过程;
- 针对不常用的服务或者端口进行关闭。
反序列化
原理
程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell 等一系列不可控的后果。
反序列化漏洞并不是 PHP 特有,也存在于 Java、Python 等语言之中,但其原理基本相通。
防范
- 不要把用户的输入或者是用户可控的参数直接放进反序列化的操作中去;
- 业务需要使用反序列化时,尽量避免反序列化数据可被用户控制,如无法避免建议尽量使用白名单校验的修复方式。
sqlmap
nmap
简单扫描
nmap 默认发送一个 ARP 的 PING 数据包,来探测目标主机 1-10000 范围内所开放的所有端口。
命令语法:
nmap <target ip address>
其中:target ip address 是扫描的目标主机的ip地址
例子:
nmap 173.22.90.10
扫描出开放的端口。
简单扫描,并对结果返回详细的描述输出
命令语法:
namp -vv <target ip address>
例子:
nmap -vv 173.22.90.10
自定义扫描
命令语法:
nmap -p(range) <target IP>
其中 range
为端口范围。
例子:扫描目标主机 20-120 范围内的端口
nmap -p20-120 173.22.90.10
指定端口扫描
命令语法:
nmap -p(port1,port2,...) <target IP>
格式与上面类似。
例子:扫描目标主机的 22 和 80 端口
nmap -p22,80 173.22.90.10
ping 扫描
利用类似 Windows / Linux 系统下的 ping 方式进行扫描。
命令语法:
nmap -sP <target ip>
例子:
nmap -sP 10.1.112.89
路由跟踪
追踪电脑所在地到目的地之间所经过的网络节点,以及通过各个节点所花费的时间。
命令语法:
nmap –traceroute <target IP>
例子:
namp –traceroute 8.8.8.8
网段扫描
扫描一个网段下的 IP。
命令语法:
nmap -sP <network address> </CIDR>
其中 </CIDR>
为子网掩码对应的前缀长度。
例子:
nmap -sP 10.1.1.0 /24
探测操作系统类型
命令语法:
nmap -O <target IP>
例子:
nmap -O 10.1.112.89
BurpSuite 的 Intruder 功能
该功能常用于爆破,有四种攻击模式:
应急响应
应急响应的流程
计算机网络及相关协议
OSI 七层模型和 TCP/IP 五层模型
ARP 协议
原理
ARP(Address Resolution Protocol)协议,即地址解析协议,其功能为将 IP 地址解析成 MAC 地址。
在 TCP/IP 模型中,ARP 协议属于网络层;在 OSI 模型中,ARP 协议属于数据链路层。
查看 ARP 缓存记录
使用 arp -a
命令可以查看本机的 ARP 缓存条目:
添加 ARP 缓存记录
使用 arp -a <IP address> <MAC address>
可以将 IP 地址对应的 MAC 地址添加到 ARP 缓存记录当中。
删除 ARP 缓存记录
使用 arp -d <IP address>
可以删除该 IP 地址对应的 MAC 地址。
如果想要清空全部的话,可以直接使用 arp -d
或者是 arp -d *
。
如何捕获 ARP 数据包
直接用 Wireshark 抓,等一会儿然后筛选一下就能看到 ARP 包:
UDP 协议
简介
UDP(User Datagram Protocol)协议,即用户数据报协议,提供不可靠的、面向报文的、无连接的传输服务。
如何捕获 UDP 数据包
在正常网络连接条件下,可以尝试登录 QQ,然后直接使用 Wireshark 抓包,然后筛选就能看到大量 UDP 数据包:
TCP 协议
简介
TCP(Transmission Control Protocol)协议,即传输控制协议,是一种面向连接的、可靠的、基于 IP 的传输层协议。
TCP 三次握手过程
第一次握手,建立连接时,客户端向服务器发送 SYN 报文(Seq = x,SYN = 1),并进入 SYN_SENT 状态,等待服务器确认。
第二次握手,实际上是分两部分来完成的,即 SYN + ACK(请求和确认)报文。
服务器收到了客户端的请求,向客户端回复一个确认信息(Ack = x + 1)。
服务器再向客户端发送一个 SYN 包(Seq = y)建立连接的请求,此时服务器进入 SYN_RECV 状态。
第三次握手,客户端收到服务器的回复(SYN + ACK 报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。