๐ฉ ๋ฌธ์ ํ์
๋ฌธ์ ํ์ด์ง์ ์ ์ํ๋ฉด view-source ์ด์ธ์๋ ๋ค๋ฅธ ์์๋ฅผ ํ์ธํ ์ ์๋ค. ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ์์ค์ฝ๋๋ฅผ ํ์ธํด๋ณด์.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// id ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ addslashes ํจ์๋ฅผ ํตํด ๋ฌธ์์ด ์ด์ค์ผ์ดํ
$_GET['id'] = addslashes($_GET['id']);
// ๋ฌธ์์ด ์ ๊ท์ ๊ฒ์ฌ
if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
// ๋ฌธ์์ด ๊ธธ์ด๊ฐ 15๋ฅผ ์ด๊ณผํ๋ฉด ์ข
๋ฃ
if(strlen($_GET['id'])>15) exit("Access Denied");
// MySQL ์ฟผ๋ฆฌ๋ฌธ ์คํ
$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
echo "<b>{$result['id']}</b><br>";
// ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ ๊ฐ์ด admin ๋ฌธ์์ด๊ณผ ๊ฐ๋ค๋ฉด ๋ฌธ์ ํด๊ฒฐ
if($result['id'] == "admin") solve(61);
์ฝ๋์์ ์ฃผ์ํ ๋ถ๋ถ์ ์์ ๊ฐ๋ค.
๐ฉ ๋ฌธ์ ํ์ด
์ฐ์ , ์ ๋ ฅ ๊ฐ id๋ฅผ ํตํด ๊ตฌ์ฑํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋ถ์ํด๋ณด์.
1
select {id} from chall61 order by id desc limit 1
: chall61
ํ
์ด๋ธ์ id ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์์ ๋ ์ต์์ 1๊ฐ ๋ฐ์ดํฐ์ id ๊ฐ์ ์ถ์ถ
์ฆ, id ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ํ์์ ๋ ์ต์์ 1๊ฐ ๋ฐ์ดํฐ์ id ๊ฐ์ ์ ํํ๊ฒ ์
๋ ฅํด์ผ ํด๋น ๊ฐ์ ์ถ์ถํ ์ ์๋ค. ์ฐ๋ฆฌ๋ ์ด ๊ฐ์ด admin
์ด์ด์ผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋, ?id=admin
์ผ๋ก ์์ฒญํ์ฌ๋ ์๋ฌด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๊ธฐ์ SQL Injection ๊ณต๊ฒฉ์ ํตํด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ ์ถ์ถํด์ผ ํ๋ค.
์ด๋ฅผ ์ํด์๋ ์ ๋ ฅ ๊ฐ์ ๋ํ ์ ๊ท์ ๊ฒ์ฌ ๊ตฌ๋ฌธ์ ๋ถ์ํด์ผ ํ๋ค. ๋ถ์ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฐ ๋ฌธ์์ด ์ฌ์ฉ ๋ถ๊ฐ ์กฐ๊ฑด์ด ์ ์ฉ๋์๋ค.
1
/\(|\)|select|from|,|by|\./i
(
๋ฌธ์)
๋ฌธ์select
๋ฌธ์์ดfrom
๋ฌธ์์ด,
๋ฌธ์by
๋ฌธ์์ด.
๋ฌธ์- Case sensitive
๊ฒฐ๊ตญ ์ฌ๋ฌ ํํฐ๋ง์ ์ฐํํ๊ณ `'admin'`์ด๋ผ๋ ๋ฌธ์์ด์ select ํ ์ ์๋๋ก ํด์ผํ๋ ๊ฒ์ด ์ด ๋ฌธ์ ์ ๊ถ๊ทน์ ์ธ ๋ชฉํ์ด๋ค. ์ด๋ฅผ ์ํด์๋ MySQL์์ ์ฌ์ฉํ๋ alias ๋ผ๋ ํค์๋์ด๋ค.
alias ํค์๋๋ ํ ์ด๋ธ์ด๋ ํน์ ์ปฌ๋ผ์ ์๋ก์ด ์ด๋ฆ, ์ฆ ๋ณ์นญ์ ์ง์ ํด์ค ๋ ์ฌ์ฉํ๋ค.
1
select 'abc' as id;
์์ ๊ฐ์ด ์คํํ๋ค๋ฉด abc
๋ผ๋ ๋ฌธ์์ด ๊ฐ์ ๊ฐ์ง ์ปฌ๋ผ์ id๋ก ๋ถ๋ฅผ ์ ์๋ค๋ ๊ฒ์ด๋ค.
1
select 'admin' as id from chall61 order by id desc limit 1
๋ง์ฝ id
ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก 'admin' as id
๋ผ๋ ๊ฐ์ ๋๊ฒจ์ฃผ๋ฉด ์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ ๊ตฌ์ฑํ๊ฒ ๋๊ณ ํด๋น ์ฟผ๋ฆฌ๋ฌธ์์ id
์ปฌ๋ผ์ 'admin'
๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๋ฐ๋ผ์ ํด๋น ์ฟผ๋ฆฌ๋ฌธ์ ์คํ ๊ฒฐ๊ณผ๋ 'admin'
์ด ๋๋ค.
์ฌ๊ธฐ์ ํ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์๋๋ฐ, ์์ id
ํ๋ผ๋ฏธํฐ ๊ฐ์ addslashes
ํจ์๋ฅผ ํตํด ํํฐ๋งํ๊ธฐ์ ์ฑ๊ธ์ฟผํฐ '
๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ MySQL์์๋ hex ๊ฐ์ ASCII ๊ฐ์ผ๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ ์์ ์ด๋ฏธ์ง์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฐ๋ฆฌ๋ 'admin'
๋ฌธ์์ด ๋์ ์ hex ๊ฐ 0x61646d696e
์ ์ฌ์ฉํ ์ ์๋ค.
1
?id=0x61646d696e as id
์ด์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธธ ๊ฐ์ ๊ตฌ์ฑํด๋ณด์. ์ด๋ ๊ฒ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๊ณ url ์์ฒญ์ ํ๋ฉด ์์ ์ด๋ฏธ์ง์ฒ๋ผ access denied ๋ฌธ๊ตฌ๋ฅผ ํ์ธํ ์ ์๋ค. ์ด์ ๋ ์กฐ๊ฑด ์ค์ id
๋ฌธ์์ด์ ๊ธธ์ด๊ฐ 15๋ฅผ ์ด๊ณผํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ฐ, alias ํค์๋ `as`๋ ์๋ต์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ ์ด์ฉํ๋ฉด ๋๋ค.
1
?id=0x61646d696e id
๋ฐ๋ผ์ ์์ ๊ฐ์ด ๊ตฌ์ฑํ๋ฉด ์ ํํ 15๊ธ์๋ก ๊ฐ์ ๋ง๋ค ์ ์๋ค.
๋ฌธ์ ํด๊ฒฐ!