워게임을 하면서 유용했던 팁들을 적어두는 글
SQL Injection은 사용자의 입력을 허락할 때 db의 중요 정보를 탈취하거나
로그인을 우회해 관리자의 권한으로 여러가지 조작이 가능한 공격이다.
SQLI는 기본적으로 참과 거짓의 문제이다.
조건을 참으로 만들어줘야 한다.
방법은 여러 가지가 있는데
예를 들어 user 라는 테이블이 아래와 같다고 하자
id | name | pw |
1 | admin | aaaaaaaaa |
2 | guest | gggggggg |
select name from user where id = [사용자 입력 값] and pw = [사용자 입력 값];
위 같은 문장이 주어지고 admin으로 로그인 하고자 할 때
id,pw을 알면 적어주면 되지만 모르는 경우엔 아래와 같이 해줄 수 있다.
id 입력 란에 'admin' and pw = 'a' or 1=1# 을 입력해주고 pw입력 란에 아무 문자를 넣어준 뒤 전송한다.
or 1=1 때문에 무조건 참이 되서 로그인이 가능해지는 원리이다.
if가 필터링 된다면 case when else end를 사용할 수 있다.
아니면 or, | 연산자나 cot() 함수를 사용해보자.
https://blog.ssrf.kr/40
쿼리문의 에러를 도출해준다면 error based sql injection이 가능하다.
주로 에러를 일으키는 값인 9e307*2을 활용한다.
에러를 출력해주지 않는 경우 time based sql injection을 사용하는 경우도 있다.
sleep() 함수를 주로 사용한다.
select가 필터링되는 문제를 만날 때가 있다.
내장 프로시저 중 analyze() 함수를 사용하면 유용하다.
https://blog.ch4n3.kr/109
블라인드 sql을 할 때 결과를 하나씩 보여줄 때가 있다.
이 때 group_concat(column_name)을 사용하면 한 줄에 볼 수 있다.
information_schema에선 테이블 이름, 컬럼 이름, 현재 실행되고 있는 쿼리 등 다양한 정보를 얻을 수 있다.
information_schema.tables : 테이블명
information_schema.columns : 컬럼명
information_schema.processlist : 실행되고 있는 쿼리
https://qkqhxla1.tistory.com/107
db에 insert 할 때 칼럼의 길이를 초과하면 길이만큼 잘려서 들어간다.
예를 들어 32자까지 입력이 가능한 컬럼이 있을 때 33자를 입력하게 되면 33번째 문자는 잘리고 32자가 들어가게 된다.
이는 admin 계정의 중복 가입이 가능하게 된다.
(입력 값의 대한 길이 검증이 없을 때 가능한 공격)
(추가로 작성 예정)
'background > web' 카테고리의 다른 글
Spring View Manipulation (Thymeleaf SSTI) (0) | 2023.08.07 |
---|---|
Command Injection for PHP (0) | 2022.11.28 |
Command Injection for Linux (2) (1) | 2022.11.27 |
Command Injection for Linux (1) (0) | 2022.11.26 |
[NoSQL] Redis DBMS (0) | 2022.11.24 |