【CTF-WEB-PHP】PHP回调函数漏洞解题思路

📅 2026/7/25 20:58:25
【CTF-WEB-PHP】PHP回调函数漏洞解题思路
题目我们有一个简单的 PHP 脚本负责处理用户输入并通过回调函数对数组进行操作然而这个脚本并未对输入进行严格的过滤。你是否能发现某些细节并利用它来深入了解更多信息解题过程1. 初始访问请求网址http://challenge.qsnctf.com:34142/目的查看页面内容了解靶场结构结果获取到页面展示的PHP代码2. 代码分析?phpfunctionexecuteCallback($callback){$someArray[0,1,2,3];returnarray_map($callback,$someArray);}if(isset($_GET[callback])){$evilCallback$_GET[callback];$newArrayexecuteCallback($evilCallback);}?executeCallback函数详细解释函数定义functionexecuteCallback($callback)参数$callback- 接收一个回调函数可以是函数名字符串、匿名函数或可调用对象返回值返回一个新数组包含回调函数处理后的结果执行流程数组初始化$someArray [0, 1, 2, 3];- 创建包含4个整数的数组回调执行return array_map($callback, $someArray);使用array_map函数将回调应用到数组每个元素array_map函数作用array_map($callback, $array)是PHP内置函数用于将回调函数应用到数组的每个元素它会遍历数组中的每个元素将元素值作为参数传递给回调函数返回一个新数组包含回调函数处理每个元素后的结果原数组保持不变回调函数执行机制对于数组[0, 1, 2, 3]回调函数会被执行4次每次执行时数组元素值会作为参数传入回调函数执行过程$callback(0); $callback(1); $callback(2); $callback(3);漏洞产生原因函数直接将外部传入的$callback参数作为回调执行没有任何验证PHP支持将内置函数名如phpinfo、system作为字符串传递给回调函数当$callback是用户可控的GET参数时攻击者可以注入恶意函数名与漏洞利用的关联尽管函数返回结果被赋值给$newArray但对于有副作用的函数如phpinfo()会直接输出内容system()会执行系统命令不需要获取返回值就能产生危害数组[0, 1, 2, 3]决定了回调函数的执行次数但对于无参数函数如phpinfo()执行次数不影响最终结果即使$newArray没有被输出phpinfo()等函数仍会直接向浏览器输出内容关键漏洞点$newArray executeCallback($evilCallback);- 将用户可控的$evilCallback传入函数return array_map($callback, $someArray);- 直接执行不可信的回调函数缺少对回调函数的白名单验证或类型检查发现漏洞callbackGET参数直接作为回调函数传入executeCallback执行PHP回调函数支持内置函数名可直接注入内置函数3. 尝试系统命令请求网址http://challenge.qsnctf.com:34142/?callbacksystem(ls)目的尝试执行系统命令查看目录文件结果连接被中止服务器可能对系统命令做了防护4. 执行phpinfo函数请求网址http://challenge.qsnctf.com:34142/?callbackphpinfo目的获取服务器环境变量和配置信息结果成功执行返回phpinfo()输出5. 查找flag在phpinfo输出的Environment部分找到FLAG变量flag值qsnctf{e386fff2cee0455bb7f0a2027712f47d}漏洞原理PHP回调函数漏洞当用户可控参数直接作为回调函数执行时可注入内置函数如phpinfo、system等从而获取服务器敏感信息或执行系统命令。