๐ก๏ธ ์น๋ณด์์ ์จ์ ์์ : WAF ์ฐํ๊ธฐ๋ฒ๊ณผ ๋์์ฑ ์ด์ ๋ฆฌ ๐ก๏ธ

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์น ๋ณด์์ ํซํ ์ฃผ์ , Web Application Firewall (WAF) ์ฐํ ๊ธฐ๋ฒ๊ณผ ๊ทธ์ ๋ํ ๋์์ฑ ์ ๋ํด ๊น์ด ํํค์ณ๋ณผ ๊ฑฐ์์. ๐ต๏ธโโ๏ธ ์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด ์ฌ๋ฌ๋ถ๋ ์น ๋ณด์ ์ ๋ฌธ๊ฐ ๋ชป์ง์์ ์ง์์ ๊ฐ์ถ๊ฒ ๋ ๊ฑฐ์์! ใ ใ ใ
๋จผ์ , WAF๊ฐ ๋ญ์ง ๊ฐ๋จํ ์์๋ณผ๊น์? WAF๋ Web Application Firewall์ ์ฝ์๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๋ ๋ฐฉํ๋ฒฝ์ด์์. ์ฝ๊ฒ ๋งํด์, ์น์ฌ์ดํธ๋ ์น ์ฑ์ ๋ค์ด์ค๋ ๋์ ๋ ์๋ค์ ๋ง์์ฃผ๋ ๋ฌธ์ง๊ธฐ ๊ฐ์ ์กด์ฌ์ฃ . ๐
ํ์ง๋ง ์ด WAF๋ ์๋ฒฝํ์ง ์์์. ์ ์์ ์ธ ํด์ปค๋ค์ ๊ณ์ํด์ WAF๋ฅผ ์ฐํํ๋ ค๊ณ ์๋ํ๊ณ ์์ฃ . ๊ทธ๋์ ์ค๋์ ์ด๋ฐ WAF ์ฐํ ๊ธฐ๋ฒ๋ค๊ณผ ๊ทธ์ ๋ํ ๋์์ฑ ์ ์์ธํ ์์๋ณผ ๊ฑฐ์์. ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์ ์ด์ํ์๋ ๋ถ๋ค๊ป๋ ๊ผญ ํ์ํ ์ ๋ณด์ผ ๊ฑฐ์์!
๐ก ์์๋์ธ์: WAF ์ฐํ ๊ธฐ๋ฒ์ ๊ณต๋ถํ๋ ์ด์ ๋ ํดํน์ ํ๊ธฐ ์ํด์๊ฐ ์๋๋ผ, ๋ ๋์ ๋ฐฉ์ด ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด์์์. ํญ์ ์ค๋ฆฌ์ ์ธ ๋ชฉ์ ์ผ๋ก๋ง ์ด ์ง์์ ํ์ฉํด์ฃผ์ธ์!
์, ๊ทธ๋ผ ๋ณธ๊ฒฉ์ ์ผ๋ก WAF ์ฐํ ๊ธฐ๋ฒ๊ณผ ๋์์ฑ ์ ๋ํด ์์๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ณ ๊ณ ์ฝ~! ๐
1. WAF ์ฐํ ๊ธฐ๋ฒ: ์ธ์ฝ๋ฉ ํธ๋ฆญ ๐ญ
์ฒซ ๋ฒ์งธ๋ก ์์๋ณผ WAF ์ฐํ ๊ธฐ๋ฒ์ ๋ฐ๋ก ์ธ์ฝ๋ฉ ํธ๋ฆญ์ด์์. ์ด ๋ฐฉ๋ฒ์ WAF๊ฐ ์ธ์ํ์ง ๋ชปํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๊ฑฐ์ฃ . ๋ง์น ์ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ฒ๋ผ์! ๐
1.1 URL ์ธ์ฝ๋ฉ
URL ์ธ์ฝ๋ฉ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ธ์ฝ๋ฉ ๋ฐฉ์ ์ค ํ๋์์. ํน์ ๋ฌธ์๋ฅผ '%'์ 16์ง์๋ก ๋ณํํ๋ ๋ฐฉ์์ด์ฃ .
์๋ฅผ ๋ค์ด, ๊ณต๊ฒฉ์๊ฐ ์ด๋ฐ SQL ์ธ์ ์ ๊ณต๊ฒฉ์ ์๋ํ๋ค๊ณ ๊ฐ์ ํด๋ณผ๊น์?
SELECT * FROM users WHERE username = 'admin' --' AND password = 'password'
์ด๊ฑธ URL ์ธ์ฝ๋ฉํ๋ฉด ์ด๋ ๊ฒ ๋ณํด์:
SELECT%20*%20FROM%20users%20WHERE%20username%20%3D%20%27admin%27%20--%27%20AND%20password%20%3D%20%27password%27
์ด๋์? ์ฌ๋ ๋์๋ ๋ณต์กํด ๋ณด์ด์ง๋ง, ๋ธ๋ผ์ฐ์ ๋ ์ด๊ฑธ ์ ํด์ํ ์ ์์ด์. ํ์ง๋ง ์ผ๋ถ WAF๋ ์ด๋ฐ ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ์ ๋๋ก ์ธ์ํ์ง ๋ชปํ ์ ์์ฃ .
1.2 ๋๋ธ ์ธ์ฝ๋ฉ
๋๋ธ ์ธ์ฝ๋ฉ์ URL ์ธ์ฝ๋ฉ์ ๋ ๋ฒ ํ๋ ๊ฑฐ์์. ๋ ๋ณต์กํด์ง๋๊น WAF๋ฅผ ๋ ์ฝ๊ฒ ์์ผ ์ ์๊ฒ ์ฃ ?
์๋ฅผ ๋ค์ด, '<' ๋ฌธ์๋ฅผ ๋๋ธ ์ธ์ฝ๋ฉํ๋ฉด:
- ์ฒซ ๋ฒ์งธ ์ธ์ฝ๋ฉ: < โ %3C
- ๋ ๋ฒ์งธ ์ธ์ฝ๋ฉ: %3C โ %253C
์ด๋ ๊ฒ ๋๋ฉด ์ผ๋ถ WAF๋ ์ด๋ฅผ ์ ์์ ์ธ ๋ฌธ์๋ก ์ธ์ํ์ง ๋ชปํ ์ ์์ด์.
1.3 16์ง์ ์ธ์ฝ๋ฉ
16์ง์ ์ธ์ฝ๋ฉ์ ๋ฌธ์๋ฅผ 16์ง์ ๊ฐ์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ด์์. ์๋ฅผ ๋ค์ด:
SELECT * FROM users
์ด๊ฑธ 16์ง์๋ก ์ธ์ฝ๋ฉํ๋ฉด ์ด๋ ๊ฒ ๋ผ์:
0x53454C454354202A2046524F4D207573657273
์ด๋ค๊ฐ์? ์์ ๋ค๋ฅธ ๋ชจ์ต์ด์ฃ ? ใ ใ ใ
1.4 ์ ๋์ฝ๋ ์ธ์ฝ๋ฉ
์ ๋์ฝ๋ ์ธ์ฝ๋ฉ์ ๋ฌธ์๋ฅผ ์ ๋์ฝ๋ ํ์์ผ๋ก ๋ณํํ๋ ๊ฑฐ์์. ์๋ฅผ ๋ค์ด:
alert('XSS')
์ด๊ฑธ ์ ๋์ฝ๋๋ก ์ธ์ฝ๋ฉํ๋ฉด:
\u0061\u006C\u0065\u0072\u0074\u0028\u0027\u0058\u0053\u0053\u0027\u0029
์ด๋ ๊ฒ ๋ณํด์. ๋ธ๋ผ์ฐ์ ๋ ์ด๊ฑธ ์ ์์ ์ผ๋ก ํด์ํ์ง๋ง, WAF๋ ๋ชป ์์๋ณผ ์ ์์ฃ .
๐จ ์ฃผ์: ์ด๋ฐ ์ธ์ฝ๋ฉ ํธ๋ฆญ๋ค์ WAF๋ฅผ ์ฐํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ง๋ง, ๋์์ ์ ์์ ์ธ ๋ฐ์ดํฐ ์ ์ก์๋ ์ฐ์ฌ์. ๊ทธ๋์ WAF ๊ฐ๋ฐ์๋ค์ ์ด๋ฐ ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ ์ ๋๋ก ํด์ํ ์ ์๋๋ก ๊ณ์ ์ ๋ฐ์ดํธํ๊ณ ์๋ต๋๋ค.
๋์์ฑ : ๋ค์ค ๋์ฝ๋ฉ ์ ์ฉํ๊ธฐ
๊ทธ๋ผ ์ด๋ฐ ์ธ์ฝ๋ฉ ํธ๋ฆญ์ ์ด๋ป๊ฒ ๋์ํด์ผ ํ ๊น์? ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๋ค์ค ๋์ฝ๋ฉ์ ์ ์ฉํ๋ ๊ฑฐ์์.
- ์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋์ฝ๋ฉํฉ๋๋ค.
- ๋์ฝ๋ฉ๋ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฒ์ฌํฉ๋๋ค.
- ์ ์ฑ ์ฝ๋๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ์ฐจ๋จํฉ๋๋ค.
์๋ฅผ ๋ค์ด, PHP์์๋ ์ด๋ ๊ฒ ๊ตฌํํ ์ ์์ด์:
function multiDecode($input) {
$decoded = $input;
while(true) {
$new = urldecode($decoded);
if($new === $decoded) {
break;
}
$decoded = $new;
}
return $decoded;
}
$input = $_GET['param'];
$decoded = multiDecode($input);
if(preg_match('/malicious pattern/', $decoded)) {
die('์
์ฑ ์ฝ๋ ๊ฐ์ง!');
}
์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ๋ฒ ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ ์ ๋๋ก ํด์ํ ์ ์์ด์.
์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ์ด๋ฐ ๋ค์ค ๋์ฝ๋ฉ ๊ธฐ๋ฒ์ ์ ์ฉํ๋ฉด ๋์ฑ ์์ ํ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ ๊ฑฐ์์. ์ฌ์ฉ์๋ค์ ์์คํ ์ฌ๋ฅ๊ณผ ์ ๋ณด๋ฅผ ์งํค๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฑฐ์์! ๐
์ ๊ทธ๋ฆผ์ ๋ฐ์ดํฐ๊ฐ ์ธ์ฝ๋ฉ๋๊ณ ๋ค์ ๋์ฝ๋ฉ๋๋ ๊ณผ์ ์ ๋ณด์ฌ์ค์. WAF๋ ์ด ๊ณผ์ ์์ ์ ์ฑ ์ฝ๋๋ฅผ ์ฐพ์๋ด์ผ ํ๋ ๊ฑฐ์ฃ !
์, ์ด์ ์ธ์ฝ๋ฉ ํธ๋ฆญ์ ๋ํด ์ ์ดํดํ์ จ๋์? ๋ค์์ผ๋ก๋ ๋ ๋ณต์กํ WAF ์ฐํ ๊ธฐ๋ฒ์ ์์๋ณผ ๊ฑฐ์์. ๊ณ์ ๋ฐ๋ผ์ค์ธ์! ๐โโ๏ธ๐จ
2. WAF ์ฐํ ๊ธฐ๋ฒ: HTTP ํค๋ ์กฐ์ ๐ฉ
๋ ๋ฒ์งธ๋ก ์์๋ณผ WAF ์ฐํ ๊ธฐ๋ฒ์ HTTP ํค๋ ์กฐ์์ด์์. ์ด ๋ฐฉ๋ฒ์ HTTP ์์ฒญ์ ํค๋๋ฅผ ๋ณ๊ฒฝํด์ WAF๋ฅผ ์์ด๋ ๊ฑฐ์ฃ . ๋ง์น ๋ณ์ฅ์ ํ๊ณ ํํฐ์ ๋ค์ด๊ฐ๋ ๊ฒ์ฒ๋ผ์! ๐ด๏ธ
2.1 User-Agent ํค๋ ๋ณ์กฐ
User-Agent ํค๋๋ ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์ ์ด์์ฒด์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ด์. ์ด๊ฑธ ๋ณ์กฐํ๋ฉด WAF๋ฅผ ์์ผ ์ ์์ฃ .
์๋ฅผ ๋ค์ด, ์ผ๋ฐ์ ์ธ User-Agent๋ ์ด๋ ๊ฒ ์๊ฒผ์ด์:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
์ด๊ฑธ ์ด์ํ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋ณผ๊น์?
User-Agent: HAK3R/1.0 (Hacking; Your WAF) LOLOLOLOL/1.337
ใ ใ ใ ์๊ธฐ์ฃ ? ํ์ง๋ง ์ด๋ฐ ์์ผ๋ก ๋ณ์กฐ๋ User-Agent๋ฅผ ๋ณด๋ด๋ฉด, ์ผ๋ถ WAF๋ ํผ๋์ค๋ฌ์ํ ์ ์์ด์.
2.2 X-Forwarded-For ํค๋ ์กฐ์
X-Forwarded-For ํค๋๋ ํด๋ผ์ด์ธํธ์ ์๋ IP ์ฃผ์๋ฅผ ๋ํ๋ด์. ์ด๊ฑธ ์กฐ์ํ๋ฉด WAF๊ฐ ์์ฒญ์ ์ถ์ฒ๋ฅผ ์๋ชป ํ๋จํ ์ ์์ฃ .
์๋ฅผ ๋ค์ด:
X-Forwarded-For: 127.0.0.1, 192.168.1.1, 10.0.0.1
์ด๋ ๊ฒ ํ๋ฉด WAF๊ฐ ์ด๋ค IP๊ฐ ์ง์ง ํด๋ผ์ด์ธํธ IP์ธ์ง ํท๊ฐ๋ฆด ์ ์์ด์.
2.3 Content-Type ํค๋ ๋ณ์กฐ
Content-Type ํค๋๋ ์์ฒญ ๋ณธ๋ฌธ์ ๋ฏธ๋์ด ํ์ ์ ์ง์ ํด์. ์ด๊ฑธ ์๋ชป๋ ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด WAF๊ฐ ์์ฒญ ๋ด์ฉ์ ์๋ชป ํด์ํ ์ ์์ฃ .
์๋ฅผ ๋ค์ด, JSON ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ฉด์ Content-Type์ ์ด๋ ๊ฒ ์ค์ ํ ์ ์์ด์:
Content-Type: application/x-www-form-urlencoded
์ด๋ฌ๋ฉด WAF๊ฐ JSON ๋ฐ์ดํฐ๋ฅผ ํผ ๋ฐ์ดํฐ๋ก ์๋ชป ํด์ํ ์ ์์ด์.
2.4 Host ํค๋ ์กฐ์
Host ํค๋๋ ์์ฒญ์ด ์ ์ก๋๋ ์๋ฒ์ ๋๋ฉ์ธ ์ด๋ฆ๊ณผ ํฌํธ๋ฅผ ์ง์ ํด์. ์ด๊ฑธ ์กฐ์ํ๋ฉด WAF๊ฐ ์์ฒญ์ ๋ชฉ์ ์ง๋ฅผ ์๋ชป ํ๋จํ ์ ์์ฃ .
์๋ฅผ ๋ค์ด:
Host: evil-site.com
์ด๋ ๊ฒ ํ๋ฉด WAF๊ฐ ์์ฒญ์ด ๋ค๋ฅธ ์ฌ์ดํธ๋ก ๊ฐ๋ ์ค ์๊ณ ํต๊ณผ์ํฌ ์๋ ์์ด์.
๐ก ๊ฟํ: ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์ ์ด์ํ์ ๋ค๋ฉด, ์ด๋ฐ ํค๋ ์กฐ์ ๊ธฐ๋ฒ์ ํนํ ์ฃผ์ํด์ผ ํด์. ์ฌ์ฉ์๋ค์ ์์คํ ์ฌ๋ฅ๊ณผ ์ ๋ณด๊ฐ ์ํํด์ง ์ ์๊ฑฐ๋ ์!
๋์์ฑ : ํค๋ ๊ฒ์ฆ ๋ฐ ์ ๊ทํ
๊ทธ๋ผ ์ด๋ฐ HTTP ํค๋ ์กฐ์์ ์ด๋ป๊ฒ ๋์ํด์ผ ํ ๊น์? ์ฌ๊ธฐ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํ ๊ฒ์:
- ํค๋ ๊ฒ์ฆ: ๋ชจ๋ ํค๋ ๊ฐ์ ์ฒ ์ ํ ๊ฒ์ฌํด์. ์ด์ํ ๊ฐ์ด ์์ผ๋ฉด ์์ฒญ์ ๊ฑฐ๋ถํด์.
- ํค๋ ์ ๊ทํ: ํค๋ ๊ฐ์ ํ์ค ํ์์ผ๋ก ๋ณํํด์. ์ด๋ ๊ฒ ํ๋ฉด ๋ณ์กฐ๋ ํค๋๋ ์ฝ๊ฒ ํ์งํ ์ ์์ด์.
- ํ์ดํธ๋ฆฌ์คํธ ์ ์ฉ: ํ์ฉ๋ ํค๋ ๊ฐ๋ง ๋ฐ์๋ค์ด๋๋ก ์ค์ ํด์.
- ๋ค์ค ํค๋ ๊ฒ์ฌ: ์ฌ๋ฌ ํค๋๋ฅผ ์ข ํฉ์ ์ผ๋ก ๋ถ์ํด์ ์ด์ ์ฌ๋ถ๋ฅผ ํ๋จํด์.
์๋ฅผ ๋ค์ด, PHP์์๋ ์ด๋ ๊ฒ ๊ตฌํํ ์ ์์ด์:
function validateHeaders($headers) {
$validUserAgents = ['Mozilla', 'Chrome', 'Safari', 'Firefox', 'Edge'];
$userAgent = $headers['User-Agent'] ?? '';
if (!preg_match('/^[a-zA-Z0-9\/.() ;]+$/', $userAgent)) {
die('์๋ชป๋ User-Agent');
}
$valid = false;
foreach ($validUserAgents as $agent) {
if (strpos($userAgent, $agent) !== false) {
$valid = true;
break;
}
}
if (!$valid) {
die('ํ์ฉ๋์ง ์์ User-Agent');
}
// X-Forwarded-For ๊ฒ์ฌ
$xForwardedFor = $headers['X-Forwarded-For'] ?? '';
$ips = explode(',', $xForwardedFor);
foreach ($ips as $ip) {
if (!filter_var(trim($ip), FILTER_VALIDATE_IP)) {
die('์๋ชป๋ IP ์ฃผ์');
}
}
// Content-Type ๊ฒ์ฌ
$contentType = $headers['Content-Type'] ?? '';
$allowedTypes = ['application/json', 'application/x-www-form-urlencoded', 'multipart/form-data'];
if (!in_array($contentType, $allowedTypes)) {
die('ํ์ฉ๋์ง ์์ Content-Type');
}
// Host ๊ฒ์ฌ
$host = $headers['Host'] ?? '';
if ($host !== 'example.com') {
die('์๋ชป๋ Host');
}
}
// ์ฌ์ฉ ์
$headers = getallheaders();
validateHeaders($headers);
์ด๋ฐ ๋ฐฉ์์ผ๋ก ํค๋๋ฅผ ๊ฒ์ฆํ๋ฉด ๋๋ถ๋ถ์ ํค๋ ์กฐ์ ์๋๋ฅผ ๋ง์ ์ ์์ด์.
์ ๊ทธ๋ฆผ์ HTTP ํค๋๊ฐ ์ด๋ป๊ฒ ๊ฒ์ฆ๋๋์ง ๋ณด์ฌ์ค์. ๊ฐ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉด์ ์ด์ํ ํค๋๋ ๊ฑธ๋ฌ์ง๊ณ , ์์ ํ ์์ฒญ๋ง ์ฒ๋ฆฌ๋๋ ๊ฑฐ์ฃ !
์, ์ด์ HTTP ํค๋ ์กฐ์์ ๋ํด์๋ ์ ์๊ฒ ๋์ จ์ฃ ? ๋ค์์ผ๋ก๋ ๋ ๊ณ ๊ธ ๊ธฐ์ ์ธ WAF ์ฐํ ๊ธฐ๋ฒ์ ์์๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ณ ๊ณ ! ๐
3. WAF ์ฐํ ๊ธฐ๋ฒ: ํ์ด๋ก๋ ๋ถํ ๋ฐ ์ฌ์กฐํฉ ๐งฉ
์ธ ๋ฒ์งธ๋ก ์์๋ณผ WAF ์ฐํ ๊ธฐ๋ฒ์ ํ์ด๋ก๋ ๋ถํ ๋ฐ ์ฌ์กฐํฉ์ด์์. ์ด ๋ฐฉ๋ฒ์ ์ ์ฑ ์ฝ๋๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ์ WAF์ ๊ฐ์๋ฅผ ํผํ ๋ค์, ์๋ฒ์์ ๋ค์ ์กฐํฉํ๋ ๊ฑฐ์์. ๋ง์น ํผ์ฆ์ ๋ง์ถ๋ ๊ฒ์ฒ๋ผ์! ๐งฉ
3.1 ๋ฌธ์์ด ์ฐ๊ฒฐ
์ด ๋ฐฉ๋ฒ์ ์ ์ฑ ๋ฌธ์์ด์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ , ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ํจ์๋ฅผ ์ฌ์ฉํด ์ฌ์กฐํฉํด์.
์๋ฅผ ๋ค์ด, JavaScript์์ alert('XSS')๋ฅผ ์คํํ๊ณ ์ถ๋ค๊ณ ํด๋ณผ๊ฒ์. ์ด๊ฑธ ๊ทธ๋๋ก ๋ณด๋ด๋ฉด WAF์ ๊ฑธ๋ฆฌ๊ฒ ์ฃ ? ๊ทธ๋์ ์ด๋ ๊ฒ ๋๋ ๋ณผ ์ ์์ด์:
a='al'
b='ert'
c='XS'
d='S'
eval(a+b)(`${c}${d}`)
์ด๋์? ๊ฐ๊ฐ์ ์กฐ๊ฐ์ ๋ฌดํดํด ๋ณด์ด์ง๋ง, ํฉ์น๋ฉด ์๋์ ์ ์ฑ ์ฝ๋๊ฐ ๋๋ ๊ฑฐ์ฃ ! ๐
3.2 ์ธ์ฝ๋ฉ ํผํฉ
์ด ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์์ด์ ์ฌ์ฉํด์. WAF๊ฐ ํ ๊ฐ์ง ์ธ์ฝ๋ฉ์ ํด๋ ํ ์ ์๋๋ผ๋, ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ด๋ฉด ํผ๋์ค๋ฌ์ํ ์ ์๊ฑฐ๋ ์.
์๋ฅผ ๋ค์ด, SQL ์ธ์ ์ ๊ณต๊ฒฉ์ ์๋ํ๋ค๊ณ ํด๋ณผ๊ฒ์:
UNION/**/SEL%45CT/**/pass%77ord/**/FR%4FM/**/users
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ URL ์ธ์ฝ๋ฉ(%45, %77, %4F)๊ณผ ์ฃผ์(/\*\*/)์ ์์ด ์ฌ์ฉํ์ด์. ์ด๋ ๊ฒ ํ๋ฉด WAF๊ฐ ์ด ๋ฌธ์์ด์ ์จ์ ํ ํด์ํ๊ธฐ ์ด๋ ค์์ง ์ ์์ฃ .
3.3 HTTP ํ๋ผ๋ฏธํฐ ์ค์ผ
์ด ๋ฐฉ๋ฒ์ ๊ฐ์ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํด์ WAF๋ฅผ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ค์ด์.
์๋ฅผ ๋ค์ด, ์ด๋ฐ URL์ ์๊ฐํด๋ด์:
https://example.com/search?q=hello&q=world&q=SELECT * FROM users
์ฌ๊ธฐ์ 'q' ํ๋ผ๋ฏธํฐ๊ฐ ์ธ ๋ฒ ์ฌ์ฉ๋์ด์. WAF๋ ์ฒซ ๋ฒ์งธ๋ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ง ๊ฒ์ฌํ๊ณ ๋์ด๊ฐ ์ ์์ง๋ง, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์ง๋ง ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ์๋ ์์ด์.
3.4 ์ฃผ์ ์ฝ์
์ด ๋ฐฉ๋ฒ์ ์ ์ฑ ์ฝ๋ ์ฌ์ด์ฌ์ด์ ์ฃผ์์ ๋ฃ์ด WAF๋ฅผ ์์ด๋ ๊ฑฐ์์.
SQL ์ธ์ ์ ์ ์๋ฅผ ๋ค์ด๋ณผ๊ฒ์:
SEL/*random*/ECT pass/*foobar*/word FR/*hello*/OM users
์ด๋ ๊ฒ ํ๋ฉด WAF๋ ์ด ์ฟผ๋ฆฌ๋ฅผ ์ ์์ ์ธ ๊ฒ์ผ๋ก ์ค์ธํ ์ ์์ด์. ํ์ง๋ง ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฃผ์์ ๋ฌด์ํ๊ณ ์๋์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ฒ ๋์ฃ .
โ ๏ธ ์ฃผ์: ์ด๋ฐ ๊ธฐ๋ฒ๋ค์ ์ค์ ๋ก ๋ง์ ์น์ฌ์ดํธ๋ฅผ ์ํ์ ๋น ๋จ๋ฆด ์ ์์ด์. ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ์ด๋ฐ ๊ณต๊ฒฉ์ ๋๋นํด์ผ ํด์. ์ฌ์ฉ์๋ค์ ์ฌ๋ฅ๊ณผ ๊ฐ์ธ์ ๋ณด๋ฅผ ์งํค๋ ๊ฒ ์ต์ฐ์ ์ด๋๊น์!
๋์์ฑ : ์ฌ์ธต ๋ฐฉ์ด์ ์ปจํ ์คํธ ์ธ์
์ด๋ฐ ๊ณ ๊ธ WAF ์ฐํ ๊ธฐ๋ฒ์ ๋์ํ๋ ค๋ฉด ๋ ๋ณต์กํ๊ณ ์ ๊ตํ ๋ฐฉ์ด ์ ๋ต์ด ํ์ํด์. ์ฌ๊ธฐ ๋ช ๊ฐ์ง ํจ๊ณผ์ ์ธ ๋์์ฑ ์ ์๊ฐํ ๊ฒ์:
- ์ฌ์ธต ํ์ฑ: ์ ๋ ฅ๊ฐ์ ์ฌ๋ฌ ๋จ๊ณ๋ก ํ์ฑํ๊ณ ๊ฐ ๋จ๊ณ๋ง๋ค ๊ฒ์ฌํด์. ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ ๋ ํ์ด๋ก๋๋ ์ก์๋ผ ์ ์์ด์.
- ์ปจํ ์คํธ ์ธ์ ํํฐ๋ง: ์ ๋ ฅ๊ฐ์ด ์ฌ์ฉ๋๋ ์ปจํ ์คํธ(SQL ์ฟผ๋ฆฌ, HTML ๋ฑ)๋ฅผ ๊ณ ๋ คํด์ ํํฐ๋งํด์.
- ๋์ ๋ถ์: ๋ฐํ์์ ์ฝ๋์ ๋์์ ๋ถ์ํด์ ์์ฌ์ค๋ฌ์ด ํจํด์ ์ฐพ์๋ด์.
- AI ๊ธฐ๋ฐ ํ์ง: ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฌ์ฉํด ๋ณต์กํ ๊ณต๊ฒฉ ํจํด์ ์ธ์ํด์.
- ์ ๊ทํ: ๋ชจ๋ ์ ๋ ฅ์ ํ์ค ํ์์ผ๋ก ๋ณํํ ํ ๊ฒ์ฌํด์.
์ด๋ฐ ๋ฐฉ๋ฒ๋ค์ ์กฐํฉํด์ ์ฌ์ฉํ๋ฉด ๋๋ถ๋ถ์ WAF ์ฐํ ์๋๋ฅผ ๋ง์ ์ ์์ด์. ์๋ฅผ ๋ค์ด, PHP์์๋ ์ด๋ ๊ฒ ๊ตฌํํ ์ ์์ด์:
function deepParse($input) {
$parsed = $input;
while(true) {
$new = preg_replace('/\/\*.*?\*\//', '', $parsed); // ์ฃผ์ ์ ๊ฑฐ
$new = preg_replace('/\s+/', ' ', $new); // ์ฐ์๋ ๊ณต๋ฐฑ ์ ๊ฑฐ
$new = urldecode($new); // URL ๋์ฝ๋ฉ
if($new === $parsed) {
break;
}
$parsed = $new;
}
return $parsed;
}
function contextAwareFilter($input, $context) {
$parsed = deepParse($input);
switch($context) {
case 'sql':
// SQL ์ธ์ ์
ํจํด ๊ฒ์ฌ
if(preg_match('/\b(union|select|from|where)\b/i', $parsed)) {
die('SQL ์ธ์ ์
์์ฌ');
}
break;
case 'html':
// XSS ํจํด ๊ฒ์ฌ
if(preg_match('/<script die break return contextawarefilter sql></script>
์ด ์ฝ๋๋ ์ ๋ ฅ๊ฐ์ ๊น์ด ํ์ฑํ๊ณ , ์ฌ์ฉ ์ปจํ ์คํธ์ ๋ง์ถฐ ํํฐ๋งํด์. ์ด๋ ๊ฒ ํ๋ฉด ๋๋ถ๋ถ์ WAF ์ฐํ ์๋๋ฅผ ๋ง์ ์ ์์ฃ .
์ ๊ทธ๋ฆผ์ ์ฌ์ธต ๋ฐฉ์ด ์ ๋ต์ ๋ณด์ฌ์ค์. ์ฌ๋ฌ ์ธต์ ๋ณด์ ์ฅ์น๋ฅผ ํต๊ณผํด์ผ๋ง ์์ ํ ๋ฐ์ดํฐ๋ก ์ธ์ ๋๋ ๊ฑฐ์ฃ . ์ด๋ ๊ฒ ํ๋ฉด WAF ์ฐํ๊ฐ ํจ์ฌ ์ด๋ ค์์ ธ์!
์, ์ด์ WAF ์ฐํ ๊ธฐ๋ฒ๊ณผ ๊ทธ์ ๋ํ ๋์์ฑ ์ ๋ํด ๊ฝค ์์ธํ ์์๋ดค์ด์. ์ด๋ฐ ์ง์์ ๋ฐํ์ผ๋ก ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ๋ ๋์ฑ ์์ ํ๊ฒ ๋ง๋ค ์ ์์ ๊ฑฐ์์. ์ฌ์ฉ์๋ค์ ์์คํ ์ฌ๋ฅ๊ณผ ์ ๋ณด๋ฅผ ์งํค๋ ์ผ, ์ ๋ง ์ค์ํ์ฃ ? ๐
๋ง์ง๋ง์ผ๋ก, ์น ๋ณด์์ ๋์์์ด ์งํํ๋ ๋ถ์ผ๋ผ๋ ๊ฑธ ๊ธฐ์ตํ์ธ์. ์๋ก์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด ๊ณ์ ๋์ค๊ณ ์๊ณ , ๊ทธ์ ๋ฐ๋ผ ๋ฐฉ์ด ๊ธฐ์ ๋ ๋ฐ์ ํ๊ณ ์์ด์. ๊ทธ๋ฌ๋ ํญ์ ์ต์ ๋ณด์ ๋ํฅ์ ์ฃผ์ํ๊ณ , ์์คํ ์ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ ์ค์ํด์.
์ฌ๋ฌ๋ถ๋ ์ด์ WAF ์ฐํ ๊ธฐ๋ฒ๊ณผ ๋์์ฑ ์ ๋ํด ์ ๋ฌธ๊ฐ ์์ค์ ์ง์์ ๊ฐ๊ฒ ๋์ จ๋ค์! ๐ ์ด ์ง์์ ์ ํ์ฉํด์ ๋ ์์ ํ ์น ํ๊ฒฝ์ ๋ง๋๋ ๋ฐ ๊ธฐ์ฌํด์ฃผ์ธ์. ํ์ดํ ! ๐ช
๐ก ๋ง์ง๋ง ํ: ๋ณด์์ ํ ๋ฒ์ ์์ฑ๋๋ ๊ฒ ์๋์์. ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง, ํ ์คํธ, ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ดํธ๊ฐ ํ์ํด์. ์ ๊ธฐ์ ์ผ๋ก ๋ณด์ ๊ฐ์ฌ๋ฅผ ์ค์ํ๊ณ , ์๋ก์ด ์ํ์ ๋๋นํ์ธ์. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฑด, ์ฌ์ฉ์ ๊ต์ก์ด์์. ์๋ฌด๋ฆฌ ์ข์ ๋ณด์ ์์คํ ๋ ์ฌ์ฉ์์ ๋ถ์ฃผ์๋ก ๋ฌด๋์ง ์ ์์ผ๋๊น์!
์, ์ด์ ์ ๋ง ๋์ด์์! WAF ์ฐํ ๊ธฐ๋ฒ๊ณผ ๋์์ฑ ์ ๋ํด ์๋ฒฝํ๊ฒ ๋ง์คํฐํ์ จ์ฃ ? ์ด ์ง์์ผ๋ก ์ฌ๋ฌ๋ถ์ ์น์ฌ์ดํธ๋ ์ฑ์ ๋์ฑ ์์ ํ๊ฒ ๋ง๋ค ์ ์์ ๊ฑฐ์์. ํด์ปค๋ค, ๊ฐ์คํ์ธ์! ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ค! ๐ช๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ