วันนี้วันที่ 1 ก.พ.60 ครับการรถไฟเปิดขายตั๋วผ่านเว็บเป็นวันแรกครับ มาวันแรกก็เจอ sqli เลยครับ
ถ้าเราเข้าหน้า login แล้วพิมพ์ ‘ ที่ username ส่วน password พิมพ์อะไรก็ได้จะขึ้น error ครับ
ถึงจะไม่ได้บอกว่าเป็น error อะไรแต่ก็พอเดาได้ครับว่าน่าจะเป็น sqli แน่นอนครับ
ก็เป็นอันรู้ว่าตัว username ทำ sqli ได้แน่ ๆ หละทีเราก็ลอง login ดูโดยใช้ username เป็น
‘ or ‘1’=’1 ส่วน password เป็น password ของผมนะครับ จะเห็นว่าสามารถ login เข้า
user ของผมได้ครับ ทีนี้เวลาจะเจาะของคนอื่นวิธีก็คือใส่ username เป็น ‘ or ‘1’=’1 ส่วน
password ต้องให้ตรงกับ user นั้น ๆ ครับ ก็จะเข้าได้โดยไม่ต้องรู้ username ครับ
ครับถ้าลองใช้ worst 25 password นี่รับลอง login ได้แน่ ๆ ครับ
ถ้าอยากได้ password เป็น clear text ก็เปลี่ยน mail แล้วขอ password ใหม่ครับ
ทำไมไม่ hash นิ
จริง ๆ น่าจะเรียกได้ว่าเป็นภาค 6 เอฟเฟ็คมากกว่าครับเผื่อใครไม่รู้ละกันตามข่าว นี้
ซึ่งผมเดาว่าละกันว่าโดน sql injection ถามว่าทำไมคงเป็นเพราะ ง่าย ไม่ต้องคิดอะไรมาก
แค่ใช้ sqlmap scan เจอก็ทำได้ตั้งแต่ dump database ไปจนถึง spawn shell ขึ้นมา
คือโคตรง่ายเด็ก ป.6 ก็ทำได้ ทีนี้สงสัยว่าเว็บที่ทำงานมีบ้างรึเปล่า ลอง scan ดู
อ้าว มีเหมือนกันแฮะมันโหว่ตรง
http://www.mysite.co.th/base.php?page=readmore&id=2095§ion=news
โหว่ตรงไอ้ id นี่เลยครับช่องโหว่นี้มันเกิดเพราะหนึ่งใช้ function mysql() แทนที่จะใช้ mysqli
ได้ mysqli นี่มันกัน sql injection ครับแต่ mysql ธรรมดาไม่ได้กันครับ
ถามว่าผมแก้ยังไง ผมแค่แปลงเป็น int ครับ intval($_REQUEST[‘id’]) ขี้เกียจแก้เป็น mysqli
พอแปลงเป็น int แล้วจะใส่ UNION มาต่อท้ายหรืออะไรก็ไม่ผลละครับก็รอดไปแบบบ้าน ๆ
แต่จากเหตุการณ์นี้ทำให้ผมรู้ว่าไอ้การใช้ lamp เนี่ยเพื่อความปลอดภัยมันควรจะ
1. ปิดฟังก์ชั่นด้าน security ของ php ให้หมดครับ exec เทือกนั้นอย่าเปิดทิ้งไว้ไม่งั้นเค้าจะ spawn shell ได้
2. ใช้ mysqli เสมอ
3. user ที่ connect เข้า mysql อย่าใช้ root ให้สิทธิเท่าที่จำเป็น
4. folder html สิทธิควรเป็น 755
แต่บอกตามตรงครับ sql injection เป็นอะไรที่โคตรง่ายครับ แล้วเว็ปราชการไทยเป็นเยอะ
ใครมีเว็ปกลัวว่าจะโดนผมแนะนำให้เอา sqlmap มา scan ดูเลยครับ
Recent Comments