第九天笔记

发布时间:2026/7/29 0:41:08
第九天笔记 第一部分课堂笔记按授课顺序一、开篇文件上传的基础认知1.1 文件上传的第一件事确认路径上传文件后必须清楚知道文件被保存到了哪个具体路径。这是后续一切操作的先决条件。不管你用的是诸葛AI还是其他工具上传成功后第一件事就是确认文件的存放位置。1.2 上传文件的三大确认事项确认文件路径和名称是否正确——文件名有没有被系统自动修改路径对不对确认上传的文件是否能被正常访问——图片可能因为编码问题导致乱码无法显示测试上传功能是否可用——可以用一句话木马配合eval()函数来验证但注意需要先关闭杀毒软件的实时保护功能才能保存这类文件测试上传漏洞时要特别小心安全防护软件的拦截这种方法仅限合法授权范围内使用二、PHP 基础与一句话木马2.1 PHP 中的 system 函数PHP 中的system函数是用来执行系统命令的。不管是 Windows 还是 Linux只要是在命令行能执行的命令都能通过system函数来运行关键区分PHP 代码的执行 和 系统命令的执行这是两回事2.2 一句话木马的典型形式?php eval($_POST[cmd]);?利用方式通过给cmd参数赋值来执行任意 PHP 代码传参内容效果cmdphpinfo()显示 PHP 信息cmdsystem(dir)执行系统目录命令cmdsystem(whoami)查看当前用户打了个比方帮助理解缺少关键参数就像有钥匙但没带门禁卡无法快速获取系统权限。还特别指出符号用来抑制错误输出但有时候并不需要。2.3 PHP 语法的严格性反复强调分号必须准确无误多一个少一个都会直接报错。例子在文件上传环节系统限制只允许上传 jpg/png/gif 格式而 php 文件会被直接拦截。这引出了第一个关键话题——如何绕过这种限制。三、第一关前端 JS 校验绕过3.1 系统仅依赖前端 JS 校验文件类型指出这是一个关键安全漏洞系统仅依赖前端 JS 校验文件类型这种校验极不可靠。3.2 两种绕过方式直接禁用浏览器 JS 执行——前端校验立刻失效使用 Burp Suite 等工具拦截修改请求——在请求发送到服务器之前篡改数据3.3 核心结论仅靠前端校验等于没有校验。所有安全校验必须在服务端进行客户端的校验只是辅助绝不能作为唯一的安全防线。四、第二关文件后缀名修改绕过4.1 操作步骤如何修改文件后缀名绕过验证先用合法后缀骗过前端检查——比如把test.php改成test.png抓包后改回真实后缀——用 Burp Suite 拦截请求把.png改回.php确认文件上传路径——只有知道文件在哪才能执行后续攻击4.2 手法分类这种手法属于典型的双重文件扩展名绕过既要考虑前端验证又要处理服务端解析。调试细节代码中可能有语法错误比如缺少中括号如果已经上传成功可以直接修改服务器上的文件而不是重新抓包上传。修改位置3w 目录下的 upload 文件夹选择直接修改服务器文件可以提高效率五、关于请求方式GET vs POST 的坑5.1 连接方式错误导致的问题当前连接默认使用 POST 方式但实际需要的是 GET 方式。具体场景有些同学用 GET 请求在浏览器里直接访问木马文件能正常工作但通过一键连接工具却连不上。原因一键工具默认使用 POST 请求而木马文件配置的是 GET 方式解决方案修改配置文件把请求方式从 POST 改成 GET5.2 比喻就像寄信时你以为用的是平邮GET但系统自动给你选了挂号信POST虽然都能寄出但处理方式完全不同。核心原则保证访问文件时使用的请求方式GET/POST和配置文件里设置的一致。六、初始化与远程连接6.1 工具初始化流程远程连接工具的初始化步骤首次运行 exe 文件——选择正确的目录文件夹完成初始化右键添加数据——配置访问路径访问 PHP 文件——这是触发后续操作的关键完整访问路径由两部分组成upload 目录下的 test.php 文件名连接密码即传参的参数名比如password或cmd容易混淆的概念连接密码实际上就是后续传递参数的名称它就是要用来传参的那个变量名。整个过程初始化 → 设置访问路径 → 通过参数名传递指令6.2 成功连接后的操作成功连接后会出现一条连接记录右键点击就可以查看目标网站的文件目录通过虚拟终端直接操作对方主机Linux 系统执行 bash 命令Windows 系统执行 Windows 命令6.3 目录穿越漏洞严重的安全问题虽然只攻击了 “update” 这个网站但却能看到整个服务器的 C 盘、D 盘内容——这就是目录穿越漏洞。正常情况下用户权限应该只限制在自己的网站文件夹内但这里却暴露了整个服务器的文件系统。这是非常严重的安全隐患。七、PHP 代码执行的安全限制7.1 字符过滤机制思考题当上传的文件包含 “php” 字符就会被自动替换掉这时候如何绕过提示参考eval()函数——这个函数可以执行字符串形式的 PHP 代码。7.2 要点虽然直接访问 PHP 文件会被拦截但需要记住文件路径后续连接服务器时这个路径信息很重要两个方向的思路安全防护与绕过技巧八、靶场第二关Content-Type 校验8.1 什么是 Content-Type开始进入靶场练习重点分析了第二关的源代码Content-Type 用来声明上传文件的类型比如图片是 jpg、png 还是 gif。8.2 后端白名单校验机制后端会通过白名单机制校验 Content-Type 属性值白名单示例image/png、image/jpg、image/gif上传文件时后端先检查 Content-Type 是否匹配白名单匹配 → 继续处理文件不匹配 → 返回错误提示“文件类型不正确请重新上传”8.3 漏洞所在校验机制依赖 Content-Type 属性值但这个校验并不严格因为用户可以通过抓包工具如 Burp Suite篡改该值。操作演示把Content-Type: text/php改成Content-Type: image/jpeg把 php 文件伪装成图片格式来绕过验证先用phpinfo()测试是否上传成功结论仅依赖客户端提供的 Content-Type 做校验存在严重安全隐患攻击者可以轻易绕过。8.4 实操小技巧清空上传文件夹的风险有时候点击清空可能会误删整个 upload 文件夹再上传就会报路径错误。最简单的解决方法就是新建一个同名的 upload 文件夹。为什么常用 phpinfo 测试phpinfo 能暴露大量服务器信息——根目录绝对路径脚本位置PHP 版本系统版本等等这些信息对后续操作很有帮助。九、代码层防护措施分析分析后端防护代码的逻辑层层递进9.1 防护措施清单措施目的删除文件名末尾的点防止file.php.这类绕过Windows 会忽略最后的点用点分割文件名分离文件名和后缀后缀名转为小写防止大小写绕过如.PhP去除特殊字符和尾部空格防止空格/特殊符号绕过黑名单数组预设禁止的后缀名类型经过前面处理后的最终后缀名如果出现在黑名单里直接报错总结这种层层过滤的设计就是为了堵住各种可能的漏洞绕过方式。十、第三关Apache 解析规则10.1 Apache 的特殊解析机制这是强调的一个非常重要的知识点Apache 有个特殊机制会把类似.php3、.php5的后缀也当作.php文件执行。而Nginx 等其他中间件不一定支持这种解析方式。说得很直白服务器能否解析 php3、php5 这类后缀的文件完全取决于你的服务器配置。Apache 或 Nginx 的规则里如果允许这些后缀就能正常解析如果不允许就不行。10.2 关键配置在 httpd.conf# 添加 MIME 类型映射告诉服务器把这些后缀当作 PHP 文件处理 AddType application/x-httpd-php .php3 .php5 .php7有些服务器为了省事会直接配置成通配符规则AddType application/x-httpd-php .php这样所有以php开头的文件都会被当作 PHP 脚本处理。10.3 张老师的强调如果这行配置缺失就算上传了 .php3、.php5 文件服务器也无法识别为 PHP 代码来执行。打了一个比方这个配置相当于给 Apache 开了翻译权限没它的话文件只会被当成普通文本。因为这个配置直接决定了攻击是否可能成功。10.4 实操要点直接访问已配置好的 gpt 目录upload 文件夹已预置操作前建议先关闭本地 PHP 环境如 phpStudy避免端口冲突重点测试两个方向Content-Type 校验第二关Apache 解析规则第三关验证成功的标准上传后的文件能被当作 PHP 代码执行并正常显示 PHP 页面十一、第四关.htaccess 配置文件利用11.1 什么是 .htaccess.htaccess 是 Apache 的目录级配置文件不像主配置文件那样全局生效。关键点正常情况下 Apache 会把.php文件交给 PHP 解析器执行但通过.htaccess配置文件可以改变这个行为。比喻就像有个开关能决定特定目录下的文件怎么被处理。11.2 为什么需要 .htaccess绕过黑名单检测只是第一步更重要的是上传的文件能否被服务器解析执行。案例说明即使把 php 文件后缀改为 jpg 成功上传但如果服务器不把 jpg 当 php 解析攻击仍然无效。解决方案利用 Apache 的.htaccess配置文件。通过在 upload 目录下创建这个文件可以强制让 Apache 把 jpg 文件当作 php 来解析。比喻虽然你给文件穿了 “jpg” 的马甲但通过这个配置文件相当于告诉服务器“这个马甲下面其实是 php请按 php 处理”。11.3 两种思路思路一让所有以.gpt结尾的文件交给 PHP 解析器执行即使上传的是 .jpg 文件只要改后缀为 .gpt里面的 PHP 代码就会被执行思路二重定向规则当用户访问某个目录下的 php 文件时系统会默认加载同目录下的 jpg 文件内容。比如目录下本来有个readme.php上传了一个test.jpg实际里面是 php 代码通过.htaccess配置文件实现访问 php 文件时自动加载 jpg 内容11.4 Content-Type 和 set header 的区别Content-Type 只是声明文件类型而 set header 才是真正决定服务器如何解析文件的关键配置。比喻就像快递单上写易碎品Content-Type和快递员实际轻拿轻放set header的区别。11.5 .htaccess 的生效条件必须使用 Apache 服务器AllowOverride 指令必须设置为 All不能是 None# 在 httpd.conf 中配置 AllowOverride All如果设置的是 “None”意味着完全忽略配置文件。遇到环境不生效时建议直接手打 “.htaccess” 文件名注意是点开头没有 p 结尾。11.6 配置文件的注意事项配置文件名称要正确——htaccess 没有 P特别注意隐藏的后缀名——有些同学的文件后缀是隐藏的可能还带着.tmt之类的后缀不同文件类型可以设置不同规则——如果想处理 png 格式可以另外再写一条规则十二、第五关user.ini 配置文件利用12.1 第五关和第四关的区别指出第五关和第四关看似相同但关键区别在于黑名单里禁用了之前使用的配置文件.htaccess。所以这一关考察的是PHP 目录级配置文件的知识点。12.2 user.ini 的作用正常情况下PHP 执行顺序由php.ini主配置文件决定。但在特定目录下可以使用user.ini这样的目录级配置文件来覆盖主配置。12.3 预加载机制讲解了一个关键操作默认将 GIF 文件内容插入到 PHP 文件最前面执行。具体来说在user.ini文件中添加一行配置auto_prepend_filetest.jpg这样访问任何 PHP 文件前系统会先把test.jpg的内容自动添加到 PHP 文件开头然后再执行整个文件。这种预加载机制通过配置文件让系统在执行 PHP 前自动插入特定内容在 Web 安全领域常被用来进行文件包含攻击的测试。12.4 常见问题文件名被修改在演示时遇到了一个实际问题原本要上传的user.ini文件被变成了.txt后缀而且内容也丢失了。解决方法通过抓包分析来观察上传时的请求数据找出文件名被篡改的原因。比喻就像快递包裹被拆开重装一样得看运输环节哪里出了问题。12.5 user.ini 生效的关键条件phpStudy 中 user.ini 文件没生效的主要原因是 Apache 配置问题。关键点必须让 Apache 通过php-fpm 模式运行 PHPuser.ini 才会生效。如果采用常规运行方式user.ini 很可能失效。建议检查服务器实际使用的 PHP 运行模式通过 phpinfo() 或进程查看这个细节很容易被忽略却直接影响配置生效。解决方法切换 PHP 版本调整 PHP 的运行组合方式具体操作可以搜索如何切换 php-fpm 模式十三、Windows 文件流ADS机制13.1 什么是文件流一个文件比如 index.txt实际上由多个数据流组成。平时打开看到的只是默认的 “content” 数据流即文件主体内容文件还包含其他隐藏的元数据流13.2 访问方式通过文件名:流名的特殊语法访问非默认流index.txt:metadata直接打开文件时系统默认只显示主数据流。比喻Windows 文件不是简单的单一体而是像多层抽屉一样存在多个独立数据流。13.3 第八关的操作讲解第八关时提到上传文件时要在文件名位置加上冒号 dollar date这个操作本身不会报错但后续访问文件时会遇到 403 权限拒绝的问题。13.4 环境差异Windows 和 Linux 系统的文件流机制不同当前讨论的配置只适用于 Windows 环境。当然也要注意必须先把 PHP Study 切换到 NginxPHP 环境否则无法正常解析。十四、Magic Number魔术数与文件头校验14.1 什么是 Magic Number讲解了一个关键概念Magic Number魔术数是识别文件类型的关键标识位于文件头部。常见文件的魔术数十六进制文件类型魔术数十六进制对应数值JPEGFFD8FF255216PNG89504E13780GIF474946387173这些十六进制代码就像文件的身份证号即使修改文件后缀名系统仍会通过检查魔术数来验证真实类型。14.2 系统检查文件头的逻辑系统会读取文件头两个字节来判断类型255216 → jpg13780 → png7173 → gif其他情况 → 未知类型上传失败强调单纯修改文件后缀名比如把 php 改成 jpg是没用的因为系统实际检查的是文件内容的二进制特征。比喻文件类型验证不是看文件名而是看文件内容的身份证——文件头标识。这就好比不能通过改护照封面来改变国籍海关会核对护照内页的真实信息。14.3 绕过文件头校验的方法方法一在文件内容前添加GIF89a魔术数字系统会误认为这是个合法的 GIF 图片文件比用图片马更简单直接第 13 关可以直接这样操作比喻就像给文件戴个面具骗过系统检查实际内容还是原来的 PHP 代码在运行。方法二使用图片马将 PHP 代码嵌入图片用copy命令的二进制模式/B参数copy /B ai.png test.php 图片.png这样就把test.php的文件内容追加到ai.png图片里生成一个新的图片文件。比喻虽然新生成的图片看起来正常但实际上已经包含了 PHP 代码。就像把一封信藏在画框背面画看起来没变但多藏了东西。14.4 查看十六进制文件的工具010 Editor— 专业的十六进制编辑器但收费且试用期仅一个月VS Code Hex Editor 插件— 免费替代方案十五、图片木马与文件包含漏洞15.1 图片木马的限制虽然成功将 PHP 代码追加到 PNG 文件末尾并上传但服务器不会解析图片中的 PHP 代码——因为 Apache 默认不会把图片交给 PHP 解析器处理。结果分析用十六进制编辑器确认图片以89504e开头PNG 文件头证明文件能通过格式校验但服务器不会解析图片中的 PHP 代码15.2 文件上传漏洞的两个条件文件上传漏洞利用需要满足两个条件绕过格式校验确保服务器能执行嵌入的代码15.3 文件包含漏洞的配合单纯上传一个伪装成图片的 PHP 文件图片马是不够的关键是服务器能否将其识别为可执行的 PHP 代码。如果服务器只是把它当作普通图片处理这个漏洞就毫无价值。核心要点必须同时存在文件包含漏洞通过特定页面比如 include.php来触发执行上传的图片。比喻就像你拿到了钥匙上传了恶意文件但还需要找到对应的锁孔文件包含漏洞才能真正开门。两个漏洞缺一不可否则攻击就无法完成。15.4 另一种绕过方法如果服务器只检查文件头比如GIF89a这样的标识攻击者只需要在恶意文件前添加这些标识就能绕过检查。张老师演示这种方法时发现在抓取到的文件内容前面手动添加 “gif89a” 文件头系统就会误认为这是个合法的图片文件从而绕过验证。十六、第13-15关不同校验方式的对比16.1 第13关可以通过添加GIF89a文件头绕过系统只检查文件头的魔术数字16.2 第14关强调第14关必须使用真实的图片文件不像第13关那样可以通过简单添加 GIF89a 文件头来绕过检测。因为第14关使用的是getimagesize()函数这个函数通过读取文件头的魔术字节来快速判断图片类型它会返回一个常量对照表进行匹配图片码本身就包含宽高信息所以完全符合第14关的要求16.3 第15关通过image_type判断文件类型同样存在被绕过的风险。16.4 总结仅靠前两种校验模式文件头和扩展名非常不可靠因为攻击者可以轻易修改这些信息。核心漏洞这些校验方式都只检查了文件的表面特征没有真正验证文件内容的合法性导致攻击者可以通过精心构造的恶意文件绕过检测。十七、第16关二次渲染17.1 什么是二次渲染讲解了一种更难突破的防御机制第16关的防御方式它不仅校验文件类型还会对上传内容进行二次渲染。比喻就像把一幅画重新临摹一遍虽然看起来一样但原画里藏的密信比如恶意代码在临摹过程中就被过滤掉了。17.2 二次渲染的原理图片上传后系统会打乱原文件内容导致嵌入的 PHP 代码失效即便成功上传了 PHP 文件经过后端处理后代码结构也可能被破坏17.3 绕过思路提供了一个方向通过比对原图和渲染后的文件找出未被修改的部分然后把木马代码插到这些保留区域。实际操作需要工具辅助比如 010 Editor来对比文件差异精准定位不变的数据区域而不是盲目插入代码。十八、黑名单 vs 白名单在讲到防御机制时总结了一个重要对比18.1 白名单机制白名单机制比黑名单更可靠。流程用户上传文件 → 系统先移动保存文件到指定目录 → 校验文件后缀是否在白名单内18.2 黑名单的缺陷黑名单方式容易遗漏比如忘记某个危险后缀而白名单则更严格——只放行明确允许的类型。18.3 先存后校验的模式特殊的防御逻辑当用户上传可疑文件时系统会先用unlink()函数立即删除该文件。防御链条存储 → 检测 → 删除十九、第17关条件竞争Race Condition19.1 核心原理虽然上传的文件会被快速删除但关键在于利用极短的时间差可能只有 0.00 几秒来执行恶意代码。系统会先临时保存文件然后才删除。要抓住这个极短的时间差在文件被删除前访问到它。19.2 利用方法双线并行线程 A持续上传恶意文件线程 B不断访问目标地址关键代码通过file_put_contents()函数写入文件内容生成新文件。这个新文件不会被自动删除因为它是由代码创建的而不是直接上传的逻辑上传的 test.php 文件在被删除前只要被访问到一次它就能执行代码生成一个新的持久性文件。19.3 实操演示用 Burp Suite 演示了具体操作抓取上传请求包抓取访问请求包使用并发爆破模块同时发送上传和访问请求观察响应状态码200 → 上传成功即使后续被删除非 404 → 命中了一次有效文件建议可以设置请求自动执行多次比如 5000 次不需要使用预设的字典攻击模式选择 non-payload。19.4 注意事项实操时遇到了 Windows 实时保护的拦截不得不先关闭防护功能。做渗透测试时环境配置很重要杀毒软件可能会误报拦截正常的安全测试行为。二十、PHP 配置实战20.1 修改 php.ini在 D 盘找到对应 PHP 版本比如 5.4.45 非线程安全版的php.ini搜索相关配置项默认被分号;注释去掉分号表示启用重启服务才能生效20.2 查阅官方文档遇到不懂的函数一定要查官方文档这是最准确的信息来源。把官方文档复制给 AI让 AI 用通俗语言解释这样至少能避免 AI 胡编乱造。20.3 文件上传的三要素要成功利用文件上传漏洞需要满足三个条件文件能成功上传能找到上传后的文件路径该路径能被当作 php 代码执行