untitled

posted on 02 Aug 2009 14:24 by rabuchan

งั้นลองไปนี่ดูครับ(English)www.acunetix.com/websitesecurity/sql-injection.htm

en.wikibooks.org/wiki/Programming:PHP:SQL_Injection

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();


อันนี้ผมเคยSave เก็บไว้นานแล้ว เลยคัดลอกมาให้ครั

 

 

 

credit Leekimhuang สุดยอดมากๆขอบคุณคับ 

 

 

http://www.goragod.com/knowledge-SQL%20Injection.html 

 

 

 

ก่อนที่ทุกคนจะเข้าอ่านบทความนี้ ต้องขออกตัวก่อนว่าที่เขียนบทความนี้ขึ้นไม่ได้มีจุดประสงค์ที่จะสอนทุกคนให้เป็น Hacker นะครับ เนื่องจากมันทั้งเป็นการผิดศีลธรรม และยังผิดกฏหมายอีกด้วย แต่อยากให้เพื่อนๆ ที่เข้ามายังเวบ dev-square นั้น ระมัดระวังในการเขียน code ของท่านด้วย 

เชื่อว่าบรรดาเซียน hacker ทั้งหลายหากจะเริ่ม hack เวบไซต์ไดเว็บหนึ่งแล้วอันดับแรกที่จะทำคือ เปิดเวบนั้นและทำการ View source ดูเพื่อหาจุดอ่อนของเวบไซต์นั้นๆ โดยจุดแรกที่จะเป็นจุดอ่อนของ hacker นั้นคือการตรวจสอบข้อมูลหรือ input field ต่างๆ โดยใช้ java script 

โดยวิธีหลบ java validation(การตรวจสอบข้อมูลโดยใช้ java script) นั้นก็ง่ายนิดเดียวคือการสั่งให้ Browser ปิดการทำงานของ java นั้นซะ Java นั้นก็จะทำงานหยุดทำงานแล้วครับ แต่แค่นั้นคงไม่ยากไปสำหรับสมาชิก dev-square หรอกครับ เราลองมาดูวิธีการเจาะระบบที่ แยบยลกว่านี้กันเถอะครับ 

Imageบางคนที่ต้องการส่งพารามิเตอร์กันระหว่าง page ก็มักจะใช้ hidden field ในการเก็บค่าแล้วส่ง ดังนี้ 
< input type="hidden" value="xxxx" name="aa" > 
แ ล้วพารามิเตอร์ก็จะถูกส่งไปกับการ submit form ด้วย แต่วิธีนี้ก็ยังมีจุดอ่อนอีกนั่นแหละครับ คือทาง hacker สามารถที่จะ save html ของเพจนั้นแล้วเอา source ไปแก้และทำการ post form นั้นกลับมายังเว็บไซต์เดิม เพื่อให้ค่า 
ใน hidden เปลี่ยนแปลงไป แต่ programmerบางคนก็ได้ทำการป้องกันโดยมีการ check referer ของเพจที่ทำการ submit form มาว่ามาจากเวบไซต์เขาหรือไม่ หากไม่ใช่ก็ให้ทำการแสดง error message ออกมา นี่ 
แหละครับคือที่มาของการโจมตีแบบ Javascript Injection 

*Referer คือค่าที่ใช้ตรวจสอบว่าเพจที่เราเข้าก่อนหน้าเพจปัจจุบนคือเพจใด มีประโยชน์สำหรับเว็บขายของ ในการตรวจสอบเว็บไซต์ที่แนะนำให้ลูกค้ามาซื้อสินค้าภายเว็บเรา* 

Javascript Injection 

Javascript injection เป็นเทคนิคการแก้ไขค่าต่าง ๆ ในเพจนั้นโดยไม่ต้องเซฟ htmlนั้นออกมาซึ่งส่งผลให้ค่า referer ไม่มีการเปลี่ยนแปลง เพื่อใช้ในการหลบการตรวจสอบ referer จากทาง server 

มีวิธีการขั้นต้น 3 วิธีดังนี้: 
I. Injection Basics 
II. Cookie Editing 
III. Form Editing 

I. Injection Basics 

Javascript injections จะถูกสั่งให้จาก URL bar ที่เราใช้ใส่ address เพื่อที่จะเข้าเวบนั่นแหละครับ โดยปกติเราจะเข้าเว็บไซต์โดยใส่ address ดังนี้ใช่ไหมครับhttp://www.google.co.th 
เมื่อเราเรียก 
url นี้ browser จะเข้าใจว่าเราจะเรียกการทำงานผ่าน http protocal แต่รู้ไหมว่า javascript ก็สามารถรันอย่างนี้ได้เช่นกัน โดยการใส่ javascript:xx; ลงในช่อง url นำหน้า address ดังนี้ 

javascript:alert('Hello, World'); http://www.google.co.th 


จ ะเห็นว่าเราสามารถส่ง javascript เพื่อไปรันใน google.co.th ได้ โดยคำสั่ง javascript ที่เราจะใช้ในการโจมตีมี 2 คำสั่งคือ alert(); and void(); โดยเราไม่จำเป็น ที่จะต้องใส่คำสั่งทีละๆ คำสั่ง เราสามารถใส่ หลายๆ คำสั่งได้ดังนี้ javascript:alert('Hello'); alert('World'); 

II. Cookie Editing 

อันดับแรกในการแก้ค่า cookie เราต้องทำการดู cookie ทั้งหมดในเว็บนั้นก่อนว่ามีอะไรบ้าง โดยการส่ง injection ไปในไซต์ดังนี้ 

javascript:alert(document.cookie); 

และในการ แก้ไข variable ใดๆ ในเว็บเราจะใช้คำสั่ง void();ในการโจมตี ดังนี้ 

javascript:void(document.cookie="Field = myValue"); 

ค ำสั่งด้านบนจะทำให้ค่า cookie ที่ชื่อว่า Field มีค่าเป็น myValue การ injection cookie นี้ใช้สำหรับเวบไซต์บางเว็บไซต์ ที่มีการใช้ cookie ในการ login หรือ การเก็บข้อมูลที่สำคัญๆ เช่นยอดซื้อสินค้า หรือ บัตรเครดิตเป็นต้น เช่นหากการเข้าระบบถูกตรวจสอบด้วย cookie เราก็สามารถที่เข้าระบบโดยไม่ต้อง login ดังนี้ 

javascript:void(document.cookie="Authorized=yes"); 

คือให้มีการแก้ค่า cookie ที่ใช้ในการตรวจสอบให้เป็นจริง เราก็เข้าระบบได้แล้วครับ 

III. Form Editing 

ส ่วนวิธีการสุดท้ายก็เพื่อใช้ในการหลบการตรวจสอบการแก้ค่าโดยการ check referer ที่ได้กล่าวไปในข้างต้น ทำให้เราไม่สามารถที่จะ save html ของเพจนั้นมาแก้ค่า แต่เราสามารถที่จะส่ง injection สั้นๆ เพื่อทำการแก้ค่าใน form นั้นได้ แต่ก่อนที่เราจะมาบอกวิธีในการ hack เราจะต้องเข้าใน variable form ใน javascript ซะก่อนว่า form ทั้งหมดของ javascript นั้นจะเก็บเป็น array ในตัวแปร form ทั้งหมดดังนี้ forms[x] โดย X จะเป็นเลขใดๆ ที่เอาไว้แทนลำดับของ form ในเพจนั้นๆ โดย form แรกจะเริ่มต้นที่ 0 form แรก ก็จะถูกเรียกผ่านตัวแปร forms[0] 

โดย การเรียก form แรกของเพจเราก็จะเรียกผ่านตัวแปรดังนี้ document.forms[0].to.value โดย to นั้นคือชื่อของ hidden ที่ซ่อนอยู่ โดยเราสามารถใช้ alert ในการตรวจสอบการมีอยู่ของตัวแปรนั้นได้ ดังนี้ 

javascript:alert(document.forms[0].to.value) 

เมื่อเราพบว่าตัวแปรที่เราต้องการจะแก้ค่านั้นมีอยู่จริงแล้วเราจะใช้คำสั้ง void ในการแก้ค่า hidden ดังนี้ 

javascript:void(document.forms[0].to.value=email  nhacks.com) 

โดยคำสั่งด้านบนจะเปลี่ยนค่าตัวแปร hidden ที่ชื่อ email ที่อยู่ใน form เป็น "email  nhacks.com" โดยเราสามารถใช้คำสั่ง alert(); ตามเพื่อตรวจสอบการเปลี่ยนแปลงค่า hidden 

เ ห็นแล้วใช่ไหมครับว่าการตรวจสอบค่าฝั่ง client โดยใช้ javascript ไม่มีความปลอดภัยดังนั้นการตรวจสอบค่าใดๆ ในเว็บ ควรทำที่ฝั่ง server ด้วยนะครับ แต่ปัญหานี้ไม่พบใน firefox นะครับ 

แฮะๆๆลองดู 

 

 

credit tumcomjoker @pamool 

Comment

Comment:

Tweet

Thanks for the article. I read the above post.

#2 By Chicgraphic on 2012-03-30 23:19