23.04.04 ECOPS 정규세션 Week4 SQL Injection
Dreamhack Simple_sqli
알고 있는 정보: id=admin
ID를 알고 있으므로 실습에서 했던 id를 아는 경우의 inline query 와 유사하다고 보았다.
따라서 id에 admin" or "1"="1 을 입력하고, pw에는 임의의 값을 기입하여 문제를 해결할 수 있다.
Lord of SQL
해당 문제는 Query를 보내기 위해 url의 뒷부분에 ?를 붙이고 id와 pw 값을 덧붙이는 형식으로 작성해야 했다.
#1 gremlin
참값으로 만들기 위해 작성해야한다. 우선 ID와 패스워드를 모두 모르고 있으므로 해당 값에 임의의 값을 넣어주고, or 뒤에서 '1'='1 로 항상 참인 값을 만들어준다.
#2 cobolt
id: 모름
특이점: pw=md5()
md5 --> 값을 알아내기 어렵기 때문에 해당 부분을 주석 처리해주어야 한다.
이때, #을 url에 바로 사용할 수 없고 이를 변환하여 %23 으로 인코딩하면 사용할 수 있다.
따라서 ?id=admin'%23 과같이 작성하여 해결할 수 있다
#3 goblin
이 부분은 어려워서 인터넷 검색에 많이 의존했다.
admin이라는 문자를 16진수로 바꾸어 우회하는 스트링 우회법을 통해 해결할 수 있다고 한다.
참고) https://ar9ang3.tistory.com/7
웹해킹 SQLI 우회기법 정리 - Webhacking SQL Injection Bypass Honey Tips
지금까지 웹해킹 워게임을 풀면서 깨달은(?) 우회기법을 정리하려 합니다.모두 수기로 기억나는대로 작성하다보니 빠진 부분도 있을 것 같습니다.기억나는대로 추가해서 수정하겠습니다. - or, a
ar9ang3.tistory.com
또한 no=no 를 no가 아닌 다른 숫자로 바꾸어주고, admin을 16진수로 바꾼 값을 함께 넣어주면 해결할 수 있다.
정규 세션 정리
인증 우회 공격
SELECT*FROM member where id = '사용자 입력값1' and pw='사용자 입력값2'
and 연산에 따라 두 값이 모두 참값을 반환하면 로그인
Terminating Query : 주석 처리를 통해 뒷부분 무력화
ID = ' or 1=1 -- 입력 시 조작된 입력값때문에 주석 처리되어 참값으로 취급됨
False or True --(주석처리) >> 무력화됨
In-line Query
ID = ' or 1=1 or '1'='
False or True or False and False // and 연산자와 or 연산자가 함께 있으면 and 연산자 먼저 처리됨
뒷부분에서 추가적인 함수가 호출되는 등 다양한 변수가 있으므로 공격자/수비자 모두 두 방식을 잘 알아야 함
SQL Injection 실습
아이디를 알고있는 경우 - Inline Query
ID= admin' or '1'='1
PW= (아무값이나 입력)
SELECT*FROM member where id='admin' or '1'='1' and pw='(사용자 입력값)'
아이디를 알고 있는 경우 - Terminating Query
ID = admin'#
cf. 언어별 주석 문자
MYSQL: #, -- (양 옆에 공백을 주어야 함)
Oracle & MSSQL: (공백)--(공백)
아이디를 모르는 경우 - Inline Query
ID = '(사용자 입력값)' or 1=1 or '1'='1
아이디를 모르는 경우 -Terminating Query
ID = ' or 1=1 --
데이터 조회 공격
- SQL Injection 가장 많이 시행되는 공격
- 공격에서 얻은 데이터를 판매하거나 타 사이트에 접근하는 데 사용될 수 있음
Out-of-band
- 대역 외 공격 기법
USER - Was - DB(Query info)
band, 순차적인 흐름을 따르는 공격: 대역 내 공격기법
대역 외에서 DB가 직접 사용자에 다른 정보를 전달하게 함(Was 거치지 않고)
대역 내 공격기법
Error-Based: DBMS의 에러를 통해 공격자가 의도하는 데이터를 조회
- DB의 에러가 노출되어 있어야 함
오류가 있는 SQL 쿼리문을 DB에 요청하면 DB에서 사용자에게 리턴하는 오류 구문을 통해 공격에 필요한 정보를 얻는 방식
Union-Based: Union 연산자를 통해 두 절이 합쳐짐
- 앞의 절은 False로, 뒷부분을 True가 되도록 절을 조작해주면 공격자가 의도한 Table 출력
Blind-Based: 데이터 추론 기법을 통해 데이터 획득
- DBMS 에러 발생하지 않는 환경에서도 공격 가능 / 반면 속도가 느린 단점이 있다
substring() : 특정 위치의 특정 사이즈만큼의 값을 반환해주는 함수
1. 순차 탐색: string 전체를 모두 물어보는 탐색
2. 이진 탐색: 아스키 코드 이진 탐색
ascii(substring(system_user(),1,1)) > 80
3. 비트 탐색: 아스키 코드 비트 탐색
ascii(substring(system_user(),1,1))&1 = 1
ascii 코드의 최댓값이 126이기 때문에 64까지, 즉 총 7번만 질의하면 코드값 알 수 있음
웹해킹
Brute Force / CSRF / SQL Injection / Command Injection / File Inclusion(LFI/RFI) / File upload / CAPTCHA Attack / XSS
CSRF: 사용자 간 요청 위조
- 피싱 링크를 통해 사용자들이 사이트에 탑재된 특정 기능을 실행하게 함 (옥션해킹사건(2008))
XSS 와의 공통점: 사용자의 브라우저를 대상으로 한다는 점에서 유사
XSS는 특정 사이트를 신뢰한다는 사실을 이용, CSRF 는 서버 내에서 실행하며 웹 애플리케이션이 인증된 사용자의 요청을 신뢰
CSRF Token: 임의의 난수를 생성하고 세션에 저장하여 사용자의 요마다 해당 난수값을 포함에서 전송