Wargame/webhacking.kr (old)

[Webhacking.kr] 18번 풀이

Grini 2019. 4. 19. 23:11


SQL Injection 문제이다.

SQL Injection이 무엇인지 알아보자.


SQL Injection이란?

DB로 전달되는 값에 정상적인 값 대신

SQL 쿼리문을 삽입해 DB 상에서 의도치 않은 결과 값이 나오도록 하는 공격 기법


index.phps 를 클릭하면 php 소스를 볼 수 있다.



소스 코드를 보니 몇몇 문자열이 필터링 되어 있고,

쿼리문에 no로 입력해준 값을 바로 삽입하여 취약점이 발생하게끔 소스가 짜여져 있다.

해당 쿼리문에 대한 결과 값이 admin이면 문제가 풀린다.


- eregi("찾고자 하는 문자", "임의의 값") : 대소문자 구분x

- ereg("찾고자 하는 문자", "임의의 값") : 대소문자 구분o


eregi 함수를 이용하여 space, /, (, ), tab, |, &, union, select, from, 0x

대소문자에 관계없이 필터링되어 있다.


우선, guest의 no 값을 알아보기 위해 0부터 차례대로 숫자를 입력해보았다.



1을 입력하니 hi guest가 페이지에 출력되었다.

guest의 no 값은 1이다.


select id from challenge18_table where id='guest' and no=$_GET[no]의 결과 값이 admin이 되는 방법은

두 가지를 생각해볼 수 있다.


1. id='guest' and no='1이 아닌 수' or id='admin'

2. id='guest' and no ='1이 아닌 수' or no='admin의 no 값'


[id='guest' and no=숫자]의 조건을 false를 만들어주어야 or의 뒷부분의 조건을

판별하기 때문에 no의 값에 guest의 no인 1이외의 수를 넣어주어야 한다.

(연산자 우선순위 and > or)


or을 사용하기 위해서는 공백이 필터링되어 있기 때문에 우회해야한다.


space 필터링 우회 방법

/**/, (), +, %0a, %0b, %0c, %0d, %09, %20 등


space 필터링 우회를 위해 %0a를 사용하여 아래와 같이 SQL Injection을 시도하였다.


?no=0%0aor%0aid='admin'



문제가 풀려야하는데,,,,,

문제가 풀리지 않는다.

php의 magic_quotes_gpc가 켜져 있어 '가 필터링되는 것 같다.ㅜㅜㅜㅜㅜㅜ


magic_quotes_gpc 옵션이란?

php.ini에 작성되어 있는 설정 값으로, 모든 GET, POST, COOKIE 데이터에 addslashes() 처리


addslashes()

DB쿼리에 처리되는 문자 앞에 \(백슬래쉬)를 붙인 문자열을 반환하는 함수로 ' '' \ NULL에 적용


문자열을 작은따옴표 없이 전송하는 방법으로는

이진수, 16진수, char 함수 사용등이 있으나,

괄호, 0x의 필터링으로 인해 16진수와 char함수는 사용할 수 없다.ㅠㅠㅠ


따라서, 이진수를 사용해 admin을 입력하자.

admin : 01100001 01100100 01101101 01101001 01101110

(이진수는 앞에 0b를 붙인다.)


?no=0%0aor%0aid=0b0110000101100100011011010110100101101110



두 번째 방법도 되는지 확인해보기 위해 admin의 no값을 찾아 차례대로 숫자들을 입력해보았다.

admin의 no 값으로 한 10까지만 해볼려고 했으나,,

2를 입력하니 문제가 풀렸다:)


admin의 no 값은 2이다.