๐กํด๋น ๋ด์ฉ์ pentestqym์ ๋ด์ฉ์ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ฉฐ,
๋ชจ๋ ์ ์๊ถ์ ํด๋น ์ฌ์ดํธ์๊ฒ ์์ต๋๋ค.
์ด๋ฒ์๋ SQL Injection์ด ๋ญ์ง์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ์์๋ด ์๋ค.
SQL Injection?
SQL Injection์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ SQL(Structured Query Language) ์ฟผ๋ฆฌ๋ฅผ ์ ์์ ์ผ๋ก ์กฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ณต๊ฒฉํ๋ ์ทจ์ฝ์ 1์ ๋๋ค. ์ฑ๊ณต์ ์ธ ๊ณต๊ฒฉ์ผ๋ก ์ธํด ๊ณต๊ฒฉ์๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๊ฐ์ธ ์ ๋ณด๋ฅผ ํ์ทจํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ์น ๋ณด์์ ๋งค์ฐ ์ฌ๊ฐํ ์ํ์ ์ด๋ํ ์ ์์ต๋๋ค.
SQL Injection action?
์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ App์ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ CRUD๊ฐ ์ด๋ฃจ์ด์ง๋๋ค. ํนํ DB์ ์ํธ์์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์์ ์์ฒญ์ WAS๋ฅผ ํตํด DB์ ์์ ์ ์ํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๋ต์ผ๋ก ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ DB๋ฅผ ํ์ฉํด ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ตฌ์ ์ ๋์ ๋ฐ๋ผ ๋ฌผ๋ฆฌ์ /๋ ผ๋ฆฌ์ ์ผ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, ์น ์๋ฒ์ธก ๊ธฐ์ ์์๋ ์์ ์ ์ฌํ๊ฒ ๋ฐฐ์๋ดค์ฃ ?
1. ์ฌ์ฉ์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ก
- HTTP ํต์ (GET ๋งค๊ฐ๋ณ์ or POST Body ๋งค๊ฐ๋ณ์ ๋ฑ
2. ์ ์ก๋ ๋ฐ์ดํฐ๋ ์๋ฒ์ธก ์คํฌ๋ฆฝํธ์ ์ํด SQL ์ฟผ๋ฆฌ์ ๋์
3. ์๋ฒ์ธก ์คํฌ๋ฆฝํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ SQL ์ฟผ๋ฆฌ ์คํ์ ์์ฒญ
4. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
5. ์๋ฒ์ธก ์คํฌ๋ฆฝํธ๋ ๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก HTTP ์๋ต์ ์์ฑํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ
์! ๊ทธ๋ผ ์์ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ๋ฐฉ์์ SQLi์ ๊ณต๊ฒฉ์ ์ํ๋๋ค๊ณ ๊ฐ์ ํฉ์๋ค. ์ทจ์ฝํ๊ฒ ๊ตฌํ๋ ๋ก๊ทธ์ธ ๋ก์ง์ SQLi๋ก ์ฐํํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์์ ๊ถํ์ ํ๋ํ ์ ์์ต๋๋ค.
๊ณต๊ฒฉ์๊ฐ ID ์ ๋ ฅ๋์ ์๋์ ๊ฐ์ด ์ ๋ ฅํ์์ต๋๋ค.
admin' or '1' = '1
๊ทธ๋ฆฌ๊ณ PW๋์๋ ์์์ ๋ฌธ์์ด์ ์ ๋ ฅํ์์ต๋๋ค. ์ฌ๊ธฐ์ anyting์ผ๋ก ์ ๋ ฅํ์์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ID์ PW๋ฅผ HTTPํต์ ์ผ๋ก ์ต์ข ์ ์ผ๋ก ์๋์ ๊ฐ์ SQL Query๋ก ์์ฑ๋ฉ๋๋ค.
SELECT * FROM users WHERE id='admin' or '1'='1' AND password='anything';
์ด์ ๊ฐ์ด ๊ธฐ์ฌ๋๋ค๋ฉด ์ฌ์ฉ์ ID๊ฐ admin์ด ์๋ค๋ฉด ํจ์ค์๋ ์ฌ๋ถ์ ์๊ด ์์ด ํด๋น ์ ๋ณด๋ฅผ ํธ์ถํ๋ ์ฟผ๋ฆฌ๋ฌธ์ด ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ก SQL ๋ฌธ์ด ํญ์ ์ฐธ์ผ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ด์ฃ
๊ทธ๋ผ ์ ์ฐธ์ด ๋๋์ง ์์๋ด ์๋ค.
์์ ๊ฐ์ด 3๊ฐ์ง ์กฐ๊ฑด์ ํ์ธํ ์ ์์ต๋๋ค. WHERE์ ์ or๊ณผ AND ๋๊ฐ์ง์ ๋ ผ๋ฆฌ์ฐ์ฐ์๊ฐ ์๊ณ , ๊ฐ ๋ ผ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ด์ ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ธ์ง ํ์ธํด๋ด ์๋ค.
๊ตฌ๋ถ | ๋ด์ฉ | ์กฐ๊ฑด์์ ์ฐธ/๊ฑฐ์ง ์ฌ๋ถ |
์กฐ๊ฑด์1 | id='admin' | TRUE (admin ๊ณ์ ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก '์ฐธ'์ ๋๋ค.) |
์กฐ๊ฑด์2 | '1'='1' | TRUE (๋๊ฐ ๋ด๋ '์ฐธ'์ ๋๋ค.) |
์กฐ๊ฑด์3 | password='anything' | FALSE (admin ๊ณ์ ์ ํ๋ฆฐ ํจ์ค์๋์ด๋ฏ๋ก '๊ฑฐ์ง'์ ๋๋ค.) |
์ ๊ทธ๋ผ ๋ ผ๋ฆฌ์ฐ์ฐ์๋ ๋์ ํ์ฌ ์ฐ์ฐํฉ์๋ค. ๋จ, AND๊ฐ OR๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค๋ ์ ์ ์ํ์ธ์
์์ ๊ฐ์ด ์ ์ฉ๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ํด๋น ํด๋ฆฌ๋ฌธ์ด ์ฐธ์ด ๋์ด admin์ ๊ณ์ ์ ์ ๋ณด๋ฅผ ํ์ทจํ ์ ์๋ SQLi ๊ณต๊ฒฉ์ด ์ ์ฉ๋ฉ๋๋ค.
๋ํ ๊ณต๊ฒฉ์๊ฐ ์ฌ์ฉํ ํด๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ํด๋ฆฌ์ ์์ด์ ์ฐธ์กฐํ์ฌ ํด์ผํ๋ ์ ์ ์๊ฐํ๋ฉด์ ๋ค์์ผ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
SELECT *
FROM users
WHERE ((id='spike') AND (password='ilovejulia'));
์๋ ์ฟผ๋ฆฌ์ ๊ดํธ๋ก ์ฌ๋ซ์ด๊ฐ ์๋ค๋ฉด ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ์๋์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๊ณต๊ฒฉํ๋ ๊ฒ์ด์ง์
admin') or ('1'='1
SQLi๋ ์ธ์ฆ์ฐํ๋ง๊ณ ๋ ๊ณต๊ฒฉ์๊ฐ ์๋ํ ์๋ก์ด DB ๋ช ๋ น๋ฌธ์ ํธ์ถํ ์๋ ์์ต๋๋ค. ๋ค์์ App์์ ๊ฒ์ํ์์ ๊ฒ์๊ธ์ ์กฐํํ๋ ์ผ๋ฐ์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์ ๋๋ค.
์๋ก๋ ๊ฒ์ํ ๊ธฐ๋ฅ์์ ์ฌ์ฉ์๊ฐ ํน์ ๊ฒ์๊ธ(๊ฒ์๊ธ ๊ณ ์ ๋ฒํธ๊ฐ 4215๋ก ๊ฐ์ )์ ํด๋ฆญํ๋ฉด ๋์ค๊ฒ ํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋๋ค.
SELECT brd_no, subject, content, author, post_date FROM board WHERE brd_no=4215;
๊ณต๊ฒฉ์๋ ๋ค์๊ณผ ๊ฐ์ด SQL ์ฟผ๋ฆฌ์ ์ข ๋ฃ๋ฅผ ์๋ฆฌ๋ ๊ธฐํธ์ธ ์ธ๋ฏธ์ฝ๋ก (;)๊ณผ ๋ณธ์ธ์ด ์๋ํ ์ ์์ ์ธ SQL ๋ฌธ์ฅ์ ์ด์ฉํ์ฌ "brd_no"๋ผ๋ GET ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ํฉ๋๋ค. 9999๋ ์กด์ฌํ์ง ์๋ ๊ฒ์๊ธ์ ๋ฒํธ๋ก ๊ฐ์ ํฉ๋๋ค.
HTTP ํต์ (GET ํ๋ผ๋ฏธํฐ; ์ฌ์ฉ์ ์์ฒญ ์ ์ก)
/board/view.php?brd_no=9999;Drop%20table%20users;
์ฌ์ฉ์์ ์์ฒญ์์ ์ ๋ฌ๋ "brd_no" ๋งค๊ฐ๋ณ์์ ๊ฐ์ SQL ์ฟผ๋ฆฌ์ ํฌํจ๋์ด DB์์ ์คํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์์ ์ธ ์๋๋ก ์ถ๊ฐ๋ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ์ธํด ์๋์ SQL ์ฟผ๋ฆฌ์ ๊ณต๊ฒฉ์๊ฐ ์ถ๊ฐํ ์ ์์ ์ธ SQL ์ฟผ๋ฆฌ๊ฐ ๋์ผํ ํธ๋์ญ์ ์์ ์คํ๋ฉ๋๋ค.
SELECT brd_no, subject, content, author, post_date FROM board WHERE brd_no=9999;Drop table users;
๋ง์ฝ App์์ ์ฌ์ฉ๋๋ DB์ ๊ณ์ ์ด ์(์ญ์ )์ ๊ฐ์ ๊ถํ์ ๊ฐ๊ณ ์๋ค๋ฉด ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
SQL Injection์ HTTP ๋งค๊ฐ๋ณ์ ๋ฑ์ ๊ฐ์์ ์์ ํ์ง ์์ ๋ฌธ์[ํ๋ฐ์ดํ('), ์ธ๋ฏธ์ฝ๋ก (;) ๋ฑ]๋ฅผ ํ์ฉํ์ฌ SQL ์ฟผ๋ฆฌ์ ์ ์์ ์ธ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๊ณต๊ฒฉ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์์น ๋ชปํ ๋์์ ์ ๋ฐํ ์ ์์ต๋๋ค.
SQLi ์ข ๋ฅ
SQLi๋ DB ์ ๊ทผ๋ฐฉ์์ด๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ ๋ฐ๋ผ ์๋์ ๊ฐ์ด ๋๋ฉ๋๋ค.
์ค๋ฅ(Error) ๊ธฐ๋ฐ SQLi
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฅ๋ฅผ ์ด์ฉํ์ฌ ๊ณต๊ฒฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด๋ฅผ ํ์ ํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋๋ค. ๊ณต๊ฒฉ์๋ ์๋์ ์ธ ์ค๋ฅ๋ฅผ ์ ๋ฐํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ ์ ๋ณด๋ฅผ ์ถ์ถํฉ๋๋ค.
๐๋ ์์๋ณด๊ธฐ!!
UNION๊ธฐ๋ฐ SQLi
๊ณต๊ฒฉ์๊ฐ ์๋ํ SQL ์ฟผ๋ฆฌ๋ฅผ UNION ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๊ธฐ์กด SQL ์ฟผ๋ฆฌ์ ๋ง๋ถ์ด๊ณ ๊ธฐ์กด SQL์ ๋ฌดํจํ์์ผ ์ํ๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ์ ์ทจํ ์ ์๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋๋ค.
๐๋ ์์๋ณด๊ธฐ!!
๋งํฌ ๋งํฌ
Blind SQLi
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฅ๋ ๋ฐ์ดํฐ๊ฐ ์ง์ ์ ์ผ๋ก ๋ ธ์ถ๋์ง ์์ ๋ ์ฌ์ฉ๋๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋๋ค.
๊ณต๊ฒฉ์๋ ์๋ฒ์ ๋ฏธ์ธํ ์๋ต๊ณผ ๋์ ๋ฐฉ์์ ๊ด์ฐฐํ์ฌ ๊ณต๊ฒฉ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ์ถ๋ก ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ด ์์ต๋๋ค.
Boolean ๊ธฐ๋ฐ
SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ฐธ ๋๋ ๊ฑฐ์ง์ ๋ฐ๋ผ ์๋ฒ์ ์๋ต์ด ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ณต๊ฒฉ์๋ ์ฐธ/๊ฑฐ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๊ณต๊ฒฉ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
Time ๊ธฐ๋ฐ
SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์๋ฒ์ ์๋ต ์๊ฐ์ ์กฐ์ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ณต๊ฒฉ์๋ ์ง์ฐ๋ ์๋ต ์๊ฐ์ ํตํด SQL Injection์ ์ทจ์ฝํ์ง ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
๐๋ ์์๋ณด๊ธฐ!!
๋งํฌ ๋งํฌ
SQLi์ ์ํฅ
SQL Injection ๊ณต๊ฒฉ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ง์ ํ๊ดดํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์ ์ถํ๋ฉฐ ๋ฐ์ดํฐ์ ์์๊ณผ ์์ค์ ์ด๋ํ ์ ์์ต๋๋ค. ๋ํ ์ผ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๊ณต๋๋ ์ ์ฅ ํ๋ก์์ (Stored Procedure)๋ฅผ ์ ์ฉํ๋ฉด ์๊ฒฉ ๋ช ๋ น ์คํ ๋ฑ์ผ๋ก ์์คํ ์์์ ์ด๋ํ ์ ์์ต๋๋ค. 2
SQLi ์๋ฐฉ์ฑ
SQL Injection์ ์๋ฐฉํ๊ธฐ ์ํด์๋ ๋จ์ํ ํ๋ฐ์ดํ(')๋ ์ธ๋ฏธ์ฝ๋ก (;) ๋ฑ์ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ ์ด์์ ๋ฐฉ์ด์ฑ ์ด ํ์ํฉ๋๋ค. ์๋๋ SQL Injection์ ์๋ฐฉํ๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ๋๋ค
์ ๋ ฅ๊ฐ ๊ฒ์ฌ
HTTP ์์ฒญ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ SQL ๊ตฌ๋ฌธ์ผ๋ก ํด์๋ ์ ์๋ ๋ฌธ์๋ ์ ์ฑ SQL ๊ตฌ๋ฌธ์ ๊ฒ์ฌํ์ฌ ํํฐ๋งํ๋ ๊ฒ์ SQL Injection ๊ณต๊ฒฉ์ ์๋ฐฉํ๊ธฐ ์ํ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ์ด๋ฌํ ๊ฒ์ฌ ๋ฐ ํํฐ๋ง์ ์ผ๋ถ SQL Injection ๊ณต๊ฒฉ์ ๋ํด ํจ๊ณผ์ ์ด์ง๋ง, ์๋ฒฝํ ๋ณด์์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค.
SQL Injection ๊ณต๊ฒฉ์ ๋ค์ํ ๊ธฐ๋ฒ๊ณผ ๋ณํ์ ์ฌ์ฉํ๋ฏ๋ก, ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น์ ํจ๊ป ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
- SQL ๊ธฐํธ : ํ๋ฐ์ดํ('), ๊ฒน๋ฐ์ดํ("), ์ธ๋ฏธ์ฝ๋ก (;), ๋์(-), ์ต(#), ์ฌ๋์์ต (/*) ๋ฑ
- SQL ๊ตฌ๋ฌธ : SELECT, INSERT, UPDATE, DELETE, UNION, GROUP BY, HAVING, ORDER BY ๋ฑ
์ ์ฅ ํ๋ก์์ ์ฌ์ฉ
์ ์ฅ ํ๋ก์์ ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํํ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋์ง๋ง, ์ ์ฅ ํ๋ก์์ ๋ด์์ ์์ ํ์ง ์์ SQL ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ๋ฐฉ์์ด ์ฌ์ฉ๋๊ฑฐ๋ ์ ์ฅ ํ๋ก์์ ํธ์ถ ๋ช ๋ น์ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ด ์์ ํ์ง ์์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ SQL Injection ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ต๋๋ค. 3
๊ณต๊ฒฉ์๋ ์ ์ฅ ํ๋ก์์ ์คํ ๋ช ๋ น์ ์กฐ์ํ์ฌ ์์น ์๋ ์ ์ฅ ํ๋ก์์ ๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ ์์ ์ธ ๋ช ๋ น์ ์คํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, xp_cmdshell์ ์ฌ์ฉํ์ฌ ์ ๋ช ๋ น์ ์คํํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด์ ๋ํ ๋ฐฉ์ด ์กฐ์น๊ฐ ํ์ํฉ๋๋ค. 4
๋ค์์ sp_boardList ์ ์ฅ ํ๋ก์์ ์คํ ๋ช ๋ น์ ์ข ๋ฃ์ํค๊ณ ๋ค์ xp_cmdshell ์ ์ฅ ํ๋ก์์ ๋ฅผ ํตํด C๋๋ผ์ด๋ธ์ ํ์ผ๊ณผ ๋๋ ํ ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ ์ ๋ช ๋ น์ ์คํํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
exec sp_boardList '30', 'test'; exec master..xp_cmdshell 'dir C:\'--
๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ ์ฌ์ฉ
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๋ SQL ์ฟผ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ
ํด๋น ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ค๋นํ ํ ํ์ํ ๊ฐ๋ค์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ฌ ์คํํฉ๋๋ค. ๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด SQL ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ๊ณ ๊ณต๊ฒฉ์์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ด SQL Injection ๋ฐฉ์ด์ ํจ๊ณผ์ ์ ๋๋ค.
๋ค์์ ๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฉํ๋ ๊ฐ๋จํ PHP ์์ ์์ค์ฝ๋์ ๋๋ค. ๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฉํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ์์ค์ฝ๋์ ๋๋ค.
$conn = mysqli_connect("example.com","spike","ilovejulia","bebop_db");
$sql = "INSERT INTO crews (firstname, lastname, email)
VALUES ('$_POST["firstname"]','$_POST["lastname"]','$_POST["email"]')";
$mysqli->query($conn, $sql);
๋ณด์๋ ๋ฐ์ ๊ฐ์ด SQL ์ฟผ๋ฆฌ์ HTTP ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ด ๋ฐ๋ก ์ ๋ ฅ๋๊ณ SQL ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌ๋์ด ์คํ๋ฉ๋๋ค.
ํ์ง๋ง ์์ ์์ค์ฝ๋์ ๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํ๊ฐ ๋ฉ๋๋ค.
$conn = mysqli_connect("example.com","spike","ilovejulia","bebop_db");
$stmt = $conn->prepare("INSERT INTO crews (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$stmt->execute();
SQL ์ฟผ๋ฆฌ์ INSERT ๊ตฌ๋ฌธ์ ๋ณด์๋ฉด VALUES ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋ ๊ณณ์ ๋ฌผ์ํ(?)๋ก ํ๊ธฐํ์์ต๋๋ค. ์ด๋ฅผ Placeholder๋ผ๊ณ ํฉ๋๋ค.
์ด SQL ์ฟผ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ก๋๊ณ , ์ถํ ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๋ฌ(๋ฐ์ธ๋ฉ)ํ์ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
์ต์ ๊ถํ & ๊ธฐ๋ฅ ์ฌ์ฉ
DBA๋ ๊ณ ๊ธ ๊ถํ์ ๊ฐ์ง ๊ณ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ํผํด์ผํ๋ฉฐ, ๋ํ ๋ถํ์ํ ๊ธฐ๋ฅ๋ค์ ๋นํ์ฑํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๊ฐํํ ์ ์์ต๋๋ค.
DB ์ต์ ํจ์น
์ฌ์ฉ ์ค์ธ DB์ ์ ์์ฌ๊ฐ ๋ฐํํ ๋ด์ฉ๋๋ก ์ต์ ํจ์น๋ฅผ ์ง์์ ์ผ๋ก ํด์ผํฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
- DB์ ์ํธ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ธ์ด [๋ณธ๋ฌธ์ผ๋ก]
- ์ผ๋ จ์ ์ฟผ๋ฆฌ๋ฅผ ๋ง์น ํ๋์ ํจ์์ฒ๋ผ ์คํํ๊ธฐ ์ํ ์ฟผ๋ฆฌ์ ์งํฉ [๋ณธ๋ฌธ์ผ๋ก]
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฏธ๋ฆฌ ์ ์๋ ํ๋ก๊ทธ๋จ ๋๋ ๋ฃจํด [๋ณธ๋ฌธ์ผ๋ก]
- Windows ๋ช ๋ น ์ ธ์ ์์ฑํ๊ณ ์คํ์ ์ํด ๋ฌธ์์ด๋ก ์ ๋ฌํฉ๋๋ค. ๋ชจ๋ ์ถ๋ ฅ์ ํ ์คํธ ํ์ผ๋ก ๋ฐํ๋ฉ๋๋ค. [๋ณธ๋ฌธ์ผ๋ก]
'๐โWeb_Study > ๐ฅโpentestgym' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQLi WriteUp (1) | 2023.07.12 |
---|---|
Error ๊ธฐ๋ฐ SQL ์ธ์ ์ (1) | 2023.07.11 |
์น ์๋ฒ์ธก ๊ธฐ์ (5) | 2023.07.06 |
์น ํด๋ผ์ด์ธํธ์ธก ๊ธฐ์ (3) | 2023.05.29 |
์ธ์ฝ๋ฉ(Encoding) (0) | 2023.05.27 |