반응형

안드로이드 애플리케이션에 대해 취약점 분석 및 모의해킹을 진행 시 Frida는 필수이다.

 

먼저 AndroidFrida를 설치하고 실행 하기 위해서는 PC에서 후킹 스크립트를 작성해야한다.

 

따라서 PC와 모바일 둘 다 Frida를 실행 할 수 있는 환경을 만들어주어야 한다.

 

PC 환경은 이전 포스팅을 보고 환경을 만들어 주자. (클릭)

 

먼저 진단용 단말기는 루팅이 진행되어야한다.

 

루팅과 관련된 내용은 따로 정리할지는 모르겠지만 검색만 하면 다른 포스팅이 많이 있다.

 

참고하자.

 

루팅된 폰에 다음과 같은 명령어를 입력하고 단말기가 32bit인지 64bit인지 확인한다.

 

getprop ro.product.cpu.abi

 

 

arm64-v8a는 64bit이기 때문에 frida 홈페이지에 가서 다운로드 받고 단말기에 넣어주기만 하면 끝이다.

 

Frida 공식 홈페이지는 다음과 같다. (클릭)

 

 

PC에 설치한 frida 버전과 똑같은 버전을 다운로드 받아 준다.

 

다운로드 받은 후 단말기에 해당 frida-server 파일을 넣어주고 실행 할 수 있는 퍼미션을 준다.

 

 

반응형

'모바일 해킹 > AoS' 카테고리의 다른 글

[UnCrackable AoS] Level 1  (0) 2022.03.23
[Android] NDK란??  (0) 2022.03.09
Byte Code & Binary Code  (2) 2021.11.09
Android Penetration Testing - Rooting (Galaxy S6)  (5) 2021.08.27
Android Penetration Testing - Setup  (2) 2021.01.11
반응형

모바일 모의해킹 및 취약점 분석 시 frida는 많이 사용된다.

 

따라서 이번에는 Anaconda에서 frida를 설치해보자.

 

먼저 Anaconda 설치는 이전 포스팅을 참고하면 된다. (클릭)

 

 

먼저 Anaconda에서 python을 실행 시켜준다.

 

그 후 다음 명령어를 입력해서 frida를 PC에 설치해주자.

 

pip install frida-tools

 

 

이렇게 설치해주면 PC에 frida가 설치되었다.

 

 

하지만 frida 설치 후 버전 확인 또는 frida를 실행 하였을 때

 

아래의 같이 오류가 난다면 python 버전의 문제이다.

 

***
Failed to load the Frida native extension: DLL load failed: 지정된 모듈을 찾을 수 없습니다.
Please ensure that the extension was compiled for Python 3.x.
***

......

ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.

 

해결 방법은 python 3.7 버전으로 다시 설치하면 된다.

 

 

반응형
반응형

 

갑자기 논문을 읽다가 평소와는 다르게 bytecode라는 단어를 보고

 

평소 같았으면 그냥 아 bytecode 하고 넘어갔지만

 

오늘 갑자기 bytecode??, binary code랑 뭐가 다른거지? 하고 어느 순간에 두개의 개념이 헷갈렸다.

 

따라서 이번에는 바이트 코드(Byte Code)바이너리 코드(Binary Code)를 짧게 정리해보고자 한다.

 

모든 언어를 예를 들거나 할때 등장하는 언어가 있다.

 

바로 C언어이다.

 

C언어는 컴파일러에 의해 소스파일(e.g., main.c, test.c)

 

오브젝트 파일(main.obj, test.obj)로 만들어진다. 

 

오브젝트 파일로 변환될때 0과 1로 이루어진 이진 코드

 

바이너리 파일로 변환된다.

 

0과 1로 이루어진 파일이기 때문에 컴퓨터는 해당 파일을 이해는 할 수 있다.

 

다만 실행은 못한다.

 

컴퓨터가 실행을 하기 위해서는 기계어(명령어 집합)가 되어야한다.

 

또한 C언어는 환경에 종속적이다.

 

이러한 문제점을 해결하고자 나온 언어가 자바(Java)이다.

 

자바는 컴파일러에 의해 소스파일(e.g., main.java)오브젝트 파일(e.g., main.class)로 변환되며

 

바이너리 코드가 아닌 바로 바이트 코드로 변환된다.

 

또한 환경에 독립적이며 바로 실행 할수 있다.

 

둘다 똑같이 컴파일러에 의해 소스파일컴파일 되었고

 

컴파일 된 파일 오브젝트 파일되었는데

 

C언어에서는 바이너리 코드, Java에서는 왜 바이트 코드일까?

 

완벽한 정답은 아니지만 두개의 차이점은 바로 실행 할 수 있냐 없냐의 차이이다.

 

차이점을 알아보자.

바이너리 코드

  • 컴퓨터가 인식하고 이해할 수 있는 이진 숫자 체계의 0과 1로 구성된 코드를 의미한다.

기계어

  • 기계어는 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어를 통틀어 일컫는다.
  • 기계어는 프로그램을 나타내는 가장 낮은 단계의 개념이다.
  • 기계어는 어셈블리어와 1 : 1로 쓰일 수 있다.

바이트 코드

  • 가상 머신에서 이해하고 실행 할 수 있는 0과 1로 구성된 코드이다.
  • 어떠한 환경에 종속적이지 않고 실행 될  수 있는 가상 머신용 기계어 코드이다.

 

나름 바이너리 코드바이트 코드의 차이를 간단하게 정리를 해보았다.

 

위의 논문에서도 바이너리 코드라고 하지 않고

 

바이트 코드라고 쓰여져있었던것이다. (안드로이드 관련 논문)

 

왜냐? 안드로이드에서 사용하는 애플리케이션(App)은 Java로 만들어졌기 때문이다.

 

 

 

 

반응형

'모바일 해킹 > AoS' 카테고리의 다른 글

[Android] NDK란??  (0) 2022.03.09
[Android] Frida 설치  (0) 2022.01.23
Android Penetration Testing - Rooting (Galaxy S6)  (5) 2021.08.27
Android Penetration Testing - Setup  (2) 2021.01.11
Android Penetration Testing - Introduction  (0) 2021.01.11
반응형

1. 문제 설명

 

문제를 클릭해보자.

 

클릭하면 화면에 javascript challenge라는 문구 말고는 아무것도 없다.

 

쿠키값을 봤을때도 아무것도 없어 페이지 소스보기를 눌러보았다.

 

페이지 소스를 봤을때 딱히 다른건 없었지만 <script> 태그에 이상한 이모티콘이 존재했다.

 

따라서 뭔가 이번 문제는 <script> 태그에 난독화 되어 있는 코드를

 

복호화하는것이 우선일 것이라는 생각이 들었다.

 

따라서 구글에 다음과 같이 입력해보았다.

 

 

검색을 해보니 제일 위에 aaencode라는 것이 나온다.

 

클릭해보자.

 

 

클릭해 보니 alert("Hello, JavaScript")이 위의 이모티콘과 같다고 한다.

 

브라우저 콘솔에 넣어보자.

콘솔에 넣고 입력해보니 바로 alert가 떴다.

 

따라서 이번 문제를 풀기 위해 사이트에서 소개하는 Decoder-aaEncode에 접속해보자.

 

Githtml 파일로 decoder가 있다.

 

다운로드 받아 보니 Input the aaencode here난독화된 코드를 넣으면

 

Decoded aaencode String복호화된 코드가 나온다. 

 

복호화 된 코드는 다음과 같다.

 

var enco='';
var enco2=126;
var enco3=33;
var ck=document.URL.substr(document.URL.indexOf('='));
for(i=1;i<122;i++)
{
  enco=enco+String.fromCharCode(i,0);
}
function enco_(x)
{
  return enco.charCodeAt(x);
}
if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))+String.fromCharCode(enco_(232))+String.fromCharCode(enco_(192))+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))+String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))+String.fromCharCode(enco_(198))+"~~~~~~"+String.fromCharCode(enco2)+String.fromCharCode(enco3))
{
  location.href="./"+ck.replace("=","")+".php";
}

 

이제 위의 코드를 보면 제일 마지막에

 

location.href로 문제에서 원하는 php 페이지로 가는것이 목적인것같다.

 

2. 문제 풀이

 

먼저 위의 복호화된 코드를 브라우저 콘솔 창에 넣고 어떤 값이 리턴되는지 보자.

 

먼저 문제에서 최종적으로 원하는 것은 원하는 php 사이트로 가는것이다.

 

마지막 if문을 살펴보면 ck라는 변수가

 

=+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))...

 

완성된 문자열같아야한다.

 

여기서 + 는 문자나 문자열을 이어주는 역할을 한다.

 

따라서 String.fromCharCode(enco_(240))를 알기 위해서는 enco_라는 함수를 먼저 선언해주어야하며

 

enco_ 함수내에 enco.charCodeAt(x)라는 것을 실행하기 위해서는 enco를 먼저 선언해주어야한다.

 

선언 한 다음 String.fromCharCode(enco_(240))를 실행해보자.

 

y가 나온다.

 

남은것도 다해보면 youaregod~~~~~~~!이라는 문장이 나온다.

 

 

마지막 코드 if문안에 ck라는 변수에 선언해주고 replace로 해주는데

 

콘솔창에서 해보면 다음과 같이 나온다.

하지만 replace가 되려면 =가 ck라는 변수에 존재해야하고,

 

ck라는 변수는 다음과 같이 정의되어 있다.

 

var ck=document.URL.substr(document.URL.indexOf('='));

 

따라서 URL에 12번URL/?=youaregod~~~~~~~!가 들어가야한다.

 

접속해보자.

 

 

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

11. old-11  (0) 2021.11.09
10. old-10  (0) 2021.11.08
9. old-09  (0) 2021.11.08
8. old-08  (0) 2021.11.05
7. old-07  (0) 2021.11.04
반응형

1. 문제 설명

 

먼저 문제를 클릭해보자.

 

문제를 클릭하니 다음과 같은 Wrong이라는 문구와 view-source가 있다.

 

역시 아무런 정보가 없으니 view-source를 클릭해보자.

 

다른 코드들은 볼 필요 없이 위의 PHP 소스코드를 분석해보자.

 

먼저 $pat이라는 변수에 어떤 패턴을 저장하였다.

 

따라서 첫 번째 pat이라는 변수에 저장되어 있는 패턴을 분석해야 한다.

 

그 후 preg_match 함수를 이용해 앞에서 정의한 패턴을 기반으로 regex를 수행한다.

 

perg_match에 대한 설명은 여기에 있다. (클릭)

 

regex를 수행하지만 어떤 문자열이나 값이 있어야 패턴을 적용할 수 있다.

 

그 값이 바로 $_GET['val'] 값이다.

 

따라서 GET 형식으로 URL 뒤에 ?val=어떤 값을 넣어줘야 한다.

 

그렇게 패턴에 매칭이 되면 solve(11) 함수가 실행되면서 문제가 clear 하게 된다.

 

여기까지 정리해보면 다음과 같다.

 

GET 형식으로 val을 값을 서버로 넘겨주는데

 

이때 값은 perg_match에 매칭이 되어야 한다. (그래야 solve(11) 함수가 실행)

 

perg_match에 매칭 되기 위해서는 pat이라는 변수에 저장되어있는 패턴을 분석해야 한다.

 

따라서 패턴 분석 후 값을 val에 넣어주면 이번 문제는 clear 할 수 있을 것 같다.

 

2. 문제 풀이

 

/[1-3][a-f]{5}_.*$_SERVER[REMOTE_ADDR].*\tp\ta\ts\ts/ 패턴을 하나하나 분석해보자.

 

첫 번째로 나오는 것이 [1-3]이다.

 

1-3은 값인 것 같고 먼저 [ ]가 무엇을 의미하는지 살펴보자.

 

 

[ ]은 지정된 두 문자 사이에 문자 코드가 있는 문자를 찾는다는 의미이다.

 

이것이 뭐냐? 쉽게 말해 범위라고 생각하면 된다.

 

[g-s]지정된 두 문자(g,s) 사이에 있는 모든 문자를 주어진 값에서 찾는다는 의미이다.

 

따라서, abcdefghijklmnopqrstuvwxyz에서

 

g, h, i, j, k, l, m, n, o, p, q, r, s만 패턴에 맞게 적용되는 것이다.

 

다음은 [a-f]이다.

 

똑같이 지정된 두 문자(a,f) 사이에 있는 모든 문자를 주어진 값에서 찾는다는 의미이다.

 

그렇다면 [1-3][a-f] 이 두 개를 사용해서 매칭 되는 문자열을 찾아보자.

 

먼저 위에 처럼 주어진 문자열에 [1-3][a-f]을 만족하기 위해서는 첫 글자가 1~3 사이의 숫자여야 한다.

 

1번을 조사할 때 첫글자가 4니깐 패스, 2번을 조사할때 5라서 패스

 

3번을 조사할때 3이고 바로 뒤에 오는 문자가 [a-f] 사이에 포함되니 3a가 매칭이 된다.

 

 

이제 다음은 {5}

 

5는 값이니깐 { }가 먼지 먼저 알아야 한다.

 

Developer에서 정의한 { } 다음과 같다.

 

{5}는 앞 표현식이 5번 나타나는 부분에만 적용된다는 의미이다.

 

적용된 부분인 aabab는 {5}의 앞 표현식 [a-f]가 총 5번 a, a, b, a, b로 매칭이 되는 것이다. 

 

3은 [a-f]의 앞의 표현식 [1-3]에 의해 매칭 되는것이다.

 

그다음은 _ 이건 말그대로 _ 문자를 의미한다.

 

. 은 새로운 개행이 나오기 전까지의 모든 문자를 의미한다.

 

 

*은 앞의 표현식이 0개 이상 연속으로 반복되는 문자를 의미한다.

 

 

 

 

그 다음은 $_SERVER[REMOTE_ADDR] 변수 값인데

 

REMOTE_ADDR은 내가 접속하는 IP 주소를 의미한다.

 

IP 주소는 구글에 what is my ip라고 검색해도 되고 아래의 URL에 들어가서 확인이 가능하다.

 

https://whatismyipaddress.com/

 

그렇다면 여기까지 매칭이 되게 val을 작성해보자.

 

[1-3][a-f]{5}_.*뒤에 원래 $_SERVER [REMOTE_ADDR] 이것이 들어가야 하지만 들어갔다고 가정하고

 

3 abcde_127.0.0.1가 매칭이 되었다.

 

이제 남은 것은 \tp\ta\ts\ts이다.

 

\t은 우리가 알고 있는 탭이다.

 

____p____a____s____s //____은 탭의 공백을 의미함.

 

pass라는 단어가 나온다.

 

따라서 val3abcde_자신의ip\tp\ta\ts\ts를 넣어주면 된다.

 

하지만 GET 방식이다.

 

GET 방식에서 URL 뒤에 ?val=3abcde_자신의ip\tp\ta\ts\ts를 넣어주면

 

\이 문자가 URL encoding이 되어 %5C가 들어가면서 %5Cp%5Ca%5Cs%5Cs가 된다.

 

따라서 탭의 의미를 주려면 %09를 넣어 줘야 한다.

 

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

12. old-12  (0) 2021.11.09
10. old-10  (0) 2021.11.08
9. old-09  (0) 2021.11.08
8. old-08  (0) 2021.11.05
7. old-07  (0) 2021.11.04
반응형

 


1. 문제 설명


 

문제를 클릭해보자.

 

문제를 클릭하면 다음과 같이 O가 하나 튀어 나온다.

 

그 후 아무런 정보가 없다...

 

쿠키값에도 아무런 정보가 없다...

 

따라서 페이지 소스보기를 눌러 소스를 분석해보았다.

 

문제를 클릭했을때는 보이지 않던 hackme라는 문구와 Goal이라는 문구를 볼 수 있다.

 

뭐지? 하다가 문제 페이지로 다시 돌아가보니 옆으로 스크롤을 할 수 있었다.

 

스크롤을 하다보니 다음과 같은 Goal 점선을 볼 수 있다.

 

 

흠 뭔가 저 OGoal에 위치시켜야 할것 같았다.

 

그럼 다시 페이지 소스를 분석해보자.

 

핵심으로 봐야할 코드는 <a>에 있는 코드들이다.

 

코드는 다음과 같다.

 

<html>
<head>
<title>Challenge 10</title>
</head>

<body>

......

<a id=hackme style="position:relative;left:0;top:0"

onclick="this.style.left=parseInt(this.style.left,10)+1+'px';

if(this.style.left=='1600px')
  this.href='?go='+this.style.left" onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O
  
</a>

......

</body>
</html>

 

먼저 a 태그의 idhackme이다.

 

따라서 문제에서도 힌트를 주었다. 

 

a 태그를 해킹해라라는 의미이다.

 

그다음 onclick 이벤트를 볼 수 있다.

 

말그대로 마우스로 클릭하면 발생하는 이벤트이다.

 

아까 O를 마우스로 클릭해보자.

 

 

O에 마우스를 올리니 yOu라고 바뀌면서 오른쪽으로 이동한다.

 

마우스를 올리니 yOu라고 바뀌고 마우스를 밖으로 빼니 다시 O로 돌아왔다.

 

이런 행동을 하는 코드는 다음과 같다.

 

onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>

 

그럼 남은 코드는 다음과 같다.

 

onclick="this.style.left=parseInt(this.style.left,10)+1+'px';

if(this.style.left=='1600px')
  this.href='?go='+this.style.left"

 

클릭하면 +1px 만큼 움직이는것이다.

 

그리고 this.style.left 값이 1600px이 되면 this.href='?go='+this.style.left로

 

뭔지 모르지만 ..?go로 이동한다.

 

따라서 이번 문제의 목표는 this.style.left 값을 1600px로 바꿔주면되는것이다.

 


2. 문제 풀이


개발자도구(F12)로 변경해도되지만 나는 웹 프록시인 피들러(클릭)를 사용해볼것이다.

 

 

먼저 F12를 눌러 Capturing을 시작해준다.

 

그 후 서버에서 응답오는 Response 패킷을 변조 하기위해 Alt+F11을 눌러준다.

 

그 후 문제 사이트를 F5로 새로고침을 하면 다음과 같이 Response 값을 변조 할 수 있다.

 

 

원래 1인 값을 문제에 맞게 1600으로 변조시킨다.

 

변조 시킨후 Alt+C를 눌러 다시 브라우져에게 전달한다.

 

브라우저에게 전달 후 O를 클릭해보면 아래의 그림처럼 Goal안에 들어간다.

 

 

Goal안에 들어간 O에 마우스를 올리면 yOu로 바뀌면서

 

문제에서 정한 링크로 가면서 문제를 Clear할 수 있다.

 

 

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

12. old-12  (0) 2021.11.09
11. old-11  (0) 2021.11.09
9. old-09  (0) 2021.11.08
8. old-08  (0) 2021.11.05
7. old-07  (0) 2021.11.04
반응형

 


이번 9번 같은 문제는 상당히 이해하기가 어려울 수 있습니다.

개인적으로 의식의 흐름대로 정리한 결과이며 정리한 결과가 정답이 아닐 수 있습니다.

또한 다소 내용이 복잡할 수 있습니다.


 


1. 문제 설명


 

먼저 문제를 클릭해보자.

 

 

이렇게 숫자가 1,2,3이 나와있고 Password를 입력하는 폼이 있다.

 

1번을 눌러보자.

 

 

1번을 눌러보니 Apple이라는 문구를 볼 수 있다

 

역시 Password를 입력하는 폼이 있다.

 

그럼 2번을 눌러보자.

 

 

이번에는 Banana이다.

 

3번을 눌러보자

 

 

3번을 눌러보니 Secret이라는 문구와 함께

 

컬럼 id와 no이 있다고 알려준다.

 

또한 no 3's id is password이라는 문구가 주어진다.

 

해석이 맞는지는 모르겠지만 3번의 id는 패스워드라는 의미이다.

 

즉, 3번의 ID를 찾으면 그것이 Password이고 이게 이번 8번 문제에서의 원하는 값인것 같다.

 

일단 공격 할 수 있는 포인트는 다음과 같이 2곳이라고 생각했다.

  1. 숫자를 의미하는 no
  2. Password를 입력하는 곳

숫자를 의미하는 noURL에서 볼 수 있다.

  1. webhacking.kr/challenge/web-09/?no=1
  2. webhacking.kr/challenge/web-09/?no=2
  3. webhacking.kr/challenge/web-09/?no=3

nopassword싱글 쿼터(')를 입력해보았다.

 

no' 를 넣으면 다음과 같은 URL이 나온다.

  • webhacking.kr/challenge/web-09/?no=%27

Password에 ' 에 넣으면 다음과 같은 URL이 나온다.

  • webhacking.kr/challenge/web-09/index.php?pw=%27

 

하지만 pw싱글 쿼터를 넣으면 다시 redirect가 되지만 no싱글 쿼터를 입력하면 

 

다음과 같이 Access Denied이라는 문구를 볼 수 있다.

 

 

이로써 공격할 포인트는 password가 아니라 no이라는것을 알 수있다.

 

왜냐? 싱글 쿼터를 입력하였을때 Access Denied이 뜨는것은

 

SQLi를 방지하기 위해 필터링이 되었음을 보여주는것이다.

 

그렇다면 이 문제는 어떻게 풀어야할까?

 

먼저 no필터링이 안되는것을 살펴봐야한다.

 

또한 필터링에 걸리지 않은 SQL문을 가지고 no 3의 ID를 알아내면 이번 문제를 해결 할 수 있을것 같다.

 

하지만 어떤것이 필터링이 된건지 이전의 문제처럼 소스 코드를 볼 수있는곳이 없다.

 

따라서 하나하나 넣어보면서 반응을 봐야한다.

  • 필터링: ', or, ||, and, &&, 공백(%20,%0a), >, <, =, from, select

몇 번 시도하니 위에 처럼 정리가 되었는데 일단 SQLi 문제를 풀때 공백과 from, select가 필터링 되면

 

SQLi를 작성하기 거의 힘들다. 

 

따라서 이문제를 풀기위해서는 경험상 블라인드 SQLi를 이용해야한다.

 

따라서 바이패스 되는 문자는 공백이 당연히 안되니

 

공백을 대신할 수 있는 괄호가 필수적으로 필요할것이다.

 

no에 괄호를 넣어보자.

 

Access Denied는 뜨지 않는다.

 

즉, 괄호를 활용 할 수 있다.


또한 selectfrom을 넣을 수 없다.

 

따라서 ascii 함수와 substr를 활용해서 3에 대한 ID 값 한글자씩 뽑아야한다.

 

따라서 ascii 함수도 필터링 되어있는지 보자.

 

webhacking.kr/challenge/web-09/?no=ascii

 

  • 필터링: ', or, ||, and, 공백(%20,%0a), >, <, =, from, select, ascii

ascii 함수가 필터링 되어 있다면 substr로 뽑아야한다.

 

substr를 넣어보자.

 

Access Denied가 뜨지 않는다.

 

따라서 substr은 사용할 수 있다는 의미이다.

 

substr로 함께 쓰이는 함수는 항상 if문이다. (substr 설명 클릭)

 

if문은 if(조건, , 거짓)이다.

 

if문안에 조건문을 실행하였을때 참이면

 

if문의 두번째 인자인 , 거짓이면 if문의 세번째 인자인 거짓을 반환한다.

 

예를들어, if(1+1=2, 1,0)이면 조건문에 1+1=2이므로 참이되어 1이 반환되는 의미이다. 

 

그렇다면 if문을 활용해서 어떻게 블라인드 SQLi를 수행할까?

 

위에서 설명하였듯이 if문과 substr를 사용할 수 있다고 하였다.

 

if(substr(id,1,1)=id의 첫번째 hex값, 1,2)

 

이렇게 작성해보았다.

 

위에 페이로드를 조금 풀어서 설명하면 substr 함수로 id의 첫번째 글자 1개를 가져온다는 의미이다.

 

그게 id 첫번째의 hex값이 만약 a(0x61)이면 1이 반환이 되고 a가 아니면 2를 의미한다.

 

즉 1이 반환되면 Apple이라는 문구를 볼 수 있을것이고 2가 반환되면 Banana를 볼 수 있다.

 

넣어보자.

 

webhacking.kr/challenge/web-09/?no=if(substr(id,1,1)=0x61,1,2)

 

Access Denied가 뜬다.

 

그렇다면 여기서 =이 필터링 되어있다는것도 알 수 있다.

 

따라서 =를 대신할 수있는 likein을 넣어보자.

 

like를 먼저 넣어보자.

 

webhacking.kr/challenge/web-09/?no=if(substr(id,1,1)like(0x61),1,2

 

 

????

 

Apple이 보인다.

 

그럼 id의 첫번째 값이 a라는 소리인데 혹시 잘못 생각할 수도있으니 

 

webhacking.kr/challenge/web-09/?no=if(substr(id,1,1)like(0x62),1,2)

 

a가 아닌 b를 넣어보자.

 

Apple이라는 문구가 없다.

 

따라서 블라인드 SQLi가 먹혔다.

 

이걸 가지고 이제 문제를 풀어보자!


2. 문제 풀이


위의 문제 설명에서 substr, if, like 또는 in을 사용 할 수 있는것을 확인하였다.

 

substr로 문자를 뽑아 내기 위해서는 3번의 id의 전체 길이를 알아야한다.

 

그래서 코드를 작성해보았다.

webhacking.kr/challenge/web-09/?no=if(length(id)like(5),1,2)일 때는

 

위의 실행 결과 처럼 ID의 길이가 5자리라고 나온다.

 

ID의 자리가 5자리면 'Apple'이다.

 

우리가 원하는 ID값은 no의 값이 3번일때이다.

 

그렇다면 webhacking.kr/challenge/web-09/?no=if(length(id)like(6),2,1) 일때는

 

길이가 6일때는 Banana이니깐 참이다.

 

따라서 if문에서는 참인 결과인 2가 반환되고 no에는 2가 들어가기때문에 Banana 문구가 나와야한다.

 

Apple이 나온다.

 

이게 뭘까?

 

왜 Apple이 나올까???

 

???????????????????????

 

위의 쿼리를 다시 보면 id의 길이가 6이면(banana)이면 참이니깐 2를 반환해서 Banana가 나와야한다.

 

테이블의 정보가 아래 처럼 있다고 가정하자.

 

 

그리고 밑에 쿼리문이 있다고 가정하자.

위의 쿼리문을 다시 해석하자면 id의 길이가 5이면 참인 1이 리턴될것이고

 

id의 길이가 5가 아니면 2리턴될것이다.

 

하지만 여기서 length(id),id의 길이 물었으나 어떤 no의 대한 id인지

 

정보가 없으니 no이 1에서 3까지 전부다 위의 쿼리를 실행하면서

 

조사할것이다라고 생각을 하였다.

 

그 후 다음과 같이 총 3개의 쿼리를 날려 보았다.

 

 

첫번째만 Apple이라는 문구가 나오고 나머지 2개의 쿼리에서는 어떠한 문구를 볼 수 없었다.

 

많은 생각에 걸쳐 다음과 같이 결론을 내렸다.

 

  1. 총 3개의 id에 대해서 조사를 진행한다.
  2. 그 중 첫번째 no이 1일때를 조사한다.
  3. no이 1일때의 id는 apple이다.
  4. 길이가 5자리이다.
  5. 따라서 if문의 최종적인 리턴값은 1이다.
  6. if문의 최종적인 리턴값인 1과 현재 no이 1일때 조사하고있으니 1=1이다.
  7. 1=1이니 최종적으로 true가 Apple이 반환된다.

다시 한번 예를들어 보자.

 

id의 길이가 6일때를 보자.

 

결과부터 보자면 다음과 같은 결과가 나온다.

 

 

아까 위에서 no이 1번에서 3번까지 있기 때문에 총 3번을 조사한다고 하였다.

 

no이 1일때를 살펴보자.

  1. no이 1일때를 보니 id값이 Apple로 총 id의 길이가 5이다.
  2. 따라서 id의 길이가 6인지를 판단했을때 이는 거짓이 되므로 if문의 거짓인 1이 리턴된다.
  3. if문의 최종적인 리턴값은 1, 또한 현재 테이블에서 조사하고 있는 no이 1이다.
  4. if문의 최종적인 리턴값 1과 현재 조사하고있는 no의 1이 같으니 1=1이다.
  5. 따라서 1=1이기 때문에 결과적으로 True니 Apple이 나온다.

no이 2일때를 살펴보자.

  1. no이 2일때를 보니 id값이 Banana로 총 id의 길이가 6이다.
  2. 따라서 id의 길이가 6인지를 판단했을때 이는 참이 되므로 if문의 참인 2가 리턴된다.
  3. if문의 최종적인 리턴값은 2, 따라서 no=2로 들어가기 때문에 no이 2인 Banana가 리턴된다.
  4. if문의 최종적인 리턴값 2과 Banana의 no이 2로 같다.

따라서 2=2이기 때문에 결과적으로 True니 Bananna이 나온다.

no이 3일때를 살펴보자.

  1. no이 3일때를 보니 id값이 ????로 총 id의 길이가 ????이다.
  2. 따라서 id의 길이가 6인지를 판단했을때 이는 거짓이 되므로 if문의 거짓인 1이 리턴된다.
  3. if문의 최종적인 리턴값은 1, 따라서 no=1로 들어가기 때문에 no이 1인 Apple이 리턴된다.
  4. if문의 최종적인 리턴값 1과 3번의 id값인 ?????이 같지 않다.
  5. 따라서 1=3이 아니기 때문에 결과적으로 false이니 무시된다.

 

이렇게 총 3번을 돌면서 판단하는데 제일 먼저 값이 나온 no이 1일때의 Apple이 출력되고

 

뒤의 Banana도 쿼리상 출력은 되었지만 첫번째 Apple만 출력되는것이다.

 

그렇다면 no이 3일때의 id의 길이를 구해보자.

 

앞에서 한 방식 그대로 적용하기 위해 아래처럼 쿼리를 작성하였다.

 

이렇게 no이 3일때의 길이가 1에서부터 증가해서 만약 20까지 범위를 주었다면

 

20까지 증가하면서 no이 3일때의 길이가 맞을때 Secret이라는 문구를 볼 수 있다면

 

그것이 no 3의 길이라고 생각하고 코드를 작성하였다.

 

코드를 작성하고 결과 값을 보니깐 다음과 같았다.

 

 

위의 결과를 보면 id의 길이가 5일때 빼고는 나머지가 다 Apple이 나왔다.

 

왜 이렇게 나온지 살펴보자.

 

길이가 1일때 - if(length(id)like(1),3,1)

  1. 길이가 1인것은 테이블에 존재하지 않는다.
  2. 존재하지 않기 때문에 if문에서는 거짓인 1이 리턴된다.
  3. if문의 최종적인 리턴값은 1
  4. if문의 최종적인 리턴값 1과 no이 1인 경우는 Apple이다.
  5. Apple의 no은 1이다.
  6. if문의 최종적인 리턴값과 5번의 no을 비교했을때 같다.
  7. 따라서 Apple이 나온다.

길이가 5일때 - if(length(id)like(5),3,1)

  1. 길이가 5인것을 no이 1~3까지 순차적으로 조사한다.
  2. no이 1일때의 id의 길이를 보니 Apple로 총 5자리이다.
  3. if문에서 length(5)를 물었기 때문에 참이므로 if문의 참인 3을 반환한다.
  4. if문의 최종적인 리턴값은 3이다.
  5. if문의 최종적인 리턴값은 3이지만 현재 검색하는 no은 1일때이다.
  6. 리턴값과 현재 조사한 no이 다르기 때문에 값이 나오지 않는다.

길이가 6일때 - if(length(id)like(6),3,1)

  1. 길이가 6인것을 no이 1~3까지 순차적으로 조사한다.
  2. no이 1일때의 id의 길이를 보니 Apple로 총 5자리이다.
  3. if문에서 length(6)를 물었기 때문에 거짓이므로 if문의 거짓인 1을 반환한다.
  4. if문의 최종적인 리턴값은 1이다.
  5. if문의 최종적인 리턴값은 1이고 현재 검색하는 no은 1이다.
  6. 리턴값과 현재 조사한 no이 같기 때문에 값이 Apple이 나온다.
  7. no이 1일때가 끝나고 no이 2로 넘어간다.
  8. no이 2일때 id의 길이를 보니 Banana로 총 6자리이다.
  9. if문에서 length(6)를 물었기 때문에 참이므로 if문의 참인 3을 반환한다.
  10. if문의 최종적인 리턴값은 3이다.
  11. if문의 최종적인 리턴값은 3이고 현재 검색하는 no은 2이다.
  12. 리턴값과 현재 조사한 no이 다르기 때문에 값이 나오지 않는다.

여기까지 보고 느낀점은

 

no이 3일때의 id의 길이와 값을 구하기 위해서는 if문의 참일때에는 3이 들어가야하고

 

거짓을때는 1,2가 아닌 다른 숫자를 써야한다는것이다.

 

왜냐하면 이 이유는 위에 과정을 보면 알 수 있다.

 

따라서 0과 또는 4이상의 숫자를 아무 숫자나 입력하면 된다.

 

4를 넣어서 다시 코드를 돌려보자.

 

 

id의 길이가 11일때 no이 3일때 볼 수있었던 Secret이 나온다.

 

이는 위의 과정처럼 혼자서 생각해보자!

 

끝으로 이제 문제를 해결 할 수 있을것 같다.

 

substr을 활용해서 no이 3일때 id의 길이가 11자인 값을 뽑아내보자.

 

나온 결과를 Password 입력에 입력해보자.

 

하지만 안된다.

 

조금만 다시 생각해보니 MYSQL은 소문자 대문자를 구별하지 않는다.

 

따라서 다시 소문자로 바꿔서 입력해보니 Clear 되었다.

 

 

참 설명이 지저분하고 어렵다.

 

하지만 이렇게 하나 하나 풀어서 설명하는 곳이 잘 없어서 혼자 이해하는데 힘들었다.

 

이렇게 이해한것도 틀린거일 수도 있다.

 

지금까지 9문제를 풀었는데 가장 이해하기 어려웠던 문제인것 같다.

반응형

'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

11. old-11  (0) 2021.11.09
10. old-10  (0) 2021.11.08
8. old-08  (0) 2021.11.05
7. old-07  (0) 2021.11.04
6. old-06  (0) 2021.11.03
반응형

모의해킹을 하다보면 JEB분석 툴을 사용하기 위해서는 자바가 필수적으로 필요하다.

 

따라서 진단 및 분석을 위해서는 자바를 꼭 설치해줘야한다.

 

또한 JDKJRE 아무꺼나 설치해도 상관없다.

 

하지만 JRE는 꼭있어야하니 JRE를 설치해보자.

 

설치를 해보자.

 

일단 공식 홈페이지에 가서 다운로드를 받아준다. (클릭)

 

그 후 Java SE Runtime Environment 항목에서

 

jre-8u281-windows-x64.exe를 검색해서 다운로드 받아주자.

 

 

다운로드된 파일을 실행하자.

 

실행한 후 대상 폴더 변경을 원하는 폴더에 변경해도되고 그냥 설치를 눌러 설치를 진행해도된다.

 

 

그렇게 쭉 설치를 완료하자.

 

완료 한 후 자바를 사용하기위해서는 환경변수를 등록을 해줘야한다.

 

환경변수를 등록하는 방법은 다음과 같다.

 

시스템 속성-환경변수를 클릭한다.

 

환경변수를 클릭한 후 시스템 변수Path를 찾아 더블클릭을 해준다.

 

 

그 후 새로 만들기를 눌러 자바가 설치된 경로를 적어준다.

 

꼭 bin까지 적어줘야한다.

 

 

그 후 확인을 누르면 환경변수 설정은 끝났다.

 

잘 실행되는지 보자.

 

cmd창에 java라고 입력하면 자바가 실행된다.

반응형

+ Recent posts