1. Proxy 서버란?

 

 

   -> 컴퓨터 네트워크에서 다른 서버 상의 자원을 찾는 클라이언트로부터 요청을 받아 중계하는 서버이다

   -> 클라이언트와 서버 사이에 있는 '대리인' 이다.

   -> 요청된 내용들을 캐시를 이용하여 저장한다. -> 전송시간 절약

 

 

 

다음 사진과 같이 Client가 request를 Server에게 전달하고,

Server가 response를 Client에게 전달하는 과정에 Proxy서버가 대리인 역할을 해줌으로써,

Proxy 서버 안에 전달된 정보들이 담겨져있게 된다.

 

 

2. 프록시 서버의 역할

 

 

   1) 프록시 서버 측에서 위험이 예상되는 웹 콘텐츠 및 악성코드 필터링이 가능하다.

       -> 클라이언트 측의 보안 향상

 

   2) 내부 통신과 외부 데이터 접근을 통제 할 수 있다.

       -> ex) 원치 않는 사이트 차단

 

   3) 자신의 IP 기록이 남지 않게 할 수 있다.

 

   4) 보안 및 통제를 뚫고 나가기 위해 차단 우회가 가능하다.

       -> 이 점을 악용하는 사람들이 많기 때문에, 많은 사이트에서 프록시 IP 차단

 

 

 

3. 프록시 패킷 접근, 조작

 

 

   1) Proxy 서버 생성

 

 

위에 사진과 같이 Proxy서버 생성을 하는 툴을 이용해도 되지만,

인터넷에서 '인터넷옵션 -> 연결 -> LAN 설정' 을 통해서도 Proxy서버를 생성 할 수 있다.

여기서, Host에 '127.0.0.1' 은 시스템 자기 자신을 의미하는 루프 백(loop back) 주소이다.

 

다음과 같이 proxy server를 생성한 뒤, 'on' 상태로 만들면 웹 프록시 툴을 사용 할 수 있다.

 

 

 

   2) 웹 프록시 툴을 이용해 프록시 패킷에 접근

 

다음 툴은 'burp suite' 라고 하는 툴인데, 대표적인 웹 프록시 툴이다.

이 툴을 이용하여 프록시 서버에 담긴 데이터들(파라미터, 헤더 등등)을 조작 할 수 있다.

 

이 툴을 'on'상태로 하려면 'intercept is off'를 눌러 'intercept is on' 상태로 만들어준다.

그런 상태에서 여러 조작들을 한 뒤 'Forward'를 누르면 조작된 정보가 서버로 전송이 된다.

'intercept is on'을 다시 누르면 'intercept is off' 상태가 되는 데,

이때는 패킷에 담긴 데이터를 확인하지 않은 채 바로 전송이 된다.

 

데이터를 조작하는 방식은 여러가지이다.

다음과 같은 화면에서 바로 조작해도 되지만,

'Action'을 누르면 여러 카테고리들로 보낼 수 있다.

 

개인적으로 데이터 조작에 활용하기 편하고 간편해서 'intruder'랑 'repeater'를 자주 쓴다.

그래서 예시로 intruder와 repeater를 설명하고자 한다.

 

 

 

예를 들어, intruder의 경우,

 

'Action'에서 'send to intruder'를 클릭하고 'intruder' 카테고리를 클릭하면,

다음과 같이 조작할 값들을 선택 하도록 나와있다.

조작하고 싶은 값들을 클릭 한 뒤 Payloads를 클릭하면

 

 

 

 

이런 화면이 나온다.

'Payload type' 에서 선택한 값들을 어떤 형식으로 조작 할 것인지 선택 할 수 있다.

(예를 들어서, 영문자 2개 숫자 2개의 조합으로 설정이 되면 영문자 2개 숫자 2개인 모든 조합을 값에 넣어서 실행을 시킬 수 있는 type이 있다.

aa00부터 .... zz99까지 ....

하지만 경우의 수가 너무 많은 규칙들은 그만큼 시간이 엄청 많이 걸린다.)

 

지금 선택되어 있는 건 'Simple list' 인데, 사용자가 원하는 값들을 넣은 뒤 'Add'를 누르면 그 원하는 값들을 다 조작하고 싶은 값에 넣는다.

그러고 (사진엔 짤렸지만) 오른쪽 위에 'start to attack' 버튼을 누르면 실행이 된다.

 

예를 들어서, 'a, b, v, d, f, e' 의 값을 'Add'를 눌러 다음과 같이 집어넣게 되면,

전 사진에 나와있는 화면에서 선택된 test의 값과 PHPSESSID의 값에 'a, b, v, d, f, e' 라는 값들을 넣어준 뒤 서버의 결과를 보여준다.

 

 

 

이렇게!!!

 

 

 'repeater' 의 경우,

 

'Action' 을 눌러 'send to repeater'를 누른 뒤 'repeater' 카테고리를 클릭하면,

다음과 같은 화면이 나온다.

 

 

 

'Request' 라고 써진 화면 아래는 데이터가 repeater에 send가 된 상태이다.

여기서 값들을 조작하고 싶은 대로 조작을 한 뒤, 'Go' 를 누르면 'Response' 라고 써진 화면 아래에서

조작 된 후에 조작된 데이터를 서버에다 전송하면 결과가 어떻게 나올지를 미리 볼 수 있다.

 

 

이 외에도 데이터를 조작 하는 데에는 많은 방식들이 있다.

 

이렇게 프록시 서버를 생성하고 웹 프록시 툴을 사용하면서 프록시 패킷에 접근하여 데이터 조작을 할 수 있다.

그러므로, 해킹을 할 때에도(예 : SQL Injection 등) 활용이 가능하다.

 

 

 

 

 

4. proxy 서버 조작 활용 - SQL Injection (webhacking 3)

 

 

 

 

 

webhacking 3번에서 로직을 풀면 다음과 같은 칸이 나온다.

 

일단 값을 모르니까 아무 값이나 쳐보자.

 

 

 

다음과 같이 빈 칸에 기입한 글자들이 결과 값으로 화면에 나온다.

 

 

 

다음 사진에서 Payload는 answer와 id의 값을 나타낸 것이다.

여기서 answer의 원래 정해진 값이 '1010100000011100101011111' 이었으나, 값을 '1'이라고 해도

결과 값으로 나오게 되었다.

이것을 보고 answer의 값을 injection하면 된다는 것을 알았다.

 

 

 

 

answer의 값을 저런식으로 바꿔주면 풀리는 문제로 추측이 가능하다.

 

 

 

그런데 answer의 값을 저렇게 바꿔주니까 no hack이라는 문구가 나왔다.

그래서 필터링을 우회하기 위해 or 대신 ||를 써주면 된다.

 

 

 

 

 

 

 

 

 

created by 사실산타는없거든A

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

Proxy 서버와 조작  (0) 2017.12.18
페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25

XSS는 웹 브라우저에서 동작하는 악의적인 스크립트이다. 일반적으로 사용자의 개인정보, 쿠키탈취등을 한다.

 

대부분 XSS취약점을 진단하고자 할 때 <script>alert(1)</script> 와 같은 형태로 공격구문을 넣는다.

 

이를 우회하는 방법에는 여러가지가 있다.

 

 

1. 대소문자를 구분하는 함수를 이용해 보안을 해 놓았을 경우

 

공격 코드 : ex) <ScripT>alert(1)</SCRipT>

 

  

 

2. 금지어의 값을 Null 처리하는 함수를 이용해 보안을 해 놓았을 경우

 

공격 코드 : ex) <sscriptcript>alert(1)</sscriptcript>

 

  

 

 

3. HTML 태그 속성을 이용한 우회

 

특정 문자열만을 치환하는 방식의 함수가 쓰였을 때에 onmouseover 옵션을 사용하여 우회할 수 있다.

 

<?
 function XSSFilter($inputString)
 {
  $content = str_replace("<","&lt;",$content);
  $content = str_replace(">","&gt;",$content);
  return $content;
 
?>                                                                       

 

위와 같은 코드가 있다고 가정하자. 위 코드는  '<'와  '>' 문자열에 대해서 필터링을 한다.  예를들어 ?file=<script>alert(1)</script>   와 같은 형태로 공격구문을 넣었을 때 필터링과정을 거쳐    &lt;script&gt;alert(1)&lt;/script&gt;  와 같이 출력될 것이다.

 

 

공격 코드 : ex) <img scr="hello" onmouseover="alert(1)l">

 

"hello"라는 이미지 파일에 마우스를 올려 놓았을 경우 스크립트가 실행된다.

 

 

  

 

4. 문자열 분리를 통한 우회


자바 스크립트의 eval 함수를 이용하여 우회한다.

여기서 eval 함수에 대해 짚고 넘어가겠다.

 

eval() 함수의 인자는 기본적으로 문자열이다. 만약 문자열이 표현식을 나타낸다면 eval()은 표현식을 실행하지만, 인자가 있는 경우에는 문장을 반환한다.

 

예를 들어 eval("1+2") 는 3을 반환하지만, eval(new String("2+2")); 는 "2+2" 인 문자열 객체를 반환한다.

이때 변수를 선언하고 그 변수에 객체를 저장한 다음 toString()을 사용하면 이 제약을 피할 수 있다.

ex) var A = new String("1+2");

    eval(A.toString());  => 3을 반환!

 

공격 코드 : var inputString="aler" + "t(al" + "ert" + "(1));" ;

               eval(inputString);

  

 

 

5. 연속된 문자열을 거부하는 함수 우회

 

ex) 웹해킹 23번

 

 

위와 같은 경우 문장의 종료를 나타내는 'null'값을 문자열 사이 사이에 url 인코딩하여 넣어주면 된다 (위의 경우에는 GET방식으로 입력받기 때문)

 

공격 코드 : <s%00c%00r%00i%00p%00t>%00a%00l%00e%00r%00t%00(1);</s%00c%00r%00i%00p%00t>

  

 

 

 

참조 사이트

 

https://msdn.microsoft.com/ko-kr/library/12k71sw7(v=vs.94).aspx

 

http://dntsecurity.blogspot.kr/2017/02/xss.html

 

 

 

 

- Created by subo0521 -

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

xss (Cross Site Scripting)  (0) 2017.12.04
error based sql injection  (0) 2017.09.18
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28

웹해킹공부를 하면서 가장 자주 보는 것 중 하나가 location.href인 거 같다.

쉬운 내용이지만 글쓴이처럼 헷갈려하는 분들을 위해 알게된 내용을 정리해보았다. ㅎㅎ


1. Location.href란??

현재 페이지의 url을 설정하거나 반환해주는 javascript의 속성으로 

대부분 페이지 이동 시에 자주 사용하는 거 같다.


2. 페이지 이동시 사용되는 location.href

Location.href="~~" 형태로 사용되며 

"~~"은 String type의 value가 들어오게 되며 ~~에는 파일의 경로가 들어간다.

파일의 경로로 인터넷의 url이 들어올 수 있고 서버안에 있는 파일의 경로가 들어올 수 있다.


1) 인터넷의 url 

location.href="https://www.google.co.kr" 라고 설정하면 현재 페이지의 주소창이 https://www.google.co.kr로 바뀌면서  구글로 페이지 이동을 하게 된다.


2) 서버안에 있는 파일의 경로 

상대 경로의 개념으로 현제 페이지의 코드파일이 있는 곳을 기준으로 경로를 지정한다.

설명을 쉽게 하기 위해 예시로 다음과 같은 서버내 파일들이 있다고 가정해보자.

  ① 같은 디렉토리 내의 파일로 이동하는 경우 

  index.html가 현재 페이지의 코드가 들어있는 파일이라는 가정하에 FileTwo로 이동하는 경우로 

  location.href="FileTwo" 라고 설정해주면 된다.

  같은 디렉토리 내의 파일이므로 파일이름만 써주면 된다. 

  그리고 주소창의 변화를 보면 다음과 같다.

    - 현재 페이지 : https://xxx.xxx.xxx.xxx/xxxx/i/index.html

    - 이동 후 페이지 : http://xxx.xxx.xxx.xxx/xxxx/i/FileTwo


  ② 하위 디렉토리 내의 파일로 이동하는 경우 

  index.html가 현재 페이지의 코드가 들어있는 파일이라는 가정하에 FileOne으로 이동하는 경우로 

  location.href="./haha/FileOne" 라고 설정해주면 된다.  

  하위 디렉토리 내의 파일이므로 해당 디렉토리이름을 써주고나서 파일이름을 써줘야한다. 

    - 현재 페이지 : https://xxx.xxx.xxx.xxx/xxxx/i/index.html

    - 이동 후 페이지 : http://xxx.xxx.xxx.xxx/xxxx/i/haha/FilOne


  ③ 상위 디렉토리 내의 파일로 이동하는 경우 

    FileOne이 현재 페이지의 코드가 들어있는 파일이라는 가정하에 FileTwo으로 이동하는 경우로 

    location.href="../FileTwo" 라고 설정해주면 된다.  

    ../ 은 현재 위치의 상위폴더를 의미한다. 만약 두단계 상위 폴더로 가고 싶다면 ../../ 

      - 현재 페이지 : http://xxx.xxx.xxx.xxx/xxxx/i/haha/FilOne

      - 이동 후 페이지 : http://xxx.xxx.xxx.xxx/xxxx/i/FileTwo


loction.href을 사용해서 어떻게 어디로 이동하는지에 대해 내용을 정리해 보았다.


이를 통해 우리는 역으로 location.href="~~"라는 코드를 보고 어디로 이동하지도 알 수 있을 것이다.

예를 들면 location.href="FileTwo" 라는 코드를 보고 기준 파일의 경로를 기준으로 같은 디렉토리내의 파일인 FileTwo로 이동하는 것을 알 수 있으며 기준 페이지의 url이  https://xxx.xxx.xxx.xxx/xxxx/i/index.html 였다면  http://xxx.xxx.xxx.xxx/xxxx/i/FileTwo로 이동하는 것 또한 알 수 있다.


Create by Gae Ko


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

Proxy 서버와 조작  (0) 2017.12.18
페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25

base64 개념

 

 

base64는 데이터를 64종류의 인쇄 가능한 숫자만을 이용하여 인코딩하는 방식으로, 그 외의 문자를 처리할 수 없는 통신 환경에서 멀티바이트 문자나 이진 데이터를 처리하는 것을 목적으로 한다. A-Z, a-z, 0-9까지의 62개 문자와 +, /의 2가지 기호가 사용되며, 남은 부분을 포장하기 위한 패딩(padding)을 위해 = 기호가 사용된다.

 

 

 

base64 인코딩 원리

 

 

1. 문자열을 ASCII의 십진수로 변경한다.
2. 십진수를 8bit에 맞춰서 이진수로 표현한다.
3. 수치를 6bit 단위로 자른다. 뒤에 부족한 부분은 6bit를 맞추기 위해 0으로 채워넣는다.
4. 6bit의 이진수를 십진수로 변환한다.
5. 십진수를 base64 table의 문자로 변경한다.
6. base64는 24bit 그룹 수를 가지기 때문에 총 bit의 수를 24의 배수에 맞추어야 한다. 남은 부분을 포장하기 위한 패딩(padding)을 위해 = 기호가 사용된다. 원 문자열의 비트수 %3만큼 = 기호를 붙여준다.

 

 

 

base64 인코딩 예시

 

 

원리만 적어놓으면 이해하기 힘든 부분도 있을 수 있으니, 'ARGOS'로 예시를 들어 base64 인코딩을 해보았다.

 

1. 문자열을 ASCII의 십진수로 변경한다.

위의 아스키코드 표를 통해 ARGOS를 십진수로 변경하면, 각각 65 82 71 79 83이 된다.

2. 십진수를 8bit에 맞춰서 이진수로 표현한다.

위에서 나온 65 82 71 79 83을 8bit에 맞춰서 이진수로 변경하면, 각각 01000001 01010010 01000111 01001111 01010011이 된다.

3. 수치를 6bit 단위로 자른다. 뒤에 부족한 부분은 6bit를 맞추기 위해 0으로 채워넣는다.

위에서 나온 01000001 01010010 01000111 01001111 01010011를 6bit 단위로 자르면, 각각 010000 010101 001001 000111 010011 110101 0011이 나온다. 뒤에 0011은 4bit밖에 되지 않으므로, 6bit를 맞추기 위해 0으로 채워넣는다. 즉, 010000 010101 001001 000111 010011 110101 001100이 된다.

4. 6bit의 이진수를 십진수로 변환한다.

위에서 나온 010000 010101 001001 000111 010011 110101 001100를 십진수로 변환한다. 각각 16 21 9 7 19 53 12이 된다.


5. 십진수를 base64 table의 문자로 변경한다.

위의 base64 table을 통해 위에서 나온 16 21 9 7 19 53 12을 문자로 변경한다. 각각 Q V J H T 1 M이 된다.

 

6. base64는 24bit 그룹 수를 가지기 때문에 총 bit의 수를 24의 배수에 맞추어야 한다. 남은 부분을 포장하기 위한 패딩(padding)을 위해 = 기호가 사용된다. 원 문자열의 비트수 %3만큼 = 기호를 붙여준다.

위의 Q V J H T 1 M은 42bit이므로, 24의 배수인 48bit에 맞추어 6bit를 패딩 한다. 즉, 원 문자열의 비트수인 40%3인 1만큼 뒤에 = 기호를 붙여준다. 즉, 결론적으로 ARGOS를 base64로 인코딩하면 QVJHT1M=가 나오게 된다. 확실성을 위하여 base64 인코딩 사이트에서 확인해보았다.

 

이를 표로 만들면 다음과 같다.

 

 

 

 

 

 

Create by harnag_25

 

 

 

참고

http://terms.naver.com/entry.nhn?docId=3440158&cid=40942&categoryId=32828

http://cattool.tistory.com/9

http://blog.naver.com/jae1zzang/220163588084

http://blog.naver.com/fjrzlgnlwns/220018324874

http://coderstoolbox.net/string/#!encoding=base64&action=encode&charset=us_ascii

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

Proxy 서버와 조작  (0) 2017.12.18
페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25

초보자가 java를 이용해 html파일을 작성할 때 모르는 용어가 많아 어려움이 생길 수가 있다.

다음 코드는 java를 이용해 작성한 html파일들이다.

 

그래서 이번에는 처음 접하는 사람들을 위한 가장 기본적인 자바스크립트용어들을 알아보려고 한다.

 

- document.바꾸고싶은 부분.innerHTML="B"   //바꾸고 싶은 부분을 B로 변경해 준다.

 

- function 이름(변수) { 함수내용 }   // 함수를 선언한다.

 

- Math.round     //반올림

- Math.ceil        //올림

- Math.floor      //버림

- Math.random()*a   //0~a까지의 수가 무작위로 나온다.

 

- x.charCodeAt(a)    //x안에 있는 a번째 문자를 유니코드로 변환한다.

 

- fromCharCode(아스키코드)   //아스키코드를 문자로 변환한다.

 

- onmouseenter
마우스 포인터가 요소 또는 자식 요소 안으로 들어올 때 발생하는 이벤트로,

한 번 들어오면 다시 나갔다 들어오지 않는 한 계속 발생하지 않는다.

 

 

 

 

 

- onmouseover
onmouseout 의 반대 개념으로,
마우스 포인터가 요소 안으로 들어올 때 + 자식 요소 출입시 발생하는 이벤트로,

해당 영역을 벗어나지 않아도 자식 요소에 들어가거나 나올 때 발생한다.

 

- onmouseout
onmouseover 의 반대 개념으로,
마우스 포인터가 요소 밖으로 나갈 때 + 자식 요소 출입시 발생하는 이벤트로,
요소 영역을 벗어나지 않아도 자식 요소에 들어가거나 나올 때 발생한다.

 

- onmousemove
마우스 포인터가 요소 또는 자식 요소 위에서 움직일 때 발생하는 이벤트로,
요소 위에서 마우스를 움직이면 계속 발생한다.

 

- indexOf(문자) //   해당 문자가 몇번쨰 글자에 있는지 찾아내고,

일치하는 값이 없으면 -1을 반환함.

 

- substr
 + (X)   // X번째 문자부터 출력한다.
 + (X, Y)   // X번째 문자부터 Y개 출력한다.
 + (음수)   // 오른쪽부터 출력한다.

 

- x.replace("a","b") : x의 내용 중 a를 b로 바꾼다.

 

- focus() : 해당 요소에 포커스를 부여하여
텍스트 창의 경우 커서를 위치시켜 바로 입력가능

쉽게 말해, 마우스를 입력창에 클릭할 때 나타나는 깜박이는 표시를 말한다.
버튼의 경우, 엔터 기능을 한다.

 

- blur() : focus와 반대로 창의 경우에는, 최소화한다.

 

- alert(document.cookie="변수명 = 값") : 변수의 쿠키값을 변경한다.

 

 

 - created by dlrudfh

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

페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25
HTTP(HyperText Transfer Protocol)이란?  (0) 2017.04.16

아스키 코드(ASCII)

 

 

 우리가 일상에서 사용하는 문자를 컴퓨터에서 표현하기 위해서는 문자를 디지털 형태로 바꿔주어야 한다. 처음에는 이와 같은 작업에 다양한 부호를 사용했는데, 다른 사용자와 사용하는 부호가 달라 호환되지 않는 문제가 발생했다. 이 문제를 해결하기 위해 표준 부호를 만들어 모두가 동일하게 사용하도록 했는데 그 대표적인 예 중 하나가 아스키 코드이다.

 

 

 아스키 코드(ASCII / American standard code for information interchange code)란 ANSI(국 표준 협회)에서 1962년 제정한 미국 표준 정보 교환 코드로, 후에 ANSI가 국제표준화기구(ISO)에 제안하여 이를 기반으로 국제부호체계가 만들어지기도 했다.

 

 아스키 코드는 7비트로 128(2의 7제곱)개의 문자를 표현할 수 있는 것이 특징이고 여기에 1비트의 패리티 비트를 추가하여 8비트로 사용한다. 이는 3개출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 이루어져 있으며 제어 문자들은 역사적인 이유로 남아 있고 대부분은 더 이상 사용되지 않는다. 이 중 출력 가능한 문자들은 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자로 이루어진다.

 

 

 

아스키 코드의 표기는 다음의 표를 따른다.

(표 출처 : http://www.theasciicode.com.ar/ )

 

 

하지만 이로는 세계 각국의 고유 언어를 표현하기에는 턱없이 부족했기 때문에 유니코드라는 또 다른 이진 코드가 개발되었는데, 유니코드는 아스키코드보다 훨씬 많은 6만 5536개(2의 16승)개의 문자를 표현할 수 있는 코드이다. 이를 사용하여 한글도 표현할 수 있다.

 

 

 

*패리티 비트 : 정보 전달과정에서 오류가 발생했는지 검사하기 위해 추가적으로 붙이는 비트

 

 

출처

http://www.newscj.com/news/articleView.html?idxno=455436

http://terms.naver.com/entry.nhn?docId=784747&cid=41828&categoryId=41828

http://penne.kr/220718441221

 

-create by yamcha

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

페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25
HTTP(HyperText Transfer Protocol)이란?  (0) 2017.04.16

string.indexOf(searchvalue,start)


javascript에서 indexOf함수는 지정된 문자열에서 searchvalue로 특정한 문자(열)에서 start시작위치에서 부터의 위치값으로, 위치 값을 숫자로 리턴합니다.


만약 특정한 문자(열)을 찾지 못한다면 -1을 반환하게 됩니다.


start가 생략이 되면 0부터 시작하여 위치값을 얻을 수 있습니다.


예를 들면 아래와 같습니다.



위의 예시에서는 시작위치가 생략되어 0부터 시작해 "two" 문자의 시작 인덱스를 반환 한 결과로, 11이 출력됩니다.


시작위치를 지정하게 된다면 아래와 같습니다.



10이후로 탐색하도록 했기 때문에, 처음의 apple은 무시되고, 두 번째 apple의 위치값이 결과값으로 나옵니다.


배열의 경우에는 



arr[0]=apple, arr[1]=orange, arr[2]=banana, arr[3]=nut, arr[4]=graph이므로 orange의 결과값이 1로 나오게 됩니다.


lastindexOf함수는 뒤에서 부터 탐색을 하는데, 위치값은 앞에서 부터 인덱싱 한 값이 나오게 됩니다.


예를 들자면 아래와 같습니다.



뒤에서부터 탐색하기 때문에 세 번째 apple의 위치를 반환하지만, 결과값인 인덱스 값은 앞에서부터 수를 세기 때문에 28을 반환합니다.


만약 시작위치를 주어주면 아래와 같습니다.



시작위치에서부터 뒤에서 세어나가게 됩니다. 결과값은 당연히 앞에서 세어간 위치값을 받게 됩니다. 


참고:http://blog.naver.com/chsmanager/140202656859


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

페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25
HTTP(HyperText Transfer Protocol)이란?  (0) 2017.04.16

error based sql injection 참과 거짓을 error로 구분하는 것인데 보통 if문으로 공격하는 기법.


일단 mysql에서의 if문을 보면

if(조건 , 참 , 거짓) 으로 나타냅니다.

이것으로 참일때 또는 거짓일 때 에러를 출력하게 하면 됩니다.

에러는 서브쿼리를 이용하면 됩니다


예시:

<?php
  
include "./config.php"
  
login_chk(); 
  
dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  if(
preg_match('/sleep|benchmark/i'$_GET[pw])) exit("HeHe");
  
$query "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if(
mysql_error()) exit(mysql_error());
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
  
$_GET[pw] = addslashes($_GET[pw]);
  
$query "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  
$result = @mysql_fetch_array(mysql_query($query));
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem");
  
highlight_file(__FILE__);

?>

출처 : lord of sqlinjection


위의 예시를 보면 if문에

mysql에서 (select 1 union select 2)를 넣게 되면 Subquery returns more than 1 row 라는 에러가 뜨게 됩니다.

따라서 url에 " ' or id = 'admin' and (if(length(pw)>숫자,(select 1 union select 2),1)#"를 넣으면

숫자에 해당되는 수에서만 error를 띄우지 않습니다.

물론 select 1 union select 2 와 1 의 자리를 바꾸어 준다면 error가 참일때만 발생할 것입니다.

이렇게 알게된 길이를 범위로 잡고

비밀번호를 계속해서 대입시켜준 다음 화면을 txt로 받아 Subquery가 있을 때의 값으로 비밀번호를 찾을수 있습니다. 

-create by sang-gamja

  



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

xss (Cross Site Scripting)  (0) 2017.12.04
error based sql injection  (0) 2017.09.18
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28

이번에는 "Drive-By-Download(DBD)공격"의 간단한 원리 등을 직접 해보겟습니다.


저번 이론편에서 페이지 이동 및 악성코드의 유포에 대한 모든 것이 "스크립트 코드"로 이루어진다고 말하였습니다.



순서대로 하나씩 구현을 해보겠습니다.

(난독화는 하지 않고 진행하겠습니다.)


1. 페이지 이동

:<iframe>, javascrpit 코드 등을 사용하여 페이지 이동이 가능해집니다.


총 5개의 웹 사이트가 있다고 가정합니다.


각각의 사이트들은 그냥 h2 태그에 의해 문자를 보이는 형식으로 이루어져 있습니다.

A1.html = A1 PAGE 출력 / A2.html = A2 PAGE 출력 ...

위의 노랑색으로 칠한 코드는 페이지를 불러오는 역할을 합니다.



*iframe 코드 설명

iframe코드는 다른 웹사이트를 자신의 웹의 프레임 안에 불러오는 역할을 합니다.

만일 위의 코드에서 display:none(화면에 안보이게하기)를 없애버리면...


즉! 웹사이트안에 웹사이트가 생기는 것입니다.




이러한 것을 사용하면 하나의 웹사이트가 다른 웹사이트를 불러오고, 그 웹사이트가 다른 웹사이트를 불러올 수 있습니다.

이말은 다른 웹사이트의 스크립트 코드에 의해 영향을 받을 수도 있다는 것을 말합니다.

 

예를 들어

A5.HTML에 alert("A5")라는 스크립트 코드를 넣으면, A1에 접속 시 A5경고 메시지를 보게 됩니다.


이것을 악성코드 유포에 사용한다면...

A1에 접속 시 A2,A3,A4,A5안에 멀웨어(바이러스)를 다운 받는 코드가 있다면, 바이러스를 다운받게 됩니다.




2. 악성 스크립트 코드 & 난독화

위에서 설명한 예제로 든 것은, 기존에 쉽게 알 수 있는 script 코드 입니다.


하지만 실제로는 이러한 스크립트 코드를 악의적인 목적으로 만들어 악성 스크립트 코드를 만듭니다. 그런 후에 지나치는 웹 


사이트 중 하나에 이러한 스크립트 코드를 넣게 되면, 직접적으로 그 사이트에 접속하지 않더라도, 연결되어 있는 웹에 접속하


게 되면 자동적으로 이 악성 코드에 감염되게 됩니다.


스크립트 코드를 분석하게 되면, 이러한 악성코드가 무엇인지, 무슨 기능을 하는지, 서버는 어디를 이용하는지, iframe태그를 어디다 연결하는지 등에 대해 알게됩니다. 그렇기에 이러한 분석을 최대한 지연시키기 위해 난독화를 이용합니다.


예를 들어

<iframe src="A2.HTML" style="display:none"></iframe>이 HTML페이지의 소스에 있으면 바로 보이기 때문에...


"%3Ciframe%20src%3D%22A2.HTML%22%20style%3D%22display%3Anone%22%3E%3C/iframe%3E" 등으로 난독화 하여 자바스크립트 코드인 Document.write랑 같이 사용합니다.

eval과 replace 등의 함수 조합을 통하여 <iframe>태그를 만들어서 호출합니다.


또는 


쉘코드를 이용하기도 하는데, 이러한 쉘코드도 그대로 사용하지 않습니다.

hex 값 변조, xor 변조 등을 통하여 쉘코드를 변조 시켜 사용합니다.


이외에도 많은 난독화 기법을 사용하여 악성 스크립트 코드등을 이용합니다.





<Created by 서쿤>




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

xss (Cross Site Scripting)  (0) 2017.12.04
error based sql injection  (0) 2017.09.18
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28

Blind SQL Injection 이란?


Blind SQL Injection은 임의의 SQL 구문을 삽입하여 인가되지 않은 데이터를 열람할 수 있는 공격 방법이라는 점에서 일반적인 SQL Injection과 동일하다.


다만 일반적인 SQL Injection의 경우에는 조작된 쿼리를 입력 해 한번에 원하는 데이터를 얻을 수 있지만, Blind SQL Injection은 쿼리 결과에 따른 서버의 참과 거짓 반응을 통해 공격을 수행한다.


즉, 쿼리에 대한 결과가 참일때와 거짓일 때 서버의 반응이 나타나야 하며 이를 구분할 수 있어야 한다.


Blind SQL Injection을 수행하기 위해선 몇 가지 기본적인 함수에 대해 알고 있어야 한다.


1. substr


substr은 문자열을 자를 때 사용하는 함수이며 사용 방법은 아래와 같다.


substr(자를 문자열, 자를 문자의 시작점, 자를 문자 개수)


예를 들어, str = substr("HelloWorld", 1, 3)일 경우, substr함수를 통해 HelloWorld의 1번째 부터 3개의 문자가 str에 저장된다.


즉, str에는 Hel이 저장된다.


만약 str = substr("HelloWorld", 5, 2)일 경우에는 str에는 oW가 저장된다.


2. ascii


ascii 함수는 문자의 아스키 코드 값을 반환해 주는 함수이다.


ascii(아스키 코드로 반환 할 문자)


위와 같은 형태로 사용되며, ascii(a)의 경우 a의 아스키 코드 값인 97이 반환된다.


위의 2 가지 함수를 통해 Blind SQL Injection을 수행할 수 있다.



공격 방법


위에서 언급했듯, Blind SQL Injection은 쿼리 결과에 따른 서버의 반응을 보고 공격을 수행한다.


공격 예시를 보이기 전 몇 가지 상황을 가정하려 한다.


1. table의 이름은 users이다.


2. 속성에는 id와 pw가 있다.


3. 공격자는 테이블 명과 admin의 id는 이미 알고 있다.


4. 서버에서는 로그인에서 자주 사용되는 SELECT * FROM users where id='(입력받은 id)' and pw='(입력받은 pw)';  형태의 쿼리문을 실행한다.


이 때 공격자는 admin의 pw를 알아내기 위한 Blind SQL Injection 공격을 수행하려 한다.


먼저 id는 알고 있으므로, 로그인 창의 ID 입력 부분에는 admin의 id를 입력한다.


id의 뒤에는 pw의 첫 글자를 알아내기 위한 쿼리를 삽입한다.


ascii(substr(select pw from users where id = 'admin', 1, 1))의 쿼리를 사용하면 users 테이블에서 id가 admin인 행의 pw의 첫 글자를 가져와 아스키 코드로 바꾸어 준다.


공격 시에는 이를 활용한다.


즉, ID 입력 칸에 admin' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 -- 을 삽입한다.


위의 쿼리를 삽입함에따라 서버에 전달되는 전체 쿼리는 다음과 같다.


SELECT * FROM users where id='admin' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 -- and pw='(입력받은 pw)'


원래의 쿼리에서는 users 테이블에서 id와 pw를 입력받아 두 값이 동일한 행을 찾아 출력하는 쿼리문이었다.


하지만 공격 쿼리를 삽입한 후에는 id가 admin이고, id가 admin인 행에서 pw의 첫 글자를 아스키 코드로 바꾼 값이 100 이하여야 쿼리문이 동작한다.


뒤의 pw를 입력받아 이를 비교하는 구문은 주석처리 된다.


따라서 만약 pw의 첫 글자가 아스키 코드 값으로 100 이하가 될 경우에는 쿼리문이 실행되고, 아닐 경우에는 쿼리문이 실행되지 않는다.


위와 같은 방법을 반복하면 pw의 첫 글자를 알아낼 수 있으며, 더 나아가 pw의 전문을 알아낼 수 있다.



이것으로 Blind SQL Injection에 대한 기본적인 설명을 마치고, 다음번엔 직접 실습 환경을 구성하고 공격을 실습하려 한다.


Created by ccoma

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

error based sql injection  (0) 2017.09.18
Drive-By-Download(DBD)공격(실습편)  (0) 2017.05.29
Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28
Drive-By-Download(DBD) 공격(이론편)  (0) 2017.04.24

+ Recent posts