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

来源:互联网 发布:淘宝账号无法登陆 编辑:程序博客网 时间:2024/05/29 13:24
继上篇百度杯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:
http://2f214b095a5f4812af6256eaabea4dcca38fc9f064014b4a.ctf.game/blog_manage/manager.php?module=../../../../tmp/phppnvQgE&name=phpss

由于我们之前上传的文件是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:
http://2f214b095a5f4812af6256eaabea4dcca38fc9f064014b4a.ctf.game/blog_manage/manager.php?module=../../../../tmp/phprIPURM&name=phpss

查看/tmp目录下:


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


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



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 母乳宝宝不喝奶粉怎么办 换奶粉不拉大便怎么办 宝宝和妈妈不亲怎么办 冬天榨果汁太凉怎么办 四个月宝宝拉水怎么办 婴儿吃奶吃撑了怎么办 1岁的宝宝腹泻怎么办 一岁宝宝老拉肚子怎么办 一岁宝宝拉肚子怎么办啊 小孩发烧怎么办39度要吃消炎药吗 孩子不爱吃水果蔬菜怎么办 一岁宝宝不吃水果怎么办 一岁宝宝不爱吃水果怎么办 1岁多宝宝不吃水果怎么办 中学生不爱与家长交流怎么办 孩子一直37度多怎么办 小孩39度3算高烧怎么办 7岁发烧怎么办如何退烧 7岁反复发烧7天怎么办 一岁发烧39.8度怎么办 反复发烧39度4天怎么办 大人发烧到39度怎么办 小孩高烧39度多怎么办 孩子嗓子发炎发烧怎么办吃什么药 猫咪吃了点桃子怎么办 猫吃了牛油果怎么办 苹果手机死机开不了机怎么办 新生儿出生第一天没奶水怎么办 第一天断奶奶水一直流出怎么办 3岁宝宝不长个子怎么办 5个月宝宝不长个怎么办 孩子比同龄人矮很多怎么办 孕妇做春梦宫缩怎么办 减肥掉头发很厉害怎么办 孕妇吃了金枪鱼罐头怎么办 怀孕吃了烂水果怎么办 快递水果压坏了怎么办 谈对象被骗了钱怎么办 如果遇到半夜坏人敲门怎么办 小孩晚上不进房间睡觉怎么办 房子照不到阳光潮湿怎么办