문제를 보면 id가 admin 이어야 한다.
preg_match() 함수를 보면 전 문제들과는 다르게 '(싱글쿼터)와 "(더블쿼터)가 필터링 되어있음을 볼 수 있다.
이는 문자열을 사용할 수 없음을 의미한다.
따라서 hex값으로 admin을 id에 넣으면 문제를 해결할 수 있다.
query : ?no=0 or id=0x61646d696e
문제를 보면 id가 admin 이어야 한다.
preg_match() 함수를 보면 전 문제들과는 다르게 '(싱글쿼터)와 "(더블쿼터)가 필터링 되어있음을 볼 수 있다.
이는 문자열을 사용할 수 없음을 의미한다.
따라서 hex값으로 admin을 id에 넣으면 문제를 해결할 수 있다.
query : ?no=0 or id=0x61646d696e
문제 코드를 보면 전 문제와 마찬가지로 preg_match() 함수를 이용하여 특정 문자열들을 필터링하고 있고
id가 admin일때 문제가 풀린다고 한다.
id에 admin 값을 넣고 pw를 검증하는 부분을 주석으로 없애면 문제를 해결할 수 있다.
#을 url 인코딩한 %23을 주석으로 사용할 수 있다.
query : ?id=admin'%23
[LoS] goblin (0) | 2020.11.03 |
---|---|
[LoS] orc (0) | 2019.11.29 |
[LoS] gremlin (0) | 2019.11.26 |
[Wargame.kr] type confusion (0) | 2019.09.10 |
[Wargame.kr] tmitter (0) | 2019.09.07 |
문제 코드를 보면 id 값이 있으면 문제가 풀린다.
또한 preg_match() 함수를 이용하여 _ , . 등의 문자등을 필터링 하고 있다.
필터링 하는 문자열에는 '(싱글쿼터)와 #(주석), or 등이 없다.
따라서 id 값에 or 연산으로 조건을 참으로 만들어 주면 문제가 해결된다.
query : ?id=admin' or '1'='1#
[LoS] orc (0) | 2019.11.29 |
---|---|
[LoS] cobolt (0) | 2019.11.26 |
[Wargame.kr] type confusion (0) | 2019.09.10 |
[Wargame.kr] tmitter (0) | 2019.09.07 |
[Wargame.kr] md5_compare (0) | 2019.09.03 |
JSON(JavaScript Object Notation)
json은 "속성 - 값" 또는 "키 - 값" 쌍으로 이루어진 데이터 오브젝트를 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. AJAX, XML 등을 대체하며 .json 확장자를 가진다.
JSON 기본 자료형
자료형으로는 number, string, boolean, array, object, null 이 있다. 다음은 이 자료형 들의 특징이다.
number : 8진수, 16진수, 표현 방법은 지원하지 않는다.
string : 항상 큰따옴표(")로 묶어야 하고, 역슬래시(\)는 제어 문자를 표현한다.
array : 대괄호[]로 나타내며, 각 요소들은 (,)로 구분한다. 요소간의 순서에 의미가 있다.
object : 순서가 없는 "이름-값" 쌍의 집합으로 이름은 항상 string 자료형이다. 중괄호{}를 사용한다.
JSON 객체 예시 ( 키-값 패턴으로 표기)
{
"이름": "phulasso",
"나이": 18,
"성별": "남",
"주소": "경기도 수원시",
}
JSON 장점
문제 설명을 보면 간단한 비교 문제이고, 힌트는 이 문제의 제목이라고 한다.
문제 페이지를 보면 입력창만 하나가 있다.
소스코드를 보면 post 방식으로 입력받고 있는데,
json_decode() 함수로 입력 받은 값을 json 값으로 바꿔준다.
key 값이 true면 flag를 출력하는 것 같다.
post 방식으로 입력받기 때문에 프록시 툴을 이용해서 입력 값을 가로채주면 다음과 같은 값이 나온다.
이 값은 url 인코딩 된 값이기 때문에 decode 해주면 다음과 같이 {"key":"123"} 의 값이 나온다.
저 값에서 123을 true로 바꾼후 값을 전달해 주면 flag를 얻을 수 있다.
true는 문자열이 아닌 boolean형 자료형이기때문에 "값인 %22도 함께 삭제해야 한다.
알게된 점 : json 관련 취약점, php json_decode() 함수
[LoS] cobolt (0) | 2019.11.26 |
---|---|
[LoS] gremlin (0) | 2019.11.26 |
[Wargame.kr] tmitter (0) | 2019.09.07 |
[Wargame.kr] md5_compare (0) | 2019.09.03 |
[Wargame.kr] strcmp (0) | 2019.09.02 |
문제 설명을 보면 admin으로 로그인 해야 하는 것 같다.
또한 id와 ps는 char()자료형으로 32자를 고정 길이로 담을 수 있다.
문제 페이지를 보면 로그인과, 회원가입을 할 수 있는데 admin으로 로그인은 당연히 안된다.
id와 ps 변수를 보면 char 자료형으로 되어 있는데 char은 고정 길이 자료형이고, 현재 32자로 고정되어 있는데, 입력된 값 외에 남은 값들은 공백 문자로 인식하고, 32자를 넘어가는 문자를 입력하면 32자 까지만 인식된다.
ex) admin 입력시 : 'admin'의 5자를 제외한 나머지 27자는 공백 문자로 인식
회원가입 하는 곳에 가서 소스 코드를 보면 id 최대 길이가 32자로 되어 있는데 33자로 수정해 준다.
소스 코드를 수정한 후 id에 'admin + 공백 27자 + 1' 을 입력한다. 이렇게 되면 33번째 문자인 1은 인식되지 않는다.
ps에는 7자 이상의 값을 넣고 계정을 만들면 성공적으로 계정이 만들어 진다.
id:admin, ps:7자 이상 만든 값 으로 로그인 하면 admin으로 로그인 할 수 있고, flag를 얻을 수 있다.
알게 된 점 : char자료형은 고정길이 자료형이고, 남은 자리는 공백으로 인식, 고정길이 넘어가면 삭제
varchar 자료형은 가변길이, 위 취약점을 막으려면 varchar 사용
[LoS] gremlin (0) | 2019.11.26 |
---|---|
[Wargame.kr] type confusion (0) | 2019.09.10 |
[Wargame.kr] md5_compare (0) | 2019.09.03 |
[Wargame.kr] strcmp (0) | 2019.09.02 |
[Wargame.kr] DB is really GOOD (0) | 2019.09.02 |
문제 설명을 보면 비교를 하는데 다른 값으로 해야 한다는 것 같다.
문제 페이지를 보면 두 개의 값을 입력받는다.
소스 코드를 확인해 보면 v1과 v2의 md5 값이 같으면 문제를 해결할 수 있는데
ctype_alpha() 함수로 v1이 알파벳인지 검사하고, is_numeric() 함수로 v2가 숫자인지 검사한다.
php md5 비교에서 두 md5 해시값의 앞부분이 0e로 같은 값을 가지면 참을 반환하는 취약점이 있다.
이러한 값을 가지는 알파벳과 숫자는 QQNKCDZO 와 240610708 가 있다.
이러한 취약점을 막기 위해서는 === 연산자를 사용하는 방법이 있다.
알파벳 값을 v1(첫번째)에 넣고 숫자 값을 v2(두번째)에 넣으면 flag를 얻을 수 있다.
알게된 점 : php md5함수에서 비교 취약점과 보안방안, php ctype_alpha()함수, is_numeric() 함수
[Wargame.kr] type confusion (0) | 2019.09.10 |
---|---|
[Wargame.kr] tmitter (0) | 2019.09.07 |
[Wargame.kr] strcmp (0) | 2019.09.02 |
[Wargame.kr] DB is really GOOD (0) | 2019.09.02 |
[Wargame.kr] md5 password (0) | 2019.08.29 |
문제 설명을 읽어보면 strcmp 함수를 우회할 수 있다면 플래그를 얻을수 잇다고 한다.
문제 페이지에 들어가 보면 password 를 입력할 수 있는 창이 있다.
소스코드를 보면 다음과 같이 strcmp 함수를 이용하여 password 값을 확인하고 있다.
strcmp 함수는 strstrcmp($a,$b)를 실행할 때 a가 작으면 음수, a가 크면 양수, a와 b가 같으면 0을 반환하는데,
0이 반환되면 암호 비교 구문이 우회되고 배열을 인자로 가지면 무조건 0을 반환하는 취약점이 있다.
따라서 password변수를 배열로 지정해 주면 해당 비교문을 우회할 수 있다.
위와 같이 문제 페이지에서 input password를 배열로 바꿔준 후 값을 입력하면 플래그를 얻을 수 있다.
알게된 점: strcmp 함수 취약점
[Wargame.kr] tmitter (0) | 2019.09.07 |
---|---|
[Wargame.kr] md5_compare (0) | 2019.09.03 |
[Wargame.kr] DB is really GOOD (0) | 2019.09.02 |
[Wargame.kr] md5 password (0) | 2019.08.29 |
[Wargame.kr] fly me to the moon (0) | 2019.08.27 |
결과 값 :
2차원 리스트 행렬 변환 (0) | 2021.07.02 |
---|---|
반복문(for) (0) | 2019.03.07 |
반복문(while) (0) | 2019.02.09 |
조건문(if) (0) | 2019.02.08 |
입력 함수(input) (0) | 2019.02.08 |
문제 설명을 보면 사용자명과 데이터베이스의 연관성을 찾아야 한다고 한다.
문제 페이지에 들어가 보면 사용자를 입력할 수 있는 로그인 창이 있다.
저기에 어떤 값을 입력하고 로그인하면 입력한 값을 사용자명으로 하는 메모창이 있다.
다시 처음 페이지로 돌아와 관리자 계정으로 예측되는 admin을 입력하면 경고창이 뜬다.
USER 입력창에 여러 특수 기호를 입력해 보던 중 / 를 넣었을 때 에러가 발생 했다.
에러 내용을 보면 ./db/wkrm_사용자명.db의 이름으로 db파일이 존재하는 것 같다.
URL에 다음과 같이 입력하였더니 wkrm_admin.db라는 db파일을 다운로드 할 수 있었다.
이 파일을 메모장으로 열어보면 하단에 플래그 위치의 경로를 알려준다
해당 경로로 들어가면 플래그를 얻을 수 있다.
[Wargame.kr] md5_compare (0) | 2019.09.03 |
---|---|
[Wargame.kr] strcmp (0) | 2019.09.02 |
[Wargame.kr] md5 password (0) | 2019.08.29 |
[Wargame.kr] fly me to the moon (0) | 2019.08.27 |
[Wargame.kr] WTF_CODE (0) | 2019.08.27 |