Web Security Lesson #1

ผมไม่ได้เขียน blog มาหลายวันละ เพราะว่า มัวแต่ up status ตัวเอง ลง Facebook
วันนี้ เลยอยากมาเขียน blog ในกึ่งวิชาการนิดๆ หน่อยๆ เพราะว่า ที่ผ่านมา เจอกับ
การละเลยเรื่อง security กันมากเหลือเกิน อันจะนำไปสู่ ความวุ่นวาย ในอนาคตได้
แต่ผมจะไม่ได้เจาะลึกมาก ถ้าอยากรู้ลึกกว่านี้ ต้องไปศึกษา ทดลองกันเองครับ ..

สิ่งที่ผมอยากจะเขียนในวันนี้ ก็คือ เรื่องการเก็บรายละเอียดของ user และ password
และรายละเอียดต่างๆ นาๆ ของ user ที่เข้ามาใช้งานระบบ ส่วนใหญ่ตรงนี้
บางทีเราไม่ได้ให้ความสำคัญกันเท่าไร บางทีเก็บ password แบบ paintext คือ
ไม่ได้เข้ารหัสอะไรเลย ใส่อะไรมาเก็บแบบนั้น ดีขึ้นมาหน่อย ก็ md5 แต่ว่ามันก็แกะไม่ยาก
มาอีกหน่อยก็ base64 ซึ่งทุกอย่างที่ว่ามานี้ มัน ไม่ปลอดภัยเลยจริงๆ ถ้ามีใครได้ data
ในส่วนนี้ไป มันไม่อันตรายเฉพาะแค่นี้ แต่มันอันตรายมากๆ เพราะว่า เมื่อมีข้อมูล ของคนคนนึง
hacker สามารถ ไปต่อยอดได้เยอะ เพราะว่า คนคนเดียวกัน มักจะใช้ password เดิมๆ
ในทุกๆ เว็บที่เข้าใช้งาน ..
ส่วนถ้าจะถามผมว่า จะเก็บแบบไหนดี ผมว่า การเข้ารหัส โดยใช้ Private Key น่าจะดีสุด
หรือไม่ก็สร้าง function สำหรับการเข้ารหัส password เอง ก็จะดีกว่า function มาตรฐาน
ตรงนี้ แค่การเก็บ data ของ user ก็ต้องคำนึงถึงเยอะแล้ว ..

อีกส่วนนึง ก็คือส่วนของการ login ผมเจอหลายๆ case มากๆ ที่ง่ายสุดก็คือ มี form
แล้วมี hidden ไว้ ว่า password ที่ต้องกรอกคืออะไร ถ้าถูก ก็ให้ผ่าน อันนี้ สมัยก่อน
ก็อาจจะใช้กัน ผมเองเขียนโปรแกรมแรกๆ ก็ใช้วิธีนี้ เพราะไม่มี idea ที่จะเขียนแบบอื่น
ไม่ได้เก็บ data ลง DB แบบสม้ยนี้ แต่เก็บลง text file ทั้งหมด ..
ที่เจอต่อมาก็คือ check cookies หรือ sessions ว่ามีหรือเปล่า ถ้ามี ก็ให้ผ่านเข้าระบบ
ไปในส่วน admin ได้ ซึ่งตรงนี้ เราสามารถแก้ไขหรือปลอม cookies และ sessions ได้ครับ
ทำให้เข้าระบบได้โดยง่าย หรืออีกอย่างนึงก็คือ cookies ไม่ได้มีการเข้ารหัสอะไรเลย
ก็ทำให้เราแก้ไข cookies แล้วเข้าใช้งาน account ของคนอื่นได้ อันนี้ก็เป็นปัญหา ..

อีกอย่างนึงก็คือ ไม่มีการกรองค่าที่ส่งเข้าไป ปล่อยให้มีการใช้ SQL Injection เข้าไปได้
ทำให้ สามารถเข้าระบบได้ง่ายๆ อย่างเช่น ใส่ password=aa’ or 1 like ‘1 แบบนี้
ถ้าไม่มีการกรอง ระบบก็จะหลุดให้เข้าไปได้ เพราะว่า 1 like 1 เป็น true เสมอ ..
ตรงนี้รายละเอียดเยอะมาก ไว้ผมจะพูดละเอียดอีกครั้งครับ ..

สุดท้ายก็คือ ระบบการ forget password ที่ไม่ดีพอ ที่ให้ใครที่รู้ user หรือ email สามารถ
ไป forget password ได้ โดยส่ง password ง่ายๆ มาให้ทาง mail ไม่ต้องมีการ activate
จาก link ที่ส่งให้ เพื่อไปเปลี่ยน password ใหม่ แบบนี้ ก็ทำให้ hacker เดาทางถูก
แค่ Brute Force ง่ายๆ เข้าไป ก็ได้ password ละ เพราะว่าไม่ได้มีการ check
ค่าที่ได้ เวลา login ผิด กับ ถูก มันออกมาต่างกันอยู่แล้ว จับทางตรงนี้ได้ ก็จบ ได้
password ง่ายๆ ..

ผมขอพูดถึงแค่นี้ก่อนนะครับ แล้วจะมาเล่าเรื่อง Web Security อื่นๆ ที่เราควรคำนึง
ให้ฟังอีกวันหลังครับ 🙂

I have no security :)

สวัสดีครับ ไม่ได้ update blog มานาน เลยขอมาอัพหน่อย title
อาจจะดูเป็นคำแสลงไปหน่อยครับ “I have no securityฉันไม่มีความปลอดภัย
ตรงนี้ผมอยากจะพูดถึงเรื่อง web security อีกสักนิดครับ จริงๆ เบื่อมาก
กับคำว่า security เพราะว่ามีแต่คนพูด แต่ว่าไม่ค่อยรู้จริงกันเท่าไร พูดตามๆ กันมา
เชื่อตามๆ กันมา ทั้งๆ ที่ไม่ได้รู้ว่ามันถูกหรือผิด เค้าสั่งมาแบบนั้น ก็ต้องทำตาม
อะไรแบบนี้ ซึ่งผมคิดว่านี่แหละคือความเสื่อมของเรื่องความปลอดภัย ..

คำว่า security พูดง่าย แต่ทำจริงๆ ยากมากครับ ผมเคยพูดไว้หลายๆ ครั้งว่า ถ้าคุณไม่เคย
เป็น hacker หรือลอง hack ระบบต่างๆ มาก่อน (ในที่นี้ขอพูดถึงเรื่องเว็บนะครับ
เพราะระบบหลักๆ ในปัจจุบัน เป็น web app หมด) ก็อย่าพูดเรื่อง security เลย เพราะว่า
มันฟังดูแปร่งๆ ฟังแล้วงงๆ ไม่ได้น่าเชื่อถืออะไรเลย ..

ผมขอสรุปง่ายๆ สั้นๆ ตรงนี้เลยว่าอะไรคือความเชื่อผิดๆ เกี่ยวกับ web security บ้าง
เท่าที่เจอมาตลอด 10 กว่าปีนะครับ ..

1.Firewall ไม่ได้ช่วยเรื่อง security นะครับ อย่าคิดว่ามีอะไรที่ทำให้ช้าๆ หลายๆ hop
แล้วจะทำให้ระบบของคุณปลอดภัย มันไม่เกี่ยวกัน เมืองนอกเค้าเลิกพูดถึงกันแล้วครับ
เรื่องนี้ บางทีเจอ UDP flood มาทีแบบ BW แทบเต็ม ISP ทั้งหมดของไทย ทำไมเค้าป้องกัน
กันได้ ไม่ใช่เค้ามี Firewall ราคาแพง คุณภาพอัจฉริยะนะครับ วันหลังผมจะมาอธิบาย
วิธีการอีกทีว่าเค้าป้องกันกันแบบไหน ใช้วิธีไหนบ้าง ..

2.วิ่งวง private โดยการ map host เป็น domain เอาข้างใน โดยคิดว่าวิ่งกันข้างในแล้ว
security อันนี้ เป็นความคิดที่ผิดมากๆ และไม่เป็นไปตามมาตรฐาน วิธีการนี้ ถ้าใช้กับ
การ develop ผมก็เห็นด้วยครับ จะได้ไม่ต้องแก้ code อะไรมาก แต่ว่าถ้าไปใช้จริงๆ สมมติ
คุณมีเครื่องอยู่ 1000 เครื่อง คุณไปนั่ง map host กันไหวไหมครับ ทั้งๆ ที่เค้ามี DNS ไว้
เป็นมาตฐานอยู่แล้ว จริงๆ วงข้างใน มีอะไรอันตรายกว่าขา public อยู่เยอะครับ เพราะว่า
มาจากความเชื่อที่ผิดๆ เหล่านี้แหละ ทำให้ไม่มีระบบตรวจสอบต่างๆ ที่แข็งแรงพอ ไม่เหมือนกับ
การวิ่งผ่าน public IP ที่ถ้ามีปัญหาอะไร จะรู้ได้ทันที และแก้ไขได้อย่างรวดเร็ว ในเมื่อ
ทั้ง private และ public อยู่เครื่องเดียวกัน คุณจะไปกลัวขา public ทำไม web app
เวลาเค้า hack กัน เค้า hack ผ่าน app ที่บกพร่องครับ ยังไงก็เข้าได้ ไม่อย่างนั้น เว็บใหญ่อย่าง
Google, Facebook เค้าคงต้องให้เราลากสาย LAN ไปต่อกับเค้าขา private ถึงจะใช้ API
เค้าได้นะครับ แต่ไม่เห็นเค้าทำแบบนั้นเลย เห็นเค้าเปิดให้ใช้ API ผ่าน public กันหมด โดยที่
มีปัจจัยอื่นๆ ในการควบคุมการเข้าถึงครับ เช่น อัตราในการ access ถ้าคุณใช้เยอะเกิน ก็อาจจะ
ต้องเสียค่าทำเนียม อะไรทำนองนี้เพิ่มเติม ซึ่งผมว่าตรงนี้ คือมาตรฐานที่ถูกต้องแล้วครับ ..

3.จำกัดเรื่อง Internet ไม่ให้เครื่อง server ออกเน็ตได้ เพราะว่ากลัวไป update อะไรที่ไม่ถูกต้อง
เข้ามาที่เครื่อง รู้ไหมครับ ว่าวิธีการนี้ เป็นการทำให้ security ของระบบต่ำลงมาก ในระบบ Windows
ผมไม่รู้นะครับว่า เป็นแบบไหน แต่ระบบของ Unix ต่างๆ กว่าจะออก patch ออก release มาแต่ละตัว
มีการตรวจสอบกันละเอียดมากครับ ไม่ต้องกลัวว่าจะมีความผิดพลาด ถ้าคุณเข้าใจมันดีพอ ..
การที่คุณเห็น security report ออกมาแล้วคุณคิดว่า ไม่น่ามีผลอะไร นั่นคือการที่คุณกำลังทำร้าย
ระบบของคุณเองอย่างรุนแรงครับ bug แค่นิดเดียวก็สามารถทำให้ใครก็สามารถเป็น root เครื่องคุณได้
โดยไม่ต้องมีความรู้อะไรมากมาย อาศัยแค่ exploits  ต่างๆ ที่ทำออกมาแจกกันก็พอ ..

วันนี้ผมขอจบแค่นี้ก่อนครับ ใครที่อยากศึกษาเรื่อง web security อย่างจริงๆ จังๆ แนะนำ
http://packetstormsecurity.org/ (ไม่ใช่ PacketLove.com นะครับ)

Web Security Upload File

Web Security

http://zone-h.org ยังเคยโดน hack แล้วจะเอาอะไรกับเว็บไทย

สวัสดีครับ ช่วงนี้ผมเองวุ่นๆ มาก งานเข้ามากมาย ก็ต้องค่อยๆ แกป้ญหากันไปครับ ..
ยิ่งเจอปัญหายากๆ ย่ิงสนุก จะทำให้เรากล้าแกร่ง และมีประสบการณ์ ขอบคุณปัญหา

วันนี้มีเรื่อง web security มาพูดกันสักนิดนึงครับ 98% ของการ hack web ในปัจจุบัน
มาจากความผิดพลาดของ web application หรือพูดกันแบบบ้านๆ ก็คือ program
ที่เขียนมีจุดอ่อน ทำให้ hacker สามารถใช้ช่องโหว่เข้ามาโจมตีและลักลอบขโมยข้อมูล
ไปได้ ไม่ว่าจะเป็นวิธี injection, cross site script ที่หนักสุดก็คือ upload php shell ..
Injection คือการใช้จุดอ่อนในการเขียน sql เข้ามากระทำต่างๆ กับ database
Cross site script คือการส่ง parameter ต่างๆ ที่สามารถทำงานที่ต้องการผ่าน script
PHP Shell คือ file php เพียง 1 file ที่ upload ขึ้นไปแล้วสามารถทำอะไรก็ได้บน server

สำหรับผมเองจะ stick กับเรื่องพวกนี้มาก เพราะว่าถ้าปล่อยให้หลุดไป ปัญหามันแก้กัน
ลำบาก ไม่รู้ว่ามีคนแอบเอา PHP Shell ไปวางไว้ตรงไหนบ้าง อะไรแบบนี้ file บน server
มีเป็นจำนวนมาก ไล่หาคงไม่เจอแน่ๆ ซึ่งถ้าโดนเข้าไปแล้ว ต่อให้ลง server ใหม่ก็ไม่หาย
เว็บไทย ส่วนใหญ่ไม่ค่อยสนใจเรื่องพวกนี้ ทำให้เว็บใหญ่ๆ ดังๆ หลายที่มีข่าวว่าโดน hack ..

สำหรับท่านที่เป็นโปรแกรมเมอร์ ผมมีวิธีแนะนำในการตรวจสอบและป้องกันง่ายๆ ก่อนที่จะ
upload file ขึ้น server ให้ test ต่างๆ ประมาณนี้ ก็จะทำให้มั่นใจว่าปลอดภัยระดับหนึ่ง ..
1.กรองการส่งค่าแบบ GET เข้ามาทาง URL และอย่าลืมทำการ addslashes() ค่าที่รับมา
ก่อนทุกครั้ง เพื่อป้องการการ injection และการ cross site script
2.อันนี้สำคัญมากคือพวกโปรแกรมที่ปล่อยให้ upload file ขึ้นมาบน server ได้ เท่าที่พบ
บ่อยที่สุด ก็คือพวกประกวดรูปภาพ แล้วให้คนมาโหวต ผมยังไม่เห็นเว็บไหนที่โกงไม่ได้
เพราะว่าพวกที่จะ hack ก็จ้องอยู่แล้วว่าเมื่อไรจะมี event พวกนี้ จะได้ส่งไปโหวตบ้างได้ของ
วิธีการปั่นโหวต ก็มีสารพัดวิธี แล้วแต่ใครถนัด แต่ก็ยังมีอีกพวก ที่ไม่ชอบปั่นแต่ hard core
คือ hack เข้าไปที่เว็บนั้นๆ เลย วิธีการก็โดยการพยายาม upload PHP Shell ขึ้นไป
ในเมื่อเว็บมีที่ให้ upload อยู่แล้ว การจะ upfile ขึ้นไป ก็ไม่ใช่เรื่องยากเท่าไรนัก ในมุมมอง
ของโปรแกรมเมอร์ อาจจะคิดว่าทำทุกอย่าง กันทุกอย่างแล้ว จะ upload เข้ามาได้อย่างไร
แต่อย่าลืมว่า hacker คือคนที่รู้และมีประสบการณ์ เรื่องพวกนี้ดีกว่า จุดอ่อนและวิธีการ
มีสารพัดวิธี แล้วแต่ใครถนัด ขนาดใช้ MySQL upload file ยังสามารถทำได้เลย ..
ที่จะแนะนำก็คือ ให้เชคให้ละเอียดว่า file ที่ให้ upload เป็น images ที่ไม่เป็นอันตราย
ไม่ใช่ check แค่ extensions หรือใช้ $_FILES เพราะว่าพวกนี้ปลอม header เข้ามาได้
ให้ใช้ getimagesize() แทนจะแน่นอนกว่า สำหรับตัวอย่างสามารถหาดูได้ที่
URL :
http://php.net/manual/en/function.getimagesize.php

ปล.วันนี้มาเขียนแค่นี้ก่อนครับ วันหลังเดี๋ยวมาเขียนต่อ รอติดตามกันนะครับ 🙂