본문 바로가기
category/웹해킹(webhacking.kr)

웹해킹(webhacking.kr) - 45번

by 자운대고라니 2020. 11. 20.
반응형

안녕하세요??

자운대 고라니입니다.

오늘은 wargame.kr old-45번 문제를 풀어보겠습니다.


첫 화면부터 SQL INJECTION을 죠지라는 문제 같다.

일단 id : admin, pw : admin으로 로그인을 시도해보았다.

위쪽을 보면 url주소에 id와 pw 값이 나와있는 게 보인다.

GET방식으로 서버와 통신한다는 것을 알 수 있다.

그렇다면 view-source를 활용하여 소스코드를 확인하자

소스코드 중 중요한 부분만 캡처하였다.

코드 중 함수를 간단하게 설명하겠다.


1. addslashes

입력 값 중 '(quote)가 있으면 앞에 \를 붙여줌으로써 sql injection을 방어하기 위해서 사용된다.

ex)

input data : admin' or 1=1#'

output data : admin\' or 1=1#\' (인젝션문 무효화 '앞에 \가 붙으면 '도 문자열 중 하나로 포함된다.)

 

2.mb_covert_encoding

encode형식을 바꾸는 함수이다.

이 문제에서 핵심 함수이다.

 

3.preg_match

문자열 안에 특정 문자열이 있는지 확인하는 함수이다.

ex)

$a = "admin, guest"

if(preg_match("\admin\/i", $a)) exit(); ($a에 admin이라는 문자열이 들어갔으므로 exit()함수가 실행된다.

 


위의 3가지 함수를 잘 생각하면서 문제를 풀어나가면 된다.

일단 우리가 얻고자 하는 쿼리문을 생각해야 한다.

 

select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')

 

솔직히 나는 pw가 md5암호화 된 값을 쿼리문으로 사용하기 때문에

sql injection문이 들어있는 특정 md5암호화 값을 찾아서 넣으려고 했으나, md5가 16자리 바이너리가 아닌 32자리 문자열로 문자로만 표현되기 때문에 불가능하다는 것을 알았다.

 

그래서 pw를 건들긴 힘들듯 하고 id를 건드려야 한다.

id에 일단 알맞은 sql injection문을 넣어본다.

 

select id from chall45 where id=''||'admin'#'' and pw ~~~

 

나는 '||admin#'을 넣으면 될 거라고 생각하였다. 이 외에도 여러 가지가 있겠지만 생략하겠다.

그렇다면 이 쿼리문을 요리조리 필터링을 잘 피해서 넣어보자.


 

1. addslashes, mb_convert_encoding우회

addslashes로 인해서 quote가 앞에 \가 붙는다. ex) ' -> \' 그런데 mb_convert_encoding을 하는 과정에서

magic_quotes_gpc 옵션이 발생하여서 \앞에 %a1 ~ %fe 중 하나의 하나라도 붙는다면 [%a1~%fe]\는

하나의 문자가 되버린다.

그러므로 나는 '앞에 %bf라는 값을 넣어줬다.

 

2. pregmatch우회

admin을 필터링하였지만 우리에겐 HEX, BIN, ASCII 등의 우회 방법이 존재한다.

나는 HEX로 우회할 것이다.

'admin'을 HEX로 표현하면 0x61646D696E 이다.

 

= -> like

'admin' ->0x61646D696E

 


이 외의 나머지는 필터링할 것도 없다.

 

GET방식으로 통신을 하니 당연히 url주소에 파라미터를 넘겨주는 방법을 선택하였다.

내가 넣을 id의 값은 아래에 있다.

 

(처음 원했던 쿼리문)'||'admin'#' -> (수정된 쿼리문)%bf%27%7C%7Cid+like+0x61646D696E%23%bf%27

 

이게 뭔지 이해가 잘 되지 않는다면 url encoding에 대해 먼저 공부하는 것을 추천한다.

쨌든 위의 값을 그대로 복사해서 url에 붙여봤다.

그랬더니

정답이 나왔다.

처음 푸는 사람이라면 score가 올라갈 것이다.


솔직히 500점 이상의 문제 중 쉬운 편이라고 생각한다.

addslashes, preg_match 우회 방법만 잘 알고 있었다면 손쉽게 풀 수 있는 문제이다.

하지만 난 꽤 오래 걸렸다.

왜냐면 난 밥이기 때문이다 호호호호홓^^

반응형

댓글