Wednesday, July 11, 2007

SQL injection

SQL injection
By Present Group 11 Section 1

Project for 423402 Computer Security

Term 1/2549

SQL injection


By Present Group 11 Section 1

B4600589 นายเกริกชัย วิชัยดิษฐ

B4601319 นายจิระพัน โสขุมา

B4605041 นายประวิทย์ ทองเน่า

 


SQL Injection

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

Injection Flaws

หมายถึง แฮกเกอร์สามารถที่จะแทรก Malicious Code หรือ คำสั่งที่แฮกเกอร์ใช้ในการเจาะระบบส่งผ่าน Web Application ไปยังระบบภายนอกที่เราเชื่อมต่ออยู่ เช่น ระบบฐานข้อมูล SQL โดยวิธี SQL Injection หรือ เรียก External Program ผ่าน shell command ของระบบปฎิบัติการ เป็นต้น

ส่วนใหญ่แล้วแฮกเกอร์จะใช้วิธีนี้ในช่วงการทำ Authentication หรือการ Login เข้าระบบผ่านทาง Web Application เช่น Web Site บางแห่งชอบใช้ "/admin" ในการเข้าสู่หน้า Admin ของ ระบบ ซึ่งเป็นช่องโหว่ให้แฮกเกอร์สามารถเดาได้เลยว่า เราใช้ http://www.mycompany.com/admin ในการเข้าไปจัดการบริหาร Web Site ดังนั้นเราจึงควรเปลี่ยนเป็นคำอื่นที่ไม่ใช่ "/admin" ก็จะช่วยได้มาก

วิธีการทำ SQL injection

ก็คือ แฮกเกอร์จะใส่ชื่อ username อะไรก็ได้แต่ password สำหรับการทำ SQL injection จะใส่เป็น Logic Statement ยกตัวอย่างเช่น ' or '1' = '1 หรือ " or "1"= "1 หรือ a' or 1=1--

Query = "SELECT * FROM product WHERE Password='$input'";
แต่ผู้ใช้ทำการใส่ ข้อมูลเป็น a' or 1=1--
ดังนั้น query ที่ได้จะเป้น
Query = "SELECT * FROM product WHERE Password='a' or 1=1--'";
จะเห็นว่าเมื่อนำไช้งานแล้ว จะสามารถเรียกดูข้อมูลได้เสมอ เนื่องจาก 1=1 เป็นจริง

สมมุติว่า มีโค้ดต่อไปนี้ใน application และ parameter "userName" ซึ่งประกอบด้วย
ชื่อผู้ใช้ ช่องโหว่แบบ SQL Injection เกิดขึ้นในโค้ดนี้:

statement := "SELECT * FROM users WHERE name = '" + userName + "';"

ถ้าป้อน "a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%"
เข้าไปในส่วน "userName" จะทำให้เกิด SQL statement ต่อไปนี้

SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%';

ฐานข้อมูลจะเอ็กซิคิวท์ statement ตามลำดับ คือ select data, drop user table
และ select data ทำให้ผู้ใช้เว็ปสามารถดูหรือแก้ไขข้อมูลใด ๆ ที่อยู่ในฐานข้อมูล
ที่ผู้ใช้ที่เชื่อมโยงกับฐานข้อมูลสามารถอ่าน หรือแก้ไขได้

วิธีการป้องกัน

นักพัฒนาระบบ (Web Application Developer) ควรจะระมัดระวัง input string ที่มาจากทางฝั่ง Client (Web Browser) และไม่ควรใช้วิธีติดต่อกับระบบภายนอกโดยไม่จำเป็น

ควรมีการ "กรอง" ข้อมูลขาเข้าที่มาจาก Web Browser ผ่านมาทางผู้ใช้ Client อย่างละเอียด และ ทำการ "กรอง" ข้อมูลที่มีลักษณะที่เป็น SQL injection statement ออกไปเสียก่อนที่จะส่งให้กับระบบฐานข้อมูล SQL ต่อไป

การใช้ Stored Procedure หรือ Trigger ก็เป็นทางออกหนึ่งในการเขียนโปรแกรมสั่งงานไปยังระบบฐานข้อมูล SQL ซึ่งมีความปลอดภัยมากกว่าการใช้ "Dynamic SQL Statement " กับฐานข้อมูล SQL ตรงๆ

ช่องโหว่แบบ SQL Injection สามารถแก้ไขได้ใน programming language ส่วนใหญ่
ในภาษา Java ควรมีการใช้ PreparedStatement class

แทนที่จะใช้

Connection con = (acquire Connection)
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM users WHERE name = '" + userName + "';");

ให้ใช้โค้ดต่อไปนี้แทน

Connection con = (acquire Connection)
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM users WHERE name = ?");
pstmt.setString(1, userName);
ResultSet rset = stmt.executeQuery();

References

http://monitor.truehits.net/scan/faq/sqlinjection.php

http://www.acisonline.net/article_prinya_hackweb2.htm

http://infosec.sran.org/modules.php?op=modload&name=Sections&file=index&req=viewarticle&artid=114&page=1