Skip to content

Commit 1ced507

Browse files
committed
fix:修复导出excel DDE漏洞 --bug=152262094 【CMDB】导出excel表格DDE漏洞
1 parent cc45f93 commit 1ced507

File tree

3 files changed

+109
-6
lines changed

3 files changed

+109
-6
lines changed

pkg/excel/style.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ type Style struct {
2525
Fill *Fill
2626
Border []Border
2727
Font *Font
28+
NumFmt int
2829
}
2930

3031
func (s *Style) convert() (*excelize.Style, error) {
3132
style := new(excelize.Style)
33+
style.NumFmt = s.NumFmt
3234
if s.Fill != nil {
3335
fill, err := s.Fill.convert()
3436
if err != nil {

src/web_server/service/excel/operator/inst/exporter/inst_func.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,39 @@ var handleSpecialInstFieldFuncMap = make(map[string]handleInstFieldFunc)
3636
func init() {
3737
handleInstFieldFuncMap[common.FieldTypeInt] = getHandleIntFieldFunc()
3838
handleInstFieldFuncMap[common.FieldTypeFloat] = getHandleFloatFieldFunc()
39+
handleInstFieldFuncMap[common.FieldTypeSingleChar] = getHandleCharFieldFunc()
40+
handleInstFieldFuncMap[common.FieldTypeLongChar] = getHandleCharFieldFunc()
3941
handleInstFieldFuncMap[common.FieldTypeEnum] = getHandleEnumFieldFunc()
4042
handleInstFieldFuncMap[common.FieldTypeEnumMulti] = getHandleEnumMultiFieldFunc()
4143
handleInstFieldFuncMap[common.FieldTypeBool] = getHandleBoolFieldFunc()
4244
handleInstFieldFuncMap[common.FieldTypeInnerTable] = getHandleTableFieldFunc()
4345

4446
handleSpecialInstFieldFuncMap[common.BKCloudIDField] = getHandleInstCloudAreaFunc()
4547
}
48+
func getHandleCharFieldFunc() handleInstFieldFunc {
49+
return func(e *Exporter, property *core.ColProp, val interface{}) ([][]excel.Cell, error) {
50+
if val == nil {
51+
return [][]excel.Cell{getRowWithOneCell()}, nil
52+
}
53+
54+
strVal := util.GetStrByInterface(val)
55+
strVal = handleDDE(strVal)
56+
handleFunc := getDefaultHandleFieldFunc()
57+
return handleFunc(e, property, strVal)
58+
}
59+
}
60+
61+
// handleDDE Add a prefix of ' to the characters '=', '+', '-', '@' to disrupt the Excel DDE formula
62+
func handleDDE(str string) string {
63+
prefix := strings.TrimSpace(str)
64+
if len(prefix) > 0 {
65+
switch prefix[0] {
66+
case '=', '+', '-', '@':
67+
prefix = `'` + prefix
68+
}
69+
}
70+
return prefix
71+
}
4672

4773
func getHandleInstFieldFunc(property *core.ColProp) handleInstFieldFunc {
4874
handleFunc, isSpecial := handleSpecialInstFieldFuncMap[property.ID]
@@ -231,13 +257,13 @@ func getHandleTableFieldFunc() handleInstFieldFunc {
231257

232258
func getDefaultHandleFieldFunc() handleInstFieldFunc {
233259
return func(e *Exporter, property *core.ColProp, val interface{}) ([][]excel.Cell, error) {
234-
var styleID int
260+
style := normalField
235261
if property.NotEditable {
236-
var err error
237-
styleID, err = e.styleCreator.getStyle(noEditField)
238-
if err != nil {
239-
return nil, err
240-
}
262+
style = noEditField
263+
}
264+
styleID, err := e.styleCreator.getPropertyStyle(style, property.PropertyType)
265+
if err != nil {
266+
return nil, err
241267
}
242268

243269
result := make([][]excel.Cell, singleCellLen)

src/web_server/service/excel/operator/inst/exporter/style.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package exporter
1818

1919
import (
2020
"configcenter/pkg/excel"
21+
"configcenter/src/common"
2122
)
2223

2324
type styleType string
@@ -37,6 +38,8 @@ const (
3738
noEditField styleType = "noEditField"
3839
// example 例子数据的单元格类型
3940
example styleType = "example"
41+
// normalField 普通数据单元格类型
42+
normalField styleType = "normal"
4043

4144
requiredFieldColor = "#FF0000"
4245
noEditHeaderColor = "fabf8f"
@@ -52,6 +55,30 @@ var generalBorder = []excel.Border{
5255
{Type: excel.Left, Color: borderColor, Style: 1}, {Type: excel.Right, Color: borderColor, Style: 1},
5356
{Type: excel.Top, Color: borderColor, Style: 1}, {Type: excel.Bottom, Color: borderColor, Style: 1},
5457
}
58+
var styleTypeMap = map[styleType]excel.Style{
59+
requiredField: {Fill: &excel.Fill{Type: excel.Pattern, Color: []string{noEditHeaderColor}, Pattern: 1},
60+
Border: generalBorder},
61+
62+
noEditHeader: {Fill: &excel.Fill{Type: excel.Pattern, Color: []string{noEditFieldColor}, Pattern: 1},
63+
Border: generalBorder},
64+
65+
noEditField: {Fill: &excel.Fill{Type: excel.Pattern, Color: []string{firstRowColor}, Pattern: 1},
66+
Border: generalBorder},
67+
68+
firstRow: {Fill: &excel.Fill{Type: excel.Pattern, Color: []string{generalHeaderColor}, Pattern: 1},
69+
Border: generalBorder},
70+
71+
generalHeader: {Fill: &excel.Fill{Type: excel.Pattern, Color: []string{tableHeaderColor}, Pattern: 1},
72+
Border: generalBorder},
73+
74+
tableHeader: {Fill: &excel.Fill{Type: excel.Pattern, Color: []string{exampleColor}, Pattern: 1},
75+
Border: generalBorder},
76+
77+
example: {Fill: &excel.Fill{Type: excel.Pattern, Color: []string{firstRowColor}, Pattern: 1},
78+
Border: generalBorder, Font: &excel.Font{Color: requiredFieldColor}},
79+
80+
normalField: {Fill: &excel.Fill{Type: excel.Pattern, Pattern: 1}, Border: generalBorder},
81+
}
5582

5683
var createStyleFuncMap = make(map[styleType]createStyleFunc)
5784

@@ -67,6 +94,35 @@ func init() {
6794

6895
type createStyleFunc func(s *styleCreator) (int, error)
6996

97+
// handlePropertyTypeNumFmt propType->excel code
98+
func handlePropertyTypeNumFmt(propType string) int {
99+
switch propType {
100+
case common.FieldTypeInt:
101+
return 1
102+
case common.FieldTypeFloat:
103+
return 2
104+
case common.FieldTypeLongChar, common.FieldTypeSingleChar:
105+
return 49
106+
case common.FieldTypeInnerTable,
107+
common.FieldTypeEnum,
108+
common.FieldTypeEnumMulti,
109+
common.FieldTypeBool:
110+
return 0
111+
}
112+
return 0
113+
}
114+
115+
func getDataStyleFunc(style styleType, property string) createStyleFunc {
116+
return func(s *styleCreator) (int, error) {
117+
style := styleTypeMap[style]
118+
style.NumFmt = handlePropertyTypeNumFmt(property)
119+
result, err := s.excel.NewStyle(&style)
120+
if err != nil {
121+
return 0, err
122+
}
123+
return result, nil
124+
}
125+
}
70126
func getNoEditHeaderStyleFunc() createStyleFunc {
71127
return func(s *styleCreator) (int, error) {
72128
style := &excel.Style{Fill: &excel.Fill{Type: "pattern", Color: []string{noEditHeaderColor}, Pattern: 1},
@@ -205,3 +261,22 @@ func (s *styleCreator) getStyle(style styleType) (int, error) {
205261

206262
return result, nil
207263
}
264+
265+
func (s *styleCreator) getPropertyStyle(style styleType, propertyType string) (int, error) {
266+
267+
if len(propertyType) == 0 {
268+
return s.getStyle(style)
269+
}
270+
271+
styleKey := styleType(string(style) + "_" + propertyType)
272+
result, ok := s.styleMap[styleKey]
273+
if !ok {
274+
var err error
275+
result, err = getDataStyleFunc(style, propertyType)(s)
276+
if err != nil {
277+
return 0, err
278+
}
279+
s.styleMap[styleKey] = result
280+
}
281+
return result, nil
282+
}

0 commit comments

Comments
 (0)