Webhacking.kr

Prob40



웹케얄 40번 문제입니다. 500점짜리 문제라 고생을 많이 한 것 같습니다.

일단 문제에 접속하면 위와 같은 로그인 폼이 나옵니다. no, id, pw 값에 1, guest, guest가 자동으로 입력되어있습니다.



그대로 로그인을 해주면 "Success - guest" 라는 메시지를 출력해줍니다.



만약 이 값들 중 하나라도 틀리게 된다면



이와 같은 "Failure" 메시지를 뱉어냅니다.



계속된 삽질 가운데, no 부분이 integer로 값을 받는다는 것을 알아냈습니다. 그래서 &&을 이용하여 select문을 사용해봤더니



정상적으로 로그인이 됩니다.

이를 이용하여 admin이 담겨있는 row로 추정되는 no=2에 해당하는 값을 빼오기 위해 아래와 같이 입력해줍니다.



위 쿼리는 no가 2일때 1을, 아닐 때 0을 출력해주는데, no=2가 admin이라고 가정하고 사용한 쿼리입니다.



로그인을 하면 admin의 패스워드를 요구하는 웹페이지가 나타납니다.



이제 admin의 패스워드를 알아내야하는데, 간단하게 "pw like %"와 같은 쿼리를 이용하여 패스워드를 찾아내도록 합시다.



python으로 pw 값을 찾아내는 스크립트를 작성하였습니다.



찾아낸 admin의 pw 값은 LUCK_ADMIN입니다.



애초에 mysql에서 대/소문자 구분이 없기 때문에 대문자로만 찾아냈습니다. 하지만 LUCK_ADMIN을 입력했을 때 Wrong!을 뱉어내기에 소문자로 luck_admin을 입력해주었습니다.



짠!




References

- THX to Zairo!!(http://zairo.tistory.com)

'Wargame > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr old-02(500)  (0) 2019.09.22
Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11

Webhacking.kr

Prob53


53번 문제입니다. 들어가자마자 hello wolrd로 우릴 반겨줍니다.

index.phps가 될 것 같으니 한번 들어가보죠.




소스를 보니 sql injection인 것 같습니다. 예전에 풀다 포기했던것까지 포함하면 2일 넘게 삽질을 했었는데... 후

결론부터 말하자면 함수를 모르면 풀 수 없는 문제입니다.

table name을 찾는 것이 목표인데 select와 from, union 모두 필터링이 걸려있어 information_schema에서 table_name을 추출 해 올 수가 없습니다. 여기서는 procedure analyse() 함수를 이용해서 table_name을 가져 올 수 있습니다.



소스에서 확인 한 대로 val 변수에 1을 집어넣어봅시다. test라는 값이 나오네요.



여기에 위에서 언급한 procedure analyse() 함수를 사용하면 db.table_name.value의 포맷으로 값이 나옵니다.

여기서는 db_name이 oldzombie, table_name이 Chal12NGe_53_TabLE_zz가 되겠습니다.


짠!




References

- THX to Zairo(http://zairo.tistory.com)

http://hyunmini.tistory.com/46

'Wargame > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11
Webhacking.kr prob59  (0) 2016.05.11

Webhacking.kr

Prob48



웹케얄 48번 문제입니다. 350점짜리 문제인데 풀고 나니 생각보다 쉬운 것 같습니다.

문제를 접속하면 위와 같은 화면이 나오는데, 파일 업로드를 할 수 있는 메모장을 구현 해 놓았습니다.

소스를 한번 확인 해 보겠습니다.



사실 처음 접근한 방법은 파일 업로드 취약점 또는 다운로드 취약점으로 생각하고 업로드 위주로 공격을 해 보았지만 실패하였고, filename으로 소스코드 자체를 바꿀 수 있기 때문에 시도해봤지만 파일 이름의 길이가 3자 이내로 제한되어 있어 실패하였습니다. 풀어본 결과, 이 문제는 파일 업/다운로드 취약점이 아니었습니다.

본론으로 돌아와서, 소스를 보고 알 수 있는 것은 현재 디렉토리에서 *.jpg 파일에 접근이 가능하다는 것입니다.



3.jpg는 초록색 슬라임 그림입니다. 글쓴이들의 프로필사진에도 있는 그림입니다. 귀엽네요.

1부터 모두 접근 해 본 결과, jpg파일은 1~8까지의 숫자로 이루어져 있었습니다.

하나하나 받기 귀찮으니 파이썬으로 코드를 짜서 실행해보죠.



wget으로 jpg 파일을 받는 코드를 작성해봅니다.



모두 받아주고



ls로 정보를 떠보니 유독 1.jpg만 파일의 크기가 크다는 것을 알 수 있습니다.

cat으로 파일을 읽어보니 아니나 다를까, php 코드가 숨어있었습니다.



아래 소스가 해당 코드입니다.



별다른 내용이 없는데, 21라인을 보면 zwitter_admin.php가 있는 것을 확인 할 수 있습니다.

수상하지 않나요? 질러봅시다.



짠!

'Wargame > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11
Webhacking.kr prob59  (0) 2016.05.11

Webhacking.kr

Prob60




60번 문제입니다. 들어가자마자 Access Denied를 뱉어내면서 우릴 밀어냅니다.

소스를 한번 확인해보도록 하죠.




PHPSESSID 값에 숫자가 들어있을 때 해당 문구를 뱉으면서 종료시키는 소스였네요.

그리고 아래 부분을 보면 세션id의 이름으로 파일을 하나 생성하는데, 내용 역시 세션id입니다.

그런데 접속하는 주소가 127.0.0.1일 경우 1초간 슬립 후 해당 파일을 삭제시킵니다.

중요한 점은 가운데 if문인데, mode 변수가 auth로 들어올 경우 해당 파일을 읽어 이름과 내용의 일치 여부 파악 후 일치할 경우 클리어 되는 부분입니다.

하지만 파일은 만들어지고 1초 뒤에 삭제가 되기 때문에 그 사이에 파일을 읽어줄 필요가 있습니다.

이 때 알아야 되는 개념이 레이스 컨디션입니다.

레이스 컨디션이란 말 그대로 경주, 경쟁자 상태를 말합니다. 서로 경쟁하는 사람들처럼 2개 이상의 프로그램이 동시에 돌아가며 서로 영향을 끼치는 상태를 의미합니다.

웹 해킹에서의 레이스 컨디션 뿐만 아니라 시스템 해킹에서도 사용되는 개념입니다.

그럼 차례대로 문제를 해결해보도록 하겠습니다.



크롬의 확장프로그램인 EditThisCookie를 이용하여 PHPSESSID를 변조시키겠습니다. 현재 PHPSESSID의 값에는 숫자가 포함되어있기 때문에 이를 없애줘야합니다.



숫자만 제거하고 영문은 그대로 놔두고 적용시키겠습니다.



세션에 해당하는 쿠키 값을 변조했기 때문에 이 바꾼 쿠키 값을 서버에 다시 저장해줄 필요가 있습니다. 다시 로그인 해 줍시다.



숫자를 제거한 세션ID로 로그인 되었습니다. Access Denied 메시지가 뜨지 않고 정상적으로 웹페이지에 접속 된 것을 확인 할 수 있습니다.



문제를 해결하기 위해 mode 변수를 auth로 GET요청을 통해 날려줍시다. 하지만 앞서 말했듯이, 1초 뒤에 파일은 삭제되기 때문에 레이스컨디션을 이용해 동시에 접속할 필요가 있습니다. 이를 위해 시크릿모드로 새 세션을 열어주었습니다.



새 세션에서도 위와 동일하게 쿠키 값을 바꾼 후 로그인 해줍니다. 그 후 두 윈도우에서 연속으로 refresh를 해주면 생성되는 파일을 read하면서 문제가 클리어됩니다.



이번 문제는 레이스컨디션에 대한 사전지식이 없을 경우 풀이하기 어려움이 있었던 문제입니다.

레이스컨디션에 대한 상세한 정보는 구글링을 통해 알아보시면 될 것 같습니다.

'Wargame > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr prob59  (0) 2016.05.11

Webhacking.kr

prob59





Webhacking.kr 59번 문제입니다.

딱 보니 sql injection을 위한 문제인 것 같습니다.

소스를 한번 확인해 보도록 하죠.



get이 아닌 post로 요청을 하네요.

id와 phone이 join에 필요한 파라미터, lid와 lphone이 로그인에 필요한 파라미터입니다.

만약 로그인 했을때 결과값의 lv이 admin일 때 클리어 할 수 있는 조건이 붙어있습니다.

join을 할 때는 여러가지 필터링이 걸려있는데, id와 phone 모두 admin이라는 단어를 필터링하고 sql injection을 위한 핵심 키워드들이 필터링 되어있습니다.

여기서 저는 id 부분에서 SQLi를 시도해보았지만 결국 모두 실패했습니다. Single Quotation으로 묶여있기 때문에 문자열 취급을 받아 정상적인 쿼리로 날아가는게 원인이었습니다. 이 문제에서는 id가 아닌 phone 부분을 공격 벡터로 이용하여 injection을 해야합니다.



위와 같이 쿼리를 작성했습니다. id에는 quotation이 먹히지 않기 때문에 단순히 참조하기 위한 수단으로만 사용합니다.

우리는 phone에서 reverse(id)를 이용해 admin을 입력해주기 위해 id의 값에 admin의 반대인 nimda를 입력해줍니다.

그리고 위와 같이 입력할 때 완성되는 쿼리문은 아래와 같습니다.


insert into c59 values('nimda',1,reverse(id)),(1,1,'guest');


(이 쿼리문은 insert문을 이용할때 insert into table values('A', 'A'),('B', 'B')와 같은 쿼리를 날려줄 때 한번에 여러 값을 동시에 넣을 수 있는 것을 이용한 쿼리문입니다.)

그렇다면 db에 들어갈 때는 reverse(id)에 의해 admin으로 변환되어 nimda/1 계정의 lv은 admin으로 들어갑니다.



로그인 해 봅시다.



짠!





-thx to Zairo(http://zairo.tistory.com)

'Wargame > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr old-01(200)  (0) 2019.09.22
Webhacking.kr Prob40  (0) 2016.05.13
Webhacking.kr Prob53  (0) 2016.05.11
Webhacking.kr Prob48  (0) 2016.05.11
Webhacking.kr Prob60  (0) 2016.05.11

+ Recent posts