본문 바로가기
2. Information Security/3. War Game

웹해킹 7번 (webhacking old 7)

by H232C 2019. 10. 20.

1. 공격 유형 : Sql Injection

2. 취약점 환경 : 파라미터('val')의 값을 조작하여 Sql Injection 수행

3. Write Up

파라메터('Val') 값에 1이라는 Value가 자동으로 입력되어 있음

 

Hint : View_Source 화면

ㅇ 코드 해석

- $go 변수에 $_GET['val'] 파라미터 저장
- $go 변수에 2, -, +, from, _, =, \s, *, \ 등의 문자열 존재 시 Access Denied! 발생
- $db 변수에 dbconnet() 함수 선언
- $rand 변수에 rand 함수를 적용한 1~5의 랜덤 값 선언
- $rand 변수에 입력된 값에 따라 조건문 실행 
- if($rand==1~5) { $result = mysqli_query($db, "select lv from chall7 where lv=($go)") or die ("nice try!!");
- $data에 mysqli_fetch_array($result) 문으로 데이터 값 저장
- $data[0] == 1일 경우 Access_Denied! 출력
- $data[0] == 2일 경우 Hello admin 출력 후 Solve(7) 수행

ㅇ Solve 조건 : $data [0]이 2 값을 저장해야 Solve(7) 수행

ㅇ 공격 포인트

문자열을 필터링하는 함수인 preg_match를 사용하여 특정 문자열 사용 불가

- 사용불가 문자열 : 2, -, +, from, _, =, \s, *, \ 

 

ㅇ 공격 시도

- val 값에 2 삽입

But Access Dinied (숫자2 필터링)

- val 값에 8%3 삽입 (8/3의 나머지 값 = 2_필터링 우회)

But Qeury Error 발생 (이로서 2값이 DB에 존재하지 않는다는 것을 추측)

 

- 2가 DB에 존재하지 않는다면 강제로 2 값을 DB에서 출력하게 해야 함 (Union Select 수행)

where절 뒤 없는 데이터를 삽입하고 union문에 원하는 데이터 입력 시 해당 데이터를 출력하는 DB 쿼리를 확인할 수 있음

 

- 결국 val 파라메터 값에 DB 내에 존재하지 않는 값을 넣고 우리가 원하는 2가 되는 값을 union select 문제 삽입해야 함
- 소스코드를 보면 $go 값은 랜덤하게 ($go), (($go))... 등으로 씌워져있음
- 공격코드 "select lv from chall7 where lv=(0)union(select(8%3)" or die("nice try!");

공격코드 : 0)union(select(8%3)

 

버트수트를 이용하여 공격코드를 반복적으로 날림 (rand 경우의 수가 5이기 때문에 몇번 반복 공격 시 공격 성공 메세지 확인 가능)

 

댓글