[+] 개인적인 공부이니 틀린부분 지적 ㄳ
- SQL Injection은 사용자가 입력한 값을 서버에서 검증하지 않고, 입력한 값이 데이터베이스 쿼리 일부분으로 포함되
어DB의 민감데이터를 노출, 갈취, 인증을 우회시킬수있는 취약점이다.
- 만약 공격자가 악의적인 SQL문을 포함한 요청을 서버로 보냈을 때, 서버에서 입력값 검증을 거치지 않으면, 악의적인 SQL문이 데이터베이스에서 실행되어 그 결과를 공격자에게 전송해준다.
Low 레벨
1. 기본 페이지
- 영화 Title을 적으면 입력한 영화에 대한 정보를 출력해주는 폼을 가지고 있다.
2. ' 와 "를 사용한 데이터베이스의 처리 동작 확인
- 일반적으로 변수에서 변수값을 처리할때는 싱글쿼터( ' ), 아니면 더블쿼터( " ) 로 값을 감싸준다.
- ' 와 " 를 대입해보면 어느 쿼터를 사용하는지 알 수 있다.
- 더블쿼터( " ) 를 사용했을때의 사진이다. 영화 title의 " 에 대한 결과는 나오지 않는 것을 확인 할 수 있다.
- 내부적으로 select * from 테이블명 where title=' " ' 로 동작해서 title이 " 인 값이 없다고 나오는 것이다.
- 하지만, 싱글쿼터( ' )를 사용했을때는 화면에 알 수 없는 오류가 뜨고있다.
- 입력값 ' 를 대입했을때, 내부적으로 title=' ' ' 로 처리가되서 오류가 뜨는 것이다. 싱글쿼터가 닫혀있지않음.
- 즉, SQL Injection 이 가능하단 소리이다.
3. ' or 1=1 # 를 사용했을때의 동작 확인
- #는 Mysql에서의 주석문이다. # 뒤에 입력되는 값은 모두 무시하는 기능을 한다.
- ' or 1=1 는 SQL 쿼리에서 Where 절을 True 값을 만들어 모든 것을 출력하게 해준다.
EX) select * from 테이블명 where title=' ' or 1=1 #
- 즉, ' or 1=1 # 은 모든 것을 출력해주고, 그뒤에 나오는 모든값들을 무시한다는 뜻이 된다. 또한 오류가 뜨면 SQL Injection을 할 수 있는다는 의미이다.
4. Union Select의 이해
- SQL에서 Union은 두개의 쿼리문에 대한 결과를 하나의 테이블로 합쳐주는 역할을 한다
- Union은 첫 쿼리문 select문과 두번째 쿼리문 union select문의 컬럼 수가 같아야 하는 특징과 컬럼은 각 순서별로 동
일한 데이터형이어야 하는 특징을 갖고 있다.
- 테이블 testtable1는 4개의 컬럼을 가지고 있다.
- 첫 쿼리 select절의 컬럼수와 union select의 컬럼수가 일치하지 않으면 오류를 출력해준다.
- union select의 컬럼수를 반복적으로 증가시켜주면 컬럼의 수를 확인할 수 있다.
5. Union SQL Injection
"' union select 1,2,3,4,5 # 를 수행한 결과이지만, 컬럼의 수가 다르다고 오류가 뜬다. 하지만, union select문에서의 숫자를 한개씩 늘려가는 작업을 반복하면, 몇개의 컬럼이 존재하는지 알 수 있다.
"' union select 1,2,3,4,5,6,7 # 을 대입했더니, 오류가 출력되지 않고, 숫자가 출력되는 것을 볼 수 있고, 이 뜻은
2, 3, 4, 5 번째의 컬럼을 조회할 수 있고, 시스템변수와 함수를 수행할수 있다는 의미이다.
5-1. Union SQL Injection
아래는 "' union select 1,@@version,@@datadir,4,5,6,7 # 를 입력한 사진이다.
@@version은 DB서버의 버전을 출력해주는 것이고, @@datadir은 DB서버가 존재하는 디렉터리를 출력해준다.
5-2. Union SQL Injection
또한, Union select를 이용하여 다른 데이터베이스의 내용도 가져올 수 있다.
"' union select 1,name,3,4,5,6,7 from testdb.testtable1 # 를 입력하여 2번째 testdb데이터베이스의 testtable1테이블에서 name들만 출력 할 수 있다.
testdb 데이터베이스에서 testtable1 테이블의 name과 일치하는 것을 확인 가능하다.
5-3. Union SQL Injection
또한 "' union select 1,concat(no,name),3,pass,id,6,7 from testdb.testtable1 # 를 입력하여 여러 컬럼를 하나의 컬럼에 붙여서 출력도 가능하다. concat() 은 문자열을 붙여주는 함수이다.
6. Low레벨 대응방안 보기
- functions.external의 no_check함수를 적용하고 있음.
- no_check함수는 아무런 대응을 하지않는 것을 확인.
High레벨
1. Union SQL Injection
- SQL 에러 메시지가 출력되지 않게 대응하고, 입력값 검증을 하고 있음. 취약점 X
2. High레벨 대응방안 보기
- functions_external.php 의 sqli_check_2 함수를 사용
- mysql_real_escap_string 함수로 입력값을 검증하고 있음.
mysql_real_escape_string() 함수는 \x00, \n, \r, \, ', ", \x1a 와 같은 문자 앞에 백슬래시(\)를 붙여서 해당 문자가 작동하지 않도록 이스케이프 시켜주는 함수이다.
- 추가적으로 Medium레벨에서는 addslashes를 써서 입력값 검증을 하고 있다.
addslashes 함수는 자열 안에 싱글쿼터(') 혹은 더블쿼터("), 백슬래시(\), NULL 바이트가 포함되어 있다면 해당 문자 앞에 백슬래시(\)를 추가해 실행되지 않도록 하는 함수이다.
- Medium레벨과 High레벨 둘다 특수문자가 실행되지 않게 처리해줘서 대응을 한다고 보면 된다.
'WebHacking > bWAPP' 카테고리의 다른 글
[bWAPP] SQL Injection (POST/Search) (0) | 2021.10.15 |
---|---|
[bWAPP] SQL Injection (GET/Select) (0) | 2021.10.15 |
[bWAPP] Server-Side Includes (SSI) Injection (0) | 2021.10.15 |
[bWAPP] PHP Code Injection (1) | 2021.10.15 |
[bWAPP] OS Command Injection (0) | 2021.10.15 |