๐ฉ ๋ฌธ์ ํ์
๋ฌธ์ ํ์ด์ง์ ์ ์ํ๋ฉด ํ์๊ฐ์
๊ณผ ๋ก๊ทธ์ธํ ์ ์๋ ํผ์ ํ์ธํ ์ ์๋ค. ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด JOIN ์ ID๋ id
, PHONE์ phone
์ name์ ๊ฐ์ง๊ณ , LOGIN์ ID๋ lid
, PHONE์ lphone
์ name์ ๊ฐ์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. view-source๋ฅผ ํตํด ํ๋ก๊ทธ๋จ ์์ค์ฝ๋๋ฅผ ํ์ธํด๋ณด์.
- JOIN ์ฒ๋ฆฌ ์ฝ๋
1
2
3
4
5
6
7
8
if($_POST['id'] && isset($_POST['phone'])){
$_POST['id'] = addslashes($_POST['id']);
$_POST['phone'] = addslashes($_POST['phone']);
if(strlen($_POST['phone'])>=20) exit("Access Denied");
if(preg_match("/admin/i",$_POST['id'])) exit("Access Denied");
if(preg_match("/admin|0x|#|hex|char|ascii|ord|select/i",$_POST['phone'])) exit("Access Denied");
mysqli_query($db,"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')");
}
addslashes
ํจ์๋ก ์ ๋ ฅ ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ์ ์ฑ๊ธ์ฟผํฐ'
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.phone
๊ฐ์ ๊ธธ์ด๋ 20 ์ด์์ผ ์ ์๋ค.id
๊ฐ์/admin/i
์ ๊ท์์ ๋ง์กฑํ ์ ์๋ค.phone
๊ฐ์/admin|0x|#|hex|char|ascii|ord|select/i
์ ๊ท์์ ๋ง์กฑํ ์ ์๋ค.- ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ ์์
insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')
๊ตฌ๋ฌธ์ ์คํํ๋ค.
- LOGIN ์ฒ๋ฆฌ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if($_POST['lid'] && isset($_POST['lphone'])){
$_POST['lid'] = addslashes($_POST['lid']);
$_POST['lphone'] = addslashes($_POST['lphone']);
$result = mysqli_fetch_array(mysqli_query($db,"select id,lv from chall59 where id='{$_POST['lid']}' and phone='{$_POST['lphone']}'"));
if($result['id']){
echo "id : {$result['id']}<br>lv : {$result['lv']}<br><br>";
if($result['lv'] == "admin"){
mysqli_query($db,"delete from chall59");
solve(59);
}
echo "<br><a href=./?view_source=1>view-source</a>";
exit();
}
}
addslashes
ํจ์๋ก ์ ๋ ฅ ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ์ ์ฑ๊ธ์ฟผํฐ'
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ
lid
์lphone
์ ํด๋นํ๋ ๋ฐ์ดํฐ์lv
์ดadmin
์ผ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
SQL Injection์ ํตํด lv
์ด admin
์ธ ๊ณ์ ์ผ๋ก ํ์๊ฐ์
ํ๊ณ ๋ก๊ทธ์ธํ๋ฉด ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
๐ฉ ๋ฌธ์ ํ์ด
์ฐ์ lv
์ด admin
๊ฐ์ ๊ฐ์ง๋ ๊ณ์ ์ ์์ฑํด๋ณด์. join ์์ login ์์ ๋ชจ๋ ์ฑ๊ธ์ฟผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ์ ์ด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ณ์ ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํ๋ค.
์ฐ๋ฆฌ๊ฐ ์
๋ ฅํ ๊ฐ์ insert
๊ตฌ๋ฌธ์ ๊ตฌ์ฑํ์ฌ MySQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ MySQL์์ ์ง์ํ๋ ๋ฌธ์์ด ๊ด๋ จ ํจ์๋ฅผ ์ด์ฉํ์ฌ admin ๊ณ์ ์ ์์ฑํด๋ณด์.
id=admi&phone=1,concat(id,chr(110))--+
(์ฃผ์ ์ฒ๋ฆฌ ๋ค์ ๊ณต๋ฐฑ ๋ฌธ์ ํ์)
๋ํ์ ์ธ ๋ฌธ์์ด ๊ด๋ จ ํจ์๋ concat
, substr
, replace
, reverse
, upper
, lower
๋ฑ์ด ์๋๋ฐ, ์ฒ์์๋ ์ด ์ค concat ํจ์๋ฅผ ์ด์ฉํ์ฌ POST ์์ฒญ ์ ์ ์กํ๋ ๋ฐ๋ ๊ฐ์ ๊ตฌ์ฑํ์๋ค. ๊ทธ๋ฌ๋, phone
๊ฐ์ ๊ธธ์ด๊ฐ 20์ด์์ผ ์ ์๋ค๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ๋ชปํ์๋ค.
id=nimda&phone=1,reverse(id))--+
๊ทธ๋์ reverse
ํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ์ฑํ์๊ณ , ์ด๋ ๋ชจ๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ์๋ค.
ํ์ด์ง์ ์ง์ ์ ๋ ฅํ์ฌ joinํ๋ฉด ์ด๋ฐ ๋ชจ์ต์ด ๋ ๊ฒ์ด๋ค.
lid=nimda&lphone=1
์์ฒญ์ ๋ณด๋ด๊ณ ์์ ๋ฐ๋ ๊ฐ์ผ๋ก LOGIN์ ์๋ํ์๋๋ ๋ฌธ์ ๋ฅผ ํ ์ ์์๋ค.
ํ์ด์ง์ ์ง์ ์ ๋ ฅํ์ฌ loginํ๋ฉด ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.