[My] ํํ์ด์ง ์ํ์ด ์ฝ๋ฉ
- -
1. SQL ์ธ์ ์
1-1. mypoint.php (ํฌ์ธํธ ์กฐํ ๊ธฐ๋ฅ)
my page์์ ํฌ์ธํธ ์กฐํ ๊ธฐ๋ฅ์ ํ์ธํด๋ณด๋ฉด ํ๋ผ๋ฏธํฐ๋ฅผ get๋ฐฉ์์ผ๋ก ๋ฐ์์ค๊ณ ์๋ค.
์๋ ์์ค์ฝ๋๋ mypoint๋ก id ๊ฐ์ ๋๊ฒจ์ฃผ๋ ์ฝ๋์ด์, ์ด์ ํ์ด์ง ์ฝ๋์ธ mypage.php ์์ค ์ฝ๋ ์ค ์ผ๋ถ์ด๋ค.
์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด, id = session id ์ด๋ฏ๋ก, ์๋ฒ ๋จ์์ ๊ฒ์ฆ๋ id๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ง๋ค. ํ์ง๋ง ์๋ mypoint.php ๋ก ๋์ด๊ฐ๋ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด
ํฌ์ธํธ ๋ด์ญ์ ํด๋ฆญํ ๋, ๋๊ฒจ์ฃผ๋ ์ฃผ์ ํ๊ทธ๋ก mypoint.php?id = "์ธ์ ์์ด๋" ๋ฅผ ์ฃผ์๋ค.
์ด๋ฅผ ๋๊ธธ ๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, mypoint.php ์์ ๊ฐ์ ๋ฐ์ ๋ get ๋ฐฉ์์ผ๋ก ๊ฐ์ด ์ ํด์ง๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ณต๊ฒฉ์๊ฐ ์ฝ๊ฒ ๋ณ์กฐํ ์ ์๋ค.
๋ณ์กฐ ์, ์์ด๋์ ํด๋นํ๋ point ๋ด์ญ์ด ์กฐํ๋๋ค.
POC ์ฝ๋(๊ณต๊ฒฉ ์ฝ๋) :
mypoint.php?id=0%27union%20select%201,2,id,pw,email%20from%20member%20%23
๋ค์๊ณผ ๊ฐ์ด ์ปฌ๋ผ์์, DB์ด๋ฆ์ ํ๋์ฉ ์์๋ธ ํ ๊ณต๊ฒฉ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๋ฉด DB์๋ฒ ๋ด๋ถ ์ ๋ณด๋ฅผ ํ์ทจ & ์ ์ฉ ํ ์ ์๋ค.
๋์๋ฐฉ์ :
- session์ ํด๋น ์์ค(point.php)๋ด์์ post๋ฐฉ์์ผ๋ก ๊ฒ์ฆํ๊ธฐ.
์ด์ ์ "mypage.php"์์ "mypoint.php" ๋ก id ๊ฐ์ ๋ณด๋์ง๋ง ์ด๋ฅผ ์์ ๊ฐ์ด ์์ ํจ.
"mypoint.php" ์์ค์ฝ๋์์ DB ์ฟผ๋ฆฌ๋ฅผ ์กฐํ ํ ๋ ์ป์ด์ค๋ ๊ฐ์ธ $id ๊ฐ์ session id๋ก ๋ฐ๊พธ์ด ๊ฒ์ฆํ๋ค.
: ์ฌ์ฉ์์ ํด๋นํ๋ point ๋ง ์กฐํ๊ฐ ๊ฐ๋ฅํด์ง.
1-2. board.php (๊ธ ๊ฒ์ ๊ธฐ๋ฅ)
์์ ๊ฒ์ํ์์ ๊ฒ์ ๊ธฐ๋ฅ์ ์ฌ์ฉ ์, "search_result.php" ํ์ด์ง์์ search ๋ผ๋ ํ๋ผ๋ฏธํฐ๋ก ๊ทธ ๊ฐ์ด ๋์ด๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋, post ๋ฐฉ์์ด ์๋, get ๋ฐฉ์์ผ๋ก ์ด๋ฅผ ์ ์กํ๊ธฐ ๋๋ฌธ์ ๊ฒ์ ๊ธฐ๋ฅ์ ํด๋ฆญ ์ ๊ฐ์ด search ํ๋ผ๋ฏธํฐ ๋ค์ ๋ ธ์ถ๋๋ค.
"search_result.php"์์๋ ๊ฐ์ ๊ฒ์ฆํ์ง ์๊ณ "get ๋ฐฉ์"์ผ๋ก ๋ฐ์์จ ๊ฒ์ ๋ด์ฉ์ ๊ทธ๋๋ก ์ฟผ๋ฆฌ์ ์ ์ฉํ๋ค.
๋๋ฌธ์ ์ด ๊ฐ์ ๊ณต๊ฒฉ์ ๋ง์๋๋ก ์กฐ์ํ์ฌ, DB์ฟผ๋ฆฌ์ ํ๋ฆ์ ๋ฐ๊พธ์ด ์ํ์ง ์์ ์ ๋ณด๋ฅผ ๋นผ๋ผ ์ ์๋ค.
POC ์ฝ๋(๊ณต๊ฒฉ ์ฝ๋) :
๊ฒ์๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํ๋ฉด, ์ํ๋ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
0'union all select id,pw,name,4,5,6,7,8 from member where id ='admin' #
๋์๋ฐฉ์ :
- get ๋ฐฉ์์ post๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๊ณ , search ํ๋ผ๋ฏธํฐ์ ํน์ ๋ฌธ์๋ฅผ ํํฐ๋ง์ ์ ์ฉํ๋ค. (์๋ฒ์ธก)
php์์๋ sql injection ๋ฐฉ์ด ํจ์๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
"addslashes()"ํจ์์ "mysql_real_escape_string()" ํจ์๊ฐ ์กด์ฌํ์ง๋ง, "mysql_real_escape_string" ํจ์๊ฐ ์ข๋ ํ์ฅ ๋ฒ์ ์ผ๋ก, ๊ธฐ๋ฅ์ ๋์ผํ์ง๋ง ์ฒ๋ฆฌํด์ฃผ๋ ๋ฌธ์ ์๊ฐ ๋ง์ผ๋ฏ๋ก ์ด ํจ์๋ฅผ ์ฌ์ฉํ์๋ค.
๋ ํจ์ ๋ชจ๋ "๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์" ์์ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ ๋ฌธ์ ์์ ๋ฐฑ ์ฌ๋์๋ฅผ ๋ถ์ธ ๋ฌธ์์ด์ ๋ฐํํด์ค๋ค.
** mysql_real_escape_string()ํจ์๊ฐ ์๋ฌ๊ฐ ๋์ ํด๊ฒฐํด๋ดค๋ค.
-> mysql ํจ์๋ PHP7์์๋ถํฐ ์ฌ์ฉ์ด ๋ถ๊ฐํ๊ธฐ ๋๋ฌธ์ "mysqli"ํจ์๋ก ๋ณ๊ฒฝํด์ ์ฌ์ฉํด์ผ ํ๋ค.
์ฆ "mysqli_real_escape_string()"ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์์ ๊ฐ์ด ์ฝ๋๋ฅผ 'post'๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ๋ค์ด๊ฐ๋ ๋ณ์ ๊ฐ๋ค์ "mysqli_real_escape_string"ํจ์๋ฅผ ํตํด ๊ฒ์ฆ ํด์ค๋ค.
ํจ์๋ ์์ ๊ฐ์ ํ์์ผ๋ก, ์ฒซ๋ฒ์งธ ์ธ์์๋ ๊ผญ $conn ์ฆ ์ปค๋ฅํฐ ๋ถ๋ถ์ ์ฐ๊ฒฐ ์์ผ ์ฃผ์ด์ผ ํ๋ค.
๋์ผํ ์ฟผ๋ฆฌ๋ฌธ ์ ๋ ฅ ์, ์ด์ ๊ณผ ๋ค๋ฅด๊ฒ ' ์์ \(๋ฐฑ์ฌ๋์)๊ฐ ๋ถ์ด์ ์ถ๋ ฅ๋๋ค.
๋ฐ๋ผ์ ํด๋น ์ฟผ๋ฆฌ์์ "๋ฌธ์์ด"๋ก ์ธ์๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง์์๋
๋ค์๊ณผ ๊ฐ์ด "$search"๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์, ์๋์ ๊ฐ์ด unescape ์์ผ์ค๋ค.
: ๊ทธ๋ผ ๊ฒฐ๊ณผ๋ก ๋ณด์ผ ๋๋ ์ด์ ๊ณผ ๋์ผํ๊ฒ ๋ณด์ด๊ณ , ๋ด๋ถ์์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ ๋๋ sql injection์ ๋ฐฉ์ดํด์ค๋ค.
2. ๋๋ ํฐ๋ฆฌ ์ธ๋ฑ์ฑ
- files, admin ..๋ฑ ๋๋ ํฐ๋ฆฌ๊ฐ ๋ ธ์ถ๋๊ณ ์์.
๋์๋ฐฉ์ :
- ์น ์๋ฒ ํน์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ๋๋ ํ ๋ฆฌ ์ธ๋ฑ์ฑ ๊ธฐ๋ฅ์ ๋นํ์ฑํ ์ํจ๋ค.
"apache2"๊ธฐ์ค
etc/apache2์ ์กด์ฌํ๋ "apache2.conf" ํ์ผ์ ํ์ธํด๋ณด๋ฉด, "Indexes"๊ธฐ๋ฅ์ด ํ์ฑํ ๋์ด ์์์ ํ์ธ ํ ์ ์๋ค.
์๋์ ๊ฐ์ด ํ์ผ์ ์์ ํด์ค๋ค.
์ ์ฅ ํ, ์ํ์น๋ฅผ ์ฌ์คํ ์์ผ์ค๋ค.
๋ช ๋ น์ด : "service apache2 restart"
: ๋๋ ํฐ๋ฆฌ๋ฅผ url ์ ์ ๋ ฅ ์ ์ก์ธ์ค ๊ถํ์ด ์๋ค๋ ํ์ด์ง๊ฐ ๋ธ.
3. ์ ๋ณด ๋์ถ
3-1. ์ฃผ์ ์ ๋ณด ๋ ธ์ถ (mypage.php)
mypage.php ํ์ด์ง์์ 2์ฐจ ๊ณต๊ฒฉ์ ์ํ ์ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
mypage๋ฅผ ํ์ธํด๋ณด๋ฉด, ์ค์์ ๋ณด(๋น๋ฐ๋ฒํธ, ์ด๋ฉ์ผ ๋ฑ)๊ฐ ํ๋ฌธ์ผ๋ก ๋ ธ์ถ๋๊ณ ์๋ค.
๋ํ ์์ค ์ฝ๋๋ฅผ ํ์ธํด๋ด๋, ๋ ธ์ถ์ด ๋์ด์๋ค.
์ฝ๋๋ ์๋ฌด๋ฐ ํํฐ๋ง ํน์ ๋ง์คํน ์ ์ฉ์ด ์์ด, ๋ฐ๋ก ์ถ๋ ฅ๋๊ณ ์์ผ๋ฏ๋ก
์ด๋ฅผ ๊ณต๊ฒฉ์๊ฐ ํ์ธํ๋ค๋ฉด, ์ด๋ก ์ธํ ํผํด๊ฐ ๋ฐ์ ํ ์ ์๋ค.
3-2. ์น ์๋ฒ ๊ตฌ์ฑ ์ ๋ณด ๋ ธ์ถ
ํ์ด์ง ์๋ฌ ๋ฉ์ธ์ง(500,404,402..๋ฑ) ๋ก ์ธํด ์น ํ์ด์ง ์๋ฒ ๊ตฌ์ฑ ์ ๋ณด ํน์ ์ฝ๋ฉํธ ๋ฑ์ด ๋ ธ์ถ ๋ ์ ์๋ค.
๊ณต๊ฒฉ์๋ ์ด๋ฅผ ํตํด ์๋ฒ์ ์ ๋ณด๋ฅผ ์ ์ถํ์ฌ, 2์ฐจ ๊ณต๊ฒฉ์ผ๋ก ์ด์ด๊ฐ ์ ์๋ค.
๋์๋ฐฉ์ :
- ์ค์์ ๋ณด๋ ๋ง์คํน์ ์ ์ฉํ์ฌ ํ์ํ๋ค.
์์ค์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ง์คํน ์ฒ๋ฆฌํ์ฌ ์ค์์ ๋ณด๊ฐ ๋ ธ์ถ๋์ง ์๋๋ก ๋์ฒํ๋ค.
- ์๋ฌ ์ฝ๋์ ๋ํด ๋ณ๋์ ์๋ฌ ํ์ด์ง๋ก Redirect ์ฒ๋ฆฌ ์ํจ๋ค.
apache2.conf ํ์ผ์ ์ ์ญ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐ ์์ผ์ฃผ์ด์ผ ํ๋ค.
๋จผ์ ์์ค์ฝ๋์ ๋์ผํ ์์น์ ์๋ฌ ์ฝ๋ ๋ฐ์ ์ ์ด๋ํ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ค๋ค.
์์ ๊ฐ์ด ๊ฐ๋จํ ์ฝ๋๋ฅผ ์์ฑ ํ apache2.confํ์ผ๋ก ์ด๋ํ๋ค
์์น : "etc/apache2 -> vi apache2.conf"
์์ ๊ฐ์ด ์ ์ญ ์ค์ ์ ์ถ๊ฐํ๋ค. (์ด๋ ์์น์ ์กด์ฌํ์ฌ๋ ์๊ด ์๋ค.)
ํ์ฌ ์์ ์ ๊ฒฝ๋ก์์ error.html์ ์ฐพ์์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
403 ์๋ฌ์ ๊ฐ์ ๊ฒฝ์ฐ -> 3.35.24.172/admin/์ผ๋ก ๋ค์ด๊ฐ ๊ฒฝ์ฐ ์ด ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค.
์ฆ ๋๋ ํฐ๋ฆฌ ๊ฐ์ ๊ฒฝ์ฐ ํด๋น ๋๋ ํฐ๋ฆฌ ํ์์๋ error ์ฝ๋๋ฅผ ์ ์ฉ ์์ผ์ฃผ์ด์ผ ํ๋ค.
์ต์ข ์ ์ผ๋ก ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ ์ฉํ์์:
: ์ ์ฉ ํ ํ์ด์ง๋ฅผ ์ฌ์์ ํ์ฌ, ํ์ธ ํ ์๋์ ๊ฐ์ด ์๋ฌ ํ์ด์ง๊ฐ ๋ฆฌ๋ค์ด๋ ํธ ๋จ
4. ์ ์ฑ ์ฝํ ์ธ
- file upload ๋ถ๋ถ์์ ํ์ฅ์๋ฅผ ํํฐ๋ง ํ์ง ์์. (f_write.php)
ํ์ผ์ ์ฌ๋ฆฌ๋ ค๊ณ ํ๋ฉด ํ์ฅ์๋ฅผ ๊ฒ์ฌํ์ง ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
์ ์๋ฒ ์์ค์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด, input type "file"์ ์๋ฌด๋ฐ ํํฐ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์๋ค.
๋์๋ฐฉ์ :
4-1. input file ํ์ ํ์ฅ์ ์ ํํ๊ธฐ (ํด๋ผ์ด์ธํธ ์ธก)
input type "file"์ ์ต์ ์ค accept๋ฅผ ์ด์ฉํ์ฌ, ํ์ฅ์๋ฅผ 1์ฐจ๋ก ์ ํํ๋ค.
ํ์ฅ์๊ฐ ์ ํ๋์ง๋ง, ์ด๋ฅผ "burp suite"์ ๊ฐ์ porxyํด๋ก ์ฐํ ํ ์ ์๊ธฐ ๋๋ฌธ์, ์๋ฒ ์ธก์์๋ ํํฐ๋ง์ ์ ์ฉํด์ฃผ์ด์ผ ํ๋ค.
4-2. Apache ํ๊ฒฝ์ค์ ์์ mine type ํํฐ๋ง์ ์ค์ ํ๋ค.(์๋ฒ์ธก ๋์)
: ์๋ centos ์ ๊ฐ์ ๊ฒฝ์ฐ apache๋ฅผ ์ฌ์ฉํ๊ณ "httpd.conf" ํ์ผ์ ์๋์ ๊ฐ์ด ์ ์ฉํด ์ค ์ ์๋ค๊ณ ํ๋ค.
ํ์ง๋ง ubuntu ์ ๊ฒฝ์ฐ "httpd.conf" ํ์ผ์ด ์๋, "apache2.conf" ํ์ผ์ด ์กด์ฌํ๋ฉฐ ์ ์ต์ ์ด ์กด์ฌํ์ง ์๋๋ค.
๋๋ฌธ์ -> "etc -> mime.types" ํ์ผ์์ ์ง์ ์์ ํ์๋ค.
๊ฒ์ํ์ ๊ธ ๋ฑ๋ก ๋ฐ ํ์ผ ์ ๋ก๋ ๊ธฐ๋ฅ์ Flash ํ์ผ์ด๋ avi ๋์์ํ์ผ, exe ์คํํ์ผ ๋ฑ ์ ์ฑ์ฝ๋๊ฐ ํฌํจ๋ ์ ์๋ ์ฝํ ์ธ ๋ฅผ ์ ๋ก๋ ํ์ง ๋ชปํ๊ฒ ํด๋นํ๋ ํ์ฅ์๋ฅผ ๋ชจ๋ ์ง์์ค๋ค.
"MIME Type์ด๋?"
MIME์ผ๋ก ์ธ์ฝ๋ฉํ ํ์ผ์ Content-Type ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
MIME Type์ “ํ์ผ์ข ๋ฅ/ํ์ผํฌ๋งท” ํํ๋ฅผ ๊ฐ์ง๊ณ ํ์ผ ํ์์ ๋ฐ๋ผ ๊ตฌ๋ ํ ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ถ์ง์ ์ ์๋๋ก ํด์ค๋ค.
4-3. ์ต์ข
์ ์ผ๋ก ํ์ผ์ ๊ฒ์ฌํ๋ ๋ก์ง์ ํ์ฅ์ ํํฐ๋ง์ ์ถ๊ฐํ๋ค.
ํ์ผ์ ์ ๋ก๋ํ๋ ํ์ด์ง์ ์์ค์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ผ์ ์ด๋ฆ๊ณผ ํ์ผ์ ์๊ฐ์ ๋ฐ์์จ ํ, ์ด์ค ํ์ฅ์ " . ?? "๋ถ๋ถ์ "insert1" ์ ํตํด ๋ถ๋ฆฌํ๋ค.
๋ถ๋ฆฌ ํ ํด๋น ํ์ผ์ ๋ ์ง + ์ด๋ฆ(ํ์ฅ์ ์ ์ธ) ์ md5๋ก ํด์ํ ํด์ค ํ ๋ค์ ํ์ฅ์๋ฅผ ๋ถ์ฌ์
์ ๋ก๋ ํ๋ ํ์์ด๋ค.
์ฆ , ์๊ฐ "20210524175153" ๊ณผ ํ์ผ ์ด๋ฆ"jvmopt.txt"๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด, .txt ๋ฅผ ์ ์ธํ ๋๋จธ์ง "20210524175501jvmopt" ๋ถ๋ถ์ ํด์ํ ํ ํ,
ํ์ฅ์๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์ต์ข ์ ์ผ๋ก ์๋์ ๊ฐ์ ์ด๋ฆ์ ํ์ผ์ files ๋ผ๋ ๋๋ ํฐ๋ฆฌ์ ๋ฃ์ด์ฃผ๋ ํ์์ด๋ค.
ํ์ฌ๋ ํ์ผ์ ์ฌ๋ฆฌ๋ ๊ฒฝ์ฐ, ํ์ฅ์๋ฅผ ๊ฒ์ฌํ์ง ์๊ณ ์์ผ๋ฏ๋ก ์ ์๋ฒ ์์ค ๋จ์์ ํ์ฅ์๋ฅผ "ํ์ดํธ ๋ฆฌ์คํธ ๊ธฐ๋ฐ"์ผ๋ก ํํฐ๋ง ํด์ค๋ค
๊ฐ๋จํ๊ฒ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฉํด์ฃผ๋ฉด ๋๋ค. (if ์ ์์ ์ ์์ ์ผ๋ก ํ์ผ์ ์ ๋ก๋ ํ๋ ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด ๋จ)
ํด๋น ์ฝ๋๋ ํ์ฅ์๋ฅผ "pdf, txt, word, docx, png, jpeg, jpg" ๋ง ํ์ฉ๊ฐ๋ฅ ํ๋๋ก ์ ํํ๋ "ํ์ดํธ ๋ฆฌ์คํธ ๋ฐฉ์ ํํฐ๋ง"์ ์ ์ฉํ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ์ ์ฉํ๋ฉด ํ์ฉ ํ์ฅ์์ ํฌํจ๋์ง ์์ ํ์ฅ์๋ฅผ ์ฌ๋ฆด ์, ๊ฒ์ฆํ์ฌ ์ด๋ฅผ ์ฐจ๋จํ๋ค.
์๋์ ๊ฐ์ด ์ ์์ ์ผ๋ก ํ์ฉ๋ ํ์ฅ์ ํ์ผ์ ์ฌ๋ฆฌ๋ฉด, ์ ๋ก๋๊ฐ ์ฑ๊ณตํ๋ค.
์ ์ฒด ์ฝ๋ : ๋นจ๊ฐ ๋ค๋ชจ ๋ฐ์ค๋ ์๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์กฐ๊ฑด๋ฌธ ์์ ๋ฃ์ด์ค ๊ฒ์ด๋ค.
: ์ ๋์๋ฐฉ์์ "ํ์ผ ์ ๋ก๋" ์ทจ์ฝ์ ์ ๋ํ ๋์ ๋ฐฉ์์ด ๋๊ธฐ๋ ํ๋ค.
5. ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํ
5-1. write.php (๊ธ์ฐ๊ธฐ)
์๋์ ๊ฐ์ด ๊ฒ์ํ์์ ๊ธ์ ์์ฑ ์, ์คํฌ๋ฆฝํธ์ ๋ํ ํํฐ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์๋ค.
๋๋ฌธ์, ์์ ๊ฐ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋ ฅํ๋ฉด ์ ์ฉ๋์ด "alert"๊ฐ ์คํ๋๋ค.
์๋ฒ ์ฝ๋ ์ค write.php ์์ form์ ๊ฐ์ write_ok.php ๋ก ๋ณด๋ด๊ณ ์๋ค.
"write_ok.php" ์์ค์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์์จ ๊ฐ์ ๊ทธ๋๋ก DB์ insertํ๊ณ ์๋ค.
"stored xss"๊ฐ ๊ฐ๋ฅํ ์ด์ ๋ ํด๋น ์คํฌ๋ฆฝํธ๊ฐ ์ผ์์ ์ด ์๋๋ผ, ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ ์ ์ฅ๋์ด, ๊ทธ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ๊ธ์ ํ์ธ ํ ๋๋ง๋ค ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ ์ฅํ์ธ๊ฒ์ด๋ค. -> ์ฆ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ค์ด๊ฐ๊ธฐ ์ ๊ฒ์ฆ์ด ํ์ํจ.
5-2. read.php (๋๊ธ ์ฐ๊ธฐ) -> reply.php
๋๊ธ ๋ํ ์คํฌ๋ฆฝํธ์ ๋ํ ํํฐ๋ง์ ๊ฑฐ์น์ง ์๊ณ ์์ด์, ์๋์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฌธ ์ ๋ ฅ ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ์ํ๋ค.
<img src=# onerror =alert(1); />
์์ค์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด, read.php ์์ include๋ฅผ ํตํด 'reply.php'๋ฅผ ๋ถ๋ฌ์ค๊ณ ์๋ค.
'reply.php' ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด, ์๋์ ๊ฐ์ด form ํ๊ทธ๋ฅผ ํตํด 'post'๋ฐฉ์์ผ๋ก reply_write.php๋ก ๋๊ธ์ ๋ํ ๋น๋ฐ๋ฒํธ์, ๋ด์ฉ์ ๋ณด๋ด์ค๋ค. ์ฆ "reply_write.php"ํ์ด์ง์์ ๊ฒฐ๊ตญ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ฐ์ ์ง์ด๋ฃ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
"reply_write.php" ์์ค์ XSS ๋์ ๋ก์ง์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
ํด๋น ์์ค ์ฝ๋๋ฅผ ๋ณด๋ฉด pw, content๋ ๊ฐ์ ์ ์ฅํ๋ฉฐ, ์๋ฌด๋ฐ ํํฐ๋ง์ด ๋์ด์์ง ์์ ์ํ๋ก ๊ฐ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ฃ์ด,
ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ "Stored Xss" ๊ณต๊ฒฉ์ ๋ ธ์ถ๋๋ค.
5-3. join.php (ํ์ ๊ฐ์ )
ํด๋น ์ฝ๋๋ฅผ ๋ณด๋ฉด, maxlength์ ๊ฐ์ด ๊ฐ์ฅ ๊ธด ๊ฒ์ด Pw์ด๋ค. ๊ฒ์ฆ ๋ก์ง์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์, xss ์ ์ทจ์ฝํ ๋ฏ ํ๋ค.
์ ์ฅ๋ pw ๊ฐ์ ํ์์ ๋ณด ์ฆ "mypage.php"์ ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์ 'stored Xss' ์ด ๋ฐ์ํ๋ค.
์์ ๊ฐ์ด ์์ด๋์ ์ด๋ฆ , ์ด๋ฉ์ผ์ ์ ์์ ์ธ ์ํ๋ก ์ ์ฉํ๊ณ ๋น๋ฐ๋ฒํธ๋ฅผ <script>๊ตฌ๋ฌธ์ ๋ฃ์ด ํ์๊ฐ์ ์ ํ๋ฉด
mypage์ ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฉ๋์ด alert ์ฐฝ์ด ๋จ๊ฒ ๋๋ค.
์๋ฒ ์์ค์ฝ๋๋ฅผ ํ์ธํ๊ธฐ ์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ์์ ์ ์๊ฐํด๋ณด๋ฉด ๊ฐ์ ํ join์ด๋ผ๋ ๋ฒํผ์ ๋๋ฅด๋ ๋์์ ๊ฐ์ด ์ ์ฅ๋๋ ๊ฒ์ด๋ค. ์ฆ "joinAction.php" ํ์ด์ง์์ ๊ฐ์ ๊ฒ์ฆํ์ง ์๊ธฐ์ ์ผ์ด๋๋ ์ทจ์ฝ์ ์ด๋ค.
๋ฐ๋ผ์ ๋ค์ ์ค, id ์ pw, name ๋ชจ๋์์ ์ ๋ ฅ ๋ฐ๋ ๊ฐ์ ๋ํ ๊ฒ์ฆ์ด ํ์ํ๋ค.
5-4. search (๊ฒ์)
๋์๋ฐฉ์ :
๊ฒ์๋ฌผ์ ๋ณธ๋ฌธ๋ฟ๋ง ์๋๋ผ ์ ๋ชฉ, ๋๊ธ, ๊ฒ์์ด ์ ๋ ฅ ์ฐฝ, ๊ทธ ์ธ ์ฌ์ฉ์ ์ธก์์ ๋์ด์ค๋ ๊ฐ์ ์ ๋ขฐํ๋ ๋ชจ๋ form๊ณผ
ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ํด์ ํํฐ๋ง์ ์ํํด์ผ ํจ.(์๋ฒ ๊ฒ์ฆ ํ์)
ํนํ ํน์๋ฌธ์ ํน์ ์คํฌ๋ฆฝํธ ์ ์์ด ๋ฑ์ "php ์ ์ ํจ์"๋ฅผ ํตํด ๊ณต๋ฐฑ ํน์ ๋ค๋ฅธ ๋ฌธ์๋ก ์นํํ๋ค.
:์ ์ ํจ์
๋ฌธ์์ด์ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๊ต์ฒดํ ๋ ์ฐ์ด๋ ํจ์๋ก str_replace()์ substr_replace()๊ฐ ์๋ค.
๋ณดํต ๋จ์ํ ๋ฌธ์์ด์ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ์นํํ ๋๋ str_replace()๋ฅผ ์ฌ์ฉํ๊ณ , ์ผ์ ๊ท์น์ ๋ฐ๋ผ ๊ต์ฒดํ๊ณ ์ถ๋ค๋ฉด substr_replace()๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ str_replace()๋ฅผ ํตํด์ ํน์ ๋ฌธ์ ํน์ ํน์ ๋ฌธ์ ๋ฑ์ ํํฐ๋ง ํด์ฃผ๋ฉด ๋๋ค.
"str_replace" -> (์นํ๋ ๋ฌธ์์ด, ์นํํ ๋ฌธ์์ด, ๋ฌธ์์ด, ๋ช๊ฐ ์นํ ํ๋์ง ์ ๋ ฅ๋ฐ์)
"substr_replace"(๋ฌธ์์ด, ์นํํ ๋ฌธ์์ด, ์นํ ์์ index, ๊ท์นํ์ธํด์ผํจ)
5-1. ๊ฒ์ํ ์ํ์ด ์ฝ๋ฉ
๋ค์ ์๋ฒ ์์ค์ ๊ฐ์ด ํ๋์ฉ ์ผ์ผ์ด ํํฐ๋ฅผ ๊ฑธ์ด์ฃผ์๋ค.
5-2. ๋๊ธ ์ํ์ด ์ฝ๋ฉ
pw์ ๋ํ ๋์์ ํ์๊ฐ ์๋ค. ๊ฐ์ ์ญ์ ํ๋ ๋ก์ง์์๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ ์ํฅ์ด ์์ผ๋ฏ๋ก, content์ ๋ํ ํํฐ๋ง ๊ฑธ์ด์ค๋ค.
ํํฐ๋ง ์ ์ฉ ์ดํ, ๊ฐ์ ์คํฌ๋ฆฝํธ ๋ฌธ์ ๋๊ธ๋ก ์์ฑํด๋ณด๋ฉด, ์ ์์ ์ผ๋ก ๊ฐ์ด ๋งํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ํ ์ํ์ด ์ฝ๋ฉ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ด์ฉ๊ณผ ์ดํ, ์ ์ฅ๋ ๋ด์ฉ์ ๋น๊ตํด๋ณด๋ฉด ๊ฐ์ด ๋ค๋ฅด๊ฒ ์ ์ฅ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
5-3. ํ์๊ฐ์ ์ํ์ด ์ฝ๋ฉ
pw_ck๋ DB์ ์ ์ฅ๋๋ ๊ฐ์ด ์๋๋ฏ๋ก ๊ฒ์ฆํ์ง ์์๋ค. id ์ email ๊ฐ์ ๊ฒฝ์ฐ DB ์ ์ ์ฅ์ ๊ธ์ ์๋ฅผ ์ ํํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ณต๊ฒฉ์ฝ๋๊ฐ ๋ค์ด์ค๋ฉด ์ด๋ฅผ ๊ฑฐ๋ถํ๋ค. -> ๊ธธ์ด์ ํ ํํฐ๋ง.
๋ํ input type ์์ email์ ์ ๋ ฅ ์ javascript๋ก ํด๋ผ์ด์ธํธ ๋จ์์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ฒ์ฆํ์ง ์์๋ค. (์๋ฒ์์ ๊ฒ์ฆํด์ฃผ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์, ๊ธธ์ด์ ๋ํ ์ ํ์ด ๊ฑธ๋ ค์์ด์ ๋ฐ๋ก ๊ฒ์ฆํ์ง ์์ ๊ฒ)
์ํ์ด ์ฝ๋ฉ ํ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ํ์ ๊ฐ์ ๋น๊ตํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํฐ๊ฐ ์ ์ฉ๋๋ ๊ฒ์ ์ ์ ์๋ค.
๊ฒฐ๊ณผ :
ํน์ ๋ฌธ์ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ ์ํฌ ์ ์๋ ์ํ ์์๊ฐ ์๋ ํ๊ทธ ๋ฑ ๋ชจ๋ ๋ฌธ์๋ฅผ ์นํํด์ฃผ๊ฑฐ๋ ์ํฐํฐ์ฝ๋๋ก ๋ฐ๊พธ์ด ์ค๋ค
: ๊ฒฐ๊ณผ๋ ์คํฌ๋ฆฝํธ๋ฌธ์ ์ ๋ ฅํ์ฌ๋ ์คํ๋์ง ์๊ณ ๋ฌธ์์ด ์์ฒด๋ก ์ธ์ํจ._
5-4. ๊ฒ์์ฐฝ ์ํ์ด ์ฝ๋ฉ
๊ฒ์์ฐฝ์ ์์์ sql injection ์ ์ํ์ด ์ฝ๋ฉ ํ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์ด์ ์ธ ํน์๋ฌธ์ ๋ฑ์ ๋ฐฉ์งํ๊ณ ์๋ค.
ํ์ง๋ง ์ด์ธ์ ์ด๋ฒคํธ ํจ์๋ ์ฝ๋๋ฅผ ์ฐํํ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐ๋ก ํํฐ๋ง ํ๋ค.
๊ฒฐ๊ณผ :
์์ ์ ์ฝ๋์์ ๋ฐ์ํ๋ XSS๊ฐ ์คํ๋์ง ์๋๋ค.
์ฆ, ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํค์ง ์๊ณ ๋ฌธ์์ด ์์ฒด๋ก ๋ฐ์๋ค์ธ๋ค.
ํด๋น ์ทจ์ฝ์ ์
Reflected(๋ฐ์ฌํ) XSS๋ URL, URL ํ๋ผ๋ฏธํฐ, Cookie ํ๋ผ๋ฏธํฐ๋ฑ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ด์ฉ์ ๋ํด์ ์๋ต ํ์ด์ง์ ์คํ๋๋ ์ทจ์ฝ์ ์ ์๋ฏธํ๋ค.
๊ฒฐ๊ตญ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ํน์ ๋ด์ฉ์ ๋ํด์ ํด๋น ์น ํ์ด์ง ํ๋ฉด์ ์ถ๋ ฅ ๋๋ ํํ์ ์ทจ์ฝ์ ์ด๋ค.
์ด์ 5-1 ~ 5.3 ๊น์ง๋ Stored XSSํํ๋ก DB ์์ ์ ์ฅ๋ ๊ฐ์ ํ์ธ ํ ์ ์์์ง๋ง, ๋ฐ์ฌํ ์ทจ์ฝ์ (Reflected XSS)๋ ์ ์ฅ๋์ง ์๊ณ
ํด๋น url์ ํตํด ์คํ๋๋ค.
XSS์ ๋ฐฉ์์ ์ด์ธ์๋ ๋ค์ํ๊ฒ ์กด์ฌํ๋ค.
1. http only ์์ฑ ์ด์ฉํ๊ธฐ
: ๋ณดํต XSS์ ๋ชฉ์ ์ ์ฟ ํค๋ฅผ ์ค๋ํ ํ์ฌ, ๋ค๋ฅธ ์ฌ๋์ ๊ถํ์ ํ๋ํ๊ฑฐ๋ ํ์ทจํ๋ ๋ฑ์ ๋ชฉ์ ์ฑ์ ๊ฐ์ง๋ค. ๋๋ฌธ์ header ์ต์ ์ค httponly ์์ฑ์ ํ์ฑํ ์์ผ ๋ค์๊ณผ ๊ฐ์ด xss๋ฅผ ๋ฐฉ์งํ๋ค.
(ํด๋น ์์ฑ์ ์ ์ฉํ๋ฉด ์ฟ ํค ๊ฐ์ ํ์ด์ฌํน ํ ์ ์๊ฒ ๋๋ค.)
2. cookie.setsecure์ด์ฉํ๊ธฐ
SSL ํต์ ์ฑ๋ ์ฐ๊ฒฐ ์์๋ง ์ฟ ํค๋ฅผ ์ ์กํ๋๋ก ์ค์ ํด์ฃผ๋ ์ฟ ํค์ ์์ฑ์ด๋ค.
์ด ์ค์ ์ญ์ Set-Cookie ์๋ต ํค๋์์ ์ค์ ํ๋ค.
ํด๋ผ์ด์ธํธ์ ํ๊ฒฝ(์น ๋ธ๋ผ์ฐ์ )์์ HTTPS(SSL/TLS) ํต์ ์ผ ๋๋ง ์ฟ ํค๋ฅผ ์ ์กํ๋ ๋ฐฉ์์ด๋ค.
HTTP๋ฅผ ์ด์ฉํ๋ค๋ฉด ์ฟ ํค๋ฅผ ์ ์กํ์ง ์๋๋ค.
์ฆ, ํ๋ฌธ์ผ๋ก ์ฟ ํค๋ฅผ ์ ์กํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฐ์ฑ์ด ๋ณด์ฅ๋๋ ๋ฐฉ๋ฒ์ด๋ค.
3. ์ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (AntiXSS) ์ฌ์ฉ
4. CSP (์ฝํ ํธ ๋ณด์ ์ ์ฑ ) ์ฌ์ฉ
์ด์ธ์๋ ์๋ ์ฃผ์๋ฅผ ํตํด ์์ธํ ์ดํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
1. https://www.kisa.or.kr/uploadfile/201312/201312161355109566.pdf -> XSS๋์๋ฐฉ์ ๋ฐ ๊ณต๊ฒฉ๊ฐ์
2. CSP ๋? SOP(Same-Origin Policy)์ CORS(Cross-Origin Resource Sharing)
->
https://core-research-team.github.io/2021-05-01/Easy-to-understand-Web-security-model-stroy-2(CSP)#3-set-cookie-httponly
์ ์ฌ์ดํธ ๋๋ค ๋๋ฌด ์ ๋ฆฌ๊ฐ ์๋์์ด์ ๊ผญ ์ฐธ๊ณ ํด๋ณด์ธ์
6. ์ฝํ ๋ฌธ์์ด ๊ฐ๋
login.php ํ์ด์ง์๋ ์๊ณ์น๊ฐ ์ค์ ๋์ง ์์์, ํ์์ ๋ํ ์ ํ์ด ์๋ค.
๋ํ admin๊ณผ ๊ฐ์ ๊ด๋ฆฌ์ ๊ณ์ ์ ๋ํ ๋ณด์์ด ๋งค์ฐ ์ทจ์ฝํ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๊นจ๊ธฐ๊ฐ ๊ฐ๋จํ๋ค.
- ๋ฌด์ฐจ๋ณ ๋์ ๊ณต๊ฒฉ (Brute-force attack)
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค