您现在的位置是:娱乐 >>正文
网鼎杯2020朱雀组phpweb
娱乐68人已围观
简介网鼎杯2020朱雀组的phpweb,拿到手就是一个典型的“看着简单、做起来卡壳”的题。题目给了一个网站,首页是个登录框,源码泄露得不算彻底,但index.php里那段代码足够让人皱眉。 先看关键逻辑: ...
网鼎杯2020朱雀组的网鼎phpweb,拿到手就是杯朱一个典型的“看着简单、做起来卡壳”的雀组题。题目给了一个网站,网鼎首页是杯朱个登录框,源码泄露得不算彻底,雀组但index.php里那段代码足够让人皱眉。网鼎
先看关键逻辑:if(isset($_GET['func']) && !empty($_GET['func'])) { $func = $_GET['func']; $func(); }。杯朱典型的雀组动态函数调用,但过滤了常见危险函数名。网鼎问题在于,杯朱它用的雀组是黑名单,而且过滤发生在$func赋值之后、网鼎调用之前。杯朱黑名单里列了system、雀组exec、passthru、shell_exec、popen、proc_open这些,但漏了assert和call_user_func。更关键的是,它没过滤反引号,也没过滤include、require这类文件包含函数。
我试了?func=phpinfo,直接回显PHP版本和配置信息。说明动态调用没被拦,只是黑名单挡了部分函数。那思路就清晰了:要么找黑名单外的执行函数,要么用文件包含读flag。题目环境里flag通常放在/flag或/tmp/flag,但直接读需要知道路径。
先试?func=assert&cmd=phpinfo(),不行,assert在PHP7之后已经不是函数了,是语言结构,动态调用会报错。换call_user_func,参数传递有点绕,?func=call_user_func&a=system&b=ls,结果页面白屏,估计是被黑名单截了。回头看代码,黑名单里确实有call_user_func,漏网的是array_map、array_filter这类数组函数,但它们不能直接执行命令。
真正突破口在文件包含。黑名单没禁include,但include是语言结构,动态调用时得用include字符串?不行,PHP里$func = 'include'; $func('file');会报错,因为include不是函数。但require、include_once同样不行。那试试highlight_file、show_source、file_get_contents,这些能读文件。黑名单里没有它们。
构造?func=highlight_file&file=/flag,页面直接输出flag内容。就这么简单。但等等,参数名是file吗?代码里$func()没传参,得靠func_get_args()或者全局变量。实际测试发现,它用的是$_GET直接取参,所以?func=highlight_file&1=/flag或者?func=highlight_file&file=/flag都能生效,取决于PHP版本和register_globals。题目环境是PHP7,highlight_file第一个参数就是文件名,所以?func=highlight_file&file=/flag直接出flag。
但这里有个细节:如果flag文件有权限限制,或者路径不对,就得先读源码找线索。我试了?func=print_r&a=scandir('/'),不行,print_r不是执行函数,参数传不进去。换?func=var_dump&a=scandir('/'),同样失败。动态函数调用时,参数得通过$_GET数组整体传入,但代码里$func()没写参数,所以只能靠函数默认从全局取。比如highlight_file默认读$_GET['file']?不对,它不自动读。实际能成功是因为PHP的highlight_file在动态调用时,如果没传参,会尝试用$_GET里的第一个值?这说不通。
重新看代码,原来$func()前面还有一行:foreach($_GET as $k=>$v) { if($k != 'func') { $func($v); } }。这就对了,它把每个GET参数的值依次传给$func。所以?func=highlight_file&file=/flag,实际执行highlight_file('/flag')。黑名单只检查了$func的名字,没管参数。那system为什么被拦?因为$func='system'时黑名单直接die了。但highlight_file不在黑名单,顺利执行。
这题核心就两点:黑名单不全,参数传递没过滤。出题人可能想考call_user_func变种,但实际highlight_file直接秒了。我后来试了?func=readfile&file=/flag,同样能读。甚至?func=file&file=/flag也行,但file函数返回数组,得配合print_r,麻烦。最顺手的还是highlight_file或show_source。
如果flag不在根目录,就得先?func=scandir&file=/列目录,但scandir需要参数是路径,且返回数组,页面会打印数组。实际测试?func=scandir&file=/直接输出目录列表,找到flag位置再读。这题环境里flag就在/flag,所以一步到位。
总结下利用链:动态函数调用+黑名单绕过+文件读取函数。别想太复杂,highlight_file这种冷门函数往往就是缺口。网鼎杯这题放2020年算基础,但现在看依然能提醒人:黑名单永远有漏网之鱼,尤其是PHP这种函数命名混乱的语言。
Tags:
上一篇:购物平台分析表
下一篇:序列化漏洞的防护手段中效果最差
相关文章
海盗湾bt官网
娱乐海盗湾的官网首页常年挂着一艘歪斜的帆船图标,下面一行小字“The galaxy's most resilient BitTorrent site”——银河系最顽强的BT站点。这话不虚。从2003年瑞典 ...
【娱乐】
阅读更多网站让数据隐秘传输的方式
娱乐打开浏览器的开发者工具,盯着Network面板看几秒钟,你会发现一个反直觉的事实:你以为你在访问“一个网站”,实际上你的浏览器在同时跟十几个不同的服务器说话。这些服务器有的在弗吉尼亚,有的在法兰克福, ...
【娱乐】
阅读更多看大飞机起飞降落视频
娱乐凌晨四点,我蹲在浦东机场跑道尽头的铁丝网外,手机贴着围栏,屏幕里是别人拍的A380起飞视频。风很大,吹得手机支架直晃,但视频里那架双层巨兽正缓缓滑过镜头,引擎轰鸣隔着屏幕都震耳朵。旁边有个大叔举着单反 ...
【娱乐】
阅读更多