-
[Webhacking.kr] 18번 풀이Wargame/webhacking.kr (old) 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이다.
'Wargame > webhacking.kr (old)' 카테고리의 다른 글
[Webhacking.kr] 21번 풀이 (0) 2019.04.19 [Webhacking.kr] 20번 풀이 (0) 2019.04.19 [Webhacking.kr] 17번 풀이 (0) 2019.04.19 [Webhacking.kr] 16번 풀이 (0) 2019.04.19 [Webhacking.kr] 15번 풀이 (0) 2019.04.19 댓글