บทความ Security
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ 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 ที่ไม่ปลอดภัย
โดย: สุวิชา บัวคอม
| 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
โดย: สุวิชา บัวคอม
| Security
Injection แทรกคำสั่งเพื่อแฮกการทำงานของระบบ
Injection คือเทคนิคการแทรกคำสั่งเข้าไปใน code ภาษาต่างๆ ส่วนมากจะพบได้จากการรับ input มาจาก user โดยที่ server ไม่ได้มีมาตรการป้องกันหรือยอมรับให้นำคำสั่งที่ได้รับมา นำไปประมวลผลอย่างไม่ปลอดภัย โดยการ Injection นั้นมีหลายประเภท แต่ที่ร้ายแรงและพบบ่อยจะเป็น SQL Injection คือการแทรกคำสั่งเข้าไปใน code ภาษา SQL ที่ server เรียกใช้ก่อนจะทำการ SQL Injection ผมแนะนำให้ศึกษาพื้นฐานที่จำเป็นของภาษา SQL โดยคำสั่งที่จำเป็นจะต้องรู้หลักๆ ก็คือคำสั่ง SELECT ที่ใช้ในการเลือกข้อมูลจากฐานข้อมูลมาแสดง โดยคำสั่ง SELECT นั้นมีเงื่อนไขและการจัดเรียงหลายรูปแบบในการเลือกข้อมูล เช่น WHERE, ORDER BY, UNION เป็นต้น สามารถศึกษาได้จากเว็บนี้https://www.w3schools.com/sql/ เพื่อให้เห็นภาพจริงเรามาติดตั้งแล็บแล้วลองทำกันดูเลย โดยที่ต้องติดตั้งมี 2 อย่างหลักๆคือVirtualBox เป็นโปรแกรมจำลองเครื่อง และ Web for Penetration Tester Lab เป็นไฟล์ .iso ไว้ติดตั้งแล็บบน VirtualBoxVirtualBox https://www.virtualbox.org/wiki/Downloads Web for Penetration Tester Lab https://isos.pentesterlab.com/web_for_pentester_i386.iso วิธีติดตั้ง Web for Pentester Labเมื่อติดตั้ง VirtualBox เสร็จแล้วสร้างแล็บด้วยการกดเมนูด้านบน Machine->New…ตั้งชื่อและตั้งค่าให้เรียบร้อยใช้ RAM 1GB, พื้นที่ดิส 8GBเมื่อสร้างเครื่องมาแล้ว คลิกที่เครื่องจากนั้นตั้งค่าเครื่องโดยการกดเมนูด้านบน Machine->Settings...เลือกแถบ Network ตั้งค่าเป็น Host-only Adapter หรืออาจจะตั้งเป็นค่าอื่นก็ได้หากเข้าใจการทำงานของ Network โดยให้เครื่องของเราสามารถติดต่อกับเครื่องจำลองที่เราสร้างได้เลือกแถบ Storage คลิกที่รูป และเลือกไฟล์ Web for Pentest ที่เราโหลดมา จากนั้นกด OKเมื่อตั้งค่าทุกอย่างเสร็จแล้วให้ดับเบิลคลิกที่เครื่องเพื่อเปิดเครื่องของเราขึ้นมาจะได้หน้าตาแบบนี้พิมพ์คำสั่ง clear เพื่อเคลียหน้าจอเทอร์มินัล$ clearและพิมพ์คำสั่ง ifconfig เพื่อดู ip ของเครื่อง$ ifconfigจะเห็น IP ที่เราสามารถเข้าเว็บไซต์ผ่านเครื่องหลักของเราที่อยู่นอก VirtualBox ได้โดยการนำ IP ไปเข้าที่เว็บบราวเซอร์ ในที่นี้จะเป็น IP 192.168.56.104เมื่อเข้ามาที่หน้าเว็บได้แล้วให้เข้ามาที่ SQL Injection Example 1หรือเข้าผ่าน URL ด้านล่างนี้http://192.168.56.104/sqli/example1.php?name=root(เปลี่ยน IP ด้านหน้าให้เป็นเครื่อง Web for Pentester ใน VirtualBox โดยของแต่ละคนจะไม่เหมือนกัน)เมื่อเข้ามาจะเห็นว่าหน้าเว็บได้ทำการดึงข้อมูล id, name, และ age (ในฐานข้อมูลอาจจะเป็นชื่ออื่นก็ได้ แต่ในแอพพลิเคชัน) มาจาก ฐานข้อมูล ถ้าหากเราเข้าใจการใช้คำสั่ง SELECT ในภาษา SQL ที่มีเงื่อนไขตรงกับที่เว็บนี้ใช้ก็จะสามารถเดาคำสั่งได้ว่าเป็นคำสั่งดังนี้ (เราจะไม่รู้ชื่อฐานข้อมูล)SELECT id, name, age FROM [database name] WHERE name=rootคำสั่ง SQL ที่ใช้อาจจะเลือกข้อมูลอย่างอื่นมาด้วยหรือเลือกมาทั้งหมด (SELECT *) แต่นำมาแสดงให้เห็นแค่สามอย่าง เงื่อนไข WHERE จะนำข้อมูลที่ตรงกับเงื่อนไขมาแสดงในเว็บนี้จะนำข้อมูลของคนที่มี name เป็น root ออกมาแสดงโดยระบบจะไปเช็คทีละชุดข้อมูล (record) ว่าตรงตามเงื่อนไขหรือเปล่าถ้ามีจะถูกเลือกออกมาแสดง หากผู้โจมตีระบบต้องการจะนำข้อมูลของทุกคนในระบบมาแสดง ผู้โจมตีจะทำการ Injection โดยการทำให้เงื่อนไขที่ถูกนำไปเช็คเป็นจริงทั้งหมดโดยเว็บไซต์นี้มีการรับข้อมูลจากผู้ใช้ผ่านพารามิเตอร์ name ใน URL แล้วนำไปประมวลผลคำสั่ง SQLผู้โจมตีจะใส่ค่าที่ทำให้เงื่อนไขเป็นจริงโดยคาดเดาการเขียนโปรแกรมของโปรแกรมเมอร์ โดยส่วนมากการเขียนแบบที่ไม่มีการป้องกัน (นำค่าที่รับมาไปประมวลผลในคำสั่ง SQL เลย) เป็นแบบนี้$sql = "SELECT id, name, age FROM [database name] WHERE name='".[user input]."'";$result = mysql_query($sql);เมื่อใส่ค่า root เข้าไปโปรแกรมจะเห็นแบบนี้$sql = "SELECT id, name, age FROM [database name] WHERE name='root'"การโจมตีของผู้โจมตี จะใส่ค่า 'or'1'='1 หรือ 'or'2'='2 หรือ 'or'a'='a หรืออะไรก็ได้ ที่ได้ค่าเป็นจริงเข้าไปโดยด้านหน้าคำสั่งที่ใส่เข้าไปจะเป็นค่าอะไรก็ได้ที่ไม่ใช่ ' หรือ " หรือเครื่องหมายอื่นๆ ที่มีผลต่อการประมวลผลภาษา SQL ในที่นี้ใช้ test 'or'1'='1$sql = "SELECT id, name, age FROM [database name] WHERE name='test’or’1’=1'"ค่า name ใส่ไปจะถูกมองเป็น 'test' or '1' = '1' เป็นการโจมตีด้วยเงื่อนไขทางตรรกศาสตร์ โดยการนำค่าอะไรก็ได้ ไป or กับค่าที่เป็นจริงจะได้ค่าที่เป็นจริงเสมอ เมื่อระบบนำค่านี้ไปเช็คกับแต่ละชุดข้อมูลจะได้ผลลัพธ์เป็นจริงเสมอ จึงนำค่าทั้งหมดมาแสดงปล. %27 คือค่า ' ที่ถูกทำการ URL encode
โดย: สุวิชา บัวคอม
| Security
Introduction to cryptography
คุณรู้ตัวหรือเปล่าว่าในชีวิตประจำวันคุณได้ใช้การเข้ารหัสโดยที่คุณไม่รู้ตัว หรืออาจจะรู้ตัวในบางเรื่องที่เราเข้าใจการทำงานของสิ่งนั้นแล้ว สาเหตุหลักที่ทำให้คุณไม่รู้ตัวว่าคุณได้ใช้การเข้ารหัสก็เพราะว่า ปัจจุบันมีสิ่งอำนวยความสะดวกมากมายโดยส่วนมากจะมาในรูปแบบของโปรแกรมประยุกต์ (Application) เช่น ตอนที่สมัครใช้งานระบบต่างๆบน application หรือ เว็บไซต์ (website) จะมีช่องให้กรอกรหัสผ่าน (password) เราก็ใส่รหัสผ่านของเราลงไปโดยไม่รู้เลยว่าปลายทางที่รับรหัสผ่านของเราไปเก็บจะมีการเข้ารหัสหรือไม่ ตอนที่เราส่งข้อความหาเพื่อนจริงๆแล้วมีหลายขั้นตอนมาก เริ่มจากที่เราสั่งงาน application ของเราให้ส่งข้อความไปหาเพื่อน ข้อความจะถูกส่งผ่านระบบ Internet ที่เราเชื่อมต่ออยู่ และเพื่อนของเราก็รับข้อความที่เราส่งโดยไม่รู้เลยว่าระหว่างทางที่ส่งมามีคนสามารถแอบอ่านข้อมูลของเราหรือไม่และข้อความของถูกเข้ารหัสไว้อย่างปลอดภัยหรือเปล่า ในบางครั้งเราก็อยากเก็บข้อมูลที่เป็นความลับไว้ในคอมพิวเตอร์ของเราไม่ให้คนอื่นมาเข้าถึงข้อมูลของเราได้ ถึงแม้ว่าขโมยเครื่องของเราไปแล้วแกะเอาฮาร์ดดิส (harddisk) ไปเปิดดูก็ตามถ้าเรารู้และเข้าใจการเข้ารหัสอย่างถูกวิธี เราก็เก็บข้อมูลลับหรือภาพลับไว้ในเครื่องเราได้อย่างสบายใจ ไม่ต้องกังวลอะไรตัวอย่างที่ยกมาด้านบนนี้กล่าวถึงการนำศาสตร์การเข้ารหัสไปช่วยในการทำให้ข้อมูล เป็นความลับ (confidentiality) นอกจากจะนำศาสตร์นี้ไปใช้ทำให้ข้อมูลเป็นความลับแล้วยังสามารถนำไปใช้ในเรื่องของความครบถ้วนสมบูรณ์ (integrity) ของข้อมูลเพื่อให้แน่ใจว่าข้อมูลไม่ถูกแก้ไขระหว่างทางที่ส่งมาหาเรา และการรับรองความถูกต้อง (authenticity) เพื่อยืนยันว่าข้อมูลที่เราได้รับมาเป็นของจริงที่ถูกส่งมาจากต้นทางตัวจริง ขอเกริ่นคร่าวๆไว้เท่านี้ ต่อไปจะเริ่มลงเนื้อหาเชิงวิชาการ

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

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

หมวดหมู่

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

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

Tags

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

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

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