- กล่าวถึงปัญหา บอตสแครปเปอร์ที่ส่งคำขอมากเกินไปจนทำงานคล้าย DDoS กับเว็บไซต์สาธารณะ พร้อมนำเสนอแนวทางเชิงทดลองในการย้อนใช้สิ่งนี้เพื่อถ่วงเวลาให้มันเสียเปล่า
- สร้าง ตัวสร้างข้อความบนพื้นฐานของ Markov chain เพื่อผลิตข้อมูลปลอมที่ดูเหมือนไฟล์
.php และล่อให้บอตอันตรายดาวน์โหลดไป
- จากนั้นสร้าง เซิร์ฟเวอร์คอนเทนต์แบบสแตติก ที่สุ่มส่งย่อหน้าจากนวนิยาย Frankenstein และออกแบบโครงสร้างลิงก์ให้ครอว์เลอร์กระจายตัวแบบระเบิด
- เพิ่ม แอตทริบิวต์
noindex, nofollow และตัวนับจำนวนคำขอในทุกหน้า เพื่อกันเสิร์ชเอนจินปกติออกและจับเฉพาะบอตที่ละเมิดกฎ
- ผลการทดลองน่าสนใจ แต่มี ความเสี่ยงต่อการตรวจจับ Googlebot ผิดพลาด จึงไม่ใช้กับบริการจริง และคงไว้เป็นโปรเจ็กต์เพื่อการเรียนรู้และทดลอง
ปัญหาของบอตสแครปเปอร์และแนวคิดในการรับมือ
- สแครปเปอร์ทำให้เกิด ภาระระดับ DDoS กับเว็บไซต์ขนาดเล็กโดยไม่ตั้งใจ
- มีผู้ดูแลบางรายมาสอบถามวิธีป้องกัน แต่บทความนี้โฟกัสที่ “โต้กลับแทนที่จะป้องกัน”
- หลังเห็นนักพัฒนาคนอื่น ใช้ Markov chain สร้างข้อมูลปลอมได้ไม่สิ้นสุดเพื่อหลอกบอต จึงเริ่มทดลองด้วยตนเอง
ตัวสร้าง PHP ปลอมบนพื้นฐานของ Markov chain
- ใช้ Rust สร้าง ตัวฝึก Markov chain เพื่อผลิตคอนเทนต์ที่ดูสมจริงจากข้อมูลข้อความตามอำเภอใจ
- เจาะกลุ่ม บอตอันตรายที่ไล่หาพาธเปราะบาง เช่น
.env, .aws, .php โดยส่งโค้ด PHP ปลอมที่ดูเหมือนจริงแต่ไร้ความหมายให้
- ขยายขนาดไฟล์ตั้งแต่ 2KB ถึง 10MB เพื่อ ทำให้บอตสิ้นเปลืองทรัพยากร
- ตัวอย่างผลลัพธ์อยู่ในรูปของ โค้ด PHP ปลอมที่น่าเชื่อถือ ซึ่งปนชื่อฟังก์ชันและคอมเมนต์ของ WordPress
- เป้าหมายคือทำให้บอตเสียเวลาและทรัพยากร รวมถึงทำให้ผู้โจมตีเสียเวลาไปกับการหาช่องโหว่ที่ไม่มีอยู่จริง
การทดลองเรื่องประสิทธิภาพและการให้ข้อมูลแบบสแตติก
- เมื่อให้บริการไฟล์ขนาดเกิน 1MB บน VPS ก็เกิด ความล่าช้าในการตอบสนองและภาระเซิร์ฟเวอร์ที่เพิ่มขึ้น
- เพื่อแก้ปัญหานี้จึงสร้าง “garbage server” ในรูปแบบเว็บไซต์สแตติก
- โหลดนวนิยาย Frankenstein ทั้งเล่มเข้าเมมโมรี และทุกครั้งที่มีคำขอจะส่งคืนย่อหน้าแบบสุ่ม 4 ย่อหน้า
- เพิ่มลิงก์ 5 รายการไว้ท้ายแต่ละหน้าเพื่อ ล่อให้เกิดการขยายการครอว์ลแบบระเบิด (เพิ่มแบบคูณ 5)
- ดูผลลัพธ์ได้ที่ https://herm.app/babbler/
รายละเอียดการออกแบบและวิธีการใช้งาน
- นวนิยายที่เลือกเป็น public domain และเลือกใช้เพราะทำในช่วง ฮาโลวีน รวมถึงมองว่า AI กับ Frankenstein มีความคล้ายกัน
- ทุกหน้ากำหนด
noindex,nofollow เพื่อ จับเฉพาะบอตที่ฝ่าฝืนกฎ
- ด้านล่างของแต่ละหน้ามี ตัวนับจำนวนครั้งที่ถูกเรียกใช้งาน ซึ่งจะรีเซ็ตเมื่อดีพลอยใหม่เพราะเก็บไว้ในเมมโมรี
- ยังแยกเซิร์ฟเวอร์สำหรับคำขอ
.php โดยเฉพาะ เพื่อ สุ่มส่งไฟล์ PHP จริงจากในเมมโมรี
- สรุปโปรเจ็กต์ด้วยวลี “Garbage for the garbage king!”
ความเสี่ยงและข้อจำกัด
- ระบบนี้มี ความเสี่ยงต่อการตรวจจับเสิร์ชเอนจินผิดพลาดหากนำไปใช้กับบริการจริง
- ถ้า Googlebot มาไล่เก็บ endpoint ผิด ๆ อาจ ถูกจัดเป็นเว็บไซต์สแปม
- อาจนำไปสู่การแสดงผลในการค้นหาที่ลดลงหรือ มีคำเตือนใน Chrome
- ดังนั้นจึง ไม่แนะนำสำหรับเว็บไซต์ที่พึ่งพาการค้นหา และใช้งานเพียงเป็นโปรเจ็กต์ทดลอง
- babbler สำหรับ
.php ไม่ใช่ HTML จึง ไม่กระทบ Googlebot และมุ่งเป้าเฉพาะบอตอันตราย
บทสรุปและข้อคิดเห็นส่วนตัว
- เพิ่ม ลิงก์ซ่อนอยู่ (
rel="nofollow") ในบล็อกเพื่อล่อสแครปเปอร์อันตราย
- หาก โควตาทราฟฟิกของ VPS เกิน ก็พิจารณาใช้ Cloudflare cache
- โปรเจ็กต์นี้เป็นการทดลองที่ทั้งสนุกและปนความหงุดหงิด พร้อมกับได้เรียนรู้ Markov chain และหลักการทำงานของบอต
- สุดท้ายแล้ว ไม่ใช่ทุกความพยายามจะต้องใช้งานได้จริงเสมอไป บางครั้งแค่สนุกก็เพียงพอแล้ว
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ต่อให้โลกเปลี่ยนไป ก็สุดท้ายยังต้องเจอปัญหาเดิม ๆ
เมื่อ 10~15 ปีก่อน ฉันเคยต่อสู้กับพวก บริการติดตามโซเชียลมีเดีย แบรนด์ใหญ่ ๆ จ่ายเงินให้พวกเขาเพื่อติดตามความเห็นบนฟอรัม แต่พวกนั้นกลับมา scrape ชุมชนฟรีที่ฉันดูแลโดยไม่ได้รับอนุญาต และทำให้เซิร์ฟเวอร์มีโหลดเพิ่มขึ้น
ถึงจะ บล็อกบอต ของพวกเขา พวกมันก็กลับมาโดยเปลี่ยน IP กับ UA อยู่ดี เลยทำฟิลเตอร์ที่สุ่มแทรกชื่อแบรนด์ลงในโพสต์เพื่อทำลายคุณภาพข้อมูลของพวกเขา พอเปิดใช้มาตรการนี้ การ scrape ก็หยุดไปหมดภายในสองวัน
บอตพวกนี้ไม่ได้ parse ไฟล์ PHP จริง ๆ แต่ใช้การมีอยู่ของไฟล์นั้นเพื่อสร้าง fingerprinting สำหรับตรวจหาช่องโหว่ ดูแค่ response code แล้วก็ทิ้งไปเลย
ไม่นานมานี้ได้ยินเรื่อง tarpit สำหรับ AI และ scraper เป็นวิธีที่ไม่ตัดการเชื่อมต่อ แต่ค่อย ๆ ส่งข้อมูลไม่สิ้นสุดอย่างช้ามาก เครื่องมือชื่อ Nepenthes ดูน่าสนใจดี อยากลองเอามาทดลอง
เมื่อก่อนถ้าบล็อก scraper บน HN จะโดนด่า มีตรรกะประมาณว่า “จะเข้าถึงยังไงก็เรื่องของฉัน”
ถ้าคุณดูแล Apache server เอง คุณสามารถใช้ RewriteEngine เพื่อบล็อกคำขอ PHP ได้ทันที
บนเซิร์ฟเวอร์ของฉันไม่มี PHP ดังนั้นคำขอพวกนี้ทั้งหมดเป็นอันตรายแน่นอน
scraper เชิงรุกส่วนใหญ่มักเล็ง ช่องโหว่ของ WordPress พวกมันไม่ได้ต้องการไฟล์ PHP เองเท่ากับต้องการ ผลลัพธ์ที่ไฟล์ส่งออกมา การตั้งค่าแบบนี้จึงคล้าย honeypot ชนิดหนึ่ง แต่ถ้าบอตไม่เจอสิ่งที่สคริปต์คาดไว้ มันก็จะไปเอง
ก่อนหน้านี้เคยโพสต์เรื่อง กลยุทธ์ zipbomb บน HN แล้วทราฟฟิกพุ่งเป็น 100,000 ครั้งในวันเดียว VPS ราคา $6 รับไม่ไหว ตอนนี้เลยใช้ zipbomb ตอบโต้เฉพาะบอตที่ก้าวร้าวที่สุด ส่วนที่เหลือให้ 403 กลยุทธ์ใหม่ได้ผลดี แต่ก็ยังลังเลว่าจะเปิดเผยอีกไหม ดูเพิ่ม: โพสต์ก่อนหน้า
เมื่อก่อนใช้แค่ fail2ban แต่ก็อยากทำ มาตรการป้องกันที่สนุกกว่านี้
ใน
.htaccessจะ redirect path ที่น่าสงสัย (/.git,/wp-login) ไปที่decoy.phpแล้วบังคับให้ดาวน์โหลด decoy.zip ขนาด 10GBdecoy.phpจะทำตัวเหมือนไฟล์สำคัญที่ถูกร้องขอ แต่จริง ๆ แล้วเป็นการสตรีม ล็อกปลอมกับข้อมูล SQL ปลอม แบบไม่สิ้นสุดเพื่อรั้งบอตไว้บอตพวกนี้ไม่ได้มา scrape ไฟล์ PHP แต่กำลังหา ช่องโหว่ของเฟรมเวิร์ก ถ้าให้การตอบกลับที่ไม่คาดคิด พวกมันก็จะยอมแพ้แล้วไปหาเป้าหมายอื่นทันที
บางครั้งก็คิดเล่น ๆ ว่า — จะทำให้บอตเอาทรัพยากรที่มันกำลังเผาทิ้งไป ขุดคริปโตเคอร์เรนซี แทนได้ไหม?