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_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

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

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)  (2) 2016.05.10
SuNiNaTaS System Level1(Prob_16)  (2) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (2) 2016.05.09
SuNiNaTaS Web Level8  (2) 2016.05.09
SuNiNaTaS Web Level7  (2) 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  (2) 2016.05.09
SuNiNaTaS Web Level7  (2) 2016.05.09
SuNiNaTaS Web Level5  (4) 2016.05.09
SuNiNaTaS Web Level4  (9) 2016.05.07
SuNiNaTaS Web Level3  (2) 2016.05.06

+ Recent posts