本指南提供了一系列寻找源代码的方法,包括使用代码托管平台的搜索功能、历史项目的访问、第三方下载平台的利用、以及直接获取源码的技巧。

目录


GitHub

在 GitHub 上,可以通过关键字和搜索语法快速找到相关代码。例如,使用以下搜索字符串可能会找到潜在的 Thinkphp5 上传代码:

/request()->file(.)/  /\$file->move(.)/ language:PHP path:/^application\/.*\/controller\//

Thinkphp5上传
详细内容可以查看官方的 Github搜索语法介绍

Gitee

Gitee 是一个国内流行的代码托管平台,与 GitHub 类似。可以通过以下示例来搜索特定的 PHP 项目:

Wayback Machine

对于已下架或停止维护的项目,互联网档案馆的 Wayback Machine 是一个有用的工具。可以查看项目的历史页面,寻找代码库链接或片段。

历史博物馆

网盘搜索

一些项目可能通过网盘分享,且链接会被爬虫抓取。使用网盘搜索引擎如 超能搜 可以找到源码。

利用漏洞信息

  • CVE:CVE (Common Vulnerabilities and Exposures) 报告中通常包含源代码链接。
  • Exploit-DB:该平台列出了已知漏洞的利用方式,部分漏洞会附带源代码。
  • 漏洞利用文章:一些漏洞复现文章可能包含代码链接,甚至可以请作者分享一份代码。

开发者论坛/社区/用户群

开源项目通常有活跃的社区支持:

  1. 开源社区:如 Stack Overflow、Reddit、GitHub Discussions,用户可以在这些社区中寻求帮助。
  2. 社交媒体和论坛:一些项目会在社交媒体或论坛中创建讨论组,通过加入可以与项目开发者交流获取源码。
  3. 产品试用:一些付费项目可能提供试用,通过试用可能获取源码。

第三方下载平台

名称 地址 备注
站长之家源码 https://down.chinaz.com
脚本之家源码 https://www.jb51.net/codes
源码屋 https://www.yuanmawu.net
果核网 https://www.guohew.cn

使用第三方平台下载存在风险,需注意安全防护,谨防木马。

官网和项目文档

很多项目的官网或文档页面会提供源代码的下载链接。开源软件官方网站通常有 “Application” 或 “Download” 按钮,直接指向代码库。

利用爬虫工具

如果项目官方网站提供了下载地址,可以编写爬虫自动抓取源代码地址。以下是一个获取所有版本代码的示例:

假设目标提供了链接 http://127.0.0.1/files/down/cms-1.4.2.zip

那么合理的猜测其他版本可能是0.0.0-1.4.2

import requests
import concurrent.futures

# 生成 URL 的函数
def generate_urls(base_url):
# 提取文件名部分
file_name = base_url.split('/')[-1]
base_url_prefix = base_url.replace(file_name, '')
base_url_suffix = file_name.split('-')[1] # 获取文件名的后缀部分

urls = []
# 对每个版本号的数字进行枚举,从 0 到 9
for major in range(2): # major: 0 和 1
for minor in range(10): # minor: 0 到 9
for patch in range(10): # patch: 0 到 9
# 正确拼接版本号
version = f"{major}.{minor}.{patch}"
url = f"{base_url_prefix}cms-{version}.zip" # 拼接完整 URL
urls.append(url)
return urls

# 检查 URL 是否有效并且包含 ZIP 文件的二进制标识符
def check_url(url):
try:
# 打印正在检查的 URL
print(f"Checking URL: {url}")
response = requests.get(url, timeout=5)
if response.status_code == 200:
# 检查返回的二进制内容是否包含 ZIP 文件标识符
if b'\x50\x4b\x03\x04' in response.content:
print(f"Found: {url}")
return url # 返回找到的 URL
else:
print(f"Not a valid ZIP file: {url}")
else:
print(f"HTTP error {response.status_code} for {url}")
except requests.RequestException as e:
# 如果请求出错,跳过该 URL
print(f"Error requesting {url}: {e}")

# 主函数
def main():
base_url = "http://127.0.0.1/files/down/cms-0.0.0.zip"

# 生成所有可能的 URL
urls = generate_urls(base_url)

found_urls = []
with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
results = executor.map(check_url, urls) # 使用线程池并行请求 URL

# 收集所有找到的有效 URL
for result in results:
if result:
found_urls.append(result)

# 输出成功抓取到的所有 URL
print("\nSuccessfully fetched URLs:")
for url in found_urls:
print(url)

if __name__ == "__main__":
main()

通过资产测绘探测路径

对于不常见的项目,可以通过探测相同资产的备份文件和源代码包获取源码。常用方法是:

提取指纹 -> 寻找资产 -> 探测路径

示例路径:http://example.com/example.com.zip

这是我通常用的Nuclei探测脚本:

id: bak-up-files

info:
name: Find Resource Code Of Target Template
author: Ethxu
description: |
wwwroot
{{FQDN}} # www.example.com
{{RDN}} # example.com
{{DN}} # example
{{TLD}} # com
{{SD}} # www
severity: low
tags: exposure,backup

requests:
- method: GET
path:
- "{{RootURL}}/{{DN}}.{{suffix}}"
- "{{RootURL}}/{{FQDN}}.{{suffix}}"
- "{{RootURL}}/{{TLD}}.{{suffix}}"
- "{{RootURL}}/{{SD}}.{{suffix}}"
- "{{RootURL}}/{{RDN}}.{{suffix}}"
- "{{RootURL}}/wwwroot.{{suffix}}"

payloads:
suffix:
- 'zip'
- 'rar'
- 'gz'
- 'tar.gz'
- '7z'
- 'bz2'
- 'tar.z'

max-size: 300
matchers-condition: and
matchers:
- type: binary
binary:
- "377ABCAF271C" # 7z
- "314159265359" # bz2
- "1f8b" # gz tar.gz
- "526172211A0700" # rar RAR archive version 1.50
- "526172211A070100" # rar RAR archive version 5.0
- "FD377A585A0000" # xz tar.xz
- "1F9D" # z tar.z
- "1FA0" # z tar.z
- "504B0304" # zip
condition: or
part: body

- type: status
status:
- 200