有意思的条件竞争

前段时间,在某场比赛中遇到了一道条件竞争题,感觉很有意思,特别是在实现过程中对payload的设置,这里我复现一下大概过程。

一、背景:

原题是在文件上传的背景下,进行各种绕过(具体可以玩一下upload-labs),然后最后一步是条件竞争。
在条件竞争过程中,需要在上一层目录中生成一个test.php的文件,含test的内容,然后就可以获取到flag。
当然服务器会利用unink()函数,在上传过程中对上传的文件进行删除。
所以,当时的思路是:
通过Burp Suite不断上传一个shell.phtml的文件(除了后缀名,还有其他的绕过,这里不是重点),内含如下代码:

1
<?php fputs(fopen('../test.php','w'),'test')?>

服务器会将该shell.phtml的文件进行删除,所以需要再次利用Burp Suite,不断对shell.phtml的文件进行访问,使其在没删除之前,经过Burp Suite访问后,生成test.php文件,从而达到目的。

二、过程:

1、搭建环境:

首先,需要给文件的目录777的权限,如果没有,是不能生成的,搭建过程中给自己坑了一下下。

1
chmod 777 目录

upload.php的代码:

1
2
3
4
<?php
fputs(fopen('shell.php','w'),"<?php fputs(fopen('hack.php','w'),'<?php phpinfo();?>')?>");
$file = "shell.php";
unlink($file);

这里有点绕,我说明一下:
首先在访问upload.php的时候,会生成一个shell.php文件,内含生成hacker.php的代码
接着服务器会把shell.php文件,进行删除。
这时候,就需要和服务器进行条件竞争,在删除之前,对shell.php文件进行访问,使其生成hack.php文件。

2、复现过程:

(1)不断访问upload.php

(2)不断访问shell.php

(3)结果:

PS:kail里面的Burp Suite只能单线程的,又给坑了一下下

(4)访问hack.php进行验证

可以看到文件已经生成,并且访问成功。

三、总结:

挺有意思的条件竞争,重点关注payload的设置…