Latest article
Home >> Security >> Injection ช่องทางยอดฮิตที่เหล่าแฮกเกอร์หลงไหลและคลั่งไคล้
Injection ช่องทางยอดฮิตที่เหล่าแฮกเกอร์หลงไหลและคลั่งไคล้

Injection ช่องทางยอดฮิตที่เหล่าแฮกเกอร์หลงไหลและคลั่งไคล้

leetsec.com-basic-sql-injection-by-1337MiR-part1-1337mir.com_

ก่อนอื่นเลย… ขอทำความเข้าใจกันก่อนนะครับว่า วิธีการและแนวทางในบทความนี้ เป็นเพียงการนำเสนอให้ทราบถึงวิธีการต่าง ๆ ที่เหล่าแฮกเกอร์ใช้ในการโจมตีไปยังเว็บไซต์ที่ไม่ได้ตระหนักถึง Web Application Security  หรือ ความปลอดภัยนั่นเอง ผู้เขียนเองไม่สนับสนุนให้ทำการใด ๆ บนระบบหรือเว็บไซต์ที่ไม่ได้รับอนุญาตนะครับ มิฉะนั้นท่านจะโดนข้อหาหนัก…ไปกินข้าวแดงในคุกเน้อ เดี๋ยวจะหาว่ามหาไม่เตือน…

เพราะอะไร… เพราะการกระทำทุกอย่างของท่านจะถูก Server มันเก็บเอาไว้หมด ฉะนั้นอย่าได้ไปทำการใด ๆ บนเว็บไซต์ที่ไม่ได้รับอนุญาตนะครับ ถึงแม้ท่านจะทำการปกปิด IP โดยวิธีการต่าง ๆ ก็ไม่รอดหรอกครับ แม้แต่มืออาชีพระดับโลกอย่างกลุ่ม Anonymous เขาก็ยังโดนจับได้ ยิ่งโดยเฉพาะเมืองไทยแล้ว พรบ. คอมพิวเตอร์มันแรงนะครับ แค่มี IP ของท่านไปป้วนเปี้ยนบน Server ของเขาแล้ว มีการ Request แปลก  ๆ เข้าไป เขาก็สามารถเอาผิดท่านได้เน้อ.. สรุปคือ รู้ไว้เพื่อป้องกันดีกว่า อย่าได้รู้ไว้เพื่อทำลาย มันเป็นบาป…

เอาล่ะ มาพูดถึง ช่องทางยอดนิยมและยอดฮิตในการเจาะระบบ ที่เหล่าแฮกเกอร์ใช้ในการโจมตีกัน เป็นช่องทางที่ง่ายและได้ผล สร้างความเสียหายได้เหลือคณานับ ประมาณว่า ถ้าเว็บไซต์ของท่าน ไม่ได้ตระหนักถึง Web Application Security แม้แต่เด็กประถมก็เจาะเว็บท่านได้ คิดดูจิว่า วิธีการเจาะระบบนั้น มันง่ายแสนง่ายขนาดไหน ถ้างั้นเรามาตระหนักถึงความปลอดภัยกันเถอะ ก่อนที่จะสายเกินไป

Injection นั้นคืออะไร ก็คือการแทรก code อันไม่พึงประสงค์เข้าไปในระบบ เพื่อให้ระบบทำงานตามที่พึงประสงค์ อันนี้ตามความเข้าใจของผู้เขียนเองนะ เรามาดูกันว่า Injection นั้น มีอะไรบ้าง

  1. SQL Injection อันนี้ยอดฮิตมาก ถ้า Code ที่ทำการแทรกเข้ามาทำงานกับฐานข้อมูล หรือ Database เขาเรียกว่า SQL Injection
  2. OS Injection ถ้าหาก Code ที่ทำการแทรกเข้ามา มีการทำงานกับคำสั่งของพวก OS หรือที่เรียกว่า Operation System Command เขาเรียกว่า OS Injection
  3. File Injection ถ้าหากระบบมีการอนุญาตให้ Upload ไฟล์แล้วไม่มีการป้องกันดี ๆ ก็สามารถทำการ Injection ผ่านไฟล์ที่ Upload ไปได้
  4. HTML Injection คือการปรับแก้ไข HTML เพื่อให้ทำงานผิดพลาด หรือทำงานในสิ่งที่ต้องการได้
  5. Code Injection คือการแก้ไข Code เพื่อให้ทำงานตามที่ต้องการ

ที่คิดออกตอนนี้ ก็ประมาณนี้แหระครับ

วันนี้ จะมาดูในส่วนของ SQL Injection สำหรับ SQL Injection นั้น มุ่งโจมตี Server ครับ เรามาดูกันว่ามันจะร้ายแรงขนาดไหน ผู้เขียนได้ทำ LAB ขึ้นมาเพื่อทดสอบวิธีการเจาะแบบต่าง ๆ ดังนี้ โดยผู้เขียนได้ทำเว็บไซต์ขายของ เขียนขึ้นง่าย ๆ ซึ่งไม่คำนึงถึงความปลอดภัยอะไรเลย เขียนแบบเด็กใหม่หัดเขียน  (ตามหนังสือ ที่มีขายตามท้องตลาดทั่วไป โดยหนังสือสอนเขียนเว็บเหล่านั้น ไม่ได้ตระหนักถึง Security เลย)  โดยฟังก์ชั่นการทำงานมีดังนี้
1. มีรายการสินค้า สามารถดูรายละเอียดสินค้าได้
2. มีระบบสมาชิก โดยสามารถ Login ดูและ แก้ไขข้อมูลส่วนตัวได้

1. ระดับ Basic หรือพื้นฐานทั่วไป การ Login โดยไม่ต้องรู้ Username หรือ Password เลย ถ้าหากเว็บไซต์ไม่ได้ตรวจสอบข้อมูลก่อนนำไปประมวลผล จะทำให้การทำงานผิดพลาด เช่น คำสั่งเช็คการ Login ประมาณนี้

$query = "SELECT * FROM member WHERE username='".$_POST['username']."' AND password='".$_POST['password']."'";

ถ้าหา Member ป้อนข้อมูลเข้ามาลักษณะดังนี้
Username = admin
Password = 1234
Query String จะเป็นลักษณะนี้ คือ

$query = "SELECT * FROM member WHERE username='admin' AND password='1234'";

ทำให้ แฮกเกอร์เห็นช่องทางในการทำ SQL Injection โดยใส่ป้อนข้อมูลมาในลักษณะนี้
Username = ‘ or ‘1’=’1
Password = ‘ or ‘1’=’1
Query String จะเป็นลักษณะนี้ คือ

$query = "SELECT * FROM member WHERE username='' or '1'='1' AND password='' or '1'='1'";

การทำงานก็จะเกิดความผิดพลาดขึ้นมา โดยระบบจะไปคิวรี่เอา Member ทั้งหมดที่มีอยู่ในระบบขึ้นมา เพราะไปเจอเงื่อนไข OR ‘1’=’1′ เข้า ทำให้แฮกเกอร์ สามารถ Login เข้าระบบได้โดยไม่ต้องใช้ Usernaem หรือ Password แต่อย่างใด สำหรับวิธีการป้อนค่าสำหรับ SQL Injection นัน มีหลายรูปแบบ อยู่ที่จะเลือกใช้แบบไหนและได้ผล

สำหรับแนวทางป้องกันคือ จะต้อง ตรวจสอบข้อมูลที่ถูกส่งเข้ามาโดย User ไม่ว่าจะเป็นค่า GET, POST ,REQUEST ,COOKIE ค่าใด ๆ ก็ตามที่เราจะนำไปประมวลผลกับ Database นั้นเราจะต้องมั่นใจว่า ค่านั้นเป็นค่าที่ถูกต้อง ไม่มีอักขระพิเศษใด ๆ ที่จะทำให้การทำงานผิดพลาดไป สำหรับ PHP นั้น สามารถใช้คำสั่ง
mysql_real_escape_string และ stripslashes  ได้เลย เพื่อความปลอดภัย

2. ระดับที่ยากขึ้นมาหน่อย  วิธีการนี้ จะใช้ SQL Injection ทำการดึงข้อมูลทั้งหมดจาก Database  สำหรับวิธีการในข้อนี้ จะขอยกตัวอย่างเว็บไซต์ที่ผู้เขียนได้ทำขึ้นมา เป็นตัวอย่าง ดังนี้ครับ
– การดูรายละเอียดสินค้านั้น จะได้ URL ดังนี้  http://local.shopping.com/post/detail?prod_id=3 โดยส่ง parameter เป็น Product ID เข้าไป การเขียน Query String ก็ประมาณนี้

$sql="SELECT * FROM product WHERE prod_id='".$_GET['prod_id']."'";

ก็จะได้ข้อมูลออกมาดังภาพ

product_detail

จะมีข้อมูลของสินค้าตามภาพ ซึ่งข้อมูลเหล่านี้แระครับ จะเป็นประโยชน์สำหรับเหล่าแฮกเกอร์ คราวนี้เราจะมาทำการ เจาะข้อมูลผ่านช่องทางนี้กันดูครับ เริ่มจากง่าย ๆ ก่อนเลย

ขั้นที่ 1 เช็คก่อนเลยว่า สามารถทำ SQL Injection ได้ไหม? โดยการเพิ่ม ‘ ต่อท้าย prod_id ผลลัพธ์ของ Query ก็จะออกมาประมาณนี้ครับ

$sql="SELECT * FROM product WHERE prod_id='3''";

ซึ่งระบบ จะต้องฟ้อง Error ออกมาให้เราเห็น (ถ้าระบบไม่ได้ซ่อน Error ไว้) ถ้าหากเห็นว่า ระบบแสดง Error ออกมาให้เราเห็น ก็เป็นอันจบข่าวครับ เว็บนี้ เราสามารถทะลุทะลวงเข้าไปถึงแก่น Database ได้เลย

ขั้นที่ 2 ถ้าหากเช็คว่า สามารถทำการ Injection ได้ ก็เข้าสู่ขั้นตอนการหาว่า Query นั้น มีการ Select ขึ้นมาทั้งหมดกี่ Colums ครับ เพื่อที่เราจะทำการเขียน Union ได้ถูกต้อง วิธีการเช็ค ก็ง่าย ๆ ครับ โดยการเช็ค ORDER BY ครับ โดยใส่ค่านี้ ต่อท้าย prod_id เข้าไปดังนี้  ‘ order by 15 — a สำหรับการเช็คนั้น ก็ไล่ไปเรื่อยๆ เอานะครับ ไล่ไปจนกว่าจะเกิด Error นั้นก็จะรู้ว่า จะมี Colums ที่ Select ขึ้นมาทั้งหมดเท่าไหร่  สำหรับตัวอย่างนี้ ไล่จาก 1 ไปจนถึง 15 แล้วเกิด Error ที่ 15 พอดี ก็รู้ได้ว่า Colums ที่ Select ขึ้นมานั้นมีทั้งหมด 14 Colums ครับ คราวนี้ก็เริ่มจะใกล้ความจริงแล้วครับ สำหรับผลของ Query ที่ได้จะออกมาประมาณนี้นะครับ

$sql="SELECT * FROM product WHERE prod_id='3' ORDER BY 15 -- a '";

โดย — a จะทำการ comment คำสั่งหลังจากไปไปทั้งหมด ตัวประมวลผลจะไม่สนใจคำสั่งหลังเครื่องหมาย — ครับ  คราวนี้ เมื่อเรารู้แล้วว่า มีทั้งหมด 14 colum ก็เข้าสู่วิธีการต่อไป คือ Union ข้อมูลออกมาดู

ขั้นที่ 3  ทำการดึงข้อมูลออกมาดู ตามที่ต้องการ โดยใช้คำสั่งนี้ต่อท้าย prod_id เข้าไปดังนี้  0′ UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14 — a โดยคำสั่งนี้ ที่ใส่ 0′ เพราะว่า หน้ารายละเอียดสินค้านั้น จะถึงข้อมูลมาเพียง 1 row เท่านั้น ดังนั้น หาเราจะให้ข้อมูลแสดงผลของ union ของเราเข้าไป เราต้องมั่นใจว่า ข้อมูลในฐานข้อมูล product id  0 นั้นไม่มีแน่นอน หรือจะใส่ค่าติดลบก็ได้นะครับ ซึ่งผลที่ได้ หน้าเว็บจะแสดงข้อมูลดังนี้

detail_hack

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

ขั้นที่ 4 เป็นการดึงข้อมูลรายละเอียดของ Database มาแสดง โดยตัวอย่างที่ผู้เขียนทำ จะให้แสดงตรงหมายเลข 3 ครับ จะใส่ค่าดังนี้ครับ CONCAT_WS(CHAR(32,58,32),user(),database(),version())   โดยใส่แทนตรงเลข 3  จะได้ดังนี้  0′ UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),user(),database(),version()),4,5,6,7,8,9,10,11,12,13,14 — a  สำหรับผลลัพธ์ที่ได้ จะเป็นดังภาพนี้ครับ

detail_hack2

ตรงเลข 3 ก็จะเปลี่ยนเป็นข้อมูลที่เราต้องการแล้วครับ โดยในรายละเอียดนี้ ผู้เขียนให้แสดง user account ของ Database  ชื่อของ Database และ Database version ครับ ในเมื่อเราได้ Database แล้ว คราวนี้เราลองมาดึง Tabale ออกมาทั้งหมดดูกันครับ

ขั้นที่ 5 ทำการแสดง Tabale ทั้งหมด ใน Database นั้น โดยการใช้คำสั่งนี้ ลงไป (select+concat(0x27,group_concat(table_name),0x27)+from+`information_schema`.tables where table_schema=0x73686f7070696e67) ก็จะได้ข้อมูลดังนี้ 0′ UNION SELECT 1,2,(select+concat(0x27,group_concat(table_name),0x27)+from+`information_schema`.tables where table_schema=0x73686f7070696e67),4,5,6,7,8,9,10,11,12,13,14 — a  สังเกตุดูนะครับ ตรง table_schema นั้นเป็นนตัวเลข ไม่ใช่เป็นชื่อ Database เลย ก็เพราะว่า ฟิวนี้เป็น String ครั้นเราจะใส่ =’shopping’ ก็จะมีเครื่องหมาย ‘ อีกทำให้การทำงานผิดพลาด เราก็ทำการแปลง shopping เป็น HEX โดยใช้ HEX Encoding เท่านี้ เราก็ได้รายชื่อ Table ทั้งหมดของ Database นั้นแล้วครับ คราวนี้ เราจะต้มยำทำแกงอะไรกับข้อมูลเหล่านี้ ก็ทำได้แล้วครับ

เห็นไหมครับ แค่เขียนเว็บแล้วไม่รอบคอบ ทำให้เกิดความเสียหายใหญ่หลวงขึ้นมาได้เลย ถ้าแฮกเกอร์คนนั้น มันเกิดใจไม้ใส้ระกำขึ้นมา สั่ง Drop Table ขึ้นมาล่ะ น้ำตาจะล่วงนะครับ ทางที่ดี ป้องกันกันไว้เสียแต่เนิ่น ๆ เลยครับ ก็ยังพูดคำเดิมคือ ตรวจสอบข้อมูลทุกอย่าง ก่อนนำไปประมวลผลกับ Database จะตรวจสอบวิธีการไหนก็ได้

ข้อแนะนำ สำหรับการป้องกันมีดังนี้นะครับ

  1. ข้อมูลทุกอย่างที่เกิดจาก User เช่นค่า GET , POST , REQUEST, COOKIE ตรวจสอบความถูกต้องข้อมูลก่อนนำไปใช้เสมอ
  2. ถ้าหากข้อมูลที่รับเข้ามาเป็นตัวเลข ก็เช็คให้มันใจว่าเป็นตัวเลขแน่นอน เพราะถ้าคิวที่นำไปประมวลผลเป็นลักษณะนี้ “SELECT * FROM xxxx WHERE id=”.mysql_real_escape_string($id) ก็ไม่สามารถช่วยอะไรได้เลย เพราะถ้าหากแฮกเกอร์ใช้ Query String มาในลักษณนี้  0 UNION SELECT 1,2,(select+concat(0x27,group_concat(table_name),0x27)+from+information_schema.tables where table_schema=0x73686f7070696e67),4,5,6,7,8,9,10,11,12,13,14 — a  จะเห็นว่า ไม่มีเครื่องหมาย ” หรือ ‘ เลย  สุดท้าย Query จะเป็นลักษณ SELECT * FROM xxxx WHERE id=0 UNION SELECT 1,2,(select+concat(0x27,group_concat(table_name),0x27)+from+information_schema.tables where table_schema=0x73686f7070696e67),4,5,6,7,8,9,10,11,12,13,14 — a ทำให้ผ่านได้
  3. กำหนดสิทธิ์การใช้งานของ Database Account เช่น ถ้า Account สำหรับ Select ก็ให้ Select ได้อย่างเดียว ไม่สามารถทำงานอย่างอื่นได้ เผื่อพลาด เราป้องกันไม่หมด เผื่อมีหลุด ๆ ไป แฮกเกอร์ ก็ไม่สามารถทำการอย่างอื่นได้ นอกจาก Select ได้อย่างเดียว
  4. แยก Database Server ออกจาก Web Server เพื่อป้องกันหากแนวทางป้องกันเราหลุดขึ้นมา จะได้ไม่เกิดความเสียหายใหญ่กว่าที่ควรจะเป็น
  5. สิทธิ์การใช้งานบนเว็บ ไม่ควรมีสิทธิ์เป็น root เพราะหากแนวทางป้องกันหลุดขึ้นมา นั่นหมายความว่า แฮกเกอร์สามารถเข้าถึงทุกอย่างของ Database ได้เลย แต่ถ้าเรากำหนดสิทธิ์เฉพาะ Database นั้น ๆ แฮกเกอร์ก็จะได้เฉพาะสิทธิ์ของ Database นั้น ๆ ไม่มีสิทธิ์ไปยุ่งกับ Database ตัวอื่น หาก Database Server เรามีหลาย Database
  6. ไม่แสดง ข้อความ Error ใด ๆ ทั้งสิ้นบนหน้าเว็บ

เพียงเท่านี้ ก็น่าจะปลอดภัยได้ในระดับหนึ่งแล้วครับ

ไว้คราวหน้า มาติดตามวิธีการที่เหนือชั้นกว่านี้ ใช้ช่องทาง Sql Injection Upload ไฟล์อันตราย หรือที่เรียกว่า Back Door ขึ้นไปบน Server น่ากลัวไหมล่ะ …

Incoming search terms:

  • html injection ตัวอย่าง
  • code injection คือ
  • html injection คือ อะไร
  • inj file
  • query sql hack
  • การป้องกัน sql injection upload image
  • การเขียนโค้ดแบบไหนถึงจะเกิดเป็น SQL Injection
  • วิธีแฮก Data MySQL
  • วิธีใช้คำสั่ง order by sql injection ผ่าน url ไม่ได้
  • หนังสือสอนเจอะระบบ Database
The following two tabs change content below.
Error: Unable to create directory wp-content/uploads/2018/11. Is its parent directory writable by the server?

Do-(A)-nG

Facebook Iconfacebook like buttonTwitter Icontwitter follow button
Copy Protected by Chetan's WP-Copyprotect.