Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.

Announcement

Collapse
No announcement yet.

Khai thác điểm yếu thông số đầu vào truy cập dữ liệu nhạy cảm trong Flask Python

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Khai thác điểm yếu thông số đầu vào truy cập dữ liệu nhạy cảm trong Flask Python



    Giới thiệu Flask:

    Flask là một Web Framework rất nhẹ của Python, dễ làm quen, giúp người mới bắt đầu học có thể tạo ra website nhỏ và giúp chúng ta hiểu cơ chế bên trong các framework khác.

    Viết một web đơn giản:
    • Cài đặt Flask: Vào cmd gõ lệnh: py –m pip install flask
    • Tạo file app.py:
    Import module Flask và tạo ứng dụng bằng cách dùng Flask.
    Code:
    [FONT=Calibri][FONT=Times New Roman]from flask import Flask[/FONT][/FONT]
    
    [FONT=Times New Roman]app = Flask(__name__)[/FONT]
    Route cơ bản và định nghĩa hàm được thực thi khi truy nhập đến URL của website.
    Code:
    [FONT=Calibri][FONT=Times New Roman]@app.route('/')[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]def home():[/FONT][/FONT]
    [FONT=Times New Roman]return """Home page"""[/FONT]
    Chạy ứng dụng, trong đó host mặc định là 127.0.0.1 (localhost), port mặc định là 5000.
    Code:
    [FONT=Calibri][FONT=Times New Roman]if __name__ == "__main__":[/FONT][/FONT]
    [FONT=Times New Roman]app.run(host="127.0.0.1", port=int("5000"))[/FONT]
    Tới đây là chúng ta có thể lưu file lại, chạy file:




    Tiếp theo là vào trình duyệt, trỏ đến URL và gõ 127.0.0.1:5000




    Vậy là chúng ta đã tạo được một web để làm quen cách sử dụng Flask Python.

    Lấy nội dung trong file và hiển thị lên trang web:

    Import các module cần thiết.
    Code:
    from flask import Flask, request
    Tạo ứng dụng Flask.
    Code:
    app = Flask(__name__)
    Tạo route đến địa chỉ 127.0.0.1:5000/get_file và định nghĩa hàm được thực thi. Các web sẽ sử dụng các phương thức khác nhau khi truy nhập đến URL. Nếu chúng ta không chỉ định thì method mặc định là get.
    Code:
    @app.route('/get_file', methods=['GET'])
    def get_file():
    filename = request.args['filename']
    return '''Content of the file {} is...\n\n {}'''.format(filename, cat(filename))
    Tiếp theo là định nghĩa hàm cat để mở file, đọc nội dung file và trả về dữ liệu.
    Code:
    [FONT=Calibri][FONT=Times New Roman]def cat(filename):[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]with open(filename) as file:[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]data = file.read()[/FONT][/FONT]
    [FONT=Times New Roman]return data[/FONT]
    Viết hàm main và lưu lại với tên flask_app.py
    Code:
    [FONT=Calibri][FONT=Times New Roman]if __name__ == "__main__":[/FONT][/FONT]
    [FONT=Times New Roman]app.run(host="127.0.0.1", port=int("5000"))[/FONT]
    Vào thư mục đặt file flask_app.py tạo 2 file text welcome và passwords. Nội dung file welcome là Hello student (không chứa dữ liệu nhạy cảm). File passwords có nội dung là username=cisco, password= cisco( đây là các thông tin nhạy cảm không cho người dùng truy cập khi gọi api)
    Vào trình duyệt và gõ 127.0.0.1/get_file .





    Trên web sẽ hiện lên thông báo Bad Request, lý do là chúng ta chưa đưa thông số filename kèm theo nên server không hiểu.
    Để thêm thông số filename ta gõ vào 127.0.0.1/get_file?filename=welcome.txt để đọc file welcome.txt





    Thay đổi filename thành passwords.txt




    Bây giờ chúng ta sẽ di chuyển file password.txt ra khỏi thư mục chứa file flask_app.py và đặt dưới thư mục chứa file flask_app.py. Để vẫn có thể truy nhập vào file passwords.txt trên ta sửa lại thành: 127.0.0.1/get_file?filename= ../passwords.txt . Như vậy chúng ta thấy được tuy file passwords không nằm chung thư mục chứa file flask_app.py nhưng vẫn có thể truy nhập đến và đọc được nội dung file nếu file passwords này đặt ở dạng plaintext. Để tránh lỗi bảo mật này xảy ra ta sẽ đi đến phần tiếp theo.

    Triển khai xác định đầu vào:

    Import thư viện re ở đầu file flask_app.py:
    Code:
    Import re
    Định nghĩa hàm sanitize_string để tạo bộ kiểm tra filename. Những ký tự chấp nhân là a-Z, 0-9, dấu “-“, dấu “.”. Những ký tự khác sẽ không được thông qua để tránh tấn công injection.
    Code:
    [FONT=Calibri]def sanitize_string(filename):[/FONT]
    [FONT=Calibri]if re.search('^[\w\-\.]+$', filename):[/FONT]
    [FONT=Calibri]pass[/FONT]
    [FONT=Calibri]else:[/FONT]
    [FONT=Calibri]raise ValueError('Can not use special characters')[/FONT]
    Vào hàm cat và sửa như sau
    Code:
    [FONT=Calibri][FONT=Times New Roman]def cat(filename):[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]sanitize_string(filename)[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]with open(filename) as file:[/FONT][/FONT]
    [FONT=Calibri][FONT=Times New Roman]data = file.read()[/FONT][/FONT]
    [FONT=Times New Roman]return data[/FONT]
    Bây giờ ta lưu file lại và chạy file
    Vào trình duyệt và gõ: 127.0.0.1/get_file?filename= ../passwords.txt .





    Lúc này chúng ta không còn truy cập vào file passwords chứa dữ liệu nhãy cảm này nữa.

    Hoàn thành.
    Nguồn : VNPRO
    Last edited by huynhvanmanhtien; 29-03-2020, 02:03 PM.
Working...
X