Dạo gần đây tôi hay viết nhiều script bằng python, tự nhiên phát hiện ra 01 trường hợp gõ linh tinh, nhưng lỗi lại trả về lỗi không tìm thấy biến có tên là giá trị tôi nhập vào. Cứ ngỡ là RCE được nhưng đúng là RCE được thật, search trên mạng hóa ra lỗi có từ lâu rồi.
Tại Python 2, chúng ta có 02 hàm nhận giá trị input của người dùng là input() và raw_input(), trong khi đó Python 3 chỉ có hàm input(). Điều khác biệt là raw_input sẽ nhận giá trị người dùng và chuyển đổi nó thành string, còn input() giữ nguyên kiểu dữ liệu của giá trị đưa vào. Do đó hacker có thể lợi dụng điểm yếu này để đưa vào các biến, hàm (tương đương code injection) để khai thác ứng dụng.
Tham khảo trường hợp bị lỗ hổng Python Input như sau:
a = input("Nhap gia tri=")
print a

Thực hiện nhập giá trị 1+1, ta thấy chương trình thực thi giá trị ta nhập vào:

Chốt hạ, ta có thể dùng hàm system bằng cách sau, game over:
__import__("os").system("whoami")

Rồi đến một ngày tôi nhận thấy một chall dễ trên DawgCTF 2021, nhận thấy trường hợp này quen quen:


Thử dùng module __builtin__ để thực câu lệnh ls, được luôn:

Lấy flag thôi:

Tham khảo tại: