Wargame.kr

Web_700

php? c?



힌트로 주어진 것은 integer type에 대해 알고 있냐는 것과 32bit 어플리케이션이라는 것입니다.

문제를 확인해보도록 하죠.



접속하면 D1과 D2를 입력 할 수 있는 텍스트박스와 try버튼이 있습니다.

get source를 눌러 소스를 보도록 하죠.



D1과 D2의 값을 POST로 받네요. 각각 input1, input2 변수에 저장을 합니다.

그리고 /tmp/p7을 실행시키는데, POST로 입력받은 d1의 값을 argv로 받습니다.

만약 실행시킨 결과 값이 1이 아니면서 result의 값과 d2에서 입력받는 값이 같을 경우 flag를 뱉는 구조네요.

p7.c도 한번 확인해보도록 합시다.



간단한 코드입니다.

argv[1]을 int형으로 바꿔준 후, 0보다 작을 경우 1을 출력시키는 nono() 함수로 분기하고, i를 5 증가시킨 후 i가 4보다 클 경우 1 출력, 5보다 작을 경우 i의 값을 출력시켜주는 코드입니다.

간단한 코드이지만 약간 말이 안되는 부분이 있죠. i가 0보다 작아서도 안되고 4보다 커서도 안된다. 하지만 i는 중간에 5가 증가되기 때문에 이 조건에 부합시키는 수는 있을수가 없죠.

하지만 32비트 어플리케이션에서는 int형이 4바이트 제한이기 때문에 값의 범위가 -2147483648 ~ 2147483647 까지입니다.

따라서 2147483643 이상의 값을 입력 받을 경우 값이 0 또는 -로 출력이 될 것입니다.

p7.c를 그대로 긁어와 컴파일 하여 실행시켜보았습니다.



우리의 예상대로 - 값이 출력이 되었습니다.

이를 그대로 POST로 날려줍시다.

날려줄때, 문제 페이지에서는 D1의 maxlength가 9로 제한이 되어있으니, 개발자 도구 또는 프록시 툴을 이용하여 제한을 풀던지, 값을 날려주던지 합시다.

저는 burp suite를 이용해 파라미터를 날려주었습니다.



짠! flag를 깔끔하게 뱉어줍니다.

이 문제는 700점이라고 하기에는 조금 쉬운 감이 없지 않아 있네요..

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

[Wargame.kr] Web_800_jff3_magic  (0) 2016.05.30
[Wargame.kr] Web_800_QnA  (0) 2016.05.27
[Wargame.kr] Web_700_ip log table  (0) 2016.05.27
[Wargame.kr] Web_700_lonely guys  (0) 2016.05.26
[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26

Wargame.kr

Web_700

ip log table




700점짜리 문제도 거의 끝나가네요. Blind SQL Injection을 이용하여 풀이하는 문제인 것 같습니다.

바로 문제를 확인 해 보도록 하죠.


문제에 접속 해 보니 상단에 admin 계정으로 로그인 할 수 있는 페이지로 접근 할 수 있는 버튼이 있고, 아래 테이블에는 idx와 함께 IP가 있습니다.

해당 테이블의 항목들을 클릭하면 아래와 같은 log time이 나타납니다.




이 log time은 문제 페이지에 접속한 당시의 서버 시간을 나타내는 것 같습니다.

그리고 Request 때리는 부분을 확인해봤더니 chk.php 페이지로 POST 요청을 날려주는데, 파라미터로 idx를 같이 날려줍니다.

이 idx가 위에서 확인했던 log time을 구별해주는 지표가 됩니다.

여기서 생각 할 수 있는것은 이 idx 파라미터가 전달 될 때 select 쿼리를 사용할텐데, 여기에 single quotation이 없는 등의 코딩 실수가 있을 경우 SQL Injection이 가능할 것입니다.



그래서 위와 같이 burp suite를 이용하여 idx 파라미터에 select문을 사용하여 table명을 알아내는 코드를 짰더니, 참과 거짓에 따라 다른 값이 나타났습니다.

(chk.php 페이지에서는 idx가 문제 페이지에 나타나있는 테이블에 존재하지 않는 경우 1970년 1월 1일자로 나타납니다.)

따라서 이를 이용하여 Blind SQL Injection을 먹일 수 있습니다.



python으로 테이블명을 알아 낼 수 있는 스크립트를 작성했습니다.

돌려보도록 하죠.



페이지 내에 sleep문이 적용되어있는지 약간 느린 반응을 보여줬습니다. 이 11글자 알아내는데 30초가 넘게 걸렸습니다...

아무튼 limit의 숫자를 늘려가며 admin_table이라는 테이블을 알아냈습니다.

이 테이블 안에 아마도 admin 계정의 id와 pw를 알아 낼 수 있는 컬럼이 있을 것입니다.



위에서 사용했던 payload.py를 복사하여 약간 내용을 수정 후 column.py로 바꾸고 컬럼 값을 찾는 스크립트를 돌려봤습니다.

이 또한 limit 값을 늘려가며 찾아보았더니 id와 ps라는 컬럼을 찾아 낼 수 있었습니다.

이제 이를 이용하여 admin 계정의 id와 pw를 알아내면 될 것 같습니다.



id는 blue_admin



pw는 0h~myp4ss!인 것을 알아냈습니다.

이제 이를 admin 페이지에 접속하여 로그인 해 보도록 하죠.






짠! flag를 찾아냈습니다.

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

[Wargame.kr] Web_800_QnA  (0) 2016.05.27
[Wargame.kr] Web_700_php? c?  (0) 2016.05.27
[Wargame.kr] Web_700_lonely guys  (0) 2016.05.26
[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26
[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25

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)

OWASP WebGoat

Authentication Flaws - Multi Level Login 1



Authentication Flaws의 세 번째 세션인 Multi Level Login 1입니다. 바로 지문을 보도록 하죠.




스테이지1은Jane/tarzan 으로 로그인을 하라고 합니다.




TAN 코드에서 2번째 숫자를 요구하는데, 그대로 입력 해줍니다.



정상적으로 로그인 되면서 스테이지2로 넘어 온 것을 확인 할 수 있습니다.

스테이지2는 Jane에게 보낸 피싱메일로부터 패스워드와 TAN 코드의 첫 번째 숫자를 알아냈다고 합니다.

어떻게든 이를 이용하여 로그인을 하라고 하네요. Burp Suite를 이용하여 Request가 어떻게 날아가는지 확인해보죠.




Jane/tarzan으로 로그인 했을 때 요구하는 TAN 코드는 3번째 숫자지만, 우리는 1번째 숫자만 알고 있으므로 1번에 해당하는 15648을 입력하여 Submit을 눌러줍니다.



Request를 확인 해 보면, GET 요청으로 hidden_tan과 tan이 인자로 함께 날아가는 것을 확인 할 수 있습니다. 여기서 유추 할 수 있는 것은 hidden_tan이 로그인 시 요구하는 TAN코드의 번호라는 것입니다.



우리가 알고 있는 TAN 코드는 1번이므로, hidden_tan의 값을 1로 바꾼 후 Request를 날려봅시다.




정상적으로 Jane 계정으로 로그인이 되면서 클리어 했습니다.


+ Recent posts