'게시글 injection'에 해당되는 글 1건

  1. 2015.05.07 [09] php 게시판 생성, 비정상적으로 게시글 입력, 게시판 출력

[09] php 게시판 생성, 비정상적으로 게시글 입력, 게시판 출력

|


- 2015.03.19

 


Remark)


1) Client    --     Server  <-->  WebApplication


2) 웹 페이지가 없어도 get방식, post방식 등으로 정보를 전달하여 Server에서 처리할 수 있게 할 수 있다.

 

 


오늘은 php를 이용한 게시판 만들기 실습

 

 


1. mysql 셋팅


# mysql -u root -p
mysql> create database bbs;

 


1) 테이블 생성


num int
name varchar(20)
subject varchar(50)
body text


mysql> use bbs;
mysql> create table board( num int NOT NULL auto_increment, name varchar(20), subject varchar(50), body text, primary key(num) );           # num 부분은 입력하지 않아도 자동으로 올라간다.
mysql> desc board;
mysql> insert into board(name, subject, body ) values( 'admin', 'test', 'testing' );
mysql> select * from board;

 

 


2) 게시판 페이지 작성 (write.php)


[ write.php ]


<html>
<head>
</head>


<body>
        <form method=post action=write_ok.php>
        <table width=400 border=0 bgcolor=#c0c0c0>
                <tr>
                        <td width=60 align=left> name </td>
                        <td align=left>
                                <input type=text name=name size=20>
                        </td>
                </tr>


                <tr>
                        <td width=60 align=left> subject </td>
                        <td align=left>
                                <input type=text name=subject size=50>
                        </td>
                </tr>


                <tr>
                        <td width=60 align=left> body </td>
                        <td align=left>
                                <textarea name=body cols=52 row=100></textarea>
                        </td>
                </tr>

                <tr>
                        <td colspan=10 align=right>
                                <input type=submit value="write">
                        </td>
                </tr>
        </table>
        </form>
</body>

</html>

 

 

 

3) write_ok.php

 


- mysql_affected_rows()
=> 최근에 실행 된 쿼리의 변경 행 개수를 얻어옴

 

 

 

[ write_ok.php ]


<?

  $DB = mysql_connect( 'localhost', 'root', 'a' );
  mysql_select_db( 'bbs', $DB );

  $sql = "INSERT INTO board( name, subject, body) VALUES( '$name', '$subject', '$body' )";

  $result = mysql_query( $sql );
  $count = mysql_affected_rows();

  if ( $count == 1 ) {
    echo "write done... ";
  }
  else {
    echo "write failed...";
}

?>

 

 

 

4) 비 정상적인 방법으로 mysql에 게시글 입력하기

 


* Get 방식

 

http://192.168.133.142/write_ok.php?name=attacker&subject=attack start&abody=<script> alert('xss'); </script>

=> mysql 에선 body 내용이 안보인다.?

 

 

* Post 방식


<form method=POST action=http://192.168.133.142/write_ok.php>
<input type=hidden name=name value=attack2>
<input type=hidden name=subject value=attack start>
<input type=hidden name=body value=sending post test>
<input type=submit value=send>
</form>

 


이 태그를 javascript를 통해 전달한다. 단 엔터가 없이 편집,,


javascript:document.write("<form method=POST action=http://192.168.133.142/write_ok.php><input type=hidden name=name value=attack2><input type=hidden name=subject value=attack start><input type=hidden name=body value=sending post test><input type=submit value=send></form>");


=> mysql에선 항목 별로 띄어쓰기 뒤쪽은 무시된 것으로 뜸...?

 


웹 브라우저 화면은 클라이언트에서 실행되고 있는 화면이므로
절대 서버에서 동작하는 코드가 아니다.
즉, 입력 폼 없이도 데이터 전송은 가능하다.

서버 웹 어플리케이션은 클라이언트로부터 전달받은 데이터를 처리
입력 폼은 사용자로부터 값을 입력받아 서버에 전달해 주기 위한 용도
입력 폼 없이도 얼마든지 서버로 데이터를 전달할 수 있음

 

 

 

5) 게시판 목록 및 게시글 확인 페이지

 


[ list.php ]

 

<?

  $DB = mysql_connect( 'localhost', 'root', 'a' );
  mysql_select_db( 'bbs', $DB );

  $sql = "select num, name, subject from board";
  $result = mysql_query( $sql );

#  $line = mysql_num_rows( $result );           # line 수 확인
#  echo $line;                                                 # 정상적으로 확인되는지 테스트용

?>

<html>
<head></head>
<style>
p { color: white; }
</style>

<body>
        <table width=600 border=0>
                <tr height=20 bgcolor=#5e5e5e>
                        <td width=35 align=center>
                                <p> num </p>
                        </td>
                        <td width=300 align=center>
                                <p> subject </p>
                        </td>
                        <td width=50 align=center>
                                <p> name </p>
                        </td>
                </tr>
<?
        while( $row = mysql_fetch_array( $result ) ) {
?>

                <tr>
                        <td height=20 align=center>
                                <?=$row[num]?>
                        </td>
                        <td heignt=20 align=center>
                                <a href="view.php?num=<?=$row[num]?>">  <?=$row[subject]?>
                        </td>
                        <td height=20 align=center>
                                <?=$row[name]?>
                        </td>
                </tr>
<?
        }
?>
        </table>
</body>
</html>

 

 


[ view.php ]


<?
  $DB = mysql_connect( 'localhost', 'root', 'a');
  mysql_select_db( 'bbs', $DB );

  $sql = "select * from board where num=$num";
  $result = mysql_query( $sql );
  $row = mysql_fetch_array( $result );
?>

<html>
<head></head>

<body>
        <table width=500 border=0>
                <tr height=20 bgcolor=#5e5e5e>
                        <td width=300 align=center>
                                <p><?=$row[subject]?></p>
                        </td>
                </tr>
                <tr height=20>
                        <td width=300 align=left>
                                <?=$row[body]?>
                        </td>
                </tr>
        </table>
</body>
</html>

 


 

And


prev | 1 | next