database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 1859 게시물 읽기
No. 1859
회원로그인 하는 부분중에서.....질문
작성자
최중권(choi1024)
작성일
2005-03-31 10:53ⓒ
2005-03-31 10:54ⓜ
조회수
12,910

아래는 login.asp 원본 파일인데요 9번째 라인에서 에러가 나에요...

<html>
<body bgcolor="#FFFFFF">
<%name="usertb"
id1 = Request("id1")
passwd = Request("passwd")
Set db = Server.CreateObject("ADODB.Connection")
db.Open("DSN=owlshop;UID=choi1024;PWD=*********")
sql1 = "SELECT * FROM " &name& "WHERE id1= '" &id1& "'"
Set rs1 = db.execute(sql1)%><%if rs1.EOF then%> <------------요라인...
<p align="CENTER">&quot;<%d=id1%>&quot;는 등록되어 있지 않은 ID입니다. 확인하시고 다시 시도해 주세요</p>
<form method="POST" action="login.asp" name="">
<p>&nbsp;</p>
<div align="CENTER">
<table border="0" width="300">
<tr>
<td width="150">회원 ID : </td>
<td width="150">
<input type="TEXT" name="id1" size="10" maxlength="20">
</td>
</tr>
<tr>
<td width="150">회원 비밀번호 : </td>
<td width="150">
<input type="TEXT" name="passwd" size="10" maxlength="20">
</td>
</tr>
<tr>
<td width="150">&nbsp;</td>
<td width="150">
<input type="SUBMIT" name="submit" value="인증">
</td>
</tr>
</table>
</div>
<p align="CENTER">&nbsp;</p>
</form>
<p align="CENTER"><a href="newuset.html">신규 회원 가입</a></p>
<p align="CENTER">&nbsp;</p>
<p align="CENTER"<%else %><%if passwd=rs1("passwd") then%>
<%session("id1")=rs1("id1")
session("username")=rs1("username")%><%name="countt"
Set db1=Server.CreateObject("ABODB.Connection")
db1.Open(DSN="owlshop;UID=choi1024;PWD=***************")
sql5="SELECT * FROM"&name&"WHERE server='owlshop'"
Set rs5=db1Execute(sql5)
countn=rs5("countn")
countn1=countn+1
nowdate=now
nowdate=left(nowdate,19)
sql6="update"&name&"set countn="&countn1&",date='"&nowdate&"'"
Set rs6=db1.Execute(sql6)
sql7="SELECT * FROM"&name&"WHERE server='owlshop'"
Set rs7=db1.Execute(sql7)%></p>
</p align="CENTER"><font size="2"2 color="#FF8000">&quot;<%=rs1("id1")%>&quot;님은&quot;<%=rs7("count")%>&quot;번째 손님이십니다.<font></p>
</p align="CENTER"><b><font size="4">즐거운 쇼핑시간이 되십시오.</font></b></p>
</p align="CENTER">&nbsp;</p>
</p align="CENTER">의류</p>
</p align="CENTER">의류</p>
</p align="CENTER">&nbsp;</p>
</p align="CENTER">&nbsp;</p>
</p align="CENTER"><a href="index.html" target="">홈으로</a><a href=regedit.asp target="">회원정보변경</a></p>
<div align="CENTER"></div>
<div align="CENTER">
<p>&nbsp;</p>
<p><%else%></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="CENTER">입력하신 회원 ID &quot;<%=id1%>&quot;에 대한 비밀번호가 올바르지 않습니다.<br>
확인하고 다시 시도해 주십시오.</p>
<form method="POST" action="login.asp">
<p>&nbsp;</p>
<div align="CENTER">
<table border="0" width="300">
<tr>
<td width="150">회원 ID:</td>
<td width="150">
<input type="TEXT" name="id12" size="10" maxlength="20" value="<%=id1%>">
</td>
</tr>
<tr>
<td width="150">회원 비밀번호:</td>
<td width="150">
<input type="TEXT" name="passwd" size="10" maxlength="20" value="<%=passwd%>">
</td>
</tr>
<tr>
<td width="150">&nbsp;</td>
<td width="150">
<input type="SUBMIT" name="SUBMIT" value="인증">
</td>
</tr>
</table>
</div>
<p align="CENTER">&nbsp;</p>
</form>
<p align="CENTER"><a href="newuser.html"> 신규 회원 가입</a></p>
<p>&nbsp;</p>
<p><%end if%><%end if%></p>
</div>
</body>
</html>

 

 

에러내용은

 

오류 형식:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]줄 1: '=' 근처의 구문이 잘못되었습니다.
/login.asp, line 9

 

인데 도대체 감을 못잡겟네요..ㅜ0ㅜ 답변좀 부탁드립니다.

 

어제 시작한 초보라서 ㅠ0ㅠ

이 글에 대한 댓글이 총 3건 있습니다.

sql1 = "SELECT * FROM " &name& "WHERE id1= '" &id1& "'"
에서 where절 앞에 한칸 띄우세요...

그리고 참고로...

님처럼 프로그램 하시면 저같은 인간한테 걸리면 디비 다 날라갑니다.

아이디입력하는 텍스트 박스에다가...
' or 1=1 --
이렇게 입력하고 프로그램 돌려보세요...
아무나 로그인 됩니다.
이정도면 다행입니다.
' or 1=1; shutdown; -- 하거나
' or 1=1; xp_cmdshell 'format C:'; --
하면 어쩌실겁니까?
로그인 계정이 sa가 아니라 천만 다행입니다.

되도록 중요한 부분은 특히 로그인같은 부분은 입력값을 체크하시고(특수문자나 SQL키워드 같은 문자는 금칙입니다.)
Dynamic하게 SQL을 만드는것 보다 Static하게, 바인딩 방식으로 작성하시는게 Parsing오버헤드를 줄이고 보안면에서도 좋습니다.
ASP에서 ADODB의 Command를 사용하시면 됩니다.
참고로, 예제입니다.

 

Dim adoCmd

id1 = Request("id1")
passwd = Request("passwd")
Set db = Server.CreateObject("ADODB.Connection")
Set adoCmd = Server.CreateObject("ADODB.Command")

db.Open("DSN=owlshop;UID=choi1024;PWD=*********")
sql1 = "SELECT * FROM TABLE WHERE id1= ?"
adoCmd.ActiveConnection = db
adoCmd.CommandType = adCmdText
adoCmd.CommandText = sql1
adoCmd.Parameters.Append adoCmd.CreateParameter("@id", adVarChar, adParamInput, 10, "test")

Set rs1 = adoCmd.Execute
....

이하 생략...

 

지나가다님이 2005-03-31 12:07에 작성한 댓글입니다. Edit

답변 & 예제감사합니다..

근데...

 

' or 1=1 --
' or 1=1; shutdown; --
' or 1=1; xp_cmdshell 'format C:'; --

 

이렇게 쳐봤는데...그냥 에러만 나거든요..

 

말씀드렸다시피 어제 시작한 초보라서...무슨 말씀은 하시는건지 이해가..@.,@

 

자세히 설명해주시면..고맙겠습니다..^^

최중권(choi1024)님이 2005-03-31 13:21에 작성한 댓글입니다.

문자열을 연결하여 쿼리문을 날리는 방법을 악용한 공격방법이 소위말하는 SQL injection입니다.

예를 들어

sql = "select * from table where id = '" & id & "'"

라고 쿼리를 만들어서 수행했다고 칩시다.

id변수에 정상적인 값이 들어온다고 해도,

변수에 들어오는 값에 따라.

select * from table where id = '홍길동'

select * from table where id = '이순신'

select * from table where id = '강감찬'

select * from table where id = '장보고'

위의 SQL은 모두 다른 SQL로 인식해서 다시 구문분석, 실행계획을 세웁니다. 기존에 썼던 구문분석의 결과나 실행계획등등을 써먹지 못하게 된다는 것이죠.

그런데 변수에 정상적인 값이 아니고..

' or 1=1 --

이렇게 쳤다고 칩시다.

문자열을 조합해보면

select * from table where id = '' or 1=1 -- '

이렇게 됩니다. 즉, where 조건이 id가 ''이거나(or) 1=1인것 이하 주석(--)

"거짓 or 참 = 참"이라는 점과 주석이하는 무시한다는 점을 악용한것이지요.

심지어

select * from table where id = '' or 1=1; shutdown; --'

하면

"요청에 의해 서버가 종료됩니다.
SQL Server가 이 프로세스를 종료하는 중입니다."

이렇게 됩니다.

xp_cmdshell 'format C:'하면 C드라이브가 포맷이 됩니다.

물론 sa계정이나 그 권한을 갖고 있는 계정을 사용할 경우 말입니다.

 

이런 점을 막기위해서...

어플리케이션내에 "sa"계정을 사용하면 안됩니다.

심지어 password없이 사용하는 업체도 봤는데 한번 당해봐야 정신차립니다.

모든 다이나믹 sql을 static하게 변수 바인딩 방식으로 바꿉니다.

혹은 Stored Procedure나 Function으로 작성합니다.(추천)

 

그리고 중요한 부분은 sql키워드(예를 들면 "or", "--", "/*"등의 주석문자)가 들어 있는지 체크해서 그런문자가 들어 있는 변수들은 일단 실행을 막아야 합니다.

이렇게 하는것이 DB성능면에서나 보안면에서 가장 좋은 방법입니다.

그럼...

지나가다님이 2005-03-31 16:12에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1863여러행을 한행으로 만드는 쿼리가 가능한지요. [2]
청년재벌
2005-04-02
3368
18628007007f 이 에러는 어떻게 해결하나요?
bluepotal
2005-04-02
2507
1861오라클 쿼리인데요.. MS-SQL 로 바꾸려고....ㅡㅡ [1]
궁금이
2005-04-02
5742
1859회원로그인 하는 부분중에서.....질문 [3]
최중권
2005-03-31
12910
1858새로운 필드를 추가시키려면... [1]
고영훈
2005-03-31
2358
1857통계 쿼리 좀 봐주십시요. [5]
참치
2005-03-30
2915
1856opendatasource()를 사용한후 세션처리방법 좀 갈켜주세요 [1]
hohan
2005-03-30
1850
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다