## prob51(web, 250pt)
[Main]
51번 문제는 간단한 sql injection문제인데, 입력한 문자열이 md5 해시 값으로 변한다는 특징이 있습니다. md5 sql injection은 유명하므로 검색하면 정말 많이 나옵니다. 우선 문제 페이지를 살펴보면 아래 [그림 1]과 같고 해당 페이지 내 source 링크를 클릭하면 php 소스코드가 아래 [그림 2]와 같이 나옵니다.
[그림 1] 문제 페이지
[그림 2] index.phps
우선 소스 코드를 보면 입력할 수 있는 벡터는 총 2개($_POST[id], $_POST[pw])입니다. 이 두 벡터 중 $_POST[id]부분에 sql injection을 성공시키기 위해서는 magic_quotes_gpc를 우회해야하는데, mb_convert_encoding()함수가 없어, 우회할 수 없습니다. 따라서 $_POST[pw]를 공략해야하는데, 이 파라미터에는 입력 값이 md5()함수를 통해 md5해시 값이 저장됩니다.
이는 md5 sql injection으로 유명한데 md5해시 값이 single quote(')와 "="의 값을 가지는 hash 값을 가지도록 만들면 됩니다. 즉 예를 들면 "select id from challenge_51_admin where id='admin' and pw='????'='???????'"과 같은 식으로 sql injection을 시키면 됩니다. 그러면 문제가 풀리는데 "'='"가 포함되는 md5 hash 값을 찾으려면 검색해도 되고 0부터 9999999까지 for문을 돌리면서 직접 php코드를 짜도됩니다.
[그림 3] Congratulations~!
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob45(550pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob26(100pt) (0) | 2018.02.21 |
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
## prob45(web, 550pt)
[Main]
45번 문제는 sql injection 문제라고 문제 페이지에 나와있었습니다. 우선 문제 페이지와 소스코드를 보면 아래 [그림 1], [그림 2]와 같습니다.
[그림 1] 문제 페이지
[그림 2] index.phps
우선 admin으로 로그인하기 위해 "select id from members where id='$_GET[id]' and pw=md5('$_GET[pw]')" 문에서 sql injection을 시켜 결과 값이 admin이 되도록 해야합니다. 각각의 GET방식의 변수에는 별도의 필터링이 걸려있는데, "select id from members where id='asdf' or id='admin'#' and pw=md5('asdf')"과 같은 식으로 injection을 하면 될 것이라고 생각했습니다.
하지만 $_GET[id]에는 admin이 필터링으로 걸려 있기 때문에 "select id from members where id='asdf' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 고쳐 우회할 수 있습니다. 하지만 한 가지 문제가 더 있습니다. php의 설정 중 magic_quotes_gpc가 on으로 되어 있으면 single_quote('), double_quote("), slash(/)가 입력되면 그 앞에 "\"(역슬래시)가 붙어 문자열로 인식시켜주는 sql injection 보호기법 입니다. 그런데 이 문제는 이 보호기법이 걸려있었습니다.
그래서 이를 우회할 수 있는 취약점이 php의 함수 중 mb_convert_encoding()이라는 함수에 있습니다. 이 함수는 문자열의 인코딩 방식을 변경하는 php 함수입니다. 취약점은 2바이트가 멀티바이트로 인식되어 일반적인 아스키로 표시할 수 없는 문자를 표시하도록 하는 곳에 있습니다. 예를 들면 "%aa\"가 하나의 문자로 인식되어 버리는 것입니다.
따라서 "select id from members where id='%aa' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 입력하면 "select id from members where id='%aa\' or id=0x61646d696e#' and pw=md5('asdf')"로 변하면서 "\"(백슬래시)때문에 single quote가 문자열로 인식되는것을 막을 수 있습니다. 이렇게 쿼리를 날리면 아래 [그림 3]과 같이 문제가 풀리게 됩니다.
[그림 3] Conratulations~!
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob51(250pt) (1) | 2018.02.21 |
---|---|
[webhacking.kr] prob26(100pt) (0) | 2018.02.21 |
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
## prob26(web, 100pt)
[Main]
26번 문제는 url encoding에 관한 문제였습니다. 우선 문제 페이지에 들어가면 index.phps라는 링크를 주어 php소스를 제공하고 있습니다. 문제 소스코드는 아래 [그림 1]과 같습니다.
[그림 1] index.phps
우선 소스코드를 분석해보면 정말 간단합니다. GET방식으로 id라는 파라미터에 값을 받고, eregi()함수로 "admin"이라는 문자열이 포함되면 "<p>no!"라는 문자열을 출력하고 종료합니다. 하지만 아래 if문을 보면 $_GET[id]가 admin이어야 문제가 풀리게 되는데, urldecode()함수를 거친 값이 "admin"값이 되면 됩니다. 따라서 "admin"이라는 값을 보내는 것이 아니라 "%61%64%6d%69%6e"라는 값을 보내야 합니다. 하지만, 브라우저의 주소창에서 "%"와 같은 예약어를 자동으로 해석해서 decode를 시켜주기 때문에 결국 "admin"이라는 값이 서버에 전송됩니다. 따라서 "%"도 url encode하여 서버에 보내야 최종적으로 서버에 "%61%64%6d%69%6e"라는 문자열이 전송되고, 이게 urldecode()함수를 통해 "admin"으로 변환되게 될 것입니다. 따라서 "%2561%2564%256d%2569%256e"이렇게 보내면 아래 [그림 2]와 같이 문제가 풀리게 됩니다.
[그림 2] Congratulations~!
참고로 url encoding에 관한 글은 아래 url에서 참조할 수 있습니다.
1) http://regularmotion.kr/url-encoding-url/
2) https://bluestarblogkr.blogspot.kr/2011/10/url-encoding.html
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob51(250pt) (1) | 2018.02.21 |
---|---|
[webhacking.kr] prob45(550pt) (0) | 2018.02.21 |
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |