+) 22. 08. 31. μΆκ°!!
SQL Injection 곡격μ΄λ, μΉ μ ν리μΌμ΄μ μμ DBμ 쿼리λ₯Ό μμ²ν μ μ λ ₯λ λ°μ΄ν°μ μ ν¨μ± κ²μ¦μ νμ§ μμ DB μ 보λ₯Ό μ΄λνκ±°λ μ‘°μν μ μλ 보μ μ·¨μ½μ μ λ Έλ¦° 곡격μ λ§νλ€.
SQL Injectionμ μΌλ°μ μΌλ‘ μ¬μ©μ μ΄λ¦ / μ¬μ©μ IDμ κ°μ΄ μ¬μ©μμκ² μ λ ₯μ μμ²ν λ λ°μνλ€.
userId = getRequestString("userId");
sql = "SELECT * FROM Users WHERE userId = " + userId;
1 = 1μ κΈ°λ°μΌλ‘ νλ SQL Injectionμ νμ μ°Έμ΄λ€.
λ§μ½ userId λ₯Ό 105 OR 1=1λ‘ μ
λ ₯νλ€λ©΄ SQLλ¬Έμ λ€μκ³Ό κ°μ΄ νμλ κ²μ΄λ€.
SELECT * FROM Users WHERE userId = 105 OR 1=1;
μμ SQLλ¬Έμ μ ν¨νλ©°, OR 1=1μ΄ νμ μ°Έμ΄κΈ° λλ¬Έμ Users ν
μ΄λΈμ λͺ¨λ rowsλ₯Ό λ°ννλ€.
μ΄ λ Users ν
μ΄λΈμ μ΄λ¦κ³Ό μνΈκ° ν¬ν¨λμ΄ μλ€λ©΄, λ°μ΄ν°λ² μ΄μ€μ λͺ¨λ μ¬μ©μ μ΄λ¦κ³Ό μνΈμ μ κ·Όν μ μμ κ²μ΄λ€.
ββ=ββμ κΈ°λ°ν SQL Injectionμ νμ μ°Έμ΄λ€.
λ€μκ³Ό κ°μ μ¬μ©μ λ‘κ·ΈμΈ μμκ° μλ€.
Username: Jangmi
Password: myPass
uName = getRequestString("username");
uPass = getRequestString("userpassword");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'
μμ κ°μ SQLλ¬Έμ μ λ ₯νλ©΄ μλμ κ°μ SQLλ¬Έμ΄ μμ±λλ€.
SELECT * FROM Users WHERE Name = βJangmiβ AND Pass =βmyPassβ
μ¬μ©μ μ΄λ¦ λλ ν¨μ€μλ ν μ€νΈ μμμ β OR ββ=βμ μ½μ νλ©΄ λ°μ΄ν°λ² μ΄μ€μ μ¬μ©μ μ΄λ¦κ³Ό μνΈμ μ κ·Όν μ μλ€.
μλ²λ λ€μκ³Ό κ°μ μ ν¨ν SQLλ¬Έμ μμ±νλ€.
SELECT * FROM Users WHERE Name =ββ or ββ=ββ AND Pass =ββ or ββ=ββ
μμ SQLλ¬Έμ μ ν¨νλ©°, OR ββ=ββκ° νμ TRUEμ΄κΈ° λλ¬Έμ Users ν μ΄λΈμ λͺ¨λ rowsλ₯Ό λ°ννλ€.
Batched SQL Statementsμ κΈ°λ°ν SQL Injection
λλΆλΆμ λ°μ΄ν°λ² μ΄μ€λ μΌκ΄(batched) SQLλ¬Έμ μ§μνλ€. μΌκ΄ SQLλ¬Έμ μΈλ―Έμ½λ‘ μΌλ‘ ꡬλΆλ λ μ΄μμ SQLλ¬Έ κ·Έλ£ΉμΌλ‘ μ²λ¦¬λλ€.
μλ SQLλ¬Έμ Users ν μ΄λΈμ λͺ¨λ rowsλ₯Ό λ°νν λ€μ Suppliers ν μ΄λΈμ μμ νλ€.
SELECT * FROM Users; DROP TABLE Suppliers
μμ
txtUserId = getRequestString("userId");
sql = "SELECT * FROM Users WHERE userId = " + txtUserId;
μ μμμ λ€μκ³Ό κ°μ ꡬ문μ λ£λλ€λ©΄
User id: 105; DROP TABLE Suppliers
SQLλ¬Έμ λ€μκ³Ό κ°μ΄ μ μ©λ κ²μ΄λ€.
SELECT * FROM Users WHERE userId = 105; DROP TABLE Suppliers;
SQL InjectionμΌλ‘λΆν° μΉ μ¬μ΄νΈλ₯Ό 보νΈνκΈ° μν΄ SQL Parametersλ₯Ό μ¬μ©ν μ μλ€.
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL, txtUserId);
νλΌλ―Έν°λ SQLλ¬Έμμ @ λ§μ»€λ‘ νμλλ€.
SQL μμ§μ κ° νλΌλ―Έν°κ° ν΄λΉ μ΄μ λν΄ μ¬λ°λ₯Έμ§ νμΈνκ³ , μ€νν SQLμ μΌλΆκ° μλ λ¬Έμ κ·Έλλ‘ μ²λ¦¬λλμ§ νμΈνλ€.
κ·Έ μΈ λμ λ°©μ
μ
λ ₯ κ°μ λν κ²μ¦
μλ²μμ νμ΄νΈλ¦¬μ€νΈ κΈ°λ°μΌλ‘ κ²μ¦νλ€.
Error Message λ
ΈμΆ κΈμ§
곡격μκ° SQL Injectionμ μννκΈ° μν΄μλ λ°μ΄ν°λ² μ΄μ€ μ 보(ν
μ΄λΈλͺ
, 컬λΌλͺ
λ±)κ° νμνλ€. λ°μ΄ν°λ² μ΄μ€ μλ¬ λ°μ μ λ°λ‘ μ²λ¦¬λ₯Ό ν΄μ£Όμ§ μμλ€λ©΄ μλ¬κ° λ°μν 쿼리문과 ν¨κ» μλ¬μ λν λ΄μ©μ λ°ννλ€.
μ΄ λ ν
μ΄λΈλͺ
λ° μ»¬λΌλͺ
μ΄ κ·Έλλ‘ λ
ΈμΆλ μ μκΈ° λλ¬Έμ μ€λ₯ λ°μ μ μ€λ₯ νμ΄μ§λ₯Ό μ μνκ±°λ λ©μμ§ λ°μ€λ₯Ό λμ°λλ‘ ν΄μΌ νλ€.
μΉ λ°©νλ²½ μ¬μ©
μ°Έκ³ μλ£
w3schools, βSQLΒ Injectionβ, https://www.w3schools.com/sql/sql_injection.asp
plura blog, βSQL Injection λμ λ°©μβ, http://blog.plura.io/?p=6056
NoirStar Space, βSQL Injection μ΄λ? (SQL μ½μ 곡격)β, https://noirstar.tistory.com/264