บทความ
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: Digital Skill
| Digital Skill
เปิดตัวโครงการ สมาคมโปรแกรมเมอร์ไทย x ทนายแมน โครงการที่จะช่วยแก้ปัญหาด้านกฏหมายต่างๆ ให้กับคน IT
เมื่อวันที่ 15 ธันวาคม 2562 สมาคมโปรแกรมเมอร์ไทยได้จัดงาน Code Mania 1010 ขึ้น ณ True Digital Park ถนนสุขุมวิท โดยในงานได้มีการเปิดตัวโปรเจกต์ใหม่ชื่อว่า "ทนายแมน" โดยคุณอิศเรศ ประจิตต์มุทิตา อุปนายกสมาคมโปรแกรมเมอร์ไทย เปิดตัวร่วมกับ ทนายความ อภิเชฏฐ์ วงศ์สันติสุข ผู้ร่วมก่อตั้งทนายแมน ซึ่งเป็นโปรเจกต์ที่ทำร่วมกับสำนักงานทนายความ มีจุดประสงค์เพื่อเป็นศูนย์กลางในการติดต่อหาทนายความและตัวกลางช่วยแก้ไขปัญหาต่าง ๆ ระหว่างผู้จ้างงานและผู้รับงานสำหรับโปรเจกต์ทนายแมนนี้ เกิดขึ้นเนื่องจากทางสมาคมได้เล็งเห็นถึงปัญหาระหว่างผู้จ้างงานและผู้รับงานที่มีมากมาย หลายครั้งที่จะมีฝ่ายใดฝ่ายหนึ่งเสียเปรียบเนื่องจากขาดความรู้ความเข้าใจด้านกฎหมาย สมาคมจึงอยากจะเป็นคนกลางที่ช่วยสามารถแก้ไขปัญหาให้กับผู้เสียเปรียบหรือผู้ที่อาจถูกเอาเปรียบได้โดยบริการหลักของทนายแมน ได้แก่ การติดต่อหาทนายความที่มีความเชี่ยวชาญในด้านนั้นๆ ,เป็นตัวกลางจ้างงาน, ตรวจสอบสัญญาและให้คำปรึกษาด้านกฎหมาย, ตรวจสอบเรื่อง พ.ร.บ. ข้อมูลส่วนบุคคล, whitelist ของผู้รับจ้างงานในสายโปรแกรมเมอร์ ฯลฯ โดยมีสิทธิพิเศษสำหรับสมาชิกสมาคมโปรแกรมเมอร์ไทยอีกด้วยทางสมาคมหวังเป็นอย่างยิ่งว่า "ทนายแมน" จะสามารถเป็นส่วนหนึ่งในการช่วยแก้ไขปัญหาต่าง ๆ เรื่องการจ้างงานของทุกคนได้ โดยสามารถเข้าไปดูรายละเอียดและติดต่อหาทนายความได้ที่ https://lawman.in.th/ พร้อมทั้งติดตามความรู้และข่าวสารต่าง ๆ ได้ที่ https://www.facebook.com/lawman.in.th/ ซึ่งจะมีการอัปเดตคอนเทนต์ทางด้านกฎหมายที่น่าสนใจ รวมถึงสามารถสอบถามข้อมูลเพิ่มเติมหรือต้องการปรึกษาทางด้านกฎหมายก็สามารถติดต่อได้เช่นกัน
โดย: สุวิชา บัวคอม
| Security
แนวทางการพัฒนาตนเองในสายแฮกเกอร์
จาก EP1 ถึง EP10 ที่ผ่านมาเราได้เรียนรู้พื้นฐานการแฮกเว็บกันไปคร่าวๆ แล้ว โดยมีตัวอย่างแล็บหลักๆ จากสองที่ คือPentester Lab ที่ผมได้นำแล็บ Web for Pentester มาให้ลองเล่นกัน นอกจาก Web for Pentester แล้ว ยังมีแล็บอื่นๆ ที่น่าสนใจอีกมากมายให้ลองเข้าไปเล่นตามความสนใจhttps://www.pentesterlab.com/exercises/ OWASP WebGoat ที่ลงผ่าน docker ในบทความผมพาเล่นแค่ไม่กี่หัวข้อเท่านั้น ยังมีหัวข้ออื่นๆ อีกมากมายให้ลองเล่นhttps://github.com/WebGoat/WebGoatนอกจากสองที่นี้แล้วยังมีที่อื่นๆ อีกมากมายให้ลองเล่น ผมจะมาแนะนำเพิ่มเติม โดยแยกเป็น 2 หมวดหมู่หลักๆ คือ หมวดที่เกี่ยวกับเว็บ และ หมวดอื่นๆ นอกเหนือจากเว็บหมวดเกี่ยวกับเว็บ ที่นิยมเล่นกันเยอะและเหมาะสำหรับมือใหม่ จะมีดังนี้Hacker101 CTFhttps://ctf.hacker101.com/ctfในแต่ละข้อ จะมีข้อความลับ ที่เรียกว่า flag ซ่อนอยู่ต้องแฮกให้ได้เราถึงจะได้ flag นั้น ให้เรานำ flag ที่ได้มาส่งในเมนู Submit Flag ก็จะได้คะแนนข้อนั้นๆ โดนแต่ละข้อจะมีจำนวน flag ไม่เท่ากันRoot-Mehttps://www.root-me.org/?page=news&lang=enเป็นเว็บไซต์แนว War-game มีหลายหมวดหมู่ด้วยกัน ซึ่งในนั้นก็จะมีหมวดหมู่ Web - Client และ Web - Server  หมวด Web - Client จะเน้นไปทาง Javascript, XSS, CSRF ซะส่วนมากหมวด Web - Serverจะเน้นเกี่ยวกับการโจมตี Server ในช่องทางต่างๆ โดยส่วนมากจะเกี่ยวกับ ภาษา PHP ในส่วนของ  Web Application Server และ SQL ในส่วนของ Database Server ซึ่งหมวด Web - Sever นี้ เป็นที่ยอมรับจากหลายๆ บริษัท จนปัจจุบันสามารถใช้คะแนนในหมวดนี้ในการยื่นสมัครงานใบบางบริษัทได้เลย หมวดอื่นๆ นอกเหนือจากเว็บ จะนิยมแบบการจำลองโจมตีระบบจริงเพื่อแฮกเพื่อเข้าไปยึดเครื่องของเหยื่อ ที่นิยมเล่นกันเยอะและเหมาะสำหรับมือใหม่ จะมีดังนี้Vulnhub https://www.vulnhub.com/จะเป็นการ download ไฟล์ VM ไปติดตั้งเอง และโจมตีเองโดยส่วนมาก ในแต่ละข้อจะไม่บอกว่าให้เราไปหาอะไรตรงๆ จะบอกแบบอ้อมๆ มากกว่าHack The Boxhttps://www.hackthebox.euจะเป็นการเชื่อมต่อผ่าน VPN เพื่อเข้าไปอยู่ใน Network เดียวกันกับเครื่องที่เราต้องโจมตี มีหลายหมวดหมู่ และหนึ่งในนั้นก็มีหมวดเว็บ แต่ส่วนมากก็จะแฮกจากเว็บเพื่อให้เข้าไปยึดเครื่องต่อ สำหรับมือใหม่ที่ต้องการจะเล่นแล็บที่อยู่นอกเหนือจากหมวดเว็บแล้ว มันจะลงระบบปฏิบัติการที่ชื่อว่า Kali Linux Kali Linuxhttps://www.kali.org/downloads/เป็นระบบปฏิบัติการณ์ที่รวมเครื่องมือในการแฮกเอาไว้มากมาย แยกเป็นหมวดหมู่เอาไว้สามารถเข้าไปดูรายละเอียดได้เองที่https://tools.kali.org/tools-listingผมแนะนำให้เข้าไปดูรายละเอียดว่า tools แต่ละตัวใช้ทำอะไรได้ และเมื่อต้องการจะทำอะไรบางอย่าง ที่ tools สามารถทำได้ เราก็แค่ไปหาวิธีใช้ tools นั้น และ หาข้อมูลพื้นฐานเกี่ยวกับเรื่องที่ tools นั้นทำ จะได้ดีหรือไม่ดี ก็ขึ้นอยู่กับทักษะการค้นหาข้อมูลของแต่ละคน หลังจากใช้เครื่องมือจนชำนาญแล้ว ก็ประยุกต์ใช้ในแบบของตนเอง สิ่งที่ผมจะแนะนำทั้งหมดก็มีเพียงเท่านี้ ก่อนจะจบ EP สุดท้ายนี้ผมก็ขอฝากไว้ว่า อย่าเอาความรู้ที่ได้ไปแฮกระบบใครนะครับ ให้ลองใช้แค่ในแล็บ หรือระบบที่เปิดให้ทดลองเท่านั้น 
โดย: สุวิชา บัวคอม
| Security
Insufficient Logging&Monitoring
การที่มีการเก็บ log และการ monitoring ไม่เพียงพอสามารถทำให้เกิดช่องโหว่ที่ตามมาหรือตรวจสอบหลักฐานของการโจมตีที่เกิดขึ้นนั้นไม่ได้ โดยการเก็บ log และ monitoring ที่ไม่เพียงพอนั้นสามารถเกิดขึ้นได้ในหลายสถานการณ์ เช่นการ login สำเร็จ และ ไม่สำเร็จ, และ การทำธุรกรรมที่สำคัญไม่ได้ถูกเก็บ logข้อความ warnings และ error ไม่ได้ถูกสร้าง มีไม่เพียงพอ หรือ ข้อความที่สร้างมาไม่ชัดเจนไม่มีการ monitoring กิจกรรมที่น่าสงสัยในแอปพลิเคชัน และ APIsเก็บ log ไว้ในเครื่องเพียงที่เดียวไม่มีเกณฑ์การแจ้งเตือนที่เหมาะสม และ กระบวนการยกระดับการตอบสนอง หรือ มีแต่ไม่มีประสิทธิภาพการทดสอบเจาะระบบ และ การสแกนด้วย Dynamic Application Security Testing Tools (DAST Tools) เช่น OWASP ZAP ไม่ถูกแจ้งเตือนไม่สามารถตรวจจับ ยกระดับ หรือ แจ้งเตือน การโจมตีได้ตามเวลาจริง หรือ ใกล้เคียงเวลาจริงสามารถเข้าไปลอง lab กันได้ที่ https://app.cybrary.it/browse/cybrscore/introduction-to-owasp-top-ten-a10-insufficient-logging-and-monitoring-scoredซึ่งเป็น lab pro ต้องสมัครที่เว็บ cybrary และ upgrade เป็น pro (เสียเงิน) แต่เราสามารถเข้าไปใช้งานฟรีในแบบ trial ได้และใช้เอกสารจาก url ด้านล่างนี้ประกอบการทำ labhttps://www.cybrary.it/wp-content/uploads/2019/03/Module-11-Insufficient-Logging-and-Monitoring-Lab.pdfแล็บนี้ผมจะไม่พาทำ และจะใช้พื้นที่ในการพาทำแล็บมาสรุปเนื้อหาตั้งแต่ EP.1 จนถึง EP.10 โดยจะสรุปสั้นๆ ในบทความนี้ และ แนวทางในการศึกษาต่อในแต่ละ EP จะพูดถึงในบทความถัดไปEP1 Injection เราพูดถึงการแทรก code เข้าไปเพื่อเปลี่ยนแปลงการทำงานของ code เดิมที่เขียนมาโดยใช้ syntax เดียวกันกับ code ที่เขียนมาในการแทรก code เข้าไป และ ได้ยกตัวอย่างง่ายๆ ในการใช้ SQL Injection อย่างง่ายในการ bypass หน้า loginEP2 Broken Authentication เป็นการใช้มาตรการในการรับรองความถูกต้องของผู้ใช้งาน โดยยกตัวอย่างการใช้ password ที่ไม่ปลอดภัยและการคำนวณความปลอกภัยในการใช้ passwordEP3 Sensitive Data Exposure การเก็บข้อมูลสำคัญไว้ได้ไม่ดีพอ หรือ ไม่มีการปิดยังข้อมูลสำคัญ และ ยกตัวอย่างการเข้ารหัสข้อมูลอย่างไม่ปลอดภัย ไม่ว่าจะเป็นข้อมูลสำคัญต่างๆ หรือรหัสผ่านEP4 XML External Entities Processing การใช้เอกสาร XML อย่างไม่ปลอดภัยทำให้มีอันตรายร้ายแรงจนแฮกเกอร์สามารถเข้าถึงไฟล์สำคัญในระบบได้EP5 Broken Access Control การควบคุมการเข้าถึงข้อมูลที่ไม่ควรให้ผู้ที่ไม่มีสิทธิเข้าถึงนั้นเข้าถึงได้ โดยยกตัวอย่างการที่ไม่มีการ ควบคุม path ในเครื่อง web server จนสามารถไปเรียกถึงไฟล์สำคัญของระบบได้EP6 Security Misconfiguration การตั้งค่าเว็บไซต์ที่ไม่ปลอดภัยโดยมีการใช้ username และ password ที่เป็นค่าโรงงานที่ติดมากับอุปกรณ์ ทำให้ถูกคาดเดาเดาได้ง่ายEP7 Cross-Site Scripting การหลอกให้เหยื่อรันสคริปในช่องทางต่างๆ และได้ยกตัวอย่างการ bypass การป้องกันการโจมตี Cross-Site Scripting หลายๆ รูปแบบEP8 Insecure Deserialization การยอมรับข้อมูล Serialized ที่ถูกปลอมแปลงมาและไม่ปลอดภัย ทำให้แฮกเกอร์เปลี่ยนแปลงข้อมูลก่อนจะส่งไปยัง server ได้EP9 Using Components with Known Vulnerabilities การใช้ช่องโหว่ที่ถูกประกาศออกมาในการโจมตี โดยจะใช้ ชื่อ product และ version เป็น keyword หลักในการค้นหา และ มีเลข CVE เป็นตัวชี้เฉพาะเจาะจงแต่ละช่องโหว่EP10 Insufficient Logging&Monitoring การเก็บ log และ monitoring ที่ไม่เพียงพอ ยกตัวอย่างวิธีที่ไม่ปลอดภัยเพื่อนำไปปรับใช้ในการทำงานจริง ซึ่งหัวข้อนี้จะเห็นภาพได้ยากที่สุด ต้องลองใช้งานจริงถึงจะสามารถเข้าใจได้และทั้งหมด 10 EP นี้คือพื้นฐานเกี่ยวกับความปลอดภัยของเว็บไซต์ที่ถูกพบได้บ่อย และ มีความรุนแรงที่ถูกจัดอันดับโดย OWASP ตามลำดับ จาก EP1 ถึง EP10 จากมากไปน้อยในบทความถัดไป (EP 11) จะเป็นแนวทางการศึกษาต่อนอกเหนือจากพื้นฐานความปลอดภัยของเว็บไซต์ และ จะเป็นบทความสุดท้ายของผมสำหรับบทความชุดนี้ครับ
โดย: สุวิชา บัวคอม
| Security
Using Components with Known Vulnerabilities ใช้ของเก่าต้องระวังตรวจสอบให้ดี
โดยทั่วไปเมื่อ developer จะทำเว็บไซต์หรือเขียนโปรแกรมอะไรสักอย่าง มักจะมีการใช้ components ต่างๆ เพื่อมาใช้อยู่เสมอ การใช้ component ในเวอร์ชั่นเก่าๆ มีโอกาสสูงที่จะมีช่องโหว่อยู่ที่มาพร้อมกับ component นั้นๆ และช่องโหว่ Using Components with Known Vulnerabilities ก็คือการใช้ components หรือ software หรืออะไรก็แล้วแต่ที่เรานำมาใช้ แล้วสิ่งนั้นมีช่องที่โหว่ที่ถูกประกาศออกมาแล้ว มีช่องโหว่จำนวนมากที่เปิดเผยสู่สาธารณะ และสามารถค้นหาได้ง่ายผ่าน internet โดยหลักๆ จะมีเว็บที่รวบรวมช่องโหว่ของ compenent ต่างๆ การที่มีช่องโหว่เปิดเผยออกมาอย่างเป็นทางการมักจะมีเลขกำกับมาด้วยเสมอ โดยส่วนมากคนทั่วๆ มักจะเห็นในข่าวที่มีรหัสกำกับไว้ ตัวอย่างเช่น ข่าวจาก techtalkthai https://www.techtalkthai.com/apache-struts-2-critical-flaw-is-exploited-in-the-wild/เมื่อปี 2018 ได้มีช่องโหว่ Remote Code Execution (RCE) บน Apache Struts ปล่อยออกมาและกำกับด้วยรหัส CVE-2018-11776 CVE ที่ขึ้นต้นรหัสนี้ ย่อมาจาก Common Vulnerabilities and Exposures ซึ่งความหมายก็ตรงตัวเลย แหล่งข้อมูลที่เราจะไปค้นหารายละเอียดของ CVE แต่ละตัวนั้น มีอยู่หลายที่มาก โดยที่นิยมกันเป็นส่วนมากก็จะมีดังนี้ https://cve.mitre.org/https://nvd.nist.gov/https://www.cvedetails.comผมจะถนัดค้นหาจาก cvedetails ผมจะพาทุกคนไปลองค้นหาข้อมูลกันเลย โดยจากข่าวด้านบน เรามีรหัส CVE-2018-11776 มาแล้ววิธีการค้นหาข้อมูลง่ายมากแค่เราเอารหัสไปใส่ในช่องค้นหาแล้วก็ได้เลยเข้าไปที่https://www.cvedetails.comใส่รหัสเข้าไปที่ช่อง ใดก็ได้ใน 2 สองช่องในภาพด้านล่างนี้เมื่อกดค้นหาเราก็จะได้ข้อมูลมาแล้วแต่เมื่อเราไม่มีรหัสแล้วเราอยากรู้ว่า components ที่เราใช้อยู่นั้นมีช่องโหว่ถูกปล่อยออกมาหรือเปล่า เข้าไปที่ลิงก์ด้านล่างนี้เลยhttps://www.cvedetails.com/version-search.phpเข้ามาแล้วใส่ชื่อ product ที่เราต้องการค้นหาเข้าไป ถ้าจากข่าวด้านบนก็จะเป็น product ที่ชื่อ strutsถ้าเราไม่ใส่เลข version ลงไปด้วย ระบบจะแสดงผลออกมาทุก version แล้วเลือก version ที่เราต้องการ โดย version ที่มีช่องโหว่คือ 2.3 ถึง 2.3.34 และ 2.5 ถึง 2.5.16ถ้าใครอยากทดลอง setup lab ขึ้นมาลองทดสอบการโจมตี ผมแนะนำวิธีตามลิงก์ด้านล่างนี้เลยครับhttps://github.com/bhdresh/CVE-2018-11776
โดย: สุวิชา บัวคอม
| 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 ที่หน้าเว็บเรียกมาแสดง

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

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