เด็กก็เป็นแฮกเกอร์ได้

water-dropsa

เด็กก็เป็นแฮกเกอร์ได้

sql injection

        SQL Injection: เด็กก็เป็นแฮกเกอร์ได้ – 1001 หากเราคุ้นเคยกับการพัฒนาเว็บสมัยใหม่ เราจะพบว่าเว็บในปัจจุบันมักเป็นเว็บแบบพลวัต (dynamic) ซึ่งหน้าเว็บที่แสดงผลมักมีฐานข้อมูลสร้างคอยสนับสนุนให้ข้อมูลอยู่ด้านหลัง และระบบฐานข้อมูลตัวเก่งมักจะเป็น MySQL, Oracle, Postgres หรือ MSSQL สำหรับเว็บทั่วไป คราวนี้เราลองมาดูกันว่า SQL และ SQL Injection นั้นคืออะไร และเกี่ยวข้องกับฐานข้อมูลอย่างไร

        SQL (อ่านว่า เอสคิวแอล, ซีเควล หรือ ซีควล) ย่อมาจาก Structured Query Language (ภาษาไทยมีคนพยายามแปลว่า ภาษาสอบถามเชิงโครงสร้าง) เป็นภาษาระดับสูงที่ใช้สำหรับสื่อสารกับระบบฐานข้อมูลทั่วไป บางตำราหรือบางระบบอาจมีรายละเอียดปลีกย่อยหรือคำเฉพาะแตกต่างกันไป แต่ทุกอันก็มีจุดมุ่งหมายเดียวกันคือเพื่อใช้สอบถามข้อมูล แก้ไข/ปรับปรุงข้อมูล หรือกำหนดโครงสร้างข้อมูล ในระบบฐานข้อมูลแบบเชิงสัมพันธ์

        SQL Injection เป็นการโจมตี (แฮก) แบบพื้นฐาน ที่อาศัยช่องโหว่ของเว็บที่ผู้พัฒนาระบบอาจจะไม่ได้ใส่ใจเพียงพอในการสร้างประโยค SQL จากข้อมูลที่รับมาจากผู้ใช้ ทำให้ผู้ใช้ (ผู้ร้าย) สามารถปรับเปลี่ยนหรือสามารถแก้ไขข้อมูลในฐานข้อมูลได้ เพื่อประกอบการอธิบาย ลองดูตัวอย่างประโยคภาษา SQL ที่ใช้สำหรับดึงข้อมูลจากตารางข้อมูลผู้ใช้ (user) ดังนี้

        SELECT * FROM user WHERE username=’admin’AND password=’secret’

       จากตัวอย่างดังกล่าว แม้จะไม่มีความรู้เรื่อง SQL มาก่อน ก็พอจะคาดเดาจากความหมายได้ว่า ให้เลือก/แสดง (SELECT) ข้อมูลจาก (FROM) ตารางผู้ใช้ (user) ที่มีเงื่อนไข (WHERE) ชื่อผู้ใช้(username) และรหัสผ่าน (password) เป็น “admin” และ “secret” ตามลำดับ ซึ่งประโยคลักษณะนี้ มักพบทั่วไปในการตรวจสิทธิ (login) เข้าระบบ ในระบบเว็บนั้น username และ password จะเป็นข้อความที่รับมาจากหน้าเว็บ และระบบจะนำข้อความดังกล่าวมาสร้างเป็นประโยค SQL ส่งไปร้องขอข้อมูลจากระบบฐานข้อมูล ตัวอย่างในภาษา PHP เช่น

       $SQL=”SELECT * FROM user WHERE username=’$username’ AND password=’$password'”;

      คราวนี้ลองคิดกันเล่น ๆ ว่าหากผู้ร้ายกรอกข้อความในช่อง username เป็น admin และข้อความในช่อง password เป็น ‘OR 1=1; — เมื่อทำการแทนข้อความ ประโยคที่ได้คือ

      SELECT * FROM user WHERE username=’admin’ AND password=”OR 1=1; — ‘;

       หากวิเคราะห์ประโยคดังกล่าวจะพบว่า เงื่อนไขด้านหลัง WHERE จะเป็นจริงเพราะ 1=1 จะเป็นจริงเสมอ ผลที่ได้คือข้อมูลทั้งตารางผู้ใช้งาน (user) จะส่งคืนกลับมาให้ระบบ หากผู้พัฒนาระบบใช้ประโยคในลักษณะดังกล่าวสำหรับตรวจสอบชื่อผู้ใช้และรหัสผ่านโดยดูเพียงว่าระบบฐานข้อมูลมีข้อมูลส่งคืนมาให้หรือไม่ เงื่อนไขในลักษณะนี้ก็ทำให้ผู้ร้ายเข้าสู่ระบบได้โดยไม่ต้องทราบรหัสผ่านที่แท้จริง ซึ่งการแฮกในลักษณะนี้ คือการแฮกที่เราเรียกว่า SQL Injection ตามลักษณะที่ผู้ร้ายส่งข้อมูลเข้ามาทำให้ภาษา SQL ที่ได้ มีความหมายผิดเพี้ยนไปจากที่ระบบต้องการ

       จากตัวอย่าง SQL Injection ที่ยกมาให้นี้เป็นเพียงพื้นฐานแบบง่าย ในความเป็นจริงยังมี SQL Injection ที่สามารถเปลี่ยนแปลงหรือทำร้ายข้อมูลได้ รวมถึงช่องโหว่ของฐานข้อมูลบางระบบยังทำให้ผู้ร้ายสามารถสั่งให้โปรแกรมใด ๆ ในระบบทำงานได้ผ่านทาง SQL Injection ได้อีกด้วย

         ปัจจุบันเราก็มีนักพัฒนาเว็บมือสมัครเล่นเป็นเด็กนักเรียนมัธยมพบได้ทั่วไป และภาษา SQL ก็เป็นภาษาเบื้องต้นที่นักพัฒนาเว็บต้องเรียนรู้เป็นอันดับต้น ๆ ดังนั้นคงจะไม่แปลกอะไรหากเราจะพบว่าเด็กที่มีความรู้ SQL และพอจะเขียนเว็บเป็นกลายเป็นแฮกเกอร์สามารถเจาะระบบ login เข้าสู่เว็บสำคัญได้ ในการป้องกันการโจมตีในลักษณะนี้ สามารถทำได้ง่ายมาก เพียงผู้พัฒนาเว็บจะต้องทำการตรวจสอบข้อมูลและสร้างประโยค SQL ที่ถูกต้องเท่านั้น

         ในต่างประเทศบางประเทศที่อนุญาตให้เจ้าของรถเลือกข้อความบนแผ่นป้ายทะเบียนเองได้ มีนักคอมพิวเตอร์นึกสนุกทำ SQL Injection กับระบบตรวจจับความเร็วด้วยกล้องถ่ายภาพ โดยกำหนดข้อความในทะเบียนให้เลี่ยงการหาข้อมูลในฐานข้อมูล ดังตัวอย่างในภาพประกอบ (คัดมาจาก http://images.cryhavok.org/v/License+Plate+SQL+Injection+Attack.jpg.html)

        จุดมุ่งหมายของบทความนี้ ต้องการเพียงจะชี้ให้เห็นว่า การเป็นผู้ร้าย (แฮกเกอร์) นั้นไม่ยาก และเด็กนักเรียนที่ฝึกหัดพัฒนาเว็บ ก็สามารถเป็นผู้ร้ายได้ โดยไม่ต้องมีการฝึกทักษะมากนัก.

         ผศ.ดร.เกริก ภิรมย์โสภา

         ภาควิชาวิศวกรรมคอมพิวเตอร์  คณะวิศวกรรมศาสตร์  จุฬาลงกรณ์มหาวิทยาลัย

         ที่มา : นสพ.เดลินิวส์ วันศุกร์ที่ 31 พฤษภาคม 2556 เวลา 00:00 น.

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s