일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- php 파일 업로드하기
- Cryptography
- Reconnaissance
- War Game
- Cookie
- access control
- OS Command Injection
- Authentication
- SQLi
- 파일 업로드 취약점
- overthewire
- Recon
- php file upload
- FTZ
- Server Side Request Forgery
- php To Do List
- THM
- over the wire
- php login page
- sql injection
- file upload
- php
- active reconnaissance
- privilege escalation
- BANDiT
- Leviathan
- php 로그인 페이지 만들기
- active recon
- tryhackme
- ssrf
- Today
- Total
R's Hacking Daily Log
SQLi (1) 본문
SQL Injection
줄여서 SQLi라고 불리는 SQL injection은 쉽게 말해 SQL을 주입함으로써 실행되는 공격이다.
* SQL = Data Base(DB) 생성, 조회, 삭제, 수정 등 DB를 다룰 때 사용하는 language로
Structured Query Language의 약자이다.
그래서 보통 "query"라는 단어가 나오면 DB와 관련된 내용이라 생각하면 된다.
사용자가 서버에 요청을 보내면 서버는 필요에 따라 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 |