[์ฌ์ด๋ฒ ํํ : ๋ณด์์ ์ฒซ๊ฑธ์] OWASP Juice-Shop์ ํตํด ์์๋ณด๋ SQL Injection
๐กOWASP Juice-Shop์ด๋?
โOWASP Juice-Shopโ์ด๋ OWASP(Open Web Application Security Project)์์ ๋ง๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์ ์ทจ์ฝ์ ์ค์ต์ฉ ํ๋ก์ ํธ์์. ์ฃผ์ ์น ์ทจ์ฝ์ ์ธ OWASP Top 10 ์ทจ์ฝ์ ๋ค์ด ์ค์ ์ ์ฉ๋์ด ์์ด, ์ด ์ทจ์ฝ์ ๋ค์ ์ง์ ํ ์คํธํ๊ณ ํ์ตํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ต๋๋ค.
Juice-Shop์ ํตํด ์ค์ต์ ์งํํ๊ธฐ ์ํด์๋, Burp Suite๋ Foxy Proxy ๊ฐ์ ํ๋ก์ ํด์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก ๋ฆฌ๋ ์ค ํ๊ฒฝ์์ ์ค์ต์ ์งํํฉ๋๋ค.
๐งJuice-Shop ์ค์นํ๊ธฐ
๋ณธ๊ฒฉ์ ์ธ ๋ด์ฉ์ ์์ํ๊ธฐ ์ ์, ๋จผ์ Juice-Shop์ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์๊ฐํ ๊ฒ์.
Juice-Shop์ ๋ฆฌ๋
์ค์ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ ๋ง ๋ค์ํ์ง๋ง, ์ ๋ ๊ทธ์ค Docker๋ก ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์ถ์ฒํฉ๋๋ค. ๊ฐ์ฅ ๋น ๋ฅด๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ด์ฃ !
(โ ๏ธํด๋น ์ค๋ช
์ ์นผ๋ฆฌ ๋ฆฌ๋
์ค ๊ธฐ์ค์ผ๋ก ๋์ด์์ต๋๋ค!)
์ฐ์ docker --version ๋ช
๋ น์ด๋ก ์นผ๋ฆฌ ๋ฆฌ๋
์ค์ ๋์ปค๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
๋ง์ฝ ์ค์น๋์ด ์์ง ์๋ค๋ฉด,
sudo apt updatesudo apt install docker.io -y
๋ฅผ ์ฐจ๋ก๋ก ์ ๋ ฅํด ๋์ปค๋ฅผ ์ค์นํด์ฃผ์ธ์.
๋ค์์ ๋์ปค ์๋น์ค ์์ ๋ฐ ๋ถํ ์ ์๋์ผ๋ก ์์ํ๊ธฐ ์ํ ์ค์ ์ ๋๋ค.
sudo systemctl start dockersudo systemctl enable docker
๋ฅผ ์ฐจ๋ก๋๋ก ์ ๋ ฅํด ์ฃผ์ธ์.
์ด์ ์ค์น๊ฐ ๊ฑฐ์ ๋๋๊ฐ๋๋ค!!
sudo docker pull bkimminich/juice-shop
๋ช ๋ น์ด๋ก Juice-Shop ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํด ์ฃผ์ธ์.
์ฌ๊ธฐ๊น์ง๊ฐ ๋์ปค๋ฅผ ์ด์ฉํ Juice-Shop์ ์ค์น ๊ณผ์ ์ด์์ต๋๋ค! ๊ฐ๋จํ์ฃ ~?๐
์ด์ sudo docker run --rm -p 42000:3000 bkimminich/juice-shop ๋ช
๋ น์ด๋ก Juice-Shop ์ปจํ
์ด๋๋ฅผ ์คํํ๋ฉด ๋ก์ปฌ์ 42000ํฌํธ๊ฐ ์ปจํ
์ด๋ ๋ด๋ถ์ 3000ํฌํธ๋ก ์ฐ๊ฒฐ๋ ๊ฑฐ์์. ์ดํ https://127.0.0.1:42000 ๊ฐ์ URL์ด ๋จ๋ฉด ์ ์ํด ์ฃผ์ธ์!
Juice-Shop์ ์ฑ๊ณต์ ์ผ๋ก ์ง์ ํ๋ฉด,
![๊ทธ๋ฆผ 1. [Juice-Shop ๋ฉ์ธํ๋ฉด]](/images/323303_250925_image1.png)
์ด๋ฐ ๋ฉ์ธ ํ๋ฉด์ด ์คํ๋ฉ๋๋ค. ์ค์ ์ฃผ์ค๋ฅผ ํ๋งคํ๊ณ ์๋ ์ฌ์ดํธ ๊ฐ์ง ์๋์?
์ด ํ์ด์ง๋ฅผ ์์์ผ๋ก, ์ค์ ์นํ์ด์ง์ฒ๋ผ ๋ก๊ทธ์ธ ํ๋ฉด, ์ฅ๋ฐ๊ตฌ๋, ์ํ ์ค๋ช
๋ฑ๋ ์ ๊ตฌํ๋์ด ์์ผ๋ ํ ๋ฒ์ฉ ์ดํด๋ณด๋ ์ฌ๋ฏธ๊ฐ ์ ์ ํ๋ต๋๋ค!
์ด๋ฒ 9์ ํธ์์๋ SQL Injection์ ๋ํด ๊ฐ๋จํ ๋ค๋ค๋ณด๋ ค๊ณ ํ๋๋ฐ์, Juice-Shop์๋ SQL Injection์ ๊ด๋ จํ ์ฑ๋ฆฐ์ง๊ฐ ์ค๋น๋์ด ์์ด Juice-Shop์ ์ด์ฉํ๋ฉด ์ฑ๋ฆฐ์ง๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์ ํตํด ๋ง์ ์ง์์ ์ป์ ์ ์๊ณ , ์๊ฐ์ ์ธ ์ดํด๋ ๊ฐ๋ฅํด์!
๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก SQL Injection์ ๋ํด ๊ฐ๋จํ ์์๋ณธ ๋ค, Juice-Shop์ ์ฑ๋ฆฐ์ง๋ฅผ ํตํด ๊ฐ๋จํ ์ค์ต์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค-!๐
๐กSQL Injection
๐SQL Injection์ด๋?
![๊ทธ๋ฆผ 2. [SQL์ธ์ ์
]](/images/323303_250925_image2.jpeg)
SQL Injection์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ทจ์ฝ์ ์ ์ ์ฉํด ์ ์์ ์ธ SQL ์ฝ๋๋ฅผ ์ฝ์ ํ๊ณ , ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ๊ฑฐ๋ ๋ถ๋ฒ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ์๋ฏธํด์.
์ฌ๊ธฐ์ SQL ์ด๋ โStructured Query Languageโ์ ์ฝ์๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ, ์ฝ์
, ์์ , ์ญ์ ํ๋ ๋ฑ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉํ๋ ํ์ค ์ธ์ด์์. ์ฝ๊ฒ ๋งํด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ช
๋ น์ ๋ด๋ ค ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ฐ์ด๋ ์ธ์ด๋๋๋ค.SELECT name, ageFROM usersWHERE age > 20ORDER BY age DESC;
์ด ์ฝ๋๋ ๊ฐ๋จํ SQL ์ฝ๋ ์์์ธ๋ฐ์, ์ฝ๋์์ SELECT name, age๋ผ๋ ๋ถ๋ถ์ users ํ
์ด๋ธ์์ name๊ณผ age ์์ฑ์ ์ ํํด ์กฐํํ๋ค๋ ๋ป์ด์์. FROM users๋ ์กฐํ ๋์ ํ
์ด๋ธ์ด users์์ ์ง์ ํ๊ณ , WHERE age > 20์ age๊ฐ 20๋ณด๋ค ํฐ ํ๋ง ํํฐ๋งํด ์ ํํ๋ค๋ ์๋ฏธ์
๋๋ค.
๋ง์ง๋ง์ผ๋ก ORDER BY age DESC๋ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ age ์์ฑ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์(DESC)์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
| id | name | age | |
|---|---|---|---|
| 1 | Alice | 25 | alice@example.com |
| 2 | Bob | 19 | bob@example.com |
| 3 | Charlie | 30 | charlie@example.com |
| 4 | Diana | 22 | diana@example.com |
์๋ฅผ ๋ค์ด, ์ด๋ฌํ ํ
์ด๋ธ์์ SQL์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด age๊ฐ 20๋ณด๋ค ํฐ Alice, Charlie, Diana๊ฐ ์ ํ๋๋ฉฐ, age๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค๊ณ ํ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ๋ Charlie(30), Alice(25), Diana(22)์์๊ฐ ๋ฉ๋๋ค.
์์ฝํด ๋ณด๋ฉด, SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํ ๋ช
๋ น์ด ์งํฉ์ด๋ผ๊ณ ๋ณผ ์ ์์ด์!
๋ค์ Injection ์ด์ผ๊ธฐ๋ก ๋์๊ฐ๋ณด๋ฉด, ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์์ ์
๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก SQL์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋๋ฐ์, ์
๋ ฅ ๋ฐ์ดํฐ์ ๋ํ ๊ฒ์ฆ์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์๋๋ค๋ฉด ๊ณต๊ฒฉ์๋ ์
๋ ฅ ํ๋์
์
์ฑ SQL ์ฝ๋๋ฅผ ์ฃผ์
ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ดํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ๊ณต๊ฒฉ์ ๊ฒฐ๊ณผ๋ก ๊ฐ์ธ ์ ๋ณด ํ์ทจ, ์น ํ์ด์ง ๋ด์ฉ ๋ณ์กฐ, ๊ถ๋ฆฌ์ ๊ถํ ํ์ทจ ๋ฑ์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด์.
๐ฅSQL Injection์ ๊ณต๊ฒฉ ์ ํ
1. Error Based SQL Injection
์ฒซ ๋ฒ์งธ ์ ํ์ Error Based SQL Injection์
๋๋ค. ์ด ์ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ํ๋ Injection์ผ๋ก, ๊ณต๊ฒฉ์๊ฐ SQL ์ฟผ๋ฆฌ์์ ์๋์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ ์ค๋ฅ๋ฉ์์ง์ ๋ํ๋๋ ์ ๋ณด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ ์ ๋ณด๋ฅผ ํ์
ํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ์๋ฏธํด์. ์์ ์ฝ๋๋ฅผ ํ ๋ฒ ์ดํด๋ณผ๊น์?SELECT * FROM users WHERE id = '1' OR 1=1; ์ ์ทจ์ฝํ ์ฟผ๋ฆฌ์ ์์์
๋๋ค.
์ด ๊ฒฝ์ฐ, ' AND (SELECT 1/0 FROM users)-- ๋ช
๋ น์ด๋ 1/0์ 0์ผ๋ก ๋๋๊ธฐ ์ค๋ฅ๋ฅผ ์ ๋ฐํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ฒ ํด์. ๋ฐ๋ผ์ ๊ทธ ๋ด์ฉ์ผ๋ก ํ
์ด๋ธ ๋ฐ ์ปฌ๋ผ ์ ๋ณด๊ฐ ์ ์ถ๋ ์ ์๋ต๋๋ค.
2. Union SQL Injection
๋ ๋ฒ์งธ ์ ํ์ Union SQL Injection์
๋๋ค. ๊ณต๊ฒฉ์๊ฐ SQL์ UNION ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ์๋ณธ ์ฟผ๋ฆฌ์ ๋์ผํ ํํ์ ์
์ฑ ์ฟผ๋ฆฌ๋ฅผ ์ถ๊ฐํด, ์ฌ์ฉ์ ์ ๋ณด, ๋ก๊ทธ์ธ ๊ณ์ ๋ฐ ์์คํ
์ ๋ณด ๋ฑ์ ํ์ทจํฉ๋๋ค. ์ฌ๊ธฐ์ UNION ๋ช
๋ น์ด๋, SQL์์ ์ฌ๋ฌ ๊ฐ์ SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ๋๋ก ํฉ์น๋ ์งํฉ ์ฐ์ฐ์์
๋๋ค. ์์๋กSELECT name FROM studentsUNIONSELECT name FROM teachers;
๋ผ๋ ์ฟผ๋ฆฌ๋ students์ teachers ํ
์ด๋ธ์์ name ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ชจ์ ํ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅํ๋ฉฐ, ์ค๋ณต์ ์ ๊ฑฐํฉ๋๋ค.
์ด์ UNION SQL Injection์ ์์ ์ฝ๋๋ฅผ ํ ๋ฒ ์ดํด๋ณผ๊ฒ์.SELECT id, name FROM users WHERE id = '$input';์ ์ทจ์ฝํ ์ฟผ๋ฆฌ์ ์์์
๋๋ค.
์ด๋ UNION Injection์ด ๊ตฌํ๋ ' UNION SELECT username, password FROM users--๋ช
๋ น์ด๋ id ์
๋ ฅ๊ฐ ๋์ UNION SELECT ๊ตฌ๋ฌธ์ ์ฝ์
ํด, users ํ
์ด๋ธ์ username๊ณผ password ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ด ์กฐํํ๊ฒ ๋ง๋ญ๋๋ค.
3. Blind SQL Injection
์ธ ๋ฒ์งธ ์ ํ์ผ๋ก๋ Blind SQL Injection์ด ์๋๋ฐ์, ์ด ๊ณต๊ฒฉ์์ ๊ณต๊ฒฉ์๋ SQL ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ฝ์
ํ๊ณ , ์๋ฒ ์๋ต ๊ฒฐ๊ณผ๋ ์๋ต ์๊ฐ์ ํตํด ์กฐ๊ฑด์ ์ฐธ/๊ฑฐ์ง์ ํ๋ณํฉ๋๋ค. ์ด๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์ ์ง์ ์ผ๋ก ํ์ทจํ๊ฒ ๋๋ต๋๋ค. ์๋ฅผ ๋ค์ด๋ณด๋ฉด,
์ฐธ/๊ฑฐ์ง ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ์ ๋ํ๋' AND 1=1-- -- (TRUE, ์ ์ ๋์)' AND 1=2-- -- (FALSE, ๊ฒฐ๊ณผ ์์)
๋ช
๋ น์ด๊ฐ ์์ ๋,' AND (SELECT CASE WHEN (SUBSTRING((SELECT password FROM users WHERE username='admin'),1,1)='a') THEN 1/0 ELSE 1 END)--๋ ์๋ฒ์ ์๋ต ์ฐจ์ด๋ ์๊ฐ ์ง์ฐ ๋ฑ์ผ๋ก ์ฐธ/๊ฑฐ์ง์ ํ๋จํด์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ฒ ํ๋ ๋ช
๋ น์ด์
๋๋ค.
4. Stored Procedure SQL Injection
๋ง์ง๋ง ์ ํ์ Stored Procedure SQL Injection์
๋๋ค. ์ด ์ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์ ์ฅ ํ๋ก์์ ์ ์ทจ์ฝ์ ์ ์ด์ฉํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ผ๋ก, ๊ณต๊ฒฉ์๋ ์ ์ฅ ํ๋ก์์ ์ ์
์ฑ SQL ์ฝ๋๋ฅผ ์ฝ์
ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ดํฉ๋๋ค. ์ ์ฅ ํ๋ก์์ ์ ๊ถํ์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด๋ฅผ ์ฅ์
ํ ์ ์๋ค๋ ์ ์์ ์ํํ ์ ํ์ด๋ผ๊ณ ํด์. ์๋ฅผ ๋ค์ด, ์ทจ์ฝํ ํ๋ก์์ ๊ฐCREATE PROCEDURE sp_login (@loginid NVARCHAR(25), @password NVARCHAR(25))ASBEGIN DECLARE @sql VARCHAR(500) SET @sql = 'SELECT * FROM users WHERE loginid = ''' + @loginid + ''' AND password = ''' + @password + '''' EXEC (@sql)END
๋ผ๋ฉด, ๋์ ์ฟผ๋ฆฌ๋ก ์
๋ ฅ๊ฐ์ ์ง์ ๋ฌธ์์ด๋ก ํฉ์น๊ฒ ๋์ด,loginid = ' OR 1=1--password = anything
์ด๋ฌํ Injection ์
๋ ฅ๊ฐ์ ์
๋ ฅํ๋ฉด SQL Injection์ ์ทจ์ฝํด์ง๋๋ค.
โ Login Admin
![๊ทธ๋ฆผ 3. [Login Admin]](/images/323303_250925_image3.png)
์ฑ๋ฆฐ์ง๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด, score board๋ผ๋ ํ์ด์ง์ ์ฐ์ ์ ์ํด์ผ ํด์. ํด๋น ํ์ด์ง์ ์ ์ํ๋ฉด ํด๊ฒฐํ ์ ์๋ ์ฌ๋ฌ ์ฑ๋ฆฐ์ง๊ฐ ๋์ต๋๋ค.
์ฌ์ง์ ๋ณด์ด๋ ๊ฑด Login Admin์ด๋ผ๋ ์ฑ๋ฆฐ์ง์์. Juice-Shop์ ๊ฑฐ์ ๋ชจ๋ ์ฑ๋ฆฐ์ง์๋ โHintโ๋ผ๋ ์์ด์ฝ์ด ๋ฑ์ฅํ๋๋ฐ, ์ด ํํธ๋ฅผ ํตํด ํด๋น ์ฑ๋ฆฐ์ง์ ์ฌ์ฉํด์ผ ํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด ๋ฌด์์ธ์ง, ์ด๋ค ๋ฐฉ์์ผ๋ก ํด๊ฒฐํด์ผ ํ๋์ง ๊ฐ์ด๋๋ผ์ธ์ ์ ๊ณตํด ์ค๋๋ค!
![๊ทธ๋ฆผ 4. [Login Admin-Hint]](/images/323303_250925_image4.png)
ํํธ๋ฅผ ์ดํด๋ณด๋ฉด, ๋งจ ์ฒซ ์ค์ โ์ด ์ฑ๋ฆฐ์ง ์ค๋ช
์์ ์ด๋ค ํํ๋ก ๊ณต๊ฒฉํด์ผ ํ๋์ง๊ฐ ์ด๋ฏธ ํํธ๋ก ์ฃผ์ด์ก์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋คโ๋ผ๋ ์ธ๊ธ์ด ์๋ค์. ๋ํ ๋ง์ง๋ง ์ค์ SQL Injectionโ์ด๋ผ๋ ์ธ๊ธ์ด ์๋ ๊ฒ ๋ณด์ด์๋์?
ํํธ๋ฅผ ํตํด ์ด๊ฒ ๋ฐ๋ก ๋ฌธ์ ํด๊ฒฐ์ ์ค๋ง๋ฆฌ๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค!
๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฑ๋ฆฐ์ง๋ฅผ ํด๊ฒฐํด๋ณผ๊น์~?๐
![๊ทธ๋ฆผ 5. [Login]](/images/323303_250925_image5.png)
์ฐ์ , Admin(๊ด๋ฆฌ์)๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ์ ํด์ผํ๋ ์ฑ๋ฆฐ์ง์ด๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ค์ด๊ฐ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
![๊ทธ๋ฆผ 6. [Login page]](/images/323303_250925_image6.png)
๋ก๊ทธ์ธ ํ์ด์ง์ ์ ์ํ๋ฉด ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ ๋ค, ๋ก๊ทธ์ธ์ ํ ์ ์๋ ํ๋ฉด์ด ๋์ค๋๋ฐ์, ์ด์ ์ด ํ์ด์ง์์ ๋ณธ๊ฒฉ์ ์ผ๋ก SQL Injection์ ์ค์ตํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ , SQL Injection์ ์๋ํด ๋ณผ ์ ์๋ ๊ฐ์ฅ ์ข์ ํฌ์ธํธ๋ ์ด๋ฉ์ผ ํ๋์ ํฐ๋ฐ์ดํ(โ) ๋ ์์ ๋ฐ์ดํ(โ) ๊ฐ์ ์ธ์ฉ ๋ฌธ๊ตฌ๋ฅผ ์ฝ์ ํด ๋ณด๋ ๊ฒ์ ๋๋ค.
![๊ทธ๋ฆผ 7. ['error]](/images/323303_250925_image7.png)
ํ์ง๋ง ์ ์ฌ์ง์์ ํ์ธํ ์ ์๋ฏ, [object Object] ๋ผ๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋จ๋ฉฐ SQL Injection์ ์คํจํฉ๋๋ค.
๋ค์ ์๋๋ฅผ ํด๋ณด๊ธฐ ์ ์ ์ฌ๊ธฐ์ ์ ๊น! [object Object]๋ ์ด๋ค ์๋ฏธ๋ฅผ ๋ํ๋ด๋ ์๋ฌ์์๊น์?๐
SQL์์ ์์ ๋ฐ์ดํ(')๋ฅผ ์ฌ์ฉํ๋ ์ ํํ ๋ฌธ๋ฒ์ 'swing'๊ณผ ๊ฐ์ด ๋ฌธ์์ด์ ์์ ๋ฐ์ดํ๋ก ๊ฐ์ธ๋ ํํ์
๋๋ค. ํ์ง๋ง ์์์์ ๊ฐ์ด'๋ง ์ ๋๋ค๋ฉด SQL ๋ฌธ๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๊ณ , ๊ฒฐ๋ก ์ ์ผ๋ก [object Object] ์ค๋ฅ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ํ์ํ๋ ค ํ ๋์ ์ค๋ฅ๋ก ์ธํด ๋ํ๋๋ ํ์์ด ๋๋ ๊ฒ์ด์ง์.
๊ทธ๋ ๋ค๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก SQL Injection์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
![๊ทธ๋ฆผ 8. [' OR true]](/images/323303_250925_image8.png)
์์ ์ฌ์ง์์์ ๊ฐ์ด ' OR true๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น์?๐
๋ฐ๋ก SQL์์ OR true๋ ๋
ผ๋ฆฌ ์ฐ์ฐ์์ ์ฐธ(True)์ ์๋ฏธํ๋ ์กฐ๊ฑด์ ๊ฐ์ ๋ก ๋ฃ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฌ๊ธฐ์ OR์ โ๋๋โ์ด๋ผ๋ ์๋ฏธ๊ฐ ์๋ ๋
ผ๋ฆฌ ์ฐ์ฐ์์ด๋ฉฐ, true๋ SQL์์ ํญ์ ์ฐธ์ ๋ปํ๋ ์์ฝ์ด์ด์ง์.
์ฆ, ์กฐ๊ฑด๋ฌธ์ ํญ์ ์ฐธ์ผ๋ก ๋ง๋ค์ด์ ์ฟผ๋ฆฌ๊ฐ ์กฐ๊ฑด์ ์๊ด์์ด ์คํ๋๋๋ก ํ๋ ์ญํ ์ ์ํํฉ๋๋ค.
![๊ทธ๋ฆผ 9. [' OR true ์คํจ]](/images/323303_250925_image9.png)
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ผ๋ก๋ SQL Injection์ ์ฑ๊ณต์ ์ผ๋ก ํด๋ด์ง ๋ชปํ์ต๋๋ค. ์ ์๊น์ ๊ฐ์ [object Object]๋ผ๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋จ๋ ๊ฒ์ผ๊น์?๐
์์ ์ด์ผ๊ธฐํ๋ฏ, SQL์์ ๋ฌธ์์ด์ ๋ฐ๋์ ์์๋ฐ์ดํ๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค.
ํ์ง๋ง ' OR true์์ OR์์'๋ฅผ ์๋ฒ๊ฐ ๋ฌธ์์ด์ ์์ํ๋ ์๋ฏธ๋ก ๋ฐ์๋ค์ด๊ฒ ๋๋ค๋ฉด, ๊ฒฐ๊ตญ ' OR true๋ ์์ ํ์ง ์์ ๋ฌธ์์ด์ด ๋๋ฉฐ, ๋ค๋ฅธ ์๋ฏธ๋ก๋ ์ด๋ ํ ๋ฌธ์์ด์ด ์ ๋๋ก ๋ซํ๊ธฐ ์ ์ ๊ทธ๊ฒ์ด ํญ์ ์ฐธ์ด๋ผ๋ ์กฐ๊ฑด์ ๋ฃ์ด๋ฒ๋ฆฌ๊ฒ ๋๋ ๊ฒ์ด์ง์.
์, ๊ทธ๋ผ ์ด์ ์ด๋ป๊ฒ ํด์ผ SQL Injection์ ์ฑ๊ณตํ ์ ์์๊น์?
๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ์๋ฉด, ์ด๋ฉ์ผ ํ๋์ ๋จ์ํ 'ํน์ ' OR true๊ฐ์ด ๋ฏธ์์ฑ์ ๋ฌธ์์ด๋ง ์ฝ์
ํ๋ ๊ฒ์ด ์๋' OR true --๋ผ๋ ์์ฑ๋ SQL ๋ฌธ๋ฒ์ ์ผ๋ก ์ค๋ฅ๊ฐ ์๋ ๋ฌธ์์ด์ ์ฝ์
ํด์ผ ํฉ๋๋ค.
![๊ทธ๋ฆผ 10. [' OR true-- ]](/images/323303_250925_image10.png)
์ด๋ ๊ฒ ๋ง์ด์ฃ !
--๋ SQL์์ ์ฃผ์ ํ์๋ก, ์ดํ์ ์ฟผ๋ฆฌ ๋ฌธ์ฅ์ ๋ฌด์๋ฉ๋๋ค. ๋ฐ๋ผ์ ' OR true --๋ ๋ฌธ์์ด ๊ฒฝ๊ณ๋ฅผ ๋ซ๊ณ , ์กฐ๊ฑด์ ์ฐธ์ผ๋ก ๋ง๋ค๋ฉฐ ๋ค์ ๋ฌธ์ฅ์ ์ฃผ์ ์ฒ๋ฆฌํ์ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ์์ ์ผ๋ก ๋ณ์กฐํ๋ ์ธ์ ์
๊ธฐ๋ฒ์ด ๋ฉ๋๋ค!
![๊ทธ๋ฆผ 11. [๊ด๋ฆฌ์ ๊ณ์ ]](/images/323303_250925_image11.png)
์ฑ๊ณต์ ์ผ๋ก ๊ด๋ฆฌ์ ๊ณ์ ์ ๋ก๊ทธ์ธํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.๐
โ Login Jim
![๊ทธ๋ฆผ 12. [Login Jim]](/images/323303_250925_image12.png)
์ด๋ฒ์๋ Jim์ด๋ผ๋ ์ฌ๋์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๋ SQL Injection์ ์๋ํด ๋ณด๋ ค๊ณ ํด์.
์ฑ๋ฆฐ์ง ํด๊ฒฐ์ ์์์ ํญ์ Hint์ ํจ๊ป ํฉ๋๋ค-!๐
![๊ทธ๋ฆผ 13. [hint]](/images/323303_250925_image13.png)
์ค, ์ด๋ฒ ํํธ์์๋ ์ญ์๋ ์ฑ๋ฆฐ์ง ์ค๋ช
์์ ํํธ๋ฅผ ์ป์ ์ ์๋ค๋ ๊ธ๊ณผ โSQL Injectionโ ์ด๋ผ๋ ์ธ๊ธ์ด ์๊ตฐ์!
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ ์ฑ๋ฆฐ์ง๋ โLogin Adminโ ๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์งํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ์ง๋ง ๊ทธ ์ ์, ๋จผ์ ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ด์. ๋ฐ๋ก โ์ด๋ฉ์ผ ํ๋์ ๋ฌด์์ ๋จผ์ ์ ์ด์ผ ํ๋๊ฐ?โ์ธ๋ฐ์, ๋ง์ฝ ์์ ์ฑ๋ฆฐ์ง๋ฅผ ์งํํ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ์๋ํ๋ค๋ฉด ์ฑ๊ณตํด๋ ๋ถ๋ช
Jim์ ๊ณ์ ์ด ์๋ Admin๊ณ์ ์ ๋ก๊ทธ์ธ์ด ๋ ๊ฑฐ์์.
๋ฐ๋ผ์ Jim์ ๊ณ์ ์ ๋ํ ํํธ๊ฐ ๋ ๋งํ ๊ฒ ์๋์ง Juice-Shop์ ๋จผ์ ๋๋ฌ๋ณด๋๋ก ํ ๊ฒ์.๐
![๊ทธ๋ฆผ 14. [jim email]](/images/323303_250925_image14.png)
์! ๋ฉ์ธํ๋ฉด์ ๋๋ฌ๋ณด๋ค ๋ณด๋, Jim์ด๋ผ๋ ์ฌ๋์ด ์ํ์ ๋ํ ๋๊ธ์ ๋ฌ์๋ค์! ๊ทธ๋ ๋ค๋ฉด jim@juice-sh.op์ด ๋ฐ๋ก Jim์ ์ด๋ฉ์ผ์ด๊ฒ ๊ตฐ์!
์ฐ์ Jim์ ์ด๋ฉ์ผ์ ์์๋์ผ๋, ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๊ฐ ๋ก๊ทธ์ธ์ ํ ๋ฒ ์๋ํด๋ณด๊ฒ ์ต๋๋ค.
![๊ทธ๋ฆผ 15. [jim ๋ก๊ทธ์ธ ์๋]](/images/323303_250925_image15.png)
์ญ์..๋น์ฐํ๊ฒ๋ Jim์ ์ด๋ฉ์ผ์ ์์๋ด๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์์๋ด์ง ๋ชปํ๋ฉด ๋ก๊ทธ์ธ์ ํ ์ ์์์ต๋๋ค.๐คฆโโ๏ธ
ํ์ง๋ง hint์์๋ ์ธ๊ธ๋์๋ฏ, ์ด๋ฒ ์ฑ๋ฆฐ์ง ๋ํ SQL Injection์ ์ด์ฉํ๋ ์ฑ๋ฆฐ์ง์ด๋ ์์ ์ฑ๋ฆฐ์ง์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ฉด ๋๊ฒ ๊ตฐ์!
๊ทธ ์ ์, ์์ ์ฑ๋ฆฐ์ง์์ ์ฌ์ฉํ '--ํํ์ ๋ํด ์กฐ๊ธ ์ ๋ฆฌํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ฐ์ ์์ ๋ฐ์ดํ(โ)๋ ๋ฌธ์์ด์ ๋ซ๋ ์ญํ ์ ํ๋ฉฐ, -- ๋ ์ฃผ์์ ์๋ฏธํ๋ค๋ ๊ฒ์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์๊ณ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด, '--๋ ์ค์ ๋ก ์ด๋ค ์๋ฏธ๋ก ํด์๋ ๊น์?
์๋ฅผ ๋ค์ด, โswing33@gmail.comโ ์ด๋ผ๋ ์ด๋ฉ์ผ์ด ์๊ณ , ์ด ์ด๋ฉ์ผ์ swing33@gmail.com'-- ๋ก ์ ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ์ค์ ๋ก ํด์๋์ด ์คํ๋๋ ๋ถ๋ถ์ swing33@gmail.com๊น์ง์ด๋ฉฐ, '-- ๋ค์ ๋๋จธ์ง ๋ถ๋ถ์ ์ฃผ์ ์ฒ๋ฆฌ๋์ด ๋ฌด์๋ฉ๋๋ค.
์๋ํ๋ฉด ๋ก๊ทธ์ธ ํ๋ก๊ทธ๋จ์์ ์ด๋ฉ์ผ๊ณผ ํจ์ค์๋๊ฐ ์ผ์นํ๋์ง ํ์ธํ๊ธฐ ์ํดSELECT * FROM users WHERE email = 'swing33@gmail.com' AND password = 'mypassword';
์ ๊ฐ์ ์กฐ๊ฑด์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฌ๊ธฐ์, ์ด ๋ช
๋ น์ด๋ฅผ ์กฐ๊ธ ๋ ์ดํด๋ณด๊ณ ๊ฐ๊น์~?
์ฐ์ SELECT *๋ users ํ
์ด๋ธ์ ์กด์ฌํ๋ ๋ชจ๋ ์์ฑ์ ์กฐํํ๋ค๋ ์๋ฏธ์
๋๋ค. FROM users๋ ์กฐํํ ๋์ ํ
์ด๋ธ์ด users์์ ๋ํ๋
๋๋ค.
๋ง์ง๋ง์ผ๋ก WHERE email = 'swing33@gmail.com' AND password = 'mypassword';๋ email ์์ฑ๊ฐ์ด โswing33@gmail.comโ ๊ทธ๋ฆฌ๊ณ password ์์ฑ ๊ฐ์ด โmypasswordโ์ธ ํ๋ง ์กฐํํ๋ค๋ ์๋ฏธ์
๋๋ค. AND๋ ๋ ์กฐ๊ฑด์ด ๋ชจ๋ ์ฐธ์ผ ๋๋ง ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ฐ๋ผ์ ์ด ๋ช
๋ น์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ users ํ
์ด๋ธ์์ email ๊ฐ์ด โswing33@gmail.comโ์ด๊ณ , password ๊ฐ์ด โmypasswordโ์ธ ์ฌ์ฉ์์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์กฐํํ๋ผ๋ ๋ช
๋ น์
๋๋ค!
![๊ทธ๋ฆผ 16. ['-- ์๋ฆฌ]](/images/323303_250925_image16.png)
๋ค์ '-- ์ด์ผ๊ธฐ๋ก ๋์๊ฐ ๋ณด๋ฉด, SELECT * FROM users WHERE email = 'swing33@gmail.com' AND password = 'mypassword';๊ฐ์ ์กฐ๊ฑด์ ์์ ์ฌ์ง์์๋ ํ์ธํ ์ ์๋ฏ ์ด๋ฉ์ผ ๋ถ๋ถ๊น์ง๋ ์ ์์ ์ผ๋ก ํด์๋์ง๋ง, ์ด๋ฉ์ผ ๋ฐ๋ก ๋ค์ '--๋ฅผ ๋ถ์ด๊ฒ ๋๋ฉด AND๋ถํฐ ํจ์ค์๋๋ฅผ ์
๋ ฅํ๋ ๋ถ๋ถ๊น์ง ์ฃผ์ ์ฒ๋ฆฌ๋์ด ๋ฌด์๋ฉ๋๋ค. ์ด๋ฌํ ์๋ฆฌ๋ฅผ ์ด์ฉํ๋ค๋ฉด, ๊ตณ์ด Jim์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ง ๋ชปํด๋ Jim์ ์ด๋ฉ์ผ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํด์ง๋๋ค!
![๊ทธ๋ฆผ 17. [jim ๋ก๊ทธ์ธ]](/images/323303_250925_image17.png)
๋ค์ Jim์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋์์, ์์ ์์๋ธ ์ฌ์ค๋ค์ ํ ๋๋ก jim@juice-sh.op'-- ์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
![๊ทธ๋ฆผ 18. [jim ๋ก๊ทธ์ธ ์ฑ๊ณต]](/images/323303_250925_image18.png)
์ญ์๋ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํด Jim์ ๊ณ์ ์ ์ง์ ํ ์ ์์์ต๋๋ค!๐
์ด์ ์ฑ๋ฆฐ์ง๋ฅผ ๋ชจ๋ ํด๊ฒฐํ์ง๋ง, ํ ๊ฐ์ง ์๋ฌธ์ ์ด ๋จ์ต๋๋ค. ์ Admin ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ ๋๋ ๊ตฌ์ฒด์ ์ธ ์ด๋ฉ์ผ ์ ๋ณด ์์ด๋ ์ฐํ๊ฐ ๊ฐ๋ฅํ ๋ฐ๋ฉด, Jim ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๋ ค๋ฉด Jim์ ์ด๋ฉ์ผ์ ์ ํํ ์์์ผ ํ์๊น์?๐
๋ฐ๋ก ๊ด๋ฆฌ์ ๊ณ์ ์ ๋ก๊ทธ์ธํ ๋๋ ' OR true-- ๊ฐ์ ๋จ์ ์กฐ๊ฑด์ ์จ์ ๋ก๊ทธ์ธ ์ฐํ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด์์. ์ฟผ๋ฆฌ๊ฐ ์ฌ์ฉ์๋ช
๊ฒ์ฆ๋ง ํ๊ฑฐ๋ ์ฒซ ๋ฒ์งธ ์ผ์นํ๋ ์ฌ์ฉ์๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ด์ฃ . ์ฆ, OR true ์กฐ๊ฑด์ด ์ฐธ์ด ๋์ด ๊ฒฐ๊ตญ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์, ๋ณดํต ๊ด๋ฆฌ์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ๋๋ ๊ฒ์
๋๋ค.
ํ์ง๋ง Jim ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ ๋ jim@juice-shop'--์ฒ๋ผ ์ ํํ ์ด๋ฉ์ผ์ ์ฐพ์์ผํ๋ ์ด์ ๋, ์ฟผ๋ฆฌ๊ฐ ์ด๋ฉ์ผ ๊ฐ์ ๊ณ ์ ์๋ณ์๋ฅผ ์๊ฒฉํ ๊ฒ์ฌํ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ด์์. ๋จ์ OR true๋ง์ผ๋ก๋ ํน์ ์ฌ์ฉ์๋ก ๋ก๊ทธ์ธํ ์ ์๊ณ , ํน์ ์ฌ์ฉ์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ ๊ทธ ์ฌ์ฉ์์ ์ด๋ฉ์ผ์ด๋ ์์ด๋๋ฅผ ๋ฐ๋์ ์์์ผ ํฉ๋๋ค.
์์ปจ๋, OR true๋ ๋ฌด์ฐจ๋ณ์ ์ธ ๋ก๊ทธ์ธ ์ฐํ๋ฅผ ์ํ ๊ฒ์ด๊ณ , jim@juice-shop'-- ๊ฐ์ ํจํด์ ํน์ ์ฌ์ฉ์๋ฅผ ํ๊ฒํ
ํ๋ ๋ฐฉ์์ธ ๊ฒ์
๋๋ค.
๊ทธ๋์ ๊ด๋ฆฌ์ ๊ณ์ ์ฐํ๋ ์กฐ๊ฑด์ ํญ์ ์ฐธ์ผ๋ก ๋ง๋ค์ด์ ์ฒซ ์ฌ์ฉ์๋ฅผ ๋ฝ๋ ๊ฒ ๊ฐ๋ฅํด ๋น๊ต์ ์ฝ์ง๋ง, ํน์ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ฐํ๋ ๋์ ์ด๋ฉ์ผ์ด๋ ์ด๋ฆ ๊ฐ์ ์ ํํ ๊ฐ์ ์์์ผ ํ๋ฏ๋ก ๋ ๋ณต์กํด์.
๐กSQL Injection ๊ด๋ จ ํด ์๊ฐ
์ง๊ธ๊น์ง Juice-Shop์ ํตํด SQL Injection ๊ณต๊ฒฉ์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ด๋ค์ง๋์ง์ ๋ํด ์์๋ณด์์ผ๋, ์ด์ SQL Injection๊ณผ ๊ด๋ จ๋ ๋ค๋ฅธ ๋๊ตฌ๋ค์๋ ์ด๋ค ๊ฒ๋ค์ด ์๋์ง ๊ฐ๋จํ ์๊ฐํด๋ณด๋ ค๊ณ ํด์.
1. SQL Fiddle
SQL Fiddle์ ์น ๋ธ๋ผ์ฐ์ ์์ SQL ์ฟผ๋ฆฌ๋ฅผ ํ
์คํธํ ์ ์๋ ์ฌ์ดํธ๋ก, Oracle, MySQL ๋ฑ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฒ์ ์ ์ง์ํ๊ณ ์์ด์. ์ฌ์ฉ์๊ฐ ์ง์ ํ
์ด๋ธ์ ์์ฑํด ๊ฐ์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ์์ฒด์ ์ผ๋ก ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์์ฝ๊ฒ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
2. Pentest Monkey
Pentest Monkey๋ ๋ํ์ ์ธ Cheat Sheet ์ฌ์ดํธ์์. ๋ฐ์ดํฐ๋ณ Cheat Sheet๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ, ๋ค์ํ ๊ณต๊ฒฉ ํ์ด๋ก๋๋ฅผ ์ ๊ณตํด ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฐธ๊ณ ํ๊ธฐ ์ข์์. ํ์ง๋ง ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฒฉ ํ์ด๋ก๋์ ๋ํ ์ถฉ๋ถํ ์ดํด ํ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
3. sqlmap
sqlmap์ SQL Injection ์ทจ์ฝ์ ์ ํ์ง/์ง๋จํ๊ณ ์๋ํํด ๊ณต๊ฒฉํ ์ ์๋ ์คํ์์ค ์นจํฌ ํ ์คํธ ๋๊ตฌ์์. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ ํ์ ๊ณผ ๋ฐ์ดํฐ ์ถ์ถ ๋ฑ์ ์๋ํํด ์ฃผ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ณผ๋ํ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ ๋ฐํด ์๋ฒ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ์ค๋ฌด์์๋ ์ ์ฐ์ด์ง ์์ผ๋ฉฐ, ๊ฐ์ธ์ฉ ํ ์คํธ ์๋ฒ์์์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค๊ณ ํด์.
๐กSQL Injection ๋์ ๋ฐฉ์
์ฌ๊ธฐ๊น์ง ์ด์ฌํ SQL Injection์ ๊ณต๊ฒฉ ๋ฐฉ์์ ๋ํด ์์๋ณด์์ผ๋, ์ด์ ์ด๋ค ์์ผ๋ก ๋ฐฉ์ดํด์ผ ํ๋์ง๋ ์ดํด๋ด์ผ๊ฒ ์ง์~?
1. ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ ๊ฒ์ฆ ๋ก์ง ๊ตฌํ
์ฐ์ ๊ฐ์ฅ ๋ํ์ ์ธ ๋์ ๋ฐฉ์์ผ๋ก๋ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ ๊ฒ์ฆ ๋ก์ง ๊ตฌํ์ด ์์ด์. SQL Injection ์ทจ์ฝ์ ์ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ์ ์์์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฝ์
ํด ๊ณต๊ฒฉ์ ์๋์ ๋ง๊ฒ SQL์ฟผ๋ฆฌ ๋ฌธ์ด ์์ฑ๋๋ ์ฝ์ ์ ์ด์ฉํ ๊ฒ์ด์ฃ . ๋ฐ๋ผ์ ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๋ณ์๊ฐ ๋๋ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๊ตฌ์ฑํ๋ ํน์๋ฌธ์, SQL ๊ตฌ๋ฌธ, ํจ์ ๋ฑ์ ๋ฌธ์๋ฅผ ๊ฒ์ฆํ๋ ๋ก์ง์ ๊ตฌํํ๋ฉด ๋๋ต๋๋ค!
SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ฑ๋ฆฝํ๊ฒ ๋ง๋๋ ๋ํ์ ์ธ ํน์๋ฌธ์๋ก๋ ์์ ๋ฐ์ดํ('), ํฐ ๋ฐ์ดํ("), ์ธ๋ฏธ์ฝ๋ก (;), ์ฃผ์ ๊ตฌ๋ถ ๊ธฐํธ(--,#) ๋ฑ์ด ์์ด์.
2. ํํฐ๋ง ๋ฐฉ์
๋ ๋ฒ์งธ ๋์ ๋ฐฉ์์ผ๋ก๋ ํํฐ๋ง ๋ฐฉ์์
๋๋ค. ํํฐ๋ง์ ๋ธ๋ ๋ฆฌ์คํธ ๊ธฐ๋ฐ ํํฐ๋ง๊ณผ, ํ์ดํธ ๋ฆฌ์คํธ ๊ธฐ๋ฐ ํํฐ๋ง์ผ๋ก ๋๋์ด์.
๋ธ๋ ๋ฆฌ์คํธ ๊ธฐ๋ฐ ํํฐ๋ง์ ํน์ ๋ฌธ์, ํค์๋ ํน์ ํน์๋ฌธ์๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก, ์์ ์ดํด๋ณธ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๊ตฌ์ฑํ๋ ํน์๋ฌธ์๋ค๊ณผ SQL ์์ฝ์ด๋ค์ด ์ฃผ ๋์์
๋๋ค. ๋ฐ๋ฉด ํ์ดํธ ๋ฆฌ์คํธ ๊ธฐ๋ฐ ํํฐ๋ง์ ํ์ฉ๋ ๋ฌธ์๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ฅผ ํ์ฉํ์ง ์๋ ๋ฐฉ์์ด์์. ํ์ฉ๋ ๋ฌธ์ ์ด์ธ์ ๋ฌธ์๋ ํ์ฉํ์ง ์์ผ๋ฏ๋ก, ๋ธ๋ ๋ฆฌ์คํธ ๊ธฐ๋ฐ ํํฐ๋ง ๋ฐฉ์๋ณด๋ค๋ ๋ณด์์ฑ ์ธก๋ฉด์์ ํจ์ฌ ๋ ๊ฐ๋ ฅํ ํจ๊ณผ๋ฅผ ์ง๋๋ต๋๋ค!
3. ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ ๋ฐฉ์ง
๋ง์ง๋ง์ผ๋ก ์๊ฐํ ๋ฐฉ์์ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ ๋ฐฉ์ง์์. SQL Injection๊ณต๊ฒฉ ์ค Error Based SQL Injection ๊ณต๊ฒฉ์ด ์กด์ฌํ๋๋ฐ์, ํด๋น ๊ณต๊ฒฉ์ DBMS ์๋ฌ๋ฅผ ์๋์ ์ผ๋ก ์ ๋ฐํด ์ถ๋ ฅ๋๋ DBMS ์๋ฌ ๋ฉ์์ง ๋ด์ ์ํ๋ SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ์์ด์ฃ . ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ฌ ๋ฐ์ ์ ์ถ๋ ฅ๋๋ ์๋ฌ ๋ฉ์์ง ์์ฒด๋ฅผ ์ถ๋ ฅ๋์ง ์๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค.
์ง๊ธ๊น์ง Juice-Shop์ ์ด์ฉํ SQL Injection์ ๋ํด ๊ณต๋ถํด๋ณด์๋๋ฐ์, ๋ค๋ค ์ด๋ ์ จ๋์~?
๋จ์ํ SQL Injection์ด๋ผ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ๋ง ๋ณธ๋ค๋ฉด ๋ค์ ์ดํด๊ฐ ๋์ง ์๊ณ ์ด๋ ต๊ฒ ๋๊ปด์ง์ง๋ง ์ ์ฉํ ํด๋ค์ ์ด์ฉํด ๊ณต๋ถํ๋ฉด ํจ์ฌ ๋นจ๋ฆฌ, ์์ฝ๊ฒ ์ดํดํ ์ ์๋ต๋๋ค!๐
OWASP Juice-Shop์๋ SQL Injection๋ฟ๋ง ์๋๋ผ ์ ๋ง ๋ค์ํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ๋ค์ ๊ณต๋ถํ ์ ์๋ ์ฑ๋ฆฐ์ง๊ฐ ๊ฐ๋ํ๋๊น ์น ํดํน์ ์ฒ์ ๊ณต๋ถํ์๋ ๋ถ๋ค์ด ํ ๋ฒ ์ฌ์ฉํด๋ณด์๋ ๊ฑด ์ด๋จ๊น์~?๐
๊ทธ๋ผ ์์ฝ์ง๋ง ์ค๋์ ์ฃผ์ ๋ ์ฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌํ๊ณ , ๋ค์์๋ ์๋กญ๊ณ ์ฌ๋ฐ๋ ์ฃผ์ ๋ก ์ฐพ์์ฌ๊ฒ์!๐ค
์ฐธ๊ณ ์๋ฃ
Wallarm. (2025, June 18). What is Structured Query Language Injection (SQLi)? Part 1. Wallarm. https://www.wallarm.com/what/structured-query-language-injection-sqli-part-1
SK์ด๋์ค. (2025, February 19). XSS ๊ณต๊ฒฉ vs SQL ์ธ์ ์ , ์ฐจ์ด์ ๊ณผ ์๋ฐฉ ๊ฐ์ด๋. SKshieldus. https://www.skshieldus.com/blog-security/security-trend-idx-45
ํดํน์คํฐ๋ํจ๋. (n.d.). ๋ณด์๋งจ. HackingStudypad. https://hackingstudypad.tistory.com/206
SecurityHacker. (n.d.). [Web Application-๋ชจ์ํดํน] SQL Injection : ๋์ ๋ฐฉ์ #3-1. SecurityHacker. https://securityhacker.tistory.com/entry/Web-Application-%EB%AA%A8%EC%9D%98%ED%95%B4%ED%82%B9-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9-SQL-Injection-3-1
Invicti. (n.d.). SQL Injection Cheat Sheet. Invicti. https://www.invicti.com/blog/web-security/sql-injection-cheat-sheet/
PortSwigger. (n.d.). What is SQL Injection? Tutorial & Examples. Web Security Academy. https://portswigger.net/web-security/sql-injection