Wargame.kr

Web_700

dmbs335




드디어 700점대 문제로 넘어왔습니다.

이번에도 web 문제네요. SQL Injection 문제입니다. 살펴보도록 하죠.



들어가보니 게시판이 하나 있습니다. 검색을 할 수 있는 공간이 있고 컬럼을 선택 할 수도 있습니다. and와 or은 subject|content 컬럼을 선택했을 경우의 연산입니다.

소스를 확인해봅시다.



30라인을 확인 해 보면 parse_str($_SERVER['QUERY_STRING']);이란 구문이 있습니다.

parse_str 함수는 파라미터로 전달받은 문자열을 PHP 변수로 변환시켜주는 함수입니다.

이 때, PHP 내부에서 쓰이고 있는 변수명을 문자열로 전달 할 경우 해당 변수의 값이 바뀌기도 합니다.

이 문제는 이러한 parse_str 함수의 취약점을 이용한 문제입니다.

$_SERVER['QUERY_STRING']은 HTTP에서 GET 요청을 했을 때, 그 문자열을 반환해주는 구문입니다.

예를 들어, 


http://wargame.kr:8080/dmbs335/?search_cols=subject&keyword=1&operator=or 라는 GET요청을 때렸다면


$_SERVER['QUERY_STRING'] -> search_cols=subject&keyword=1&operator=or 이 될 것입니다.


그렇다면 우리는 GET 요청으로 PHP상에서 취약한 부분을 찾아 변수의 값을 변환해주면 될 것입니다.

where_clause 변수에 실질적인 where구문의 쿼리가 들어갑니다.

47라인을 보면 query_parts 변수가 존재 할 경우 where_clause문에 해당 변수의 내용을 넣어주는 부분이 있는데, 이는 그 위의 search_cols 변수가 존재 할 경우 들어갑니다.

따라서 search_cols 변수에 preg_match문에 부합되지 않는 값을 넣어주고, query_parts 변수에 우리가 원하는 쿼리문을 집어 넣어준다면 keyword에 추가되는 addslashes 함수를 우회하여 쿼리를 실행시킬 수 있을 것입니다.





query_parts 변수에 union 구문을 집어 넣어주었습니다.

결과 값이 1,2,3,4로 나타나는 것을 확인 할 수 있습니다.



테이블명을 알아내기 위해 select구문을 서브쿼리로 집어 넣어 실행시켜주었더니 41번째에 해당하는 테이블에서 플래그를 담고 있는 테이블로 의심되는 값이 튀어나왔습니다.



다음으로 컬럼 값을 알아내기 위해 table_name의 조건을 위에서 알아 낸 테이블명으로 설정 해 준 후 쿼리를 때렸더니 f1ag라는 컬럼명을 뱉어냈습니다.



위에서 알아낸 값들을 이용하여 Key값을 따낼 수 있었습니다.






References

- God of Webhacking Zairo(http://zairo.tistory.com)

Wargame.kr

Web_650

crack crack crack it



.htaccess를 크랙하는 문제라고 합니다.



문제에 접속하면 .htpasswd 파일을 받을 수 있는 링크와 텍스트박스, 인증 버튼이 있습니다.

패스워드는 G4HeulB로 시작하며, 알파벳 소문자와 숫자로만 이루어져있다고 합니다.



htpasswd 파일을 받으면 HTTP의 Basic Authentication과 같은 형태의 아이디 및 패스워드가 있으며, 패스워드 부분은 md5 crypt로 hash 되어있습니다.

이는 john the ripper라는 프로그램으로 패스워드를 크랙 할 수 있습니다.



해당 프로그램의 charset을 python을 이용해 출력하는 스크립트를 짰습니다.



위 스크립트를 이용하여 john the ripper 프로그램을 실행시키면 뒤의 문자열을 알아 낼 수 있습니다.



짠!





References

- God of Webhacking Zairo(http://zairo.tistory.com)

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

[Wargame.kr] Web_700_lonely guys  (0) 2016.05.26
[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26
[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Misc_650_pyc decompile  (0) 2016.05.23
[Wargame.kr] Web_650_web chatting  (0) 2016.05.23

Wargame.kr

Forensics_650

img recovery



650점짜리 img recovery입니다.

PNG파일을 복구하라고 합니다.

그런데 스테가노그래피가 아닌 포렌식 문제라고 하네요. 한번 문제를 확인해봅시다.



문제를 들어와보니.... 눈이 째질것같네요. 감사합니다.

코드를 찾으라고 합니다.

소스를 한번 봐보죠.



pattern.png가 바둑판 배열로 나열이 되어있는 형태입니다.

이 파일을 받아 hexdump로 파일을 확인해봤습니다.



일반적인 PNG 프로그램과 달리, 마지막 부분에 Japng r119라는 스트링이 들어있습니다.

구글링 해 본 결과, APNG는 Animated PNG로, PNG파일 안에 스테가노그래피같이 여러개의 파일이 숨겨져 있는 형태입니다.

Safari 브라우저의 경우 바로 재생이 되지만, Chrome이나 Firefox, Iexplore의 경우 재생이 바로 되지는 않고 확장 프로그램 등을 이용하여 재생 할 수 있습니다.

APNG Disassembler 프로그램을 다운받아 숨겨진 파일들을 찾아내봅시다.



총 2개의 png파일이 숨겨져있었습니다.

하지만 두 번째 파일의 경우 0/1000의 시간 텀으로 움직이도록 설정을 해 두었기에 APNG이지만 움직이지는 않았습니다.

APNG Assembler로 합치면 일정 인터벌을 두고 움직이는 GIF와 같은 파일이 만들어집니다.



자, 이렇게 두 개의 파일이 나왔습니다.

뭔가 모양이 익숙하지 않나요?

포토샵을 이용하여 두 개의 그림을 하나로 합쳐보았습니다.



QR코드같은 모양이 나왔네요! 네이버 어플을 이용하여 QR코드를 찍어보았더니 


WHAT!@#$?


이라는 스트링 값을 뱉어냈습니다.



이를 텍스트박스에 넣어주고 check를 눌러주면



짠!

Key값을 뱉어냅니다.

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

[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26
[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25
[Wargame.kr] Misc_650_pyc decompile  (0) 2016.05.23
[Wargame.kr] Web_650_web chatting  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21

Wargame.kr

Misc_650

pyc decompile



650점짜리 문제입니다. 정확한 분야를 정하기가 애매해서 Misc로 지정했습니다.

문제를 확인해보죠.



문제 페이지에 접속하면 서버 타임과 함께 bughela.pyc를 받을 수 있는 링크가 있습니다.

pyc파일을 받은 후 Easy Python Decompiler 툴을 이용하여 .py 파일로 변환시켜줬습니다.



bughela.py입니다.

소스를 확인해보니 %m/%d/HJEJSH 포맷으로 현재 로컬 타임을 받아옵니다.

그리고 start와 end 부분은 로컬 시, 로컬 분을 연산 한 결과로 집어 넣어줍니다.

하지만 로컬 타임과 서버 타임이 약 8분정도 차이나는 것을 확인 할 수 있습니다.



따라서 위와 같이 약간 변형을 시켜줍시다.

flag와 ok와 다를 때 die 함수로 가는 부분을 return ok로 바꾼 이유는 처음 함수에 접근했을 때 flag 값을 받아오기 위함입니다.



위는 bughela.py에서 GIVE_ME_FLAG 함수를 한번 호출하여 flag에 해당하는 값을 얻어오고, 그 값을 웹페이지에 요청하는 스크립트입니다.

5번째 라인의 두번째 GIVE_ME_FLAG 함수는 테스트를 위해 추가한 코드이니 신경 쓰지 않아도 무방합니다.



짠!

Key 값을 뱉어주네요.

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

[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25
[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Web_650_web chatting  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20

Wargame.kr

Web_650

web chatting


650점짜리 문제입니다. 이번에도 SQLi 문제라고 하네요.

개발자의 관점에서 문제를 풀어보라고 합니다. 문제 확인 들어가봅시다.



BlueCHAT 프로그램이 나오네요. ID를 입력하고 join 해 봅시다.




채팅 프로그램이 나타납니다. 왼쪽 텍스트박스에 입력한 ID가 표시되고, 오른쪽 텍스트박스에 문자열을 입력하고 say를 누르면 위와 같이 채팅창에 글이 올라오는 형태입니다.

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



xmlhttp를 이용한 AJAX를 구현 해 놓은 채팅으로 보입니다.

say를 누르면 chatlog.php에 data파라미터로 문자열이 인코딩 되어 들어가면서 서버에 저장이 됩니다.

그리고 1초간의 인터벌을 두고 채팅 로그를 가져오네요.

가져올 때 t 값과 ni 값을 가지고 값을 불러오는데, t는 크게 관련이 없는 변수인 것 같고, ni가 중요한 변수가 됩니다.

ni는 아래에서 다시 언급하겠지만, 채팅을 할 때 해당 글이 서버에 저장된 index의 값입니다. 



blueh4g_js.js입니다. 이 소스 또한 크게 신경 쓸 부분은 아닌 것 같습니다. get_Cookie 함수에서 get_Cookie('chat_id') 등을 입력하면 채팅에 설정된 id가 나타난다는 것만 알고 있으면 될 것 같습니다.(실제 문제 풀이에는 쓰이지 않는 함수였습니다.)



위에서 확인했던 chatlog.php?t=1을 접속했을 때의 화면입니다. 13828은 마지막으로 저장했던 index+1, 즉 앞으로 저장 될 ni의 값입니다.



그렇기 때문에 chatview.php에서 ni의 값을 13827(13828-1)로 입력해주면 마지막으로 채팅했던 값이 반환되며



그 이전의 값을 입력하면 최근 채팅부터 그 index에 해당하는 값까지 모두 출력이 됩니다.



여기서 select문을 사용하는 것 같은 느낌이 들어, and와 or문을 적절히 이용하여 request를 날려보았더니, 역시나 쿼리가 먹힙니다.



그렇다면 위와 같이 if문을 이용하여 SQLi를 시도 할 수 있을 것 같습니다.



파이썬으로 테이블 명을 찾는 스크립트를 작성했습니다.

42번째 index에 우리가 찾고자 하는 테이블 명을 알아 낼 수 있었습니다.



딱 봐도 여기에 플래그가 있다고 광고하는듯한 테이블입니다.



다음으로 컬럼 값을 찾아보았습니다. 이번에는 486번째 인덱스에 우리가 찾는 컬럼이 있었습니다.



README! 이전의 SimpleBoard 문제가 생각이 나네요.



이제 flag 값을 찾아내는 스크립트를 작성해봅시다.

chat_log_secret 테이블에서 readme 칼럼 값을 빼옵니다.



그러면 Key 값을 얻어낼 수 있습니다.

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

[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Misc_650_pyc decompile  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20
[Wargame.kr] Web_550_type confusion  (0) 2016.05.19

군대에 있을 때 풀었던거지만... 이제서야 포스팅..

페이스북 계정으로 풀이하다 중간에 Hamlet 난이도부터 구글계정으로 풀이하는바람에 따로따로 놀고있지만.. 그래도 올클리어!

2~3일정도 걸렸던 기억이 나는데 나름 재밌었습니다.




'ETC.' 카테고리의 다른 글

[Web] 아스키문자 필터링  (2) 2017.02.21
[Python] Console color  (0) 2016.12.08

Wargame.kr

Web_600

SimpleBoard


600점짜리 문제입니다.

Union을 이용한 SQL Injection 문제라고 하네요.

스크립트가 필요할 것이라고 합니다. 문제를 확인 해 보도록 하죠.




들어가보면 게시판이 하나 있습니다. 해당 제목을 클릭하면 글의 내용이 보여지며 HIT수가 올라갑니다.

소스를 확인해보죠.



read 함수의 where 구문에 $idx를 살펴보면 Single Quotation이 없습니다. 따라서 이 부분을 공격 벡터로 이용하여 SQL Injection을 먹일 수 있을 것 같습니다.

사실 이 문제의 경우 union을 이용한 SQL Injection이라고 하였지만, 계속 넣어봐도 query error만 뱉어내고 작동을 안해서... Blind SQL Injection을 이용하여 풀이했습니다.



파이썬 스크립트를 작성하여 테이블 이름을 찾아보았습니다.



limit 41, 1 을 걸어주었을 때 SIMPLEBOARD 테이블이 나왔고 40, 1을 걸어주었을 때 README라는 테이블 또한 뱉어냈습니다.

아마 README 안에 FLAG가 들어있을 것 같습니다.

다음은 COLUMN을 찾아보겠습니다.



limit 480,1을 걸어주었습니다.



column 중 FLAG라는 이름을 가진 컬럼이 있습니다.



이제 select 구문을 이용하여 flag를 따낼 차례입니다.



짠!

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

[Wargame.kr] Misc_650_pyc decompile  (0) 2016.05.23
[Wargame.kr] Web_650_web chatting  (0) 2016.05.23
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20
[Wargame.kr] Web_550_type confusion  (0) 2016.05.19
[Wargame.kr] Web_550_strcmp  (0) 2016.05.18

Wargame.kr

Web_600

tmitter


admin 계정으로 로그인하라고합니다.




문제를 확인 해 보니 회원가입과 로그인 버튼이 하나씩 있습니다.



회원가입 버튼을 눌러보니 가입 폼이 나타나네요.



아이디와 패스워드는 각각 4자리, 7자리 이상이어야 하며 힌트로는 admin으로 로그인 하라는 메시지 뿐입니다.

우리는 맨 처음 문제 페이지에서 확인했던 DB 구조를 이용하여 문제를 풀이 할 것입니다.

ID의 경우 32바이트까지만 DB에 저장을 합니다. mysql의 특성상 저장 한도를 넘으면 그 뒤를 잘라내고 저장을 하는데, 이러한 특성을 이용하여 admin 계정을 새로 만들 수 있습니다.



위와 같이 크롬의 개발자 도구에서 maxlength를 33으로 늘려주고 마지막에 한 문자를 붙여준다면 trim() 함수 적용으로 공백이 사라지고, 뒤의 a는 사라지면서 admin이라는 문자열만 남게 됩니다.



따라서 admin으로 로그인이 가능해지고 플래그를 획득 할 수 있습니다.





Gossip

- 사실 저는 위 WriteUp대로 풀지 않았습니다..

- 위 WriteUp은 구글링 해서 찾은 방법입니다.

- 저는 뭘 어떻게 했는지는 모르겠는데

- 하다 보니 admin으로 로그인이...

- 아직도 뭘 어떻게 했는지 모릅니다.

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

[Wargame.kr] Web_650_web chatting  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_550_type confusion  (0) 2016.05.19
[Wargame.kr] Web_550_strcmp  (0) 2016.05.18
[Wargame.kr] Web_500_md5 password  (0) 2016.05.18

Wargame.kr

Web_550

type confusion




php의 data type에 관련된 문제같습니다. 문제를 확인해봅시다.


텍스트박스 하나와 check 버튼 하나가 우릴 맞이해주고있습니다.

view-source 링크를 타고 소스를 확인 해 보죠.




gen_key 함수에서 uniqid 함수와 sha1 암호화를 통해 키를 생성하는데, usleep 함수때문에 프로그래밍을 통한 때려맞추기는 못할 듯 싶습니다.

그렇다면 답은 if문에 있을 것입니다.

if문을 지나게 되면 json 형식으로 code 값에 true를, flag 값에 Key값을 넣어 return 해주네요.

util.js 부분을 살펴봅시다.



아까 소스에서 확인했던 code 부분이 true 일 때 flag를 뱉어주네요.




구글링을 통해 확인 한 php 비교연산 테이블입니다.

"php"라는 문자열과 TRUE의 값을 비교했을 때 TRUE를 반환하는 것을 알 수 있습니다.

우리가 json의 key value에 true를 넣어준다면 if문이 우회가 될 것입니다.

네. 생각대로 flag를 뱉어줍니다.




References

- Chris Smith_(PHP Magic Tricks: Type Juggling)

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

[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20
[Wargame.kr] Web_550_strcmp  (0) 2016.05.18
[Wargame.kr] Web_500_md5 password  (0) 2016.05.18
[Wargame.kr] Web_500_md5_compare  (2) 2016.05.18

Wargame.kr

Web_550

strcmp




550점대로 넘어왔습니다. strcmp 함수의 취약점을 이용한 문제인것같습니다.



문제에 접속하니 패스워드와 체크하는 버튼이 우릴 기다리고 있습니다.

view-source를 눌러 소스를 확인해봅시다.



POST로 값을 입력받아 password 변수와 비교를 하여 strcmp 함수의 결과로 0을 반환시키면 Flag를 뱉어주네요.

password 변수의 경우 더미값을 이용한 rand()로 생성한 랜덤값이기 때문에 추측하기 어렵습니다.

따라서 정상적인 방법으로는 패스워드를 맞출 수 없습니다.


이렇게 다른 패스워드 값을 넣어준다면  Wrong passwrod.. 메시지를 출력합니다.

구글링을 통해 찾아보니 PHP 5.3+ 버전에서는 strcmp 함수에 string 값이 아닌 Array 값을 입력 해 주었을 때 0을 반환한다고 합니다.

이러한 특성을 이용하여 인증을 우회해봅시다.



burpsuite를 이용하여 POST로 값을 요청해주었습니다.

password 값을 배열로 인식하도록 만들어준 후, 값을 요청해 준 결과 플래그를 뱉어내는 것을 확인 할 수 있습니다.

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

[Wargame.kr] Web_600_tmitter  (0) 2016.05.20
[Wargame.kr] Web_550_type confusion  (0) 2016.05.19
[Wargame.kr] Web_500_md5 password  (0) 2016.05.18
[Wargame.kr] Web_500_md5_compare  (2) 2016.05.18
[Wargame.kr] Web_500_fly me to the moon  (0) 2016.05.17

+ Recent posts