$getenv(REMOTE_ADDR) : 접속자 IP Address


$getenv(HTTP_USER_AGENT) : 접속자 브라우저 정보

'함수들' 카테고리의 다른 글

strtolower()함수  (0) 2018.01.10
trim()함수  (0) 2018.01.10
alert()함수  (0) 2018.01.08
@file함수  (0) 2018.01.04
fwrite함수  (0) 2018.01.04


Oracle Padding Attack


oracle padding attack에서 오라클은 흔히 알려진 데이터베이스의 이름으로 쓰여진 것이 아니라 "응답에 대한 판독" 과 같은 뜻으로 쓰였다.

즉 padding이 올바르게 되었는지 여부에 따라 서버의 응답이 다르기 때문에 이것을 이용한 공격을 말한다.

흔히들 알고있는 것 처럼 padding이란 블록암호화에서 모자른 부분들, 즉 틀에서 채우고 남은 부분을 채워주는 것을 말한다.

그 예로,


EX 1을 보면 평문이 3바이트 일 경우 나머지 5바이트를 패딩(0X05)로 채우고 있다.

EX 2 또한 평문이 BANANA인 6바이트 일 경우 나머지 2바이트를 패딩 (0X02)로 채우고 있다.

EX 4인 8바이트 일 경우 나머지 8바이트를 padding으로 채운다는 것이 중요하다.

즉 모든 블록암호화에서는 적어도 한 바이트 이상의 패딩이 들어간다는 것을 알 수 있다.


여기서 CBC모드를 알아야 하는데 CBC란 (Cipher-Block Chaining)의 약자로 서로 엮여 있는 암호 블록이라는 의미이다.


그 예를 그림으로 보자.


위의 그림은 CBC방식으로 암호화 하는 방법이다.


위의 그림은 CBC방법으로 복호화 하는 방법이다.

위의 그림들과 같이 암호화,복호화시 첫 블록의 암호화 값이 두번째 블록에 영향을 미친다.

그리고 첫번째 블록을 암호화 복호화 할 때에는 IV(이니셜 벡터)가 암호문 대신 사용되는 것을 볼 수 있다.



서버응답의 종류


패딩 오라클 공격을 성공하기 위해서는 서버의 응답을 구별하는 능력이 필수적이다.

예로 CBC모드의 블록 암호화를 사용하는 어플리케이션에 조작된 암호문 값을 입력 하였을 경우 서버는 각기 다른 반응을 보이게 된다.


1. 어플리케이션에서 올바른 암호화 값을 받았을 경우(200 OK)

2. 어플리케이션에서 패딩이 올바르지 않은 암호문을 받았을 경우(500 Internal Server Error)

3.어플리케이션에서 패딩은 올바르나 잘못된 암호문을 받았을 경우(암호화된 값을 평문으로 복호화 하였더니 잘못된 값이 있을 경우)

(200 OK - 커스텀 에러 메시지)


위의 3가지 반응을 통해 우리는 암호문의 패딩이 올바른지, 올바르지 않은지에 대해 알수있다.



그 예로 암호분이 7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 라고 예를 들어 보자.

해당 암호문은 다음과 같이 총 3개의 블록으로 나누어 진다.


여기서 첫번째 블록은 이니셜 벡터로 사용되며 나머지 두개의 블록이 평문에 대한 암호문으로 사용되는 것을 볼 수 있다.

여기서 이를 순서대로 IV, 암호문1, 암호문2 로 명명한다.

다음은 평문을 암호화 하는 과정이다.

위의 그림과 같이 IV값에 평문을 XOR하여 Intermediary 값을 만들고 이를 3DES로 암호화 하여 암호문 1이 생성된다.

또한 이때 생성된 암호문1과 나머지 평문(평문+패딩)을 XOR 하여 Intermediary값을 생성한 후 이를 3DES로 암호화 하여

암호문 2를 얻는다. 즉, 암호문은 IV + 암호문1 + 암호문2로 구성된다.

\

이번에는 반대로 복호화 하는 과정이다.

암호문1을 3DES 복호화 한 뒤 나온 Intermediary값을 IV와 XOR 하여 평문 1을 얻었다.

그리고 암호문2를 3DES 복호화 한 뒤 나온 Intermediary 값을 암호문 1 과 XOR하여 평문 2를 얻는다.


이제 패딩 오라클 공격을 통해 암호화된 값을 복호화 하는 방법에 대해 알아 보자.

위에서 사용한 암호문 7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6에서

IV + 암호문1 만 사용하여 7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 까지만 사용하겠다.

먼저, 다음과 같이 IV값을 0으로 채운 암호문을 서버에 전송해보자.


요청 : http://sampleapp/home.jsp?UID=0000000000000000F851D6CC68FC9537858795A28ED4AAC6

응답 : 500 - Internal Server Error

위의 요청에 대한 응답이 500 에러가 뜬다.

왜 그런걸까?


암호문 1을 3DES 복호화 한 뒤 나온 Intermediary 값과 IV 값(0으로 채운) 을 XOR 하여 나온 평문의 마지막 바이트가 올바르지 않은 패딩 값이 되어 에러가 나온 것 이다.

왜냐하면 패딩은 0X01 ~ 0X08 까지 범위이며 해당 수 만큼의 개수가 와야 하기 때문이다.(0X01이면 1개, 0X08이면 8개)

즉, 0X3D는 올바르지 않은 패딩 값으로 인식하여 에러가 나온 것 이다.


이제 패딩이 1개 일 경우를 가정하여, IV의 마지막 바이트를 0X00부터 0XFF 까지 브루트포싱으로 200 OK 응답이 나오는 부분을 확인해 보자

요청 : http://sampleapp/home.jsp?UID=00000000000000003CF851D6CC8FC9537

응답 : 200 OK


IV의 마지막 바이트가 0X3C일 때 패딩이 0X01이 되어 올바른 패딩으로 인식 되었다.

이로써 우리는 결론이 나온다.


[Intermediary 값] ^ 0x3C == 0X01 이므로

[Intermediary 값] == 0x3C ^ 0x01 

그러므로 [Intermediary 값] == 0x3D

패딩에 대한 서버의 반응을 통해 8번째 [Intermediary 바이트 값]을 알아낸다.


이제 패딩이 2개일 경우를 가정해 IV의 7번째 바이트를 0X00~0XFF까지 브루트포싱 해보자.

이때 주의할 점은 IV의 8번째 바이트는 0X3D ^ 0X02 == 0X3F가 된다는 점이다.

서버응답이 200 OK일 때, IV의 값을 살펴 보면 0X0000000000000000243F가 되게 된다.

이로써 7번째 Intermediary 값을 알 수 있게 되었다.

(0x24 ^ 0x02 == 0x26)


이렇게 계속 한바이트씩 브루트 포싱으로 결과를 뽑아내면 된다.

그렇다면 이렇게 Intermediary값을 모두 획득 가능하다. Intermediary값을 모두 획득한다면 암호화 과정에서 최초의 IV 값과 평문을 XOR 하여

Intermediary 값을 생성하게 되는데 이미 Intermediary 값을 알고 있고 IV값도 알고 있기 때문에 그 뒤 작업이 가능하다.

그러므로 획득한 Intermediary 값들과 최초의 IV값을 XOR 하면 평문을 얻을 수 있다.


평문을 조작하여 암호화 하려면 

(원래 평문) XOR (IV) == ( Intermediary 값) 이 되고

(Intermediary) XOR (조작한 평문) == (조작된 IV값) 이 나오기 떄문이다.

즉, (원래 평문) ^ (IV) ^ (조작한 평문) 을 하게 되면, 조작된 IV값이 나오게 되어, 이 조작된 IV값으로 암호문을 복호화 하게 되면 조작한 평문이 나오게 된다.



출처 및 참고:

http://netifera.com/research/poet/PaddingOracleBHEU10.pdf

http://blog.gdssecurity.com/labs/2010/9/14/automated-padding-oracle-attack-with-padbuster.html

http://www.troyhunt.com/2010/09/fear-uncertainty-and-padding-oracle.html

laughfool.tistory.com/attachment/cfile7.uf@135D7C3F4F799B14313DAA.pdf



'Hacking' 카테고리의 다른 글

File Inclusion Attacks  (0) 2018.02.01
Oracle Padding Attack[실전편]  (0) 2018.01.31
XSS(Cross Site Scripting)  (0) 2018.01.15
error based sql injection  (0) 2017.09.18

개인적으로 가장 배점이 이해안되는 쉬운문제!

$pat = "/[1-3][a-f]{5}_.*127.0.0.1.*\tp\ta\ts\ts/"

이고

$pat과 $_GET[val]이 같으면

성공하는 문제이다.

127.0.0.1은 실제로 없고 거기에 자신의 아이피가  존재할 것이다.

저 정규표현식을 아무렇게나 맞춰만 주고

주소 창에 get 방식으로

?val=답 을 써주면 된다.

나는

/111aaaaa_.127.0.0.1.%09p%09a%09s%09s/로

답을 적었다.

여기서 tab이 주소창에서 안쳐지기 때문에 그냥 url코드로 집어 넣으면 된다.


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

Webhacking.kr 7번  (0) 2018.01.11
Webhacking.kr 8번  (0) 2018.01.10
Webhacking.kr 3번  (0) 2018.01.09
Webhacking.kr 5번  (0) 2018.01.08
Webhacking.kr 23번  (0) 2018.01.08

 정규표현식

표현 

설명 

^x 

문자열이 x로 시작 

 $

x$ 

문자열이 x로 종료 

 .

.x 

임의의 한 문자 표현 

x+ 

x가 한번이상 반복 

x? 

x가 존재하거나 존재하지 않음 

x* 

x가 0번이상 반복 

x|y 

x 또는 y 찾기 

() 

(x) 

()안의 내용을 그룹화 

{n} 

x{n} 

x를 n번 반복한 문자를 찾기 

{n,} 

x{n,} 

x를 n번이상 반복한 문자를 찾기 

{n,m}

x{n,m} 

x를 n번이상 m번이하 반복한 문자를 찾기 

[] 

[x,y] 

x,y중 하나를 찾기 

[^] 

[^xy] 

x,y를 제외하고 문자를 하나 찾기 

[-] 

[x-y] 

x에서 y 사이의 문자를 찾기 


 \b

문자와 공백사이의 문자찾기 

\B 

문자와 공백사이가 아닌 값을 찾기 

\d 

 숫자 찾기 

\D 

숫자가 아닌 값을 찾기 

\s 

공백문자를 찾기 

\S 

공백이 아닌 문자를 찾기 

\t 

Tab 문자 찾기 

\w 

알파벳 + 숫자 + _ 를 찾기 

\W 

알파벳 + 숫자 + _ 를 제외한 모든 문자 찾기

.혹은 []등 특수한목적으로 사용되는 메타 문자를 문자열에서 찾을 대 메타문자를 문자 그대로 사용 할 수 있도록 변환


'컴퓨터 관련 정보' 카테고리의 다른 글

idapython 7.4 바뀐 API 비교 목록  (1) 2019.12.03
ESP, EBP  (0) 2018.04.16
Google검색  (0) 2017.12.28
Ascii 코드표  (0) 2017.09.23
url code 표  (0) 2017.09.18

이제는 퍼즐을 풀라고 한다...

우선 소스를 보면 

숫자들로 둘러쌓인 5x5의 칸들은

클릭하면 검정색을 바뀌고 다시 클릭하면 흰색으로 바뀐다.

이때 검정색은 value값이 1 흰색은 0으로 바뀌고

_answer이라는 hidden값은 그 값들을 받아서

submit해준다.

일단은 아무렇게나 클릭하면 안풀려서

퍼즐 자체를 풀어야 할 것 같다.

퍼즐은 그 줄에 몇개의 검정색이 들어가야 하는지에 대해서

말해주고 있다.

실제로 여러가지 나오는것 같던데 

막 하다보면 

이 페이지로 넘어간다.

여기서 내 아이디를 write해보니

올라간다.

값은 내가 입력한 name과

answer, 그리고 내 ip가 나온다.

answer은 보니 아까 푼 퍼즐을 1과0으로 나열해 놓은 값으로 보인다.


문제를 풀었는데 답을 안주니

다시 name을 admin으로 만들어 보았다.

근데 만들어는 지는데 변화는 없다.

그래서 answer를 바꾸어 보았지만

달리 변화는 없다.


그래서 burp suite로 intercept해보니

answer값과 id값을 &로 받는다.

그래서 answer값을 1010100000011100101011111 or 1로 넘겨보면


막혀있다.

그래서 1010100000011100101011111 || 1을 넘겨주면

답이 나온다!

3번도 클리어!


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

Webhacking.kr 8번  (0) 2018.01.10
Webhacking.kr 11번  (0) 2018.01.09
Webhacking.kr 5번  (0) 2018.01.08
Webhacking.kr 23번  (0) 2018.01.08
Webhacking.kr 33번  (0) 2018.01.05

첫 화면은 꺼멓다....

먼저 join을 눌러보니 들어갈 수 가 없다..

그래서 login을 눌러서 들어가서

아무렇게나 넣고 login해보니

admin만 로그인이 되는것 같다.


그래서 admin을 id로 password는 아무렇게나 하니 

패스워드 오류가 뜬다.

그런데

주소를 보면 mem이 있어서 들어가 보았다.

힌트라고 써져있다!


여기서 join.php를 들어가니

까맣다...

그래서 소스를 보니 이렇게 난독화가 되어있다.


이렇게 난독화 되어있는 소스를 치환해보면 이런 소스가 나와있는데

쿠키를 oldzombie로 만들어주고

주소창뒤에 ?mode=1을 넣으라고 되어있다.

쿠키를 만들고

주소창에 mode=1 을 넣어주면!

이런 가입창이 뜬다!!

여기다 admin으로 가입하려고 하니

이미 있다고 한다.


소스를 보니 maxlength가 5로 되어있는 것을 10으로 바꾸어 주고

admin뒤에 null값을 넣어주니

가입이 된다!



그렇게 로그인을 해보니

엥?

안된다...




다시 admin뒤에

그냥 띄워쓰기를 하고 

가입후

로그인 하니

5번도 클리어!


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

Webhacking.kr 11번  (0) 2018.01.09
Webhacking.kr 3번  (0) 2018.01.09
Webhacking.kr 23번  (0) 2018.01.08
Webhacking.kr 33번  (0) 2018.01.05
Webhacking.kr 59번  (0) 2018.01.03

injection이라 적힌 것 으로 봐서는 sql injection문제가 아닐까 싶다.

우선 <script>alert(1)</script>를 넣어야 풀리는 문제인 것 같다.

그래서 al을 넣어봤더니 막혀있다.

그래서 a와 l사이에 URL코드로 %09를 넣으니 적혀진다!

그래서 전체를 다 넣으니 완성은 되는데 띄워쓰기가 되어 버린다...

그렇다면 %00을 넣어보니 띄어쓰기도 생기지 않는다!!!!

다 쳐서 넣어보니 완성!!!

23번은 가볍게 클리어!


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

Webhacking.kr 3번  (0) 2018.01.09
Webhacking.kr 5번  (0) 2018.01.08
Webhacking.kr 33번  (0) 2018.01.05
Webhacking.kr 59번  (0) 2018.01.03
Webhacking.kr 58번  (0) 2018.01.03

alert(띄우고 싶은 말)


어떤 창에다 글을 적어서 띄우고 싶을때 사용가능한 함수


예)

alert("Hello! I am an alert box!!");



'함수들' 카테고리의 다른 글

trim()함수  (0) 2018.01.10
getenv()함수  (0) 2018.01.10
@file함수  (0) 2018.01.04
fwrite함수  (0) 2018.01.04
fopen함수  (0) 2018.01.04

+ Recent posts