本想用appscan掃掃本站的應用,沒想到就碰到問題了
在使用appscan掃描測試web應用時,出現如下圖問題
圖片.png
隨即懷疑難道錄制腳本有問題?不應該啊也跑了一段時間了,我先是手動訪問了應用發現訪問不了,應用掛了,自然而然的appscan連不上應用,無法測試了
為什么會掛,完全不知道什么情況,看web應用的日志,到這里結束了,我一時間也不知道什么情況引起的
圖片.png
按我接下來的思路,我先是重啟一遍web應用,然后再繼續用appscan跑起來,果然不到一分鐘應用又掛了,我肯定那個地方一定有問題,而且這種問題是大問題,必須解決,不然appscan掃描測試下,應用就掛了,那得多么脆弱。既然重啟web應用沒有效果,那肯定是appscan掃描測試時發送了什么請求導致的,web應用的日志也報錯提示不正確的字符串。
但是我不知道是那個請求啊,發送了什么字符串導致的。所以我不知道在那個地方加個日志打印出來。換個思路,在appscan里面去找找看,但是找了一圈沒找到有用的信息
只能用wireshark抓包了
但是抓不到數據,網上查了下,抓本地的數據包需要安裝nmap工具,
圖片.png
安裝nmap(下載地址:https://nmap.org/download.html) 這個后會多出Npcap Loop back Adapter 這個選項,這樣wireshark就可以抓本地數據包,
圖片.png
重啟web應用,重新用appscan掃描測試,應用也掛了,可以看到請求中POST http://192.168.1.20:8080/collection 包含特殊字符,但是我們并不能確定這就是罪魁禍首,我們需要進一步驗證
圖片.png
我們需要把請求單獨POST出去試試,type參數設置了亂碼內容,發送后可以看到沒有響應,服務器也報錯了,再手動打開瀏覽器訪問
圖片.png
圖片.png
圖片.png
問題已經重現了那接下來看看代碼了
func (self *CollecController) Collec() {
t, typeid := self.Input().Get("type"), self.Input().Get("typeid")
tpid, _ := strconv.Atoi(typeid)
uid := self.GetSession("uid")
if uid == nil {
msg := map[string]interface{}{"code": 1, "msg": "need login"}
self.Data["json"] = &msg
self.ServeJSON()
}
if models.IsCollecExit(t, tpid, &models.User{Id: uid.(int)}) {
//收藏存在就刪除,collection表做了多字段關聯唯一鍵
models.DelCollection(t, tpid, &models.User{Id: uid.(int)})
msg := map[string]interface{}{"code": 0, "msg": "取消收藏成功"}
self.Data["json"] = &msg
self.ServeJSON()
} else {
//不存在就添加
collec := models.Collection{Type: t, TypeId: tpid, Uid: &models.User{Id: uid.(int)}}
models.AddCollection(&collec)
fmt.Println(2)
msg := map[string]interface{}{"code": 0, "msg": "success"}
self.Data["json"] = &msg
self.ServeJSON()
}
}
//收藏表結構
type Collection struct {
Id int
Type string //收藏類型 tid:帖子收藏
TypeId int
Uid *User `orm:"rel(fk)"`
}
客戶端發送的 type參數為不正確的字符串,代碼處理邏輯自然得不到正確的collection結構體,得不到正確的結構體,添加收藏函數就執行失敗,而恰恰這個函數失敗會執行log.Fatalln,這些這個log.Fatalln會有什么后果呢?
//添加收藏
func AddCollection(collection *Collection) {
o := orm.NewOrm()
_, err := o.Insert(collection)
if err != nil {
log.Fatalln(err.Error())
}
}
log.Fatalln 說明,會執行os.Exit退出,這才是真正的罪魁禍首
圖片.png