บทความ Security
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: สุวิชา บัวคอม
| 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 ที่ไม่ปลอดภัย
โดย: สุวิชา บัวคอม
| 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
โดย: สุวิชา บัวคอม
| 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 คือ ถ้าเราตั้งรหัสผ่านไว้ไม่ปลอดภัยจะถูกแกะรหัสได้ โดยความเร็วในการถูกแกะรหัสจะขึ้นอยู่กับความยาก-ง่าย ของรหัสผ่าน วิธีการอื่นๆ สามารถทดลองเล่นเองได้ตามในแล็บนี้เลยครับ
โดย: สุวิชา บัวคอม
| Security
Broken Authentication การรับรองตัวตนที่ไม่มั่นคงปลอดภัย
Broken Authentication คือการรับรองความความถูกต้องของการเข้าถึงระบบอย่างไม่ปลอดภัย การโจมตีช่องโหว่ Broken Authentication มีอยู่หลายรูปแบบ ในบางครั้งอาจจะง่ายมาก หรือบางครั้งอาจจะซับซ้อนมากเลยก็ว่าได้ โดยมีพื้นฐานของการเกิด Broken Authentication อยู่ที่การอนุญาติให้ผู้ใช้ใดๆก็ตามสามารถเข้าถึงไฟล์หรือฟังก์ชันในระบบที่ไม่ควรจะเข้าถึงได้โดยการใช้ประโยชน์จากการมีมาตรการการจัดการการเข้าถึงระบบได้อย่างไม่มั่นคงปลอดภัยหรือมั่นคงปลอดภัยไม่เพียงพอไปลองดูกันในแล็บดีกว่า โดยแล็บที่ผมจะใช้ก็คือ WebGoat เวอร์ชัน 7.1 โดยติดตั้งผ่าน Docker วิธีการติดตั้งแล็บ 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โดยจะมีเมนูเกี่ยวกับข้อผิดพลาดของ Authentication ให้เราเล่นอยู่ทั้งหมด 4 เมนูทางด้านซ้ายมือPassword Strengthเป็นโจทย์เกี่ยวกับความปลอดภัยของรหัสผ่าน โดยให้เราหาว่ารหัสที่ให้มาจะถูกแกะรหัส (crack) ได้ในเวลาเท่าไหร่โดยให้เรานำ password ไปเช็คในเว็บที่เค้าให้มาแล้วนำไปตอบในหน้าโจทย์https://howsecureismypassword.net/ เนื่องจากเป็นแล็บเวอร์ชันเก่า คำตอบที่เราเช็คในเว็บอาจจะไม่ตรง กับคำตอบที่ถูกต้อง ณ เวลานั้น ในปัจจุบันเทคโนโลยีได้พัฒนาให้ผู้โจมตีสามารถ crack รหัสผ่านได้เร็วขึ้น คำตอบตามที่ผมเช็ค ณ​ เวลาปัจจุบัน 29/4/2562 คือ0 seconds, 0.2 seconds, 2 seconds, 2 hours, 2 days, 36 quintillion years ตามลำกับคำตอบที่ถูกต้องคือ 0 seconds, 2 seconds, 19 seconds, 15 hours, 20 days, 364 quintillion yearsตามลำดับเมื่อเราตอบถูกทั้งหมดและผ่านแล้ว จะได้เครื่องหมายถูกสีเขียวด้านหลัง Password Strength ข้อที่เราผ่าน ตามภาพนี้สำหรับข้ออื่นๆ สามารถลองเล่นได้เองโดยมีคำใบ้จะได้เมื่อกดปุ่ม Show Hints แล้วมีเฉลยดูได้ ด้วยการกดปุ่ม Show Solution

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

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