Start를 누르게 되면 아레와 같이 뜬다.
get source를 보게되면 아래와 같은 소스코드들이 나온다.
나오는 코드는 PHP 코드와 CSS 코드 2개가 나온다.
CSS는 디자인 하는 코드부분이기 때문에
PHP 코드를 한번 보겠다.
우선
isset() 함수는 ()안의 변수가 설정되어있는지 확인하고
설정되어 있으면 TRUE, 아니면 FALSE를 반환한다.
$_GET[]은 값을 입력받는 함수이다.
따라서 이 부분은 view-source라는 변수를 입력받으면 현재 페이지의 소스코드를 보여주고
종료하라는 의미로 해석될 수 있다.
다음으로
$_POST[]도 값을 입력받는 함수이다.
< $_GET과 $_POST의 차이 >
속도는 $_GET이 빠르지만 보안상으로는 $_POST가 더 안전하다.
이 부분은 id 와 ps부분에 파라미터( 입력 값 )가 있으면 lib.pyp를 함수에 포함시키는 부분이다.
이 부분은 데이터 베이스와 연결하기 위해 사용된다.
$key와 같이 $가 붙은 것들은 변수를 의미한다.
이 부분은 $_POST로 전송한 id와 ps를 escape 한 후 각각 $id와 $ps에 넣고,
$row 변수에 명령문을 실행한 결과를 넣는다.
mysql_real_escape_string() 함수는 특수문자 앞에 역 슬래시를 추가하여 SQL Injection을 막는 함수이다.
< SQL Injection >
웹 보안에서 가장 대중적으로 언급되는 공격 기법
웹 애플리케이션이 데이터 베이스와 연동하는 모델에서 발생 가능하다.
이용자의 입력값이 SQL 구문의 일부로 사용될 경우, 해커에 의해 조작된 SQL 구문이 데이터 베이스에
그대로 전달되어 비정상적인 DB 명령을 실행시키는 공격 기법이다.
mysql_query()함수는 PHP에서 데이터 베이스에게 SQL 명령어를 실행시키가 위한 함수이다.
mysql_fetch_array()함수는 결과를 연관배열로 가져오는 함수이다.
이 부분이 가장 중요한 부분인데
$row에 id 값이 존재할 경우 빨간색 네모 박스를 실행하고
아닐 경우 파란색 네모박스를 실행한다.
또한 $id 값이 guest와 blueh4g라면 "your account is blocked"라는 문장을 출력하고
아닐경우 $key 값을 출력하게 되어있다.
이 주석처리 되어있는 부분이 id와 ps를 알려준다.
그러나 두개 다 입력하면 다음과 같은 결과를 얻게된다.
때문에 이 문제를 풀수 없게 된다.
하지만 PHP 코드를 다시 보게 되면 이 문제는 PHP에서 MYSQL을 이용하여 id와 ps를 확인하는 시스템으로 되어있다.
따라서 대소문자를 구분하는 PHP와는 달리 대소문자를 구분하지 않는 MYSQL의 특징을 이용하면 되는 문제였다.
즉 PHP는 GUEST와 guest를 다르게 구분하지만
MYSQL은 GUEST와 guest를 같게 본다는 뜻이다.
위 사진처럼 id부분을 대문자로 바꾸고
ps부분을 id부분에 맞는 ps로 입력해주면 FLAG 값이 나온다.
'코딩 문제 > Wargame' 카테고리의 다른 글
wargame.kr : Fly me to the moon (0) | 2019.08.29 |
---|---|
wargame.kr : WTF_CODE (0) | 2019.08.22 |
wargame.kr : QR CODE PUZZLE (0) | 2019.08.21 |
wargame.kr : flee button (0) | 2019.08.20 |
wargame.kr : already got (0) | 2019.08.20 |