Always-Try(정보보안 및 일상)

webhacking.kr - Challenge(old) - 18번 (SQL 인젝션) 본문

Pen Test

webhacking.kr - Challenge(old) - 18번 (SQL 인젝션)

Always-Try 2021. 3. 9. 23:41

#1. 18번

1-1. 문제

1-2. 풀이

대놓고 SQL INJECTION이라고 되어있다. 

일단 소스보기를 하자.

소소의 끝 쪽에 preg_match와 mysqli_fetch_array를 사용하여 작성된 부분이 있는데, 여기에 sql 쿼리문이 적나라하게 나와있다.

 * preg_match는 php에서 정규표현식을 이용하여 결과 값을 반환할 수 있는 함수이다.

  - 첫 번째 인수 : 정규식 표현 작성

  - 두 번째 인수 : 검색 대상 문자열

  - 세 번째 인수 : 배열 변수 반환. 패턴 매치에서 매칭된 값을 배열로 저장

  - 반환값 : 매칭에 성공하면 1, 실패하면 0이 반환

 *mysqli_fetch_array는 select 쿼리의 결과 값을 배열 형태로 입력해주는 함수이다.

 

그럼 selcet와 from을 포함한 일부 문자열은 입력 값으로 사용할 수 없다. 그리고 쿼리의 결과 값을 $result에 넣는데, $result에 id가 admin인 값을 넣으면 문제가 해결된다. 그리고 admin의 no는 2이다. 여기서 말하는 쿼리는 다음과 같다.

 

select id from chall18 where id='guest' and no=$_GET[no]

 

위 쿼리의 조건에는 id='guest'라고 되어 있는데, 이걸 무력화 시키고 where id='admin' 이라고 인식하게 하면 문제가 해결 된다. and, or의 특성을 이용하여 결과적으로 아래와 같은 형태의 쿼리가 실행되도록 해보자.

 

select id from chall18 where id='guest' and no='2' or no='2'

 

위 쿼리의 빨간 부분을 일력하면 no hack 이라고 필터링된다.

흠.. GET 방식이므로 URL 인코딩을 이용하여 입력해보도록 하자.

 

성공

 

 

Comments