百度杯12月第四场Blog进阶版解题过程记录

继上篇百度杯12月第四场Blog挑战赛后,又出了一道Blog进阶版,其中有些内容非常开阔脑洞。
用上一篇提到的insert注入方法能够顺利获取到admin的账号和密码,这里就不再重复阐述;
另外提一下,出题人的解中用到了注册用户名处存在的一个二次注入,可以试一下。
接下来就是坑点的开始了:

在Blog那题中,做到以admin身份登录系统后,接下来使用php://filter读一波网站根目录下的flag.php即可解决,
如图:


但是在这里发现php://filter失效了。
使用上面这个payload读不到任何东西,于是尝试包含其他文件,如下:

发现包含功能还是起作用的,这说明出题人一定是在包含路径上作了手脚废了伪协议读文件内容的方法。。
到现在正常的思路已经走到尽头了,因为网站上所有相关的php我们已经都利用过了(详见上一篇)
接下来思路变得十分重要,从读网站上某个文件的角度去考虑,有以下几个角度:
php伪协议包含读文件内容
上传webshell,执行命令读文件
上传php,读特定文件
后两个其实方法是差不多的,可现在网站既找不到上传点,也不能用伪协议了,如何才能做呢?
这里利用了php对POST上传文件临时保存的特性,以及与自包含递归爆内存的结合成功上传并包含了webshell,下面是详解:
php对post过来的文件有一个默认处理流程,即在一个处理周期内(post,response),首先将post过来的文件保存在/tmp文件夹下,
文件名为php{0-9A-Za-z}的随机字符,如果文件被php文件本身用到了,则php直接使用/tmp里的这个临时文件,如果没用到或者处理完毕了,则将/tmp下的这个临时文件删除。
也就是说,在正常处理流程下,tmp目录下的这个文件存活周期是一次请求到响应,响应过后,它就会被删除,因为kindeditor那里存在的目录遍历漏洞,导致我们可以查看tmp目录下的文件列表,我们也可以对任一php文件post一个文件过去,使其暂存于tmp目录下,问题就在于,我们还没来得及包含这个文件,它就会在这次请求结束后被删除掉。
如何不让它被删除掉呢?删除和处理请求的都是php,所以我们要让php守护进程产生内存溢出,换言之,使之崩溃,而php自身是不会因为错误直接退出的,它会清空自己的内存堆栈,以便从错误中恢复,这就保证了web服务的正常运转的同时,打断了php对临时文件的处理。
自包含恰巧可以做到这一点,什么是自包含呢?
即: /X.php?include=X.php
这样X.php就会将它本身包含进来,而被包含进来的X.php再次尝试处理url的包含请求时,又将自己包含进来一遍,这就形成了无穷递归,递归会导致爆栈,使php无法进行此次请求的后续处理,也就是删除/tmp目录中我们通过post强行上传的临时文件。

整理下php对一个post文件请求的正常处理流程:
1.manager.php接收一个Post请求,php在/tmp目录下创建我们post的文件
2.manager.php处理请求url,包含一个文件
3.manager.php进行文件处理
4.php删除/tmp目录下的临时文件

整理下这个漏洞的触发过程:
1. manager.php接收一个Post请求,php在/tmp目录下创建我们post的文件
2.manager.php处理请求url,不断自包含本身造成内存溢出
3.php发出内存溢出信号,清空缓冲区和调用堆栈,以便接收新的请求
4./tmp目录下的上传文件得以保留
5.包含/tmp目录下的上传文件形成webshell

于是我们本地构造一个payload,通过这个payload递送一个post请求包含一个文件的同时使manager.php自包含溢出崩溃:

上传一个随意文件,
用上一次中发现的目录遍历漏洞查看/tmp目录下文件情况,发现果然增加了一个文件:


文件名为phppnvQgE..,我们上传的文件就是它了。
图为自包含请求返回的效果,(无穷无尽,还在不断返回中


接下来就是用manager.php再去包含/tmp目录下的那个文件了:
payload:

由于我们之前上传的文件是phpinfo,此处正式包含了进来:



故技重施,上传了几个webshell,但是都不能正常使用,这才发现phpinfo里已经用disable-function禁用了大部分函数:


仔细分析后,发现copy函数没有被禁用,于是想到将flag.php利用copy函数copy成一个txt文件,那么就可以像robots.txt一样直接被包含读取咯。。

final-PayloadA:
上传文件:
<?php
copy("/var/www/html/flag.php","/tmp/flag.txt");
?>

此处必须再膜拜一下出题人的严谨,/var/www/html目录被设置为了不可写,试了好多次,发现只能将flag.txt copy到/tmp目录下。
上传上述文件后用manager.php包含一遍,即可在/tmp目录下看到flag.txt了:
payload:

查看/tmp目录下:


有flag.txt了,再然后,manager.php包含一波:
payload:


注意这里可能被安全宝封,所以GET方法改为OPTIONS
读到flag~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值