前言
作为一个拿着几 K 工资的安服仔,某一天上级给了一个网站需要挖挖洞。客户不愿意提供测试账号,通过其他位置拿到账号规则,然后进行爆破的时候把账号都锁了,因此还被投诉了。记录一下一天的漏洞挖掘过程,过程有点啰嗦。
干活
拿到目标,通常先扫一下端口
访问目录提示 404
三大搜索引擎和github都没找到相关网站的信息,这个时候只能先扫目录了。
发现net版本的ueditor,还以为能shell了,访问发现报错了,问了一下大佬说可能需要登录。看到了网站的绝对路径,二话不说先写个低危报告。
访问wap目录,需要在微信打开:
在微信打开,提示要关注企业号,没找到企业号。
访问目录的时候有一个跳转过程,在还没跳转之前先暂停。发现使用了webpack.
F12
--> 源代码
发现可以看到 webpack:// ,可以直接在这看 JS ,也可以还原出来在本地看
webpack 还原代码
方法一:
使用谷歌插件可以直接下载代码:https://github.com/SunHuawei/SourceDetector
需要编译,我编译失败了
方法二:
# 安装reverse-sourcemap
npm install --global reverse-sourcemap
# 下载 *.js.map(右键查看源代码,找到js,在js后面加上.map)
curl -O https://127.0.0.1/*.js.map
# 使用reverse-sourcemap
reverse-sourcemap --output-dir ./test xxx.js.map
# 得到js
未授权访问
API 要未授权才能捡到洞,要验证感觉没什么戏了。
查看JS,URL,参数,请求方式 都写明了,跟着构造就对了。
发现这是通行码的二维码base64编码的图片,可以通过这个通行码到门岗处领取访客卡。
创建一个html,使用img标签成功得到二维码。
信息泄露
这是一个搜索用户的接口
成功获取到 3568 条员工信息
SQL注入
通过构造请求,发现 area 参数存在SQL注入
手工把几个参数都尝试一遍,没 waf 没什么难度。看长度证明漏洞
第二个注入
通过手工把上面的参数都测试一遍,一开始没发现什么。当在 ProcLnstID 使用运算符的时候发现漏洞
ProcLnstID=1/1 返回正常
ProcLnstID=1/0 返回错误
任意文件下载
发现文件上传的 JS
// 上传
const upload = function (file) {
let url = '/xxxxxxxxxx/loadFile'
let postData = new FormData() // 创建form对象
postData.append('file', file, file.name) // 通过append向form对象添加数据
let config = {
headers: { 'Content-Type': 'multipart/form-data' }
}
return ajax.post(url, postData, config)
}
构造请求,发现只能上传图片,又一次与getshell无缘。
burpsuite 右键 点击 change body encoding ,从post 转成 form-data ,在 Content-Dispostition: 加上 name="file" 就可以成功上传了
发现图片查看的 JS
一开始先测试一下 SSRF ,报错了。然后尝试读取文件,成功读取
总结
大概流程:拿到目标-->扫端口-->扫目录--> 发现webpack-->查看JS-->构造请求-->捡到漏洞