아놔... 며칠 간 저넘의.... sql injection 때메 고생 좀 했습니다.
미국에 있는 서버라 작업하기도 엄청 느리고...
요즘 유행인가 보네요, 봇으로... 무작위로 들어옵니다.
여러 좀비 서버에 js 파일들 배치시켜두고,
database 테이블들에 varchar, text 이런 필드에 script 구문이나 iframe으로 넣어두고 있습니다.
여기 웹 사이트... 참조하시고... http://isc.sans.org/diary.html?storyid=4565
대개 파일은 0.js 1.js b.js fuckjp.js 이런식이네요...
윈도우 서버라 asp 파일들이 데이터베이스에 접속하는 부분이 담긴 파일을 include 해서 사용합니다.
그 파일에 다음과 같은 내용을 추가해줍니다.
Attach code in dbconn.inc
<%
' Code for preventing SQL Injection
' Injection Keyword
array_split_item = Array("-", ";", "/*", "*/", "@@", "@", "char", "nchar", "varchar", "nvarchar", "alter", "begin", "cast", "create", "cursor", "declare", "delete", "drop", "end", "exec","execute", "fetch", "insert", "kill", "open","select", "sys", "sysobjects", "syscolumns","table", "update", "<script", "", "'")
for each item in Request.QueryString
for array_counter = lbound(array_split_item) to ubound(array_split_item)
item_position1 = InStr(lcase(Request(item)), array_split_item(array_counter))
'Response.Write(array_split_item(array_counter) & "
")
if item_position1 > 0 then
Response.Write("Command cannot be executed.")
Response.End()
end if
next
next
%>
그리고 SQL 서버에 다음의 두 쿼리를 날려서 SP 두개를 생성합니다.
Create FindReplace stored procedure
create PROCEDURE FindReplace
(
@TABLE VARCHAR(200),
@Field VARCHAR(200),
@WHERE VARCHAR(100),
@Find VARCHAR(500),
@REPLACE VARCHAR(500)
)
AS
DECLARE @query VARCHAR(8000)
SET @query = 'UPDATE ' + @TABLE +
' SET ' + @Field + '= REPLACE(CONVERT(varchar(8000),'
+ @Field + '),''' + @Find + ''',''' + @REPLACE +''')'
IF(@WHERE <> '')
SET @query = @query + ' WHERE '+@WHERE
EXECUTE (@query)
GO
Create RemoveStringFinal Procedure
create Procedure RemoveStringFinal
@FIND VARCHAR(500),
@REPLACE VARCHAR(500)
as
DECLARE @TABLE_NAME VARCHAR(500)
DECLARE @COLUMN_NAME VARCHAR(500)
DECLARE @DATA_TYPE VARCHAR(500)
DECLARE db_cursor CURSOR FOR
select TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @COLUMN_NAME, @DATA_TYPE
WHILE @@FETCH_STATUS = 0
BEGIN
if @DATA_TYPE = 'varchar' or @DATA_TYPE = 'text' or @DATA_TYPE = 'ntext' or @DATA_TYPE = 'nvarchar'
begin
print @TABLE_NAME
print @COLUMN_NAME
print @DATA_TYPE
EXEC FindReplace @TABLE_NAME,@COLUMN_NAME,'',@FIND,@REPLACE
end
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @COLUMN_NAME, @DATA_TYPE
END
CLOSE db_cursor
DEALLOCATE db_cursor
이제 exec로 SP를 써먹어 DB에 들어간 코드들을 지워줍니다.
제 서버에는 아래 script로 쌓인 데이터가 있어서 아래와 같이.. 싹 날려줬져...
심심하지 않은 이틀이었네요...
Run stored procedure example
EXEC RemoveStringFinal '
',''
EXEC RemoveStringFinal '
',''
EXEC RemoveStringFinal '
',''
EXEC RemoveStringFinal '
',''
EXEC RemoveStringFinal '
',''
'프로그래밍' 카테고리의 다른 글
크롬원격데스크톱(Chrome Remote Desktop) 한영키 설정 (3) | 2020.03.31 |
---|---|
VirtualBox rc=-5640 에러 해결 (0) | 2020.03.31 |
nginx 에서 masscan, badbot block 하기 (0) | 2019.11.07 |
Redis 패스워드 설정 (0) | 2019.11.05 |
PHP 숫자 자릿수 표시 넣기 (0) | 2019.11.05 |