Hack JavaScript Validation ที่บางคนอาจจะยังไม่รู้

วันนี้เป็นความรู้เกร็ดเล็กๆ ให้สำหรับคนที่ยังไม่รู้ครับหากรู้แล้วผมต้องขออภัยมา ณ ที่นี้นะครับ ข้อดีของการเขียน Validate โดย JavaScript ก็คือเราสามารถตรวจสอบการป้อนข้อมูลในฟอร์มก่อนที่จะส่งข้อมูลนั้นไปประมวลผลที่เซิร์ฟเวอร์ให้ตรงอย่างที่เราต้องการเช่น เราอาจจะต้องการให้ User ระบุค่าเป็นตัวเลขเท่านั้นซึ่งการใช้ JavaScript นั้นจะทำให้ Response การตอบโต้กับ User ที่ค่อนข้างไวเกือบที่จะ Real Time เพราะมันทำงานที่ฝั่ง Client ทันทีแต่มี Dev หลายๆ คนจะเขียนเพียงแค่ Validate ที่ JavaScript เท่านั้นเลยอาจเป็นช่อง โหว่ให้ผู้ไม่หวังดีเขามาก่อกวนระบบรองดูต้วอย่างด้านล่างนะครับ
ตัวอย่างนี้คือการป้องกันให้ User สามารถ Save ได้เพียงตัวเลขเท่านั้นโดยได้มีการเขียน JavaScript เท่านั้นโดยไม่ได้ทำการเขียนการป้องกันที่ฝั่ง Server



หากเป็น User ทั้วไปก็อาจที่จะพอป้องกันได้ครับ แต่หากเป็นพวก Hacker หรือพวกที่ประสงค์ร้ายก็อาจจะทำการเข้ามาก่อกวนระบบ โดยวันนี้ผมจะมานำเสนอวิธีง่ายที่ Hacker ใช้ครับ วีธีก็เพียงแค่จำรองการ Post โดยไม่ผ่านหน้า Web โดยการเขียน Script ขึ้นมาง่ายเพื่อ Post ค่าไปที่ Server โดยไม่ต้องผ่านการ Validate ครับ
เบื้องต้นเราจะรู้ได้อย่างไรว่า เราจะต้องส่งอะไรบ้าง ก็ให้ Download พวก Http Debugger มาติดตั้งไว้ที่เครื่องในที่นี้ผมชอบใช้ Fiddler เพื่อจับ Header ให้ทำการติดตั้งโปรแกรมและเปิดโปรแรกมขึ้นมา แล้วทำการเข้า Web เพื่อทำการ Save ค่าเป็นตัวเลขสัก 1  ครั้ง

ValidateFail

หลังจากนั้นให้กลับไปที๋โปรแกรม Fiddler ที่เปิดข้างไว้

fidder2
ซึ่งจากรูปด้านบนให้สักเกตุดูที่ Request แรกที่เราเป็น Request ที่เกิดจากเราทำการ Save Data ผ่าน Web ได้อย่างถูกต้อง จากนั้นให้เลือกที่ Inspectors และ WebForm

HAckValidateFidder2

เราก็จะเห็นว่ามี Parameter ซึ่งเป็นการแสดงค่าต่างๆ ที่ Post กลับไปที่ Server ซึ่งมีรายละเอียดดังนี้

Name Value
__VIEWSTATE คือ hidden fieldของ ASP.NET page framework ที่ใช้จดจำค่าของ Control และสถานะของ Page ระหว่างการ Post Back (Round Tip) โดยจะอยู่ในรูปแบบ Hidden fied และ ถูกเข้ารหัสด้วย base64-encoded (โดยที่เราจะไม่สามารถแก้ไข้มันได้เอง)
__EVENTVALIDATION คือ __EVENTVALIDATION hidden สำหรับ Security ของ ASP.NET เพื่อป้องกันการ Request ที่ไม่ไม่ปลอดภัย (เช่น <% GetDate() %> อะไรแบบนี้)
txtNum คือ ชื่อ TextBox ที่ถูก Post ค่ากลับไปที่ Server (เราจะเปลี่ยนค่าที่นี้)
BtnSave คือชื่อ Button ที่เรา Post ไปให้ Server

ข้างบนคือค่าที่เราจะต้องทำการ Post ค่ากลับไปที่ Server อาจจะมี Tool ให้ใช้มากมายครับแต่ก็อย่างที่บอกถ้าเราใช้ Tool เราก็จะกลายเป็นเพียง Scriptdy ซึ่งเป็นแต่เพียงผู้ Run Script เท่านั้นแต่ไม่ได้เข้าใจอะไรเลย เอาละเรามาดู Script ที่ผมเขียน Post ค่ากัน Script นี้เขียนด้วย C#.Net ครับ

  static void Main(string[] args)
        {
                //กำนหนด Url ที่เราต้องการ Post
                string url = "http://www.javascriptthai.com/AppDesign/ValidateFail/ValidateFail.aspx";

                var myPost = new WebPostRequest(url);

                //เรียก Page ที่ต้องการ Hack 1 ครั้ง เพื่อหาค่า __VIEWSTATE และ __EVENTVALIDATION
                myPost.HttpGet(); //Call Site*/

                //ใส่ค่า __VIEWSTATE และ __EVENTVALIDATION
                myPost.Add("__VIEWSTATE", myPost.__VIEWSTATE);
                myPost.Add("__EVENTVALIDATION", myPost.__EVENTVALIDATION); 

                //เปลี่ยนค่าเป็น ตัวหนังสือแทน
                myPost.Add("txtNum","ABGGGC");
                //ส่งปุ่ม Save
                myPost.Add("BtnSave", "Save");

                //Post ค่าไปที่ Server
                myPost.GetResponse();

            Console.WriteLine("Hack OK");
            Console.ReadLine();
        }

หมายเหตุด้านบเป็นเพียงส่วนหนึ่งเท่านั้นนะครับผมขอที่จะไม่อธิบาย Detail เพราะมันอยู่นอก Scope ของ Site นี้หากสนใจให้ Download Full Script ที่ Link ด้านล่างไปลองดูครับ

ทดสอบการ Hack โดยการ Download Full Code และเข้าไปที่ HackValidate.zipBin แล้ว  Run HackValidate.exe ถ้าสำเร็จจะได้ผลตามรูปด้านล่างครับ

HAckConsole

จากนั้นให้กลับไปที่   http://javascriptthai.com/AppDesign/ValidateFail/ValidateFail.aspx

Hacked

ผลที่ได้ก็คือมีข้อมูลที่ไม่ถูกต้องถูก Save ลงไปครับ

จริงๆอยากบอกเพียงแค่ว่า Validate JavaScript อย่างเดียวนั้นไม่พอครับแต่เพื่อให้เห็นภาพเลยยาวเลย

SOURCE  WEB  

 ValidateFail.zip << ให้ RunScript CreateTable.Sql ที่ SQLSERVER  และแก้ Connect String ที่ไฟล์  ValidateFail.aspx.cs และทำการ Build ใหม่

private string ConnectionString = @"Server=?????;User=??????;Password=?????;Database=??????";

Hack

HackValidate.zip << ให้เปิด Project โดย visual studio 2010 ทำการแก้ไข Url เป็น Site ด้านบนและทำการ Build  & Run

string url = “http://???????????/ValidateFail/ValidateFail.aspx”;

หากมีข้อส่งสัยติดต่อที่นี่ครับ

หวังว่าคงจะมีประโยชน์บ้างนะครับ ^_^

Leave a Reply