๋ฒ ์–ด_
TechBear
๋ฒ ์–ด_
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (336)
    • Spring (33)
      • ๊ฐœ๋… (13)
      • Security (5)
      • ์‹ค์Šต (1)
      • ํ† ๋น„ ์Šคํ”„๋ง (11)
    • JPA (6)
    • ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก (24)
    • DB (13)
    • JAVA (18)
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (50)
      • ์œ ํ˜•์ •๋ฆฌ (8)
      • Baekjoon (21)
      • LeetCode (18)
    • ๋””์ž์ธํŒจํ„ด (0)
    • ๊ฐœ๋ฐœ์„œ์  (79)
      • Effective Java (78)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (1)
    • ๋…ํ›„๊ฐ (4)
    • ๋ณด์•ˆ (2)
    • ์šด์˜์ฒด์ œ(OS) (53)
      • ๊ณต๋ฃก์ฑ… (53)
    • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (28)
      • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ (23)
    • ์ž๋ฃŒ๊ตฌ์กฐ (1)
    • DevOps (2)
    • ์•ฑ ๊ฐœ๋ฐœ (20)
      • ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค (20)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    ๊ณต์ง€์‚ฌํ•ญ

    ์ธ๊ธฐ ๊ธ€

    ํƒœ๊ทธ

    • leetcode
    • ์Šค๋ ˆ๋“œ
    • java
    • ์Šคํ”„๋ง์‹œํ๋ฆฌํ‹ฐ
    • ์Šคํ”„๋ง
    • dfs
    • BFS
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์šด์˜์ฒด์ œ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • ํ•จ์ˆ˜ํ˜•์ธํ„ฐํŽ˜์ด์Šค
    • ์ž๋ฐ”
    • C++
    • ์ดํŽ™ํ‹ฐ๋ธŒ์ž๋ฐ”
    • ๋ฐฑ์ค€
    • Spring
    • ์ž๋ฐ”8
    • jpa
    • ํ† ๋น„์Šคํ”„๋ง
    • ์ฝ”๋“œ์—…

    ์ตœ๊ทผ ๋Œ“๊ธ€

    ์ตœ๊ทผ ๊ธ€

    ํ‹ฐ์Šคํ† ๋ฆฌ

    hELLO ยท Designed By ์ •์ƒ์šฐ.
    ๋ฒ ์–ด_

    TechBear

    ๋ณด์•ˆ

    SQL Injection ๊ณต๊ฒฉ๊ณผ ๋Œ€์‘๋ฐฉ๋ฒ•

    2023. 7. 18. 23:09

    ๐Ÿ” SQL Injection

       ๋งŽ์€ ์‚ฌ์ดํŠธ์—์„œ ํผ์„ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ, ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ๋“ฑ์„ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. SQL Injection์€ ์ž…๋ ฅ ํผ์— SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•ด ๋ณด์ด๋Š” ํ–‰์œ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ํฐ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. (e.g ํŒจ์Šค์›Œ๋“œ์™€ ์‹ ์šฉ์นด๋“œ์™€ ๊ฐ™์€ ๊ฐœ์ธ์ •๋ณด ํƒˆ์ทจ)

     

    โœ๏ธ SQL Injection ๊ณผ์ •

    1. HTTP request๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž…๋ ฅ ํผ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.   

    2. ์ด๋•Œ, ์ฝ”๋“œ์— SQL ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ' OR 1 = 1'๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ WHERE ์ ˆ์„ ํ•ญ์ƒ ์ฐธ์œผ๋กœ ๋งŒ๋“ ๋‹ค. 

    3. ์›น ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „๋‹ฌํ•œ๋‹ค.

    4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ „๋‹ฌ๋ฐ›์€ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

    5. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. SQL Injection์— ์˜ํ•ด ๋…ธ์ถœ๋˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜๊ณ  ์ด๋ฅผ ์•…์šฉํ•œ๋‹ค. 

     

    ๐Ÿ” SQL Injection ๋ฐฉ์–ด

       SQL Injection์„ ๋ฐฉ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

     

    โœ๏ธ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ์ฟผ๋ฆฌ (Parameterized Statements) ์‚ฌ์šฉ

    ๋งŒ์•ฝ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ด๋ฏธ ๊ตฌ์กฐํ™” ๋˜๊ณ , ํ•ญ์ƒ ์ฐธ์ด ๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋˜์ง์œผ๋กœ์จ ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

    Connection conn = DriverManager.getConnection(URL, ID, PASS);
    Statement stmt = conn.createStatement();
    
    // concat์„ ์ด์šฉํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ
    String sql = "SELECT * FROM users WHERE email = '" + email + "'";
    
    // ์ฟผ๋ฆฌ ์‹คํ–‰
    ResultSet results = stmt.executeQuery(sql);

     

     

    ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ์ฟผ๋ฆฌ๋ž€ ์ฟผ๋ฆฌ์— ๋งค๊ฐœ ๋ณ€์ˆ˜(placeholder)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ PreparedStatement๋ฅผ ์ด์šฉํ•˜๋ฉด SQL Injection์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ
    Connection conn = DriverManager.getConnection(URL, ID, PASS);
    
    // ์ฟผ๋ฆฌ๋ฌธ ์ค€๋น„
    String sql = "SELECT * FROM user WHERE email = ?";
    
    // prepared statement ์ค€๋น„ 
    PreparedStatement stmt = conn.prepareStatement(sql);
    
    // ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ๋ฐ”์ธ๋”ฉ
    stmt.setString(1, "user@naver.com");

     

    ์—ฌ๊ธฐ์„œ ์˜๋ฌธ์ด stmt.setString(1, "'1'='1'") ๋„˜๊ธฐ๋ฉด ๊ฒฐ๊ตญ์—” SQL Injection์ด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€ ์‹ถ์€๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค !. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์€ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ๋Š” ๋ฌธ์ž์—ด๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ , ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ์ข€ ๋” ์ž์„ธํžˆ ๋งํ•˜๋ฉด ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ๋Š” SQL ์ฟผ๋ฆฌ๋ฌธ์€ ์ฟผ๋ฆฌ๋กœ์„œ ์ „๋‹ฌ๋˜๊ณ  ์ดํ›„์— ๋™์ ์œผ๋กœ ๊ฐ’์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ๋”ฐ๋ผ์„œ DBMS๋Š” ์ฟผ๋ฆฌ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ SQL Injection์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

     

    โœ๏ธ Object Relational Mapping (ORM) ์‚ฌ์šฉ 

       ORM์ด๋ž€ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋ณ€ํ™˜์„ ์ž๋™ํ™”ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์„ ๋งํ•˜๋ฉฐ, ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” JPA๊ฐ€ ORM์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ORM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ด ORM ๊ธฐ์ˆ ์ด ์ž‘์„ฑํ•ด์ค€๋‹ค. ์ด๋•Œ, ๋Œ€๋ถ€๋ถ„์˜ ORM ๊ธฐ์ˆ ์€ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ํ•˜์ง€๋งŒ ORM์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” SQL Injection์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋ฌธ์ž์—ด์„ concatํ•  ๋•Œ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค. 

     

    โœ๏ธ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž ์‚ฌ์šฉ

       ์ฟผ๋ฆฌ์— ์•…์šฉ๋  ๋ฌธ์ž์—ด(์—ญ์Šฌ๋ž˜์‹œ, ์ž‘์€ ๋”ฐ์˜ดํ‘œ ๋“ฑ)์„ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์–ธ์–ด๋“ค์ด ํ‘œ์ค€ ํ•จ์ˆ˜๋กœ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ SQL Injection์ด ๋”ฐ์˜ดํ‘œ๋‚˜ ์—ญ์Šฌ๋ž˜์‹œ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๋ง‰์•„์ฃผ์ง€๋Š” ๋ชปํ•œ๋‹ค.

    "SELECT * FROM user WHERE id = " + id;

    ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์„ ํ†ตํ•ด id๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— '1; DROP TABLE user' ์™€ ๊ฐ™์€ SQL Injection์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    โœ๏ธ ์ž…๋ ฅ ๊ฐ’ ์ •์ œ

       ์ž…๋ ฅ ๊ฐ’์—์„œ ์ž ์žฌ์ ์ธ ์•…์„ฑ ์ฝ”๋“œ๋‚˜ ์ทจ์•ฝํ•œ ๋ฌธ์ž์—ด์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋„ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค. 

    1. ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ
    2. ๋ฌธ์ž์—ด ํ•„ํ„ฐ๋ง : ์ž…๋ ฅ ๊ฐ’์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๋ฌธ์ž๋‚˜ ๋ฌธ์ž์—ด ํŒจํ„ด์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ œ๊ฑฐํ•œ๋‹ค. (HTML ํƒœ๊ทธ, ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ, SQL ์˜ˆ์•ฝ์–ด ๋“ฑ)
    3. ํ˜•์‹ ๊ฒ€์‚ฌ : ์ž…๋ ฅ ๊ฐ’์˜ ๋ฒ”์œ„ ๋˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•œ๋‹ค.

     

     

    ์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
      '๋ณด์•ˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
      • XSS๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์„๊นŒ?
      ๋ฒ ์–ด_
      ๋ฒ ์–ด_
      Today I learned | ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐœ๋ฐœ์ž

      ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”