R's Hacking Daily Log

SQLi (1) 본문

Port Swigger/SQL Injection

SQLi (1)

hanhxx 2023. 4. 26. 13:23

SQL Injection

줄여서 SQLi라고 불리는 SQL injection은 쉽게 말해 SQL을 주입함으로써 실행되는 공격이다. 

 

* SQL = Data Base(DB) 생성, 조회, 삭제, 수정 등 DB를 다룰 때 사용하는 language로

Structured Query Language의 약자이다.

 

그래서 보통 "query"라는 단어가 나오면 DB와 관련된 내용이라 생각하면 된다. 

 

 

 

https://portswigger.net/web-security/images/sql-injection.svg

 

사용자가 서버에 요청을 보내면 서버는 필요에 따라 DB에서 데이터를 조회, 수정, 삭제와 같은 역할을 수행한다.

! 이때 SQL을 이용해 일반적으로 조회할 수 없는 내용을 출력시키거나 DB 안에 있는 데이터를 수정, 삭제하는 등의 악의적인 내용을 실행하는 공격

SQL injection(SQLi)

이라고 한다. 

 

 

 

SQLi도 상황에 따라 다양한 기술, 공격 방식, 취약점이 존재하는 데

이번 글에서는 그 중에서도 "Retrieving hidden data"에 대해 살펴보려 한다.


Retrieving hidden data

:) hidden data를 조회한다는 의미

:) 여기서 말하는 hidden data는 web application 기능에 따라 사용자가 조회하지 못하도록 제한해 둔 데이터를 말한다. 

 

 

여러 카테고리 상품이 있는 쇼핑 applicaiton을 사용한다고 상상해보자. 

이때 사용자가 "Gift"라는 카테고리를 클릭하면 사용자에게는 Gift에 해당하는 상품만 보이게 될 것이다.

이 상황에서 서버가 받은 URl은 다음과 같다. 

https://insecure-website.com/products?category=Gifts

 

* URL에서 ?(question mark)가 나오면 이 부분은 query에 해당하는 내용이라는 뜻이다. 

SQL에서 where문에 들어가는 내용이라 보면 된다.

 

 

위의 url을 받은 서버에서는 다음과 같은 query를 DB에 실행하게 된다.

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

이 query는 "products table에 있는 카테고리가 Gifts이고 released가 1인 상품을 모두 조회해!"라는 뜻이다. 

 

:) select *에서 * 문자는 "모두(all)"를 의미

:) from NAME = NAME table에서 값을 조회하라는 의미

:) where은 조건문이라 생각하면 쉽다. 카테고리가 gifts, released가 1인 걸 동시에 만족하는 상품을 찾으라는 의미

 

 

이와 같은 query가 실행될 때 hidden data는 무엇일까??

카테고리가 gifts인데 released가 0인 상품은 조회할 수 없다.

공격자는 realeased가 뭐든 상관없이 카테고리가 gifts인 상품을 모두 출력하고 싶다고 가정하자. 

 

 

그렇다면 공격자 입장에서 어떤 SQLi를 실행할 수 있을까?

https://insecure-website.com/products?category=Gifts'--

url을 위와 같이 만들어 서버로 보내면 다음과 같은 sql이 만들어지게 된다. 

 

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

sql 종류에 따라 "-- or #"은 주석을 의미한다. 

 

 

사용자가 gifts를 선택하게 되면 해당 요청을 받은 서버는 자신이 갖고 있던 sql에 

SELECT * FROM products WHERE category = '$user_input' AND released = 1

 

url에 category=~~~라고 적혀있는 값을 가져와 $user_input 자리에 넣음으로써 sql을 완성한다.

 

 

 

그렇기 때문에 url의 값을 

https://insecure-website.com/products?category=Gifts'--

이와 같이 수정하면 $user_input = Gifts'-- 가 되기 때문에 이 부분 값을 가져와 $user_input자리에 넣으면

 

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

결과적으로 위와 같은 sql이 만들어지게 되는 것이다. 

 

 

!! category = 'Gifts'--' 

이 부분에서 double dash 앞에 있는 따옴표에서 category의 값은 Gifts로 끝나게 되고

남은 double dash -- 가 주석으로 쓰이게 된다. 

 

따라서 double dash -- 뒤에 어떤 내용이 오든 공격자 입장에서는 상관없이 category가 gifts인 모든 상품을 

출력할 수 있게 되는 것!

 


두 번째로 hidden data라 삼을 수 있는 대상은 무엇일까??

위의 상황은 카테고리가 gifts인 상품만 출력하고 있는 상황이다.

이번에는 공격자가 카테고리에 상관없이 쇼핑 application에 있는 모든 상품을 조회하고 싶어 한다. 

이럴 경우에는 어떤 SQLi을 실행할 수 있을까?

 

 

이번에도 공격자가 url을 조작해 다음과 같이 수정했다고 가정해 보자.

https://insecure-website.com/products?category=Gifts'+OR+1=1--

이전과 달라진 부분을 보자면 

 

Gifts -> Gifts'+OR+1=1--

OR 1=1--이 붙은 걸 볼 수 있다.

 

 

이렇게 되면 서버에서는 다음과 같은 sql은 완성하게 된다.

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

위에서 봤듯이 --(double dash) 이후의 내용은 주석 처리된다는 걸 알 수 있다. 

그러면 "and released = 1"에 의한 제한은 없어질 것이다.

 

 

!! OR 1=1

1=1은 1은 1이다라는 조건문이다. 다만 항상 결과가 true가 되는 조건문인 셈이다. 

결과적은 OR 1=1은 "OR trye"가 되기 때문에 앞의 내용이 뭐든 상관없이 결과는 true가 된다.

 

* or 연산에서는 한쪽의 값만 true라도 전체가 true가 된다.

 

 

따라서 

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

 

위의 query는 category=true가 되기 때문에 products table 안에 있는 모든 상품을 출력하게 되는 것이다.

 

 

:) category = 'Gifts' or 1=1--' and released = 1

:) category = 'Gifts' or 1=1

:) category = 'Gifts' or true

:) category = true

 

 


[ Summary ]

SQL Injection이란 ) 

보통은 조회할 수 없는 데이터를 조회하거나 데이터 베이스 안에 있는 데이터를 삭제, 조작하는 등

악의적인 목적의 sql을 주입하여 실행하는 공격

 

Retrieving hidden data )

Idea 1) 주석 처리하자! [comment]

DB에 따라 double dash -- OR # 문자로 주석 처리할 수 있다.

 

Idea 2) 항상 true인 조건문 활용 

1=1과 같이 항상 결과가 true인 조건문과 or 연산을 통해 원하는 내용을 전부 출력.

'Port Swigger > SQL Injection' 카테고리의 다른 글

SQLi (4)  (0) 2023.04.28
SQLi (3) - Lab  (0) 2023.04.28
SQLi (3)  (0) 2023.04.27
SQLi (2) & Lab  (0) 2023.04.27
SQLi (1) - Lab  (0) 2023.04.26
Comments