บทความ
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: สุวิชา บัวคอม
| Security
Insecure Deserialization
Insecure Deserialization : คือช่องโหว่ที่เกิดจากการใช้ serialize ที่ไม่มั่นคงปลอดภัยโดยจะเกิดเมื่อระบบได้ทำการ deserialize ข้อมูลที่ถูกทำการ serialized โดยแฮกเกอร์อย่างไม่มั่นคงปลอดภัย มารู้จักการ serialize และ deserialize กันก่อนการ serialize ให้พูดง่ายๆ ก็คือการนำข้อมูลแบบ object ไปแปลงเป็นข้อมูลแบบ byte stream เพื่อให้สะดวกในการบันทึกลงใน storage และส่งข้อมูลไปหาเครื่องหรืออุปกรณ์อื่นๆได้สะดวกส่วน deserialize คือการทำให้ข้อมูลที่ถูกแปลงไปเป็น byte stream นั้นกลับมาเป็น object แบบเดิมใน lab สำหรับ EP นี้จะใช้ docker ชื่อ insecure_deserialization ของ dockerbuckethttps://hub.docker.com/r/dockerbucket/insecure_deserialization/สร้างแล็บกันเลยด้วยคำสั่ง$ docker run -p 3000:3000 dockerbucket/insecure_deserializationเมื่อสร้างแล็บมาแล้วเข้าไปที่ localhost:3000 จะเจอหน้าเว็บสำหรับทำแล็บhttp://localhost:3000หน้าเว็บจะมีข้อความ Welcome Coder และมี cookie ชื่อ username อยู่ ค่าของ cookie ชื่อ username คือ eyJweS9vYmplY3QiOiAiX19tYWluX18uVXNlciIsICJ1c2VybmFtZSI6ICJDb2RlciJ9ซึ่งถ้าใครเคยเห็นค่าของ cookie หน้าตาประมาณนี้จะสามารถเดาได้ทันทีเลยว่า cookie นี้ใช้การแปลงรหัสในรูปแบบของ base64 การทำงานของ base64 คร่าวๆBase64 คือการแปลงข้อมูลให้อยู่ในรูปแบบของ ASCII text โดยจะมีตัวอักษรที่เป็นไปได้ในข้อมูลรูปแบบ base64 แค่ 64 ตัว จะมองว่าเป็นเลขฐาน 64 ก็ได้ โดยใน 64 ตัวอักษรนี้ ได้แก่ a-z, A-Z, 0-9 เครื่องหมาย + และ / โดยจะมีเครื่องหมาย = ต่อท้ายในบางครั้งเพื่อให้จำนวน bits ของตัวอักษรลงตัวสามารถอ่านเพิ่มเติมเกี่ยวกับ base64 ได้ที่https://en.wikipedia.org/wiki/Base64ช่องทางในการถอดรหัส base64 นั้นมีหลายช่องทาง จะเขียนโค้ดตามภาษาที่เราถนัดก็ได้หรือจะใช้ OS command ก็ได้ แต่วิธีที่ง่ายที่สุดที่จะใช้เป็นตัวอย่างคือการใช้เว็บไซต์สำหรับถอดรหัส base64 ออนไลน์ โดยเข้าไปที่ https://www.base64decode.org/ใส่ค่า cookie ที่เป็นรูปแบบ base64 ของเราเข้าไปและกด < DECODE >เราจะได้ข้อมูลที่ถอดรหัสแล้วกลับมา นั่นก็คือ{"py/object": "__main__.User", "username": "Coder"}ให้เราลองแก้ไขค่าและทำ encode กลับไปเป็น base64 เพื่อนำไปแทนที่ค่า cookie อันเดิมของเราโดยการ encode สามารถกดเข้าผ่านเมนู encode ในเว็บที่ใช้ decode ได้เลย หรือเข้าไปที่https://www.base64encode.org/ทำกลับกันกับตอนที่เรา decode คือใส่ค่าที่เราแก้แล้วเข้าไปและกด encode ในที่นี้ผมจะเปลี่ยนค่า Coder เป็น Hacker ค่าที่เปลี่ยนจะเป็น {"py/object": "__main__.User", "username": "Hacker"}จะได้ข้อมูลรูปแบบ base64 กลับมา คือeyJweS9vYmplY3QiOiAiX19tYWluX18uVXNlciIsICJ1c2VybmFtZSI6ICJIYWNrZXIifQ==และเมื่อนำค่า base64 ที่ได้ไปแทนที่ค่าเดิมและ refresh หน้าเว็บจะได้ข้อความว่า You are now: Hackerนอกจากเปลี่ยนชื่อได้ยังสามารถทำอย่างอื่นได้อีกขึ้นอยู่กับการนำไปประยุกต์ใช้ โดยในบทความนี้จะทำให้เห็นว่ามีการเชื่อค่าที่ถูกเปลี่ยนเปลี่ยนแปลงโดยผู้ใช้ และนำค่านั้นไปทำการ deserialize ซึ่งถือเป็นการ deserialize ที่ไม่ปลอดภัย
โดย: Laris
| IoT
Yet Another Home Automation (2)
Mozilla’s WebThingsบทความก่อนหน้านี้ เราได้ทำการติดตั้ง WebThings Gateway ไปแล้ว เราค้างกันไว้ที่หน้า Things ว่างๆ (No devices yet)ที่ยังไม่มี devices หรือ things ขึ้นมาโชว์นะคะThings pageเราจะกลับเข้าไปที่หน้า Things ได้ยังไง?…. มี 2 options ค่ะ …..gateway.local —ถ้าหากเราเชื่อมต่อ network เดียวกันกับ gateway นะคะ 2. [your_subdomain].mozilla-iot.org — ถ้าหากจะเข้าผ่านมือถือ คอมพิวเตอร์ ที่เชื่อมต่อ network อื่นค่ะ โดยที่ [your_subdomain]คือชื่อที่เราตั้งไว้ตอนติดตั้ง gateway ค่ะถึงตรงนี้…. ถ้าใครไม่สามารถเข้าไปหน้า Things แบบข้างบนได้ ….ให้หันไปเชคที่ Pi ก่อนนะคะ ว่าลืมเสียบปลั๊กไฟรึป่าว หรือ รอให้ Pi บูธสักแปบ และ เชค network ที่เชื่อมต่อบนคอมพิวเตอร์ หรือ มือถือ ค่ะ แล้วเลือก option 1 หรือ 2 ให้ตรงกับเงื่อนไขของ network ที่เราเชื่อมต่ออยู่ค่ะ แล้วลองเข้าใหม่ค่ะเริ่ม scan หา device ด้วยการกดปุ่ม (+) ล่างขวาได้เลยค่ะตัว gateway จะเริ่มค้นหา device ค่ะ จะเห็น Scanning for new devices…สักพัก จะเห็น No new things found และมี option ให้ ว่าจะเลือก โดยผ่าน add-ons หรือว่า URLถึงตรงนี้เราไม่ได้ทำผิดตรงไหนนะคะ ที่มันไม่เจอ เพราะเรายังไม่มี thing เพิ่มเข้าไปนั่นเองค่ะ…และในเมื่อเค้าเคลมแล้วว่า platform เค้าเชื่อม things ได้ ด้วย URL เราก็จะเลือกใช้วิธีเพิ่ม thingsโดยผ่าน URL กันค่ะ…สิ่งที่ต้องเตรียม สำหรับการทำ Thing ก็คือ…บอร์ด ESP32 Arduino IDE ….เริ่ม Installation กันก่อนนะค่ะ….เพิ่ม ArduinoJson และ webthings-arduino libraries ก่อนค่ะSketch > Include Library > Manage Libraries2. เปิด LED example เลยค่ะ File > Examples > webthings-arduino > LED/** * Simple server compliant with Mozilla's proposed WoT API * Originally based on the HelloServer example * Tested on ESP8266, ESP32, Arduino boards with WINC1500 modules (shields or * MKR1000) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */#include <Arduino.h>#include "Thing.h"#include "WebThingAdapter.h"//TODO: Hardcode your wifi credentials here (and keep it private)const char* ssid = "public";const char* password = "";#if defined(LED_BUILTIN)const int ledPin = LED_BUILTIN;#elseconst int ledPin = 13; // manually configure LED pin#endifWebThingAdapter* adapter;const char* ledTypes[] = {"OnOffSwitch", "Light", nullptr};ThingDevice led("led", "Built-in LED", ledTypes);ThingProperty ledOn("on", "", BOOLEAN, "OnOffProperty");bool lastOn = false;void setup(void){ pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); Serial.begin(115200); Serial.println(""); Serial.print("Connecting to \""); Serial.print(ssid); Serial.println("\"");#if defined(ESP8266) || defined(ESP32) WiFi.mode(WIFI_STA);#endif WiFi.begin(ssid, password); Serial.println("");// Wait for connection bool blink = true; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); digitalWrite(ledPin, blink ? LOW : HIGH); // active low led blink = !blink; } digitalWrite(ledPin, HIGH); // active low ledSerial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); adapter = new WebThingAdapter("w25", WiFi.localIP());led.addProperty(&ledOn); adapter->addDevice(&led); adapter->begin(); Serial.println("HTTP server started"); Serial.print("http://"); Serial.print(WiFi.localIP()); Serial.print("/things/"); Serial.println(led.id);}void loop(void){ adapter->update(); bool on = ledOn.getValue().boolean; digitalWrite(ledPin, on ? LOW : HIGH); // active low led if (on != lastOn) { Serial.print(led.id); Serial.print(": "); Serial.println(on); } lastOn = on;}เปลี่ยน ssid และ password ให้ตรงกับ wifi network ของเราก่อนนะคะLED pinใส่หมายเลย led pin ให้ตรงกับของบอร์ด เราด้วยนะคะ … จากนั้น ก็ upload ลงบอร์ดได้เลยค่ะThingDeviceเราจะกำหนด ThingDevice ด้วยชื่อ ‘Built-in LED’ ThingPropertyled เราที่ชื่อ Built-in LED จะมี property — ‘on’ 3. กลับมาที่หน้า Things แล้ว scan ใหม่ จะเจอ led ที่เราทำไว้บนบอร์ด esp32 มีชื่อว่า Built-in LED….. Hit save และ done เลยค่ะ…..newly added thing — Built-in LEDLED — OFFจะเห็นว่า led ของเราโผล่ขึ้นมาบนหน้า Things แล้วค่ะ LED — ONลองคลิกที่ led เราได้เลยค่ะ จะ toggle สถานะ ON — OFF ซึ่งจากโค้ดตัวอย่าง จะเป็น active low นะคะ เวลา ON ไฟ LED จะดับ และ เวลา OFF ไฟ LED จะ ติดค่ะTroubleshoot : ถ้าไฟ LED ไม่ติดนะคะ ลองกลับไปเช็คค่า ledPin อีกทีนะคะ ว่าตรงตามสเปคของบอร์ดเราที่ใช้รึป่าวเพื่อให้สมกับที่เป็น Smart Home Automation Platform นะคะ จะมาคอยเลื่อนเปิดปิดด้วยมือไม่ได้แล้ว ต่อไปเราจะสั่งงาน led ของเราด้วยการใช้ Rules ค่ะRulesตัว Rules ก็จะตาม logic ที่เป็น if (A) then (B) ค่ะ หรือจะเปลี่ยน if เป็น while ก็ได้ค่ะ ซึ่งหน้านี้ก็จะใช้งานง่ายค่ะ แค่ drag แล้วก็ dropเรามาลองตั้ง Rules ด้วยเวลาให้กับ led เราดูค่ะ ลาก Clock ให้เป็น input ค่ะ แล้ว ลาก led ให้เป็น outputตั้งเวลาที่ต้องการได้เลยค่ะ และ เลือก property (on/off) ค่ะ เพียงเท่านี้เราก็จะได้ระบบเปิดปิด led อัตโนมัติแล้วค่ะRules by time of the dayนอกจากนี้ยัง WebThing ยังสามารถเพิ่ม thing ด้วย add-ons ลองเล่นกันได้ค่ะ เผื่อใครจะมี device ที่อยู่ใน list ของ add-ons ก็สามารถเพิ่มเข้าไปโดยที่ไม่ต้องโค้ดได้เลยค่ะ รวมไปถึงอีก feature นึง ที่น่าสนใจ นั่นก็คือ FloorPlan ค่ะ เราสามารถอัพรูป svg ที่เป็น floor plan ของบ้านเราได้เลย แล้วเราก็สามารถที่จะลาก thing แต่ละตัวมาวางไว้ตามห้องได้เลยคะ สมกับที่เป็น Smar home automation นะคะ…FloorPlanFloorPlanอ้างอิงจากBuild Your Own Web ThingsWebThings Gateway for Raspberry Pi User Guide
โดย: Laris
| IoT
Yet Another Home Automation (1)
Mozilla’s WebThingsจากบทความ รู้จัก Home Assistant (1) - (4)เราได้ลองใช้หนึ่งใน Home Automation platform ที่ชื่อ ว่า Home Assistant ในการควบคุมเปิดปิดไฟกันไปแล้วนะคะในบทความนี้เราจะมาทำความรู้จักกับอีกหนึ่ง open platform ค่ะ ซึ่งก็คือ mozilla’s WebThings ค่ะmozilla เริ่มพัฒนา WebThings (เดิมใช้ชื่อว่า Project Things) ในปี 2017 ซึ่งเป็น platform สำหรับเชื่อมต่อ device ต่างๆเข้าด้วยกัน ด้วยการกำหนด url ให้แต่ละdevice เพื่อให้สามารถ monitor และ control ได้ผ่าน web และใช้ Web of Things หรือ WoT ( by W3C )การกำหนด url ให้แต่ละ device ก็จะช่วยให้ IoT ข้ามข้อจำกัดขึ้นมาอีกเลเวลนึงคะ ด้วยที่ว่าตอนนี้มี device มาจากหลากหลาย manufacturers หลากหลาย protocols หากการจะใช้ web technology ที่เป็น standard และใช้กันทั่วโลกอยู่แล้ว มาเป็นตัวเชื่อมต่อ device เหล่านี้ ก็คงจะช่วยประหยัดเวลาในการสร้าง platform ได้มากเลยค่ะThe Web of Things connects real-world objects to the World Wide Web.WoT ต้องการที่จะเป็น single platform ที่จะรวม device ต่างๆ หลากหลายยี่ห้อ ให้เป็นส่วนหนึ่งของ World Wide Web และให้สามารถเชื่อมต่อเข้าถึงกันได้ด้วย web technology ที่ใช้อยู่ และ เป็น standard ในปัจจุบัน เช่น HTML5, JavaScript WebThings ประกอบด้วย 2 ส่วนค่ะ WebThings Gateway เป็น web-based user interface ที่ใช้สำหรับ monitor/control smart home devices ค่ะ มี rules ที่สามารถทำ automation ได้ แนว ‘it this , then that…’ และมี add-ons สำหรับ smart home devices ที่มีในขายอยู่แล้วWebThings Framework สำหรับ developers ที่ต้องการพัฒนา web things เองในบทความนี้ เราจะทำ WebThings Gateway โดยใช้ Raspberry Pi 3 ค่ะ ไหนๆเราก็ใช้ใน บทความ สิ่งเล็กๆที่เรียกว่า beacon (1)-(7)กันแล้วนะคะ และ บทความถัดไป เราจะทำ web thing โดยใช้บอร์ด esp32 หรือถ้าใครจะสะดวกใช้ Smart home device อื่นๆ ก็สามารถใช้ได้นะคะ สามารถจาก ที่นี่ ได้เลยค่ะว่าตัวไหน นำมาใช้ได้บ้าง …..สิ่งที่ต้องมีนะคะ….Raspberry Pi 3Note : ถ้าใครอยากจะทำโดยใช้ smart home device ที่ใช้ zigbee หรือ z-wave จำเป็นต้องมี usb dongle แต่เราจะไม่พูดถึงวิธีการใช้สอง protocols ในบทความนี้และบทความถัดไปนะคะ เราจะใช้ WIFI ค่ะ)zigbee และ z-wave เป็นอีก protocols ที่ใช้ใน home automation ค่ะ… มาเข้าสู่ขั้นตอนวิธีทำ WebThings Gateway กันเลยค่ะ…Download image สำหรับ WebThings Gateway กันก่อนค่ะ2. ได้ไฟล์ image มาแล้ว ก็ flash ลง sd card ได้เลยคะ โดยเราจะใช้ Etcher เช่นเคยค่ะ3. ใส่ sd card และ เสียบปลั๊กให้ Pi เลยคะ โดย Pi จะทำตัวเหมือนเป็น WiFi hotspot ค่ะ และ ใช้ชื่อว่า WebThing Gateway xxxx ( xxxx เป็น digits สี่ตัวที่ได้มาจาก Pi’s MAC address ค่ะ เช่น 16D1)ใ ห้เราเชื่อมต่อ กับ network นี้ก่อนนะคะ หรือหากใครจะต่อ Pi โดย ใช้สาย ethernet ก็ได้ค่ะ แล้วไปที่ gateway.local เพื่อเข้าหน้า setup ค่ะwelcome pageจะเจอหน้า Welcome เพื่อให้เลือกเชื่อมต่อกับ wifi network ของเราค่ะ หลังจากจากนั้นก็ทำการเชื่อมต่อกับ network ที่เลือกไว้นะคะถึงตรงนี้ จะให้เราตั้งชื่อ subdomain ค่ะสร้าง subdomain เสร็จ ก็จะ redirect เราไปที่หน้าถัดไปเพื่อสร้าง account ค่ะ Things pageสร้าง account เสร็จแล้วก็จะ login เราเข้าหน้า Things ค่ะ ซึ่งเป็น Progressive Web App นั่นหมายความว่า เราสามารถเพิ่มหน้านี้ไปที่หน้า homescreen บนมือถือเราได้เลยค่ะ.. สะดวกดีนะคะเสร็จแล้วค่ะ สำหรับการทำ WebThings Gateway……บน Raspberry Pi แต่จะเห็นว่า ยังไม่มี devices หรือ things บนหน้าเวปนะคะ บทความถัดไปเราจะมาเพิ่ม things ด้วย WebThings Framework กันค่ะ…..อ้างอิงจากHow to build your own private smart home with a Raspberry Pi and Mozilla’s Things Gateway
โดย: สุวิชา บัวคอม
| Security
Cross-Site Scripting แค่กดเข้าเว็บก็โดนแฮกด้วยสคริปอันตราย
Cross-Site Scripting แค่กดเข้าเว็บก็โดนแฮกด้วยสคริปอันตรายการโจมตีด้วยช่องโหว่ Cross-Site Scripting คือการที่แฮกเกอร์ทำสคริปเอาไว้เพื่อหวังผลให้เหยื่อมารันสคริปที่แฮกเกอร์ทำ โดยส่วนมากสคริปที่ใช้จะเป็นภาษา JavaScript โดยใช้เว็บไซต์เป็นสื่อกลางในการโจมตี โดยจะมีผลเฉพาะเว็บไซต์ที่มีช่องโหว่ Cross-Site Scripting เท่านั้น แฮกเกอร์ถึงจะใช้เว็บไซต์นั้นมาเป็นสื่อกลางในการโจมตีได้ โดยจุดประสงค์หลักคือ ทำยังไงก็ได้ ให้เหยื่อที่เข้าเว็บไซต์ที่มีช่องโหว่ รันสคริปที่แฮกเกอร์ทำไว้จากหน้าเว็บไซต์รูปแบบของ Cross-Site Script แบ่งเป็น 3 ประเภทหลักๆ Stored Cross-Site Scripting - เป็นการวางสคริปไว้ที่เว็บและเว็บเก็บค่านั้นไปประมวลผลที่หน้าเว็บReflected Cross-Site Scripting - แนบสคริปไปพร้อม request เช่น ส่ง url ไปพร้อมคำสั่งสคริป และหน้าเว็บนำคำสั่งสคริปไปประมวลผลหน้าเว็บDOM Based Cross-Site Scripting - การใช้ สคริปที่ติดไปกับ DOM Base หรือใช้วิธีอื่นๆทำให้เกิดสคริปใน DOMแล็บวันนี้จะเน้นไปที่การ bypass การป้องกันแบบต่างๆ โดยจะใช้ Web for Pentester จาก Pentester Lab ที่เคยใช้ใน EP1, EP4 และ EP5 มาเป็นแล็บ Cross-Site Scripting ในวันนี้มี Cross-Site Script ทั้งหมด 9 ตัวอย่างผมจะพาไปดูทั้งหมดเลย เพราะว่าเป็นช่องโหว่ที่ผมถนัดที่สุดใน OWASP Top 10 ซึ่งในแต่ละตัวอย่างจะมีมาตรการป้องกันในแต่ละแบบ จะต้องใช้วิธีการ bypass ท่าต่างๆ เพื่อให้สคริปนั้นรันได้โดนไม่ติดการป้องกัน ปล. Payload ในแล็บอาจจะมี %20 %27 บ้าง คือการทำ URL encode %20 คือช่องว่าง 1 space และ %27 ก็คือ “ ' ” (Single quote)Example 1 - เป็นการนำค่าที่รับมาจาก parameter ชื่อ name มาแสดงบนหน้าเว็บแบบไม่ป้องกันอะไรเลยเมื่อเราใส่ <script>alert('Digital Skill')</script> เข้าไปเป็นค่าของ parameter ชื่อ name ก็จะเกิด alert ขึ้น นั่นคือ สคริปเราสามารถทำงานบนเว็บไซต์นี้ได้http://192.168.56.104/xss/example1.php?name=<script>alert('Digital Skill')</script>Example 2 - มีการดักค่า <script> และ </script> รอบนี้ท่าเดิมจะใช้ไม่ได้แล้ว เพราะว่ามีการดักค่า <script> และ </script> เมื่อมี 2 คำนี้เข้ามาจะถูกแทนที่ด้วยค่า ว่าง ทำให้ผลที่ออกมาไม่มีการนำค่า <script> และ </script> ไปแสดงด้วย แต่ว่าก็ยังเขียนดักมาไม่ดีโดยการเช็คค่านั้น ดักคำว่า script ที่เป็นตัวพิมพ์เล็กเท่านั้น แฮกเกอร์สามารถใช้ ตัวพิมพ์ใหญ่เข้าไปแทนที่ตัวอักษรใดก็ได้ ก็จะสามารถ bypass การป้องกันได้แล้ว แต่ว่าก็ยังเขียนดักมาไม่ดีโดยการเช็คค่านั้น ดักคำว่า script ที่เป็นตัวพิมพ์เล็กเท่านั้น แฮกเกอร์สามารถใช้ ตัวพิมพ์ใหญ่เข้าไปแทนที่ตัวอักษรใดก็ได้ ก็จะสามารถ bypass การป้องกันได้แล้ว http://192.168.56.104/xss/example2.php?name=<scRipt>alert("Digital%20Skill")</scRipt>Example 3 - ดักค่า <script> และ </script> แบบ case insensitive ตัว i ที่อยู่ด้านหลัง /<script>/ และ /<Vscript>/ คือการ บ่งบอกว่าเป็น case insensitive หมายถึง ไม่ว่าจะใช้ตัวพิมพ์ใหญ่หรือพิมพ์เล็ก ก็จะให้ความหมายเหมือนกัน แต่ว่าค่าที่ดักนั้น ถูกเช็คแค่ 1 ครั้งต่อ 1 ค่า และแทนที่ค่านั้นด้วยค่าว่างเปล่า เมื่อมาคิดดูเมื่อเราใส่คำว่า<sc<script>ript> ระบบจะเห็นค่า <script> และแทนที่ค่านั้นด้วยค่าว่าง กลายเป็น <script> เมื่อได้แบบนี้แล้ว เราก็สามารถสร้าง payload ในการโจมตีได้แล้วดังนี้http://192.168.56.104/xss/example3.php?name=<sc<script>ript>alert(%27Digital%20Skill%27)</sc</script>ript>Example 4 - เจอค่านี้แบบ case insensitive ให้แสดง error เมื่อเจอการดักค่าแบบนี้ เราจะไม่สามารถใช้แท็ก <script> ได้เลย ไม่ว่าจะเป็นตัวพิมพ์ใหญ่หรือพิมพ์เล็ก เราต้องหาทางใช้แท็กอื่น มาสั่งรัน JavaScript ไม่ว่าจะเป็น แท็ก <img> แท็ก <div> หรืออื่นๆ ที่สามารถใส่ event ในแท็กนั้นได้ก็จะสามารถสอดแทรกคริปเข้าไปได้ โดยผมจะใช้ event ชื่อ onmousemove จะทำงานเมื่อมีการขยับเมาส์ โดยมี payload การโจมตีหน้าตาแบบนี้http://192.168.56.104/xss/example4.php?name=%3Cdiv%20onmousemove=%22alert(%27Digital%20skill%27)%22%3Eเมื่อเหยื่อเปิดเว็บด้วย URL ด้านบนและทำการขยับเมาส์แล้ว สคริปก็จะถูกร้น ที่เลือก event ชื่อ onmousemove มาใช้ก็เพราะว่ามีความเป็นไปด้วยน้อยมากที่มีคนเข้าเว็บแล้วไม่ขยับเมาส์ (ใช้ touchpad หรือ trickpad ถ้าเลื่อน cursor ก็นับเป็น event onmousemove)Example 5 - มีการป้องกันการใช้คำว่า alert ทั้งพิมพ์เล็กและพิมพ์ใหญ่ในทางปฏิบัติจริงๆ แล้วเราจะไม่ใช้คำสั่งที่เป็นการแสดงข้อมูลออกมาอยู่แล้ว การป้องกันการใช้ alert เป็นการป้องกันที่ผิดวิธี ยังมีคำสั่งอื่นๆอีกมากมายในการใช้โจมตี แต่คนส่วนมากมักจะใช้คำสั่ง alert ในการพิสูจน์ว่าสามารถใช้คำสั่ง javascript ได้  แต่คำสั่งในการแสดงหน้าต่างออกมานอกจากคำสั่ง alert แล้ว ยังมีคำสั่งอื่นๆ อีก โดยผมจะใช้คำสั่ง confirm แทนดังนี้http://192.168.56.104/xss/example5.php?name=%3Cscript%3Econfirm(%27Digital%20Skill%27)%3C/script%3EExample 6 - รับค่าไปเก็บในตัวแปร $a รวมกับคำสั่ง echo อยู่ภายในแท็ก <script>ค่าที่รับไปใช้ อยู่ภายในแท็ก <script> แล้วเรียบร้อย ดังนั้น payload ของเราจึงไม่ต้องใส่แท็ก <script> เข้าไปเพิ่มแต่ในครั้งนี้จะเก็บค่าลงในตัวแปรเฉยๆ ไม่มีการเรียกใช้ตัวแปรนั้น การ bypass ของเราคือต้องปิดการเก็บค่านั้นแล้วสร้างคำสั่งใหม่ จากเดิมที่เป็น <script>var $a= "<?php echo $)GET["name"], ?>";</script>ค่าที่ใส่เข้าไปจะอยู่ตรงที่ผม highlight แดงไว้ โดยจะใส่ "; เข้าไปปิดการรับค่าในตัวแปรและทำการ comment ด้วย // ต่อด้านหลังเพื่อเป็นการบอกว่าไม่ใช้สคริปที่อยู่ด้านหลัง // ที่ใส่ไปเมื่อใส่ค่า name="; // เข้าไป code จะถูกเปลี่ยนแปลงเป็นรูปแบบนี้ var $a ="<?php echo"; // ?>";ส่วนที่ highlight เขียวไว้หมายถึงการเก็บค่า <?php echo ลงในตัวแปร $a และจบ statement ของภาษา php แล้ว เราสามารถเติมคำสั่งต่อด้านหน้า // ก่อนที่จะ comment ได้เลย โดยผมจะใส่ alert เข้าไปตามเดิม จะได้ payload ดังนี้ name="; alert('Digital Skill'); // จะได้ URL ดังนี้http://192.168.56.104/xss/example6.php?name="; alert('Digital Skill'); // var $a ="<?php echo"; alert('Digital Skill");// ?>";โดย code จะแยกเป็น 2 คำสั่ง คือ เก็บค่า <?php echo ลงในตัวแปร $a และ alert ที่เราใส่ไปแยกกันExample 7 - มีการใช้ฟังก์ชัน htmlentities() เพื่อแปลงอักขระพิเศษฟังก์ชัน htmlentities() ที่นำมาใช้ไม่ได้มีการเซ็ต flag หรือ option โดยค่าเริ่มต้นจะใช้เป็น ENT_COMPAT | ENT_HTML401. ENT_COMPAT คือการแปลงแค่ค่า " (double-quotes) และเหลือแค่ ' (single-quotes) ไว้ENT_HTML401 คือการใช้ภาษา HTML เวอร์ชัน 4.01 ในการจัดการโค้ดรายละเอียดเพิ่มเติมเกี่ยวกับ ฟังก์ชัน htmlentities() ดูได้ที่https://www.php.net/manual/en/function.htmlentities.phpโดยผมจะใส่ ';alert(1);// เข้าไป หลักการจะเหมือนกันกับ Example 6 คือแยกเป็น 2 คำสั่งvar $a='<?php echo htmlentities(';alert(1);//); ?>;จะได้ URL ดังนี้http://192.168.56.104/xss/example7.php?name=%27;alert(1);//Example 8 - ค่าที่รับมาถูกจัดการเป็นอย่างดีแล้วครั้งนี้เป็นการใช้ฟังก์ชัน htmlentities() กับ " (double-quote) ทำให้จัดการกับค่า name ที่รับมาได้เป็นอย่างดีแล้ว แต่ปัญหาอยู่ที่การใช้ $_SERVER[PHP_SELF] โดย $_SERVER[PHP_SELF] นี้คือการเรียก path ของหน้าเว็บปัจจุบัน ถ้าเราใส่สคริปเข้าไปใน URL จะถูกเรียกมาใช้ หน้าเว็บนี้ใช้ $_SERVER[PHP_SELF] ไว้ใน form เป็นการส่งค่าจาก form หน้าเว็บแล้วส่งไปที่หน้าปัจจุบัน <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">เมื่อเราใส่ payload " onmousemove="alert('Digital Skill') ใน form เมื่อมีการขยับเมาส์จะทำให้ JavaScript ถูกรัน ค่าที่ใส่เข้าไปจะไปเป็น event ที่แทรกอยู่ในแท็ก <form><form action="<?php echo " onmousemove="alert('Digital Skill') ?>" method="POST">จะได้ URL ดังนี้http://192.168.56.104/xss/example8.php/" onmousemove="alert('Digital Skill')และเมื่อขยับเมาส์ก็จะเกิด alertExample 9 - DOM Basedเป็นการนำค่าจาก hash หรือ # มาแสดงที่หน้าเว็บเมื่อใส่ สคริปเข้าไปด้านหลัง # ก็จะถูกนำมารัน จะได้ URL ดังนี้http://192.168.56.104/xss/example9.php#%3Cscript%3Ealert('Digital%20Skill')%3C/script%3Eโดย web browser เวอร์ชันใหม่ๆ จะมีการป้องกันไว้ให้แล้วตั้งแต่ติดตั้ง/อัพเกรด
โดย: สุวิชา บัวคอม
| Security
Security Misconfiguration ตั้งค่ามั่ว เปิดรูรั่วให้แฮกเกอร์
Security Misconfiguration คือช่องโหว่เกี่ยวกับการตั้งค่าความมั่นคงปลอดภัย โดยสามารถเกิดได้ทุกที่ในระบบที่มีการตั้งค่า สาเหตุหลักเกิดจากการตั้งค่าอย่างไม่มั่นคงปลอดภัยหรือใช้ค่าตั้งต้น ที่ไม่มั่นคงปลอดภัยมาตั้งแต่ต้นอยู่แล้ว เกือบทุกระบบสามารถเกิดการตั้งค่าที่ไม่มั่นคงปลอดภัยเกิดขึ้นได้ ยกตัวอย่างเช่น การติดตั้งอุปกรณ์เราเตอร์ ไม่ว่าจะใช้อุปกรณ์เราเตอร์ที่เราซื้อมาเอง หรือ ใช้อุปกรณ์จากผู้ให้บริการอินเทอร์เน็ต โดยชื่อผู้ใช้และรหัสผ่านที่ติดตั้งมาพร้อมอุปกรณ์ เป็นค่าที่สามารถหาได้ง่าย อาจจะค้นจาก search engine หรือใช้วิธีการเดาก็ได้ โดยส่วนมากชื่อผู้ใช้จะเป็นคำว่า admin และรหัสผ่านเป็นคำว่า password หรือถ้าอยากเจาะจงอุปกรณ์แต่ละรุ่นเราก็สามารถคนหาชื่ออุปกรณ์ และตามด้วยคำว่า default password ได้ ยกตัวอย่างเช่นรูปภาพด้านล่างนี้ อ้างอิงจาก https://proprivacy.com/guides/default-router-login-detailsสาเหตุที่ทำให้เกิดช่องโหว่ Security Misconfiguration มีดังตัวอย่างต่อไปนี้ไม่มีการตั้งค่าความมั่นคงปลอดภัยให้กับระบบติดตั้งหรือเปิดใช้โปรแกรมหรือคุณสมบัติที่ไม่จำเป็นไม่มีการเปลี่ยนแปลงบัญชีและรหัสผ่านที่มาพร้อมกับการติดตั้งดังตัวอย่างที่กล่าวไปด้านบนการจัดการข้อความ error ได้ไม่ดีทำให้มีข้อมูลสำคัญหลุดไปพร้อมกับการเกิด errorการปิดใช้งานคุณสมบัติความมั่นคงปลอดภัยของระบบไม่ได้ตั้งค่า framework, library, database และส่วนประกอบอื่นๆที่เราเรียกใช้ ให้เป็นค่าที่มั่นปลอดภัยการตั้งค่า security headers ให้เป็นค่าที่ปลอดภัยการใช้ software ที่ล้าสมัย โดยหากยังไม่เข้าใจในแต่ละหัวข้อที่ว่ามานี้ สามารถเอาคำในหัวข้อนั้นๆ ไปค้นหาข้อมูลเพิ่มเติมได้เลยหัวข้อที่ว่ามานี้นอกจากจะเกิดช่องโหว่ของการตั้งค่าที่ไม่ปลอดภัยแล้วยังสามารถถูกนำข้อมูลไปใช้ในการโจมตีช่องโหว่อื่นๆ หรือเกิดเป็นช่องทางในการโจมตีจากช่องโหว่อื่นๆได้อีกด้วยและช่องโหว่ที่เราจะไปทำแล็บในวันนี้มีชื่อว่า Fail Open Authentication Scheme คือการมีมาตรการยืนยันตัวตนที่ไม่มั่นคงปลอดภัย โดยในแล็บมีการเป็นการจำลองสถานการณ์ว่า มี error message บอกรายละเอียดการเข้าสู่ระบบหลุดออกมา ถ้าจะให้เห็นภาพ ไปเริ่มแล็บกันเลยดีกว่าในแล็บของ EP นี้ ผมจะใช้เป็นแล็บ WebGoat ที่เคยใช้ใน EP2 ```วิธีการติดตั้งแล็บ WebGoat โดยใช้ Dockerสำหรับผู้ที่ยังไม่มี Docker ในเครื่องสามารถดาวน์โหลดและติดตั้ง Docker ได้ที่ URL ด้านล่างนี้:https://www.docker.com/get-started เมื่อติดตั้ง Docker เสร็จแล้วให้ดาวน์โหลด Docker Image ของ WebGoat ผ่านคำสั่ง docker pull ดังนี้:docker pull webgoat/webgoat-7.1เมื่อได้ Docker Image มาแล้วให้สั่ง docker run เพิ่มเริ่มใช้งาน Docker Image โดยจะใช้ port ในการเข้าใช้งานเป็น port 8080docker run -p 8080:8080 -t webgoat/webgoat-7.1เมื่อ run ขึ้นมาสำเร็จแล้วเราจะสามารถเข้าแล็บของเราได้ผ่าน http://127.0.0.1:8080/WebGoatหรือhttp://localhost:8080/WebGoat เข้ามาแล้วจะเจอหน้า Login ให้เราเข้าผ่าน Username: guest และ Password: guest``` เข้าแล็บผ่าน Web browser และเข้าไปที่เมนู Improper Error Handling → Fail Open Authentication Schemeจะเห็น error message หลุดออกมาบอกว่า มีปัญหาในการจัดการ error ของกลไกการรับรองตัวตน ทำให้มีการเข้าสู่ระบบโดยไม่ต้องใช้รหัสผ่านได้ โดยให้เราล็อกอินด้วย user ชื่อ webgoat ก็คือ user ที่เราใช้ล็อกอินเข้าระบบนั่นเองโดยมี password คือ webgoat เหมือนกับ usernameเมื่อเราลองล็อกอินด้วย user ชื่อ webgoat และใช้ password เป็น webgoat จะพบว่าเราเข้าระบบได้ปกติ หน้านี้บ่งบอกว่าล็อกอินสำเร็จแต่ยังไม่ผ่านด่านนี้การเดา password ให้ถูกหรือใช้วิธีอื่นๆ ที่ไม่ตรงกับวิธีทำของหัวข้อนี้ในการเข้าสู่ระบบให้สำเร็จจะยังไม่ถือว่าผ่านได้ โดยวิธีตามที่ error บอกมานั้นคือการล็อกอินโดยไม่ต้องใช้ password เราก็ลองเลยอ้าวววว ไม่ได้ซะงั้น error หลอกเราแล้วหรือเปล่า ขึ้นข้อความมาบอกว่า “Invalid username and password entered.” ซะงั้นจริงๆแล้ว error ไม่ได้หลอกเราแต่ยังทำไม่ถูกที่เราทำไปเมื่อกี๊ก็คือ ส่งค่า Username=“webgoat”Password=”” เราส่ง password ไปด้วยแต่ password มันเป็นค่าว่างเปล่าครั้งนี้เรามาลองแบบไม่ต้องส่ง password ไปโดยการลบ field password ทิ้งไปเลย ผมจะใช้วิธีการ Inspect ใน google chrome browser แล้วลบ field password ออกทำดังน้ีคลิกขวาบนหน้าเว็บแล้วเลือก Inspect เลือกเครื่องมือ select element แล้วกดที่ช่องกรอก passwordจากนั้นลบ code ทิ้งโดยการคลิกขวาและเลือก delete elementช่องกรอก password จะหายไปเมื่อเรากดล็อกอินครั้งนี้ข้อมูลที่เราส่งไปก็จะมีแค่ Username แล้ว กด Login ได้เลยถ้าผ่านแล้วระบบจะขึ้นข้อความว่า Congratulations. You have successfully completed this lesson.
โดย: สุวิชา บัวคอม
| Security
Broken Access Control แหกกฎการควบคุมการเข้าถึงระบบ
Broken Access Control คือการควบคุมการเข้าถึงที่เราทำหรือจัดการไว้ถูกเข้าถึงได้จากแฮกเกอร์ที่มีสิทธิอยู่นอกเหนือจากที่เรากำหนดไว้ ผลที่เกิดอาจจะทำให้เปิดเผยข้อมูลที่ไม่ได้รับอนุญาตดัดแปลงหรือทำลายข้อมูลทั้งหมดหรือดำเนินการทางธุรกิจนอกขอบเขตของผู้ใช้ โดยช่องโหว่ Broken Access Control สามารถเกิดได้หลายช่องทางโดยมีจุดประสงค์หลักในการโจมตีคือการเข้าถึงระบบหรือข้อมูลที่อยู่นอกเหนือขอบเขตของผู้ใช้ที่ควรจะใช้ได้ โดยตัวอย่างการโจมตีมีดังต่อไปนี้ การ bypass การตรวจสอบการเข้าถึงระบบ หรือระบบไม่ได้มีการตรวจสอบ แฮกเกอร์จะโจมตีโดยวิธีการแก้ไข URL หรือดัดแปลง API สำหรับเข้าถึงข้อมูลหรือระบบการอนุญาตให้เปลี่ยนเปลี่ยนรหัสผ่านของผู้ใช้คนอื่นได้การยกระดับสิทธิ์ผู้ใช้ในระบบโดยไม่ต้อง login เข้าสู่ระบบ หรือ login เข้าสู่ระบบโดยมีระดับสิทธิ์เป็น admin โดยที่ login เป็นผู้ใช้ปกติปลอมแปลงหรือทำการ replay ข้อมูลจำพวก token ที่ใช้ควบคุมสิทธิ์ของผู้ใช้การอนุญาตให้ใช้ API ที่ผู้ใช้ทั่วไปไม่ควรมีสิทธิ์ใช้โดยไม่มีมาตรการจัดการการเข้าถึงการอนุญาตให้เข้าถึง API ที่มีสิทธิพิเศษโดยไม่มีมาตรการควบคุมการเข้าถึงและยังมีวิธีอื่นๆ อีกมากมายไปลองแล็บกันเลยดีกว่า โดยครั้งนี้จะใช้แล็บ Web For Pentester ที่ได้เคยเล่นกันไปแล้วใน EP1 และ EP4 โดยในหน้าเว็บจะมีเมนู Directory traversal แต่ไม่มีลิงค์ให้กดเข้า แต่เป็นรูปภาพแทนดังนั้นเราจึงต้อง Inspect เพื่อดูโค้ดเพื่อหาข้อมูลต่อไป โดยวิธีการ Inspect ถ้าใช้ Google Chrome Browser จะทำได้โดยการ คลิกขวาและเลือก Inspectจากนั้นจะได้หน้าต่างแบบนี้โผล่ขึ้นมาโดยส่วนมากหน้าต่างนี้จะอยู่ด้านล่าง ใครที่เปิดมาแล้วหน้าต่างไปอยู่ด้านอื่นไม่ต้องตกใจ เราสามารถเปลี่ยนได้ ตรงปุ่ม นี้เลยแล้วเลือกฝั่งที่อยากให้หน้าต่างนี้อยู่ เมื่อได้แล้วจะเห็น code  หน้าตาแบบนี้เป็นการใช้คำสั่งเรียกไฟล์โดยหน้าเว็บที่เขียนด้วยภาษา php ลองเข้าไปดูกันhttp://192.168.56.104/dirtrav/example1.php?file=hacker.pngจะเห็นว่าไฟล์รูปภาพ ถูกเรียกมาที่หน้าเว็บอีกทีการเรียกไฟล์มาแสดงแบบนี้มีความเป็นไปได้ว่าแฮกเกอร์จะเข้ามาเปลี่ยนค่าของ parameter ที่ชื่อ file ให้ไปเรียกไฟล์อื่นๆ อาจมีบางคนสงสัยว่าเราจะรู้ได้อย่างไรว่าไฟล์อื่นๆชื่ออะไร มีไฟล์อะไรบ้าง ซึ่งถ้าให้เดาสุ่มทีละไฟล์คงยากที่จะเจอแต่ละไฟล์ ดังนั้นการแฮกเกอร์ส่วนมากจึงมักจะเข้าหาไฟล์ที่สำคัญที่มักจะเก็บอยู่ใน well-known path (ตำแหน่งไฟล์ที่มักจะรู้กันอยู่แล้วว่าอยู่ที่ไหน) ซึ่งตัวอย่างที่จะทำก็คือ ไฟล passwd ที่อยู่ใน /etc/passwd นั่นเองมาเริ่มหากันเลย ซึ่งการที่เราจะไปเรียกไฟล์นั้นไฟล์ /etc/passwd นั้นไม่สามารถเรียกได้โดยตรงเพราะว่าไฟล์ถูกเรียกจาก directory ที่เก็บรูปในเว็บ เราจึงต้องใช้ .. ช่วยโดย .. นี้คือการอ้างถึง directory ก่อนหน้าที่เราอยู่ เช่นเราอยู่ที่ /a/b/c/d ถ้าเราเรียกถึง .. จากตรงนี้ก็คือการที่เราเรียกถึง /a/b/c เราจะเรียกถึง directory ก่อนหน้าซ้อนทับกันหลายๆรอบเพื่อนให้ไปถึง root path (ตำแหน่งที่เก็บไฟล์ที่อยู่ลึกสุดของระบบ) โดยใช้ .. ที่ว่ามาด้านบน แล้วคั่นด้วย / เพื่อเรียกซ้อนทับกันหลายครั้งนำมาใส่ในค่าของ parameter ชื่อ file จะได้ลิงค์เป็นแบบนี้http://192.168.56.104/dirtrav/example1.php?file=../etc/passwdจะเจอหน้าว่างเปล่าแสดงว่ายังไม่เจอไฟล์ ให้เราเพิ่มจำนวน ../ เพื่อเรียกถึง directory ก่อนหน้าซ้อนทับกันไปเรื่อยๆจนเจอไฟล์ passwd จะได้ลิงค์มาแบบนี้http://192.168.56.104/dirtrav/example1.php?file=../../../etc/passwdโดยเรียกซ้อนทับกันทั้งหมด 3 ครั้ง จะเจอข้อมูลของไฟล์ passwd ที่หน้าเว็บเรียกมาแสดง
โดย: สุวิชา บัวคอม
| Security
XML External Entities (XXE) Processing แฝงคำสั่งเรียกทรัพยากรณ์มากับ XML
EP4 | XML External Entities (XXE) Processing แฝงคำสั่งเรียกทรัพยากรณ์มากับ XMLก่อนจะไปรู้จักช่องโหว่ XML External Entities Processing ผมจะพาไปรู้จักกับ XML อย่างคร่าวๆ กันก่อน XML ย่อมาจาก Extensible Markup Language เป็นการ encode (แปลงรหัส) เอกสารให้อยู่ในรูปแบบ ที่สามารถอ่านได้ทั้งคนแล้วก็เครื่อง รูปแบบของ XML จะคล้ายๆกับภาษา HTML ที่ใช้แท็ก <> และปิดด้วย </> ดังตัวอย่างนี้<message><from>Groot</from><subject>Message from Groot to Rocket</subject><body>I am Groot</body></message>โดยจะมี Document Type Definition (DTD) เป็นมาตรฐานในการตรวจสอบข้อมูลที่ได้รับมาจากภายนอก กำกับเอกสารไว้ กำกับไว้ด้านบนดังนี้<?xml version="1.0" ?><!DOCTYPE message [<!ELEMENT message (to,from,subject,body)><!ELEMENT from (#PCDATA) <!ELEMENT to (#PCDATA)<!ELEMENT subject (#PCDATA) <!ELEMENT body (#PCDATA)]><message><from>Groot</from><to>Rocket</to><subject>Message from Groot to Rocket</subject><body>I am groot</body></message>อธิบายจากโค้ดตามลำดับดังนี้!DOCTYPE message เป็น root element (element ใหญ่สุด) ของเอกสารนี้ ที่มี element !ELEMENT message บรรจุ element ไว้ 4 ตัว คือ to, from, subject, และ body!ELEMENT from, to, subject, และ body ที่มี (#PCDATA) เป็นการประกาศว่า แต่ละตัวเป็นข้อมูลประเภท Parsed Character Data การใช้ XML แล้วอาจจะมี หรือ ไม่มี DTD ก็ได้ โดยการใช้ DTD จะแบ่งออกเป็น 2 ประเภทคือ External และ Internalตัวอย่าง DTD แบบ External<?xml version="1.0"?><!DOCTYPE message SYSTEM "message.dtd"><message> <from>Groot</from><to>Rocket</to><subject>Message from Groot to Rocket</subject><body>I am groot</body></message>เป็นการ import ไฟล์ message.dtd จากภายนอกเข้ามาในเอกสาร XML ด้วยการกำหนดผ่าน keyword ที่ชื่อ SYSTEMปล. ตอนนี้อาจจะงง เดี๋ยวจะมีแล็บให้ลองตัวอย่าง DTD แบบ Internal<!ENTITY name "Groot"><!ENTITY author "I am &name;"><author>&author;</author>จากด้านบนเป็นการสร้าง entity สองตัวและเรียกใช้ซ้อนกันจะได้ผลลัพธ์ออกมาเป็น<author>I am Groot</author>เมื่อเราเข้าใจ XML อย่างคร่าวๆแล้วเราก็มาลองทำแล็บ กันเลยก่อนที่จะเริ่มผมไม่ได้ลืมบอกนะครับว่าช่องโหว่ XXE คืออะไรผมอยากให้ลองทำแล็บกันดูก่อนแล้วคิดดูเองว่า XXE ที่ทุกคนเข้าใจจากการได้ลองทำแล็บ จะเหมือนที่ผมเขียนไว้หรือเปล่าถ้าพร้อมแล้วเรามาเริ่มกันเลย ในครั้งนี้จะพาเล่นแล็บจาก Vulnhub
โดย: Laris
| IoT
IoT Connectivity
LPWAN — Low-Powered Wide Area Networkถ้าจะพูดถึงคำว่า IoT หรือ Internet of Things นะคะ หรือ การเอา Things มาเชื่อมต่อกัน เพื่อให้มีการแลกเปลี่ยนข้อมูลกัน จะเห็นว่าคำว่า IoT ไม่ได้หมายถึงแค่ device /sensor หรือ application เพียงอย่างเดียวนะคะ IoT Connectivity ก็เป็นส่วนผสมหลักในการทำให้ Things เหล่านี้ สามารถพูดคุยสื่อสารกันได้ด้วย Data Protocol อย่างเช่น MQTT ที่เราได้พูดถึงกันค่อยข้างละเอียดกันไปแต่ต้นแล้วนะคะ ซึ่งในปัจจุบัน มีการนำ IoT เข้ามาใช้งานจริงจัง ในหลายๆภาคอุตสาหกรรม ที่เห็นเป็นตัวอย่างได้ชัดเจนก็พวก IoT Application ต่างๆ ที่ขึ้นต้นด้วยคำว่า Smart นี่แหละค่ะ ไม่ว่าจะเป็น Smart City, Smart home, หรือ Smat Farmงาน IoT Application ส่วนใหญ่ก็จะมีลักษณะการใช้งานที่คล้ายกันค่ะ คือ ต้องตอบโจทย์หลักสำคัญๆเลยที่ว่า….ต้องใช้ พลังงานน้อยๆ (low enery consumption) ต้องส่งข้อมูลน้อยๆ (low data rate) ต้องสามารถส่งได้ในระยะทางที่ไกลๆ (long range) และที่สำคัญอีกอย่างนะคะ ต้องใช้งบน้อยๆค่ะ (cost effectiveness) และด้วยลักษณะเฉพาะตัวในการใช้งานของ IoT Application ข้างต้นนี้ Network Technology ที่มีอยู่ อาจจะไม่ตอบโจทย์ความต้องการของ IoT Application ได้ซะทั้งหมดทีเดียว เช่น Bluetooth ก็จะมีข้อเสียตรงที่ไม่ครอบคลุมพื้นที่ระยะไกลค่ะ (< 5km ) หรือ Cellular Communication เช่น 3G/4G สามารถให้การเชื่อมต่อครอบคลุมพื้นที่ได้ไกลกว่า 5 กิโลเมตร แต่ไม่ค่อยเป็นมิตรกับแบตเตอรี่ค่ะ (ไม่ตอบโจทย์เรื่อง battery consumption) และนี่ก็เป็นที่มาของ Wireless Technology อีกรูปแบบนึงค่ะ ที่เรียกว่า LPWAN หรือ Low-Powered Wide Area Network ค่ะ เพื่อให้เหมาะสมกับ IoT Application ค่ะ Figure -1 Network Technologies and Distancesที่จะได้ยินชื่อกันบ่อยๆ และค่อนข้างจะเป็น Standard หน่อย ก็จะมี Sigfox , LoRa, และ NB-IoT ค่ะ …ลองมาอ่านประวัติกันคร่าวๆค่ะ…SigfoxSigfox ถูกพัฒนาขึ้นมาโดยเน้นไปทาง LPWAN โดยบริษัท Sigfox ในฝรั่งเศสค่ะ ใช้ Standard และ Technology ของตัวเองค่ะ เช่น ใช้ modulation ที่ทำให้สามารถเพิ่มระยะในการรับส่งมากขึ้นLoRaแรกเริ่มเดิมทีถูกพัฒนาโดยบริษัท startup ในฝรั่งเศษ ชื่อ Cycleo ค่ะ หลังจากนั้นก็ถูกเปลี่ยนมือไปอยู่ภายใต้การดูแลโดย บริษัท Semtech ค่ะ LoRa ถูกกำหนดและควบคุมด้วย Standard ของ LoRa Alliance ค่ะNB-IoTหลังจากที่มี Sigfox และ LoRa บริษัทที่ทำเกี่ยวกับ cellular และ 3GPP เองก็อยากมีส่วนร่วมในตลาดของ LPWAN จึงได้เปิดตัว NB-IoT ขึ้นมาค่ะ และถูกควบคุมดูแล โดย 3GPP นั่นเองค่ะจากรูป Figure -1 Network Technologies and Distances จะเห็นว่า LPWAN มีทั้งแบบที่เป็น Licensed (NB-IoT) และ Unlicensed (Sigfox และ LoRa) ซึ่ง unlicensed band ก็จะมีข้อดีที่ว่าไม่ยุ่งยากค่ะ ไม่จำเป็น ต้องมี Service provider ช่วยลดต้นทุน แต่ก็จะมีปัญหาเรื่องสัญญาณรบกวนถ้าหากว่ามีการใช้คลื่นความถี่เดียวกัน ในพื้นที่เดียวกันค่ะ ด้วยความที่ว่าเป็น unlicensed band นะคะ ใครอยากจะใช้ก็ได้และในบทความถัดไป เราจะมาทำความเข้าใจ โดยละเอียดกับ LoRa กันค่ะอ้างอิงจากWhat is LPWAN and the LoRaWAN Open Standard?
โดย: Laris
| IoT
LPWAN Technologies
LoRa — LoRaWANจากบทความที่แล้ว เรื่อง IoT Connectivity ซึ่งก็จะพูดถึงซะเยอะในเรื่องของ LPWAN Technology นะคะ ทั้ง Sigfox, LoRa, และ NB-IoT เพราะความที่ LPWAN ค่อยข้างจะตอบโจทย์ความต้องการของ IoT application ได้ค่อนข้างดีเลยทีเดียวค่ะ ประหยัดพลังงานได้มากถึงขั้นที่ว่าใช้กันได้เป็นปีๆโดยไม่ต้องชาร์จหรือเปลี่ยนแบตเตอรีเลยค่ะ และใช้งานได้ในพื้นที่ห่างไกล(remote area)ในบทความนี้จะขออธิบายเพิ่มเติมเกี่ยวกับ LoRa ค่ะ ก่อนที่เราจะได้ลงมือทำกันค่ะLoRa หรือ LoRaWAN มักจะถูกเรียกแทนกันนะคะ(ผู้เขียนเองก็เคยสงสัยค่ะ ว่าต้องเรียกว่ายังไงกันแน่) แต่ความจริงแล้วในเชิงคำนิยามเค้ามีความหมายแตกต่างกันค่ะLoRaWAN Protocol (sources : Smart Makers, OpenIoT, )LoRa คือ Physical Layer Modulation ที่ถูกพัฒนาโดย Semtech ใน LoRaWAN protocol ซึ่งมีวิธีการ modulation มาจาก Chirp Spread Spectrum (CSS) modulation ที่ใช้ใน radar application ใน military และ space communication ค่ะ เพราะว่าสามารถใช้งานได้ในระยะทางไกล ใช้พลังงานน้อย และคลื่นถูกรบกวนได้น้อยค่ะ เพราะใช้คลื่น Sub 1GHZ ในแต่ละที่ก็จะใช้คลื่นความถี่ที่แตกต่างกันค่ะ เช่น ในอเมริกา ก็จะใช้ความถี่ที่ 915 MHZ ยุโรปก็จะใช้ความถี่ที่ 868 MHZ ในเอเชียว ก็จะใช้ความถี่ที่ 430 MHZ เป็นต้นค่ะmodulation คือการ modify คลื่นวิทยุ (radio signal)ธรรมดา ๆให้สามารถ carry ข้อมูลได้ค่ะส่วน LoRaWAN จัดว่าเป็น wireless communication standard เหมือนพวก Bluetooth, GSM, 4G, หรือ LTE และเพื่อให้เกิดความแตกต่างจาก LoRa , LoRa Alliance เลยใช้คำว่า LoRaWAN ในการอ้างอิงถึง architecture และ specification เวลาพูดถึง end-to-end LoRaWAN communications และ protocols ค่ะLoRaWAN ArchitectureLoRaWAN ประกอบด้วย End node (end device)Gateway (concentrator)Network serverApplication serverข้อมูลที่ถูกส่งจาก node มักจะถูกส่งไปยัง gateway หลายๆตัวค่ะ และ gateway เองก็จะส่งข้อมูลไปให้ network server ผ่าน cellular, Ethernet, Wi-Fi, หรือ satellite ข้อมูลที่ duplicate จะถูก de-duplicate ที่ network server และสุดท้ายแล้ว ข้อมูลจะถูกส่งไปที่ application server ซึ่งเป็น ข้อมูลที่ใช้ใน payload ของ LoRaWAN message ค่ะLoRaWAN TopologyLoRaWAN Star TopologyLoRaWAN topology จะเป็นแบบ “star of stars” topology ซึ่ง end node จะมีการแลกเปลี่ยนข้อมูลผ่าน gateway ที่ทำตัวคล้าย bridge และมี central LoRaWAN network serverLoRaWAN SecurityLoRaWAN Securityจากรูป LoRaWAN Security ค่ะ ในชั้นแรกที่เรียกว่า Network security ที่ MAC layer ค่ะ การันตี authentication ของ end node โดย network server และมีการ encrypt ข้อมูล โดยใช้ AES ค่ะแต่ละ end node ก็จะใช้ network session key (NwkSKey) ที่จะถูกใช้โดย ตัว end node เอง และ network server ค่ะ เพื่อให้มั่นใจเรื่อง data integrity ค่ะถัดไปในชั้นที่สองนะคะ application session key (AppSKey) จะถูกใช้ในการ encrypt/decrypt ระหว่าง end node และ application server ค่ะ เพื่อป้องกัน LoRaWAN service provider เข้าถึงตัว application payload หากไม่ได้รับอนุญาตค่ะอ้างจิงจากLoRaWAN simply explainedGonzalo Salgueiro; David Hanes; Rob Barton , IoT Fundamentals: Networking Technologies, Protocols, and Use Cases for the Internet of Things, 2017Pradeeka Seneviratne, Beginning LoRa Radio Networks with Arduino, 2019Perry Lea, Internet of Things for Architects, 2018
โดย: สุวิชา บัวคอม
| Security
Sensitive Data Exposure | ข้อมูลที่เป็นความลับถูกเปิดเผย
Sensitive Data Exposure ก็คือ ช่องโหว่ที่เป็นการเปิดเผยข้อมูลที่ควรเป็นความลับ อาจจะเปิดเผยโดยตั้งใจหรือไม่ตั้งใจ โดยมีวิธีการใดก็ตามที่ทำให้เกิดการเข้าถึงข้อมูลที่ควรเป็นความลับได้ จะถือว่าเป็นช่องโหว่ Sensitive Data Exposureโดยข้อมูลที่หลุดออกมานั้นอาจจะอยู่ในรูปแบบปกติ คือ คนทั่วไปสามารถอ่านเข้าใจได้ หรือ อาจจะต้องใช้ความรู้ในการเข้าหรัสหรือแปลงรหัสในการอ่าน เช่น ข้อมูลถูกแปลงด้วยการ ด้วยการเลื่อนตำแหน่งของตัวอักษรไป 13 ตำแหน่ง ดังตัวอย่างนี้จะแปลงอักษรของคำว่า ‘digitalskill’ ไป 13 ตำแหน่ง (วิธีการนี้เรียกว่า ROT13) ถ้าให้นับเลื่อนไป 13 ตำแหน่งทีละตัวอักษรก็จะทำให้ยุ่งยาก วิธีการที่ง่ายคือ ทำตารางของตัวอักษรมาทั้งหมด 26 ตัวอักษร จะเห็นได้ชัดว่า ตัวอักษรตัวไหนถูกแปลงไปเป็นตัวไหนPlain text (ตัวอักษรเดิมก่อนทำการแปลง)ROT13anbocpdqerfsgthuivjwkxlymznaobpcqdresftguhviwjxkylzmเมื่อเราแปลง ‘digitalskil’ ด้วยการใช้ ROT13 ก็จะได้เป็นคำว่า ‘qvtvgnyfxvyy’ ซึ่งอยู่ในรูปแบบที่คนทั่วไป อ่านไม่รู้เรื่อง ซึ่งข้อความที่พบจริงๆอาจจะเป็นพบเป็นการเลื่อนตัวอักษรที่จำนวนตำแหน่งไม่ใช่ 13 ก็ได้ นอกจากการแปลงข้อมูลแบบนี้ยังมีวิธีการแปลงข้อมูลแบบอื่นอีกมากมายที่เราจะมาเรียนรู้กันในแล็บ แล็บที่จะใช้ในหัวข้อ Sensitive Data Exposure นี้จะใช้แล็บ WebGoat ที่เคยสอนวิธีการติดตั้งและเรียกใช้งานไว้แล้วใน EP2 | Broken Authentication หากใครยังไม่ได้ติดตั้งสามารถเข้าไปดูได้เลย เปิดแล็บ WebGoat ขึ้นมาแล้วเข้าไปที่เมนู Insecure Storage → Encoding Basicsในแล็บจะเป็นพื้นฐานการแปลงข้อมูลโดยวิธีการแปลงข้อมูลเหล่านี้สามารถแปลงกลับมาให้อยู่ใน รูปแบบเดิมได้ ให้เราลองใส่คำว่า ‘digitalskill’ เข้าไป จากนั้นกดปุ่ม “Go!” แล้วดูผลลัพธ์แต่ละช่องซึ่งแบ่งเป็น 3 ส่วน Description (รายละเอียดของการแปลงรหัสแต่ละวิธี), Encoded (ข้อมูลหลังจากถูกแปลงแล้ว), และ Decoded (ข้อมูลเมื่อถูกแปลงกลับ) วิธีที่ 1 คือ Base64 จะเห็นว่าคำว่า ‘digitalskill’ ที่เราใส่ไปในช่อง Enter a string ถูกแปลงเป็น ‘ZGlnaXRhbHNraWxs’ เมื่อเรานำค่าที่ถูกแปลงแล้วไปใส่ในช่อง Enter a string จะได้ข้อมูลเดิมของเรากลับมาให้เห็นในช่อง Decoded วิธีที่ 2: Entity encodingเมื่อใส่ &lt; เข้าไป จะถูกแปลงกลับเป็นเครื่องหมาย “<”  ซึ่งเป็นการแปลงรหัส HTML Character Entities สามารถดู HTML Character Entities ตัวอื่นๆได้จากลิงก์นี้https://www.w3schools.com/html/html_entities.asp วิธีที่ 3: Password Based Encryption (PBE)เป็นการแปลงรหัสโดยมีใช้รหัสผ่านไปด้วย การที่จะแปลงรหัสกลับมาได้นั้นจะต้องมีรหัสผ่านที่ตั้งไว้ จึงจะสามารถแปลงกลับมาเป็นข้อความเดิมก่อนที่จะแปลงได้ในรูปแบบปกติ เราใส่คำว่า ‘digitalskill’ แบบไม่กำหนดรหัสผ่านสำหรับการแปลงจะได้คำว่า ‘EuQOKq5NtwBWN+x2RWnr2w==’ กลับมาเมื่อเราใส่คำว่า ‘EuQOKq5NtwBWN+x2RWnr2w==’ กลับเป็นก็จะเป็นข้อความที่ถูกแปลงกลับมาเป็นคำว่า ‘digitalskill’แต่ถ้าเราใส่รหัสผ่านเข้าไปด้วย ในที่นี้ผมใส่รหัสผ่าน ‘[email protected]’ และใช้ข้อความว่า ‘digitalskill’ ข้อความที่ได้หลังจากการแปลงคือ ‘igW0tz9kz7IlfxHZzcXOTA==’ เมื่อเรานำไปแล้วกลับโดยไม่รู้รหัสผ่าน จะไม่สามารถแปลงกลับเป็นข้อความเดิมได้และเมื่อเรารู้รหัสผ่านและใส่เข้าไปอย่างถูกวิธีก็จะสามารถแปลงกลับมาเป็นข้อความเดิมได้โดยวิธีการนี้จะมีความสัมพันธ์กับแล็บในบทความ Broken Authentication คือ ถ้าเราตั้งรหัสผ่านไว้ไม่ปลอดภัยจะถูกแกะรหัสได้ โดยความเร็วในการถูกแกะรหัสจะขึ้นอยู่กับความยาก-ง่าย ของรหัสผ่าน วิธีการอื่นๆ สามารถทดลองเล่นเองได้ตามในแล็บนี้เลยครับ

พบบทสัมภาษณ์ได้ที่นี่เร็ว ๆ นี้

พบDigital Skill บนสื่อ ได้ที่นี่เร็ว ๆ นี้

หมวดหมู่

พบหมวดหมู่ ได้ที่นี่เร็ว ๆ นี้

พบหมวดหมู่ ได้ที่นี่เร็ว ๆ นี้

Tags

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้