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

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

SuNiNaTaS

Web Level10(Prob_23)




써니나타스 웹 카테고리의 마지막 문제입니다.

Hard Blind SQL Injection 문제라고 합니다.

이번에는 admin이라는 단어 자체가 필터링이 되어 있습니다. 이를 우회하여 admin 계정의 패스워드를 알아내는 것이 우리의 목표가 되겠습니다.



기본으로 주어지는 계정인 guest/guest 계정을 이용하여 주물럭거리다 보니 위와 같은 형태로 문자열 필터링 우회가 가능하다는 것을 알아냈습니다.



그래서 22번 문제와 동일한 방법으로 admin 계정의 pw 길이를 먼저 알아냈습니다.



그런데 쿼리를 작성하다 보니 자꾸 No Hack. 필터링이 걸리기에 확인을 해봤더니 역시나 쿼리 길이 제한이 있었습니다.

우와 같이 30byte까지는 허용 범위이지만



30byte를 넘어가는 순간 No hack을 뱉어내고 종료시킵니다. 따라서 우리는 30byte 이내의 쿼리를 작성해야 하는 상황이 됩니다.



한참 고민하던 중 22번과 다르게 23번 문제는 or 이 필터링 되지 않았다는 것을 알고 바로 이용했습니다.

substring, substr이 필터링 되기 때문에 이를 우회하기 위해 left 함수와 right 함수를 함께 사용하여 기능을 구현했습니다.

또한 쿼리를 작성하다보니 계속 30byte를 넘겨서 고민을 계속 해본 결과 위와 같은 형태의 쿼리문이 완성되었습니다.



딱 30byte



바로 python으로 브포 코드를 작성하여 key값을 찾아냈습니다.



SuNiNaTaS web level all clear!

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level2(Prob_24)  (0) 2016.05.10
SuNiNaTaS System Level1(Prob_16)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09

SuNiNaTaS

Web Level9(Prob_22)



9번째 문제입니다. Blind SQL Injection을 이용한 문제 풀이인데, 소스를 확인 해 보니 admin의 pw를 알아내는 것이 목표라고 합니다.


위와 같이 id에 admin'--, pw에 아무 값이나 넣어주면 pw 부분이 주석 처리 되어 바로 로그인이 가능해집니다.



이를 이용하여 and 뒤의 값을 적절히 변형시켜주면 참과 거짓일때의 반응이 다르다는 것을 알 수 있습니다.



참일때는 OK admin, 거짓일때는 false를 뱉어냅니다.



len 함수를 이용하여 pw의 길이를 확인 해 보니 10글자인 것을 알 수 있었으며



substring 함수를 이용하여 pw의 값을 한 글자씩 끊어서 판별 할 수도 있습니다.



python 스크립트를 이용하여 bruteforcing으로 키값을 알아내는 코드를 작성했습니다.



최종 값이 나오면 Auth 페이지에서 인증하면 됩니다.






References

 - Zairo(http://zairo.tistory.com/entry/SuNiNaTaS-Challenge-Level-22)

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level1(Prob_16)  (0) 2016.05.10
SuNiNaTaS Web Level10(Prob_23)  (0) 2016.05.10
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09
SuNiNaTaS Web Level6  (0) 2016.05.09

SuNiNaTaS

Web Level6




6번째 문제입니다. Hint와 reference 글을 읽어보면 README 글을 열람하라는 내용과, 인코딩 및 디코딩을 지원해주는 http://tools.web-max.ca/encode_decode.php 웹페이지 URL이 적혀있습니다. README 글을 클릭 해 보면 아래와 같은 창이 나타납니다.



파란 글씨로 SQL Query가 써져있는데, Single Quotation을 이용한 SQL Injection을 통해 간단하게 인증을 우회 할 수 있을 것 같았습니다.

그래서 위 그림과 같이 query를 날려주었습니다.(1' or 1=1#과 같은 쿼리를 날려 줄 수도 있지만, =과 # 필터링으로 인해 like와 --을 사용했습니다.)




Congratulation!!

Auth_key를 뱉어내길래 이 키로 바로 Auth 메뉴에 넣어줬더니 계속 틀린 값이라고 합니다... reference 글에 나타나있는 대로 뭔가 인코딩이 필요할 것 같아 base64, sha1, md5 등 인코딩을 해서도 날려봤지만 역시 인증이 되지 않았습니다.

한참 고민하던 중, 몇 번 다시 돌려보니 위 팝업창이 뜬 이후 http://suninatas.com/Part_one/web06/view.asp?idx=3&num=3&passcode=wkdrnlwnd 이라는 URL로 요청을 때리는데, 접근 거부 팝업이 뜨는 것을 확인했습니다.

그래서 한 단계가 더 있는 것을 깨닫고, 쿠키를 확인 해 봤더니 쿠키 중 auth_key라는 값이 있었습니다.

이 곳에 우리가 찾아낸 key값을 집어 넣는 듯 합니다.



이 auth_key 값을 suninatastopofworld!로 넣어주었더니 그래도 안되길래... base64, sha1, md5 등 인코딩을 하다 보니 md5 hash 값을 넣어 주었을 때 해당 글이 읽혔습니다.



저는 크롬 확장프로그램 중 하나인 EditThisCookie 툴을 이용하여 쿠키를 변조 해 주었습니다.



접근 거부가 뜨던 웹페이지가 정상적으로 접속이 되고, KeyFinding^^라는 본문 내용을 담고 있는 페이지가 나왔습니다.



소스를 확인 해 보니, 시작 부분에 KEY_HINT가 Rome's First Emperor 라고 주어져있습니다.

찾아보니 로마의 첫 번째 황제는 아우구스투스였습니다.



구글링을 통해 아우구스투스의 라틴 이름을 Auth 메뉴에 박아주니 인증 되는 것을 확인하였습니다.



이번 문제는 게싱이 많이 포함되어 있는 문제였습니다. 힌트가 없었다면 풀이하기 많이 어려웠을 것 같습니다...

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09
SuNiNaTaS Web Level5  (0) 2016.05.09
SuNiNaTaS Web Level4  (3) 2016.05.07
SuNiNaTaS Web Level3  (0) 2016.05.06

+ Recent posts