还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
93道网络安全面试题
内容实在太多,不一一截图了
黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
1️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-
一、SQL 注入(SQL Injection)
-
- 演示 SQL 注入
-
简单了解WEB项目
-
SQL 注入的原理(3个SQL语句)
-
从代码看 SQL 注入原理
-
何为预处理语句?
-
为什么预处理语句可以防止 SQL 注入?
-
SQL注入学校官网(过滤SQL关键字)
-
威力更强的SQL注入
-
后话
-
二、教你用 Python 写个 arpspoof
-
- arpspoof 是什么?
-
什么是 ARP 双向欺骗
-
了解 scapy 模块
-
了解 ARP 报文结构
-
使用 scapy 模块 查看 报文结构
-
- 代码编写
-
- 引入需要的模块
-
获取必要的参数(构造ARP)
-
进行双向欺骗
-
缓冲表修复
-
测试脚本
-
将脚本改的更通用
-
三、虚拟机配置中的常见问题
-
- 简单介绍桥接模式、NAT模式、主机模式
-
桥接模式网络不稳定,主机与虚拟机不处于同一个局域网下?
-
如果虚拟网络编辑器中没有 Vmnet0
-
后话
这个是我的实验汇报的笔记,这里还有实验课题: 网络信息安全实验 — 网络攻击技术实验
但是。。。实验汇报和实验过程关系不大,哈哈哈
这次的课题比较高大上,但是是面向比较基础的的同学;
我觉得不管水平如何,听完应该都是会有收获的。
==========================================================================================
SQL 注入攻击是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台SQL服务器上解析执行进行的攻击,它目前是黑客对数据库进行攻击的最常用的手段之一。
在本机上启动 SpringBoot 项目,
由于本机 IP 为:192.168.3.3
,项目端口设置为8989
,
故在虚拟机上输入下列网址可以访问该项目:
192.168.3.3:8989/ems/index
首先给大家演示一下 SQL 注入可以达到的效果。
以下是本次用到的简单 SQL 注入语句:
123 or ‘1’ = ‘1’
‘hello’ or ‘a’ = ‘a’
222 or true
这几次密码都是不一样的,并且与数据库中的存储的密码都不同,却可以登录成功,
我们把这种攻击称作 SQL注入。
想要知道 SQL 注入的原理,我们要简单了解一下 WEB 项目。
WEB 项目的结构是很复杂的,我们这里简单介绍一下我们需要了解的部分,
当用户在登陆界面输入用户名和密码以后,后台是如何判断登录成功或是登录失败?
- 其实就是将用户输入的用户名和密码作为参数,去数据库中查询对应的信息,如果输入的用户名和密码与数据库中的信息对的上,那么就会登录成功,否则就会登录失败。(简略版,实际要更复杂)
要说原理,还是从 mysql 的查询语句开始看比较容易理解。
首先,我们来看一个最简单的 SQL 语句。(配合 mysql 中的 ems 数据库演示)
SELECT * FROM t_user
WHERE username = ‘zhenyu’
AND password = ‘123456’;
以上这个是可以从数据库中查询到信息的,因为 WHERE
子句的条件成立。
好,我们再看一个 SQL 语句。
SELECT * FROM t_user
WHERE username = ‘zhenyu’
AND password = ‘111’;
这个 SQL 语句明显是得不到结果的,因为 WHERE
子句的条件不成立,
即数据库中没有 用户名为 zhenyu
,密码为 111
的数据。
那么有没有办法让 WHERE
子句的条件强行成立呢?
那自然是有的啦,请看下一条 SQL 语句:
SELECT * FROM t_user
WHERE username = ‘zhenyu’
AND password = ‘111’
OR ‘1’ = ‘1’;
没错,这就是最简单的 SQL 注入。
利用 123 or '1' = '1'
登录。
其实我们开启了 SpringBoot 的日志功能是可以看到执行的SQL语句的。
以下是 MyBatis 框架生成 有风险
的 SQL 语句:
select id, username, realname, password, sex
from t_user
where username=‘zhenyu’
and password=123 or ‘1’ = ‘1’
以下是 MyBatis 框架生成的 可以预防SQL注入的
的 SQL 语句:
select id, username, realname, password, sex
from t_user
username=?
and password=?
预防 SQL 注入的关键在于 预处理语句
,也就是代码中出现的这个 ?
,具体请看下面。
简单介绍一下,用于 Java程序 和 数据库 之间的数据传输的途径是 Statement
接口;
具体类的实现有 3 个:我们主要了解一下 Statement
和 PreparedStatement
,第三个不用管。
-
Statement
:用于对数据库进行通用访问,使用的是静态SQL -
PreparedStatement
:用于预编译模板SQL语句,在运行时接受 sql 输入参数 -
CallableStatement
对于 静态SQL,所有的 SQL 都是进行拼接,再看上面框架生成的有风险的 SQL:
select id, username, realname, password, sex
from t_user
where username=‘zhenyu’
and password=123 or ‘1’ = ‘1’
对于 预处理语句:在 SQL 模板中,使用 ?
作为占位符,再看上面的框架生成的安全的SQL:(将用户输入的内容变成了参数,使得 SQL 关键字 or
不生效了)
select id, username, realname, password, sex
from t_user
where username = ?
and password = ?
是因为它 把单引号'
转义了,在单引号前面加了一个斜杠,变成了 \'
,这样一来,就无法截断 SQL 语句,进而无法拼接 SQL 语句,基本上没有办法注入了。
这么说可能不够直观,让我们直接看SQL语句。就比如我们上面的例子中,
我们传入的用户名是:zhenyu
、密码是:123 or '1' = '1'
,
对于 静态SQL 来说,拼接成了:
select id, username, realname, password, sex
from t_user
where username=‘zhenyu’
and password=123 or ‘1’ = ‘1’
对于 预处理语句 来说,实际上变成了:
select id, username, realname, password, sex
from t_user
where username=‘zhenyu’
and password=‘123 or ‘1’ = ‘1’’
对学校官网使用 123 or '1' = '1'
,看看是什么效果呢?
状态码简介:
-
200 表示可以正常访问
-
403 表示 禁止访问(没有权限)
-
404 表示找不到页面
-
…
为什么会这样呢?其实很简单,就是对用户输入的信息进行一个判断,如果包含某些 SQL 语句的关键字比如 OR
、AND
等,那么就认为该用户有非法操作。(这也是预防SQL注入的方法一种,但更推荐直接使用预处理语句,也可以将两者结合使用)
一般判断输入是否合法都会使用 正则表达式 ,这是为了防止误判,比如某个人的密码为 HUORE
,如果只是普通的字符串匹配的话,匹配到OR
便会认为这个密码非法。
但是我这里为了省事,就用字符串匹配的方式写的代码。
String ban[] = {“or”, “‘or’”, “OR”,“‘OR’”, “drop”, “‘drop’”, “DROP”, “‘DROP’”};
for (String b : ban) {
if (password.contains(b)) {
return “/ems/forbid”; // 禁止页面
}
}
你以为 SQL 注入的危害就那么一点点吗?我们来看一个稍微严重一点的。
123; drop table t_user;
实际生成的 SQL 语句:
select id, username, realname, password, sex
from t_user
where username=‘zhenyu’
and password=123;
drop table t_user;
看到效果了吗,现在是不是觉得 SQL 注入比想象中的要恐怖呢?
SQL 备份:
CREATE TABLE t_user
(
id
varchar(40) NOT NULL,
username
varchar(40) DEFAULT NULL,
realname
varchar(40) DEFAULT NULL,
password
varchar(40) DEFAULT NULL,
sex
varchar(8) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO t_user
VALUES (‘1’, ‘zhenyu’, ‘陆振宇’, ‘123456’, ‘男’);
此时,相信大家对 SQL 注入的原理有个初步的了解了,当然这只是最简单的一种,
几乎没有任何实用性,因为现在的网站一般都会使用 预处理语句 来预防 SQL 注入,
安全性更高的会还对用户的输入进行严格的过滤。
据我了解,只要安全意识足够,预处理语句 是 100% 可以防范住 SQL 注入的,(如果只是过滤关键字依旧有可能拼接成功,所以更建议使用 预处理语句)
而黑客找的漏洞其实找的就是 安全意识方面的漏洞,例如:
-
很多老旧项目,安全意识不足,不使用 预处理语句
-
没有在所有的 数据库操作中 使用预处理(有时候自己都没有意识到,因为这不会影响程序正常运行)
-
不排除 SQL 注入和其他攻击方式结合起来,黑客自己造出了 SQL 注入点
-
…
黑客的智慧是无穷无尽的,正如简单的 SQL 语句你我都知道,可又曾想到如此简单的语句隐藏着如此大的威胁与漏洞。
===========================================================================================
相信大家做过实验应该对 ARP欺骗 不陌生,arpspoof 是一款进行 arp欺骗 的工具。
这个我相信其他同学会讲的很清楚,所以我这里就简单介绍一下。
简单来说就是:有三个角色
-
目标主机(被攻击)
-
本机(攻击人)
-
网关(相当于看门的)
双向欺骗指的是:本机(攻击方) 同时欺骗 目标主机(被攻击方) 和 网关;
-
本机(攻击方)向网关发送数据报文,告诉网关:我是目标主机。
-
本机(攻击方)向目标主机发送数据报文,告诉目标主机:我是网关。
由此可以得出编程的大致思路:
- 学会 构造数据包 和 发送数据包:利用 python 的
scapy
模块
- 了解 ARP报文的结构,才知道要发送什么样的报文(例如我是目标主机、我是网关这种包要如何发出)
代码大体结构:
-
获取必要的参数(获取一些 构造 ARP 包必要的参数)
-
进行双向欺骗(构造 ARP 包并发送,开始进行欺骗)
-
缓冲表修复(攻击结束后,让目标重新可以上网)
scapy
是一个 python 模块,使用简单,作用是:构造各种数据包,
我们编写 arpspoof工具 就需要用它来 构造 ARP 数据包 并且发送。
报文结构是十分复杂的,但是对我们来说,要了解的其实没有那么多。
对我们来说只要关心
操作码
、源硬件地址
、源协议地址
、目标硬件地址
、目标协议地址
ARP 报文结构分为两部分:以太网链路层 (所有报文共有的)和 ARP 报文数据。
(下面的英文单词要了解一下,因为编程中变量命名的规范都是根据这个来的)
以太网链路层:
- 目标以太网地址:目标 MAC 地址。FF:FF:FF:FF:FF:FF (二进制全1)为广播地址。
dst
—— destination:目标
- 源以太网地址:发送方 MAC 地址。
src
—— source:源
- 帧类型:以太类型,ARP 为 0x0806。
type
:类型
ARP 报文数据:
- 硬件类型:如以太网(0x0001)、分组无线网。
hwtype
—— hardware + type
- 协议类型:如网际协议(IP)(0x0800)、IPv6(0x86DD)。
ptype
—— protocol + type
- 硬件地址长度:每种硬件地址的字节长度,一般为6(以太网)。
hwlen
—— hardware + type
- 协议地址长度:每种协议地址的字节长度,一般为4(IPv4)。
plen
—— protocol + length
上面的部分基本都是固定,下面才是是我们需要了解的。
- 操作码:操作码, 默认为 1,1表示请求,2表示应答(我们用的都是2)
op
—— operation
- 源硬件地址:n个字节,n由硬件地址长度得到,一般为发送方MAC地址。
hwsrc
—— hardware + source
- 源协议地址:m个字节,m由协议地址长度得到,一般为发送方IP地址。
psrc
—— protocol + source
- 目标硬件地址:n个字节,n由硬件地址长 度得到,一般为目标MAC地址。
hwdst
—— hardware + destination
- 目标协议地址:m个字节,m由协议地址长度得到,一般为目标IP地址。
pdst
—— protocol + destination
完整报文格式:对我们来说只需要关心 操作码
、源MAC地址
、源IP地址
、目标MAC地址
、目标IP地址
======================================================================================
from scapy.all import *
查看默认的以太网头部:
LS(Ether()) # 查看默认的以太网头部
dst : DestMACField = ‘ff:ff:ff:ff:ff:ff’ (None)
src : SourceMACField = ‘18:1d:ea:a1:f7:34’ (None)
type : XShortEnumField = 36864 (36864)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!