# CTF : SQLi 1

[union-sql-injection-process](https://hh-rys-log.gitbook.io/normaltic/6-11-29/notes/union-sql-injection-process "mention")에서 공부한 내용으로 간단한 CTF 문제를 풀어볼 시간이다. \~.\~

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2Fot9Ra9QADFRUBSwVslcF%2Fimage.png?alt=media&#x26;token=72178037-7aa1-4760-a58f-3222e5f7b6ef" alt=""><figcaption></figcaption></figure>

사이트에 들어가면 총 4개의 계정 정보를 볼 수 있다.

**우리의 목표는 게시판에서 실행되는 Query를 활용해 다른 Table에 있을 Flag를 찾아내는 것이다.**

그렇기 위해서는 우선 SQL injection을 수행할 수 있는 지의 여부를 파악해야 한다.&#x20;

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2F8FPUr8F4iSrT3VvmQFc3%2Fimage.png?alt=media&#x26;token=e7c92c9e-6c24-478f-a7ff-aad1180368af" alt=""><figcaption></figcaption></figure>

일부러 <mark style="color:blue;">**항등원**</mark>인 값을 넣어 "bello"를 입력했을 때와 동일한 결과가 나오는 지 확인해보았다.&#x20;

결과가 동일하게 나오는 걸 보니 주입한 Query가 문제 없이 동작하는 듯 하다!

그럼 이제 서버에서 실행되고 있는 Query가 몇 개의 COLUMN을 가져오는 지 알아내 보자.

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2FU2EnybJmHyCg3YhALPD7%2Fimage.png?alt=media&#x26;token=efab878a-3bde-4168-b378-aab4b08fa477" alt=""><figcaption></figcaption></figure>

UNION을 이용해서 column이 1개, 2개, 3개,... 늘려 나가다 보면&#x20;

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2F2iJSwjC9eWdfi2dDxQJi%2Fimage.png?alt=media&#x26;token=eb3d9fef-9bfd-4671-88e0-71e6e434344f" alt=""><figcaption></figcaption></figure>

column 수를 4개로 맞췄을 때, 결과가 나오는 걸 볼 수 있다.

이 말은 즉, 서버에서 작성해둔 구문이 <mark style="background-color:blue;">**4개의 column**</mark>을 결과로 보여준다는 뜻이다.

column의 개수를 알아냈으니 이제 DB, TABLE, COLUMN 정보를 알아가 보자.

```
bello' union select 1,database(),1,1 #
```

column이 4개라고 했는데, 화면에 제공되는 값 또한 4개이므로&#x20;

어느 위치에 얻고자 하는 값을 넣든 상관이 없다!

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2F7thuIu3YuHE53i8VmWzk%2Fimage.png?alt=media&#x26;token=1488edb2-28a4-4865-9161-be29da39817d" alt=""><figcaption></figcaption></figure>

database 이름은 2번째 column에 출력 되도록 Query를 주입해보았다.&#x20;

결과는 <mark style="color:blue;">**database : sqli\_1**</mark>

그럼 이제 DB 안에 어떤 table이 들어있는 지 물어볼 수 있다.

```
bello' union select 1,table_name,1,1 from information_schema.tables where table_schema='sqli_i' #
```

DB sqli\_1 안에 어떤 테이블이 들어있니\~? 물어봤더니&#x20;

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2F2j9LtKbpseCX7ObfnyB8%2Fimage.png?alt=media&#x26;token=0c7c5781-ce3b-49c3-8f14-3e43ff32222b" alt=""><figcaption></figcaption></figure>

flag\_table, user\_info라는 2개의 Table이 들어 있다고 한다.

우리의 목표는 flag이기 때문에 flag\_table의 정보를 알아내 보자.

```
bello' union select 1,1,1,column_name from information_schema.columns where table_name='flag_table' #
```

이번에는 flag\_table 안에 어떤 column이 있는 지 알려 달라는 Query를 넣어보았다.

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2FY17f5TOFQ43x863pICYN%2Fimage.png?alt=media&#x26;token=b5b07edd-bc34-4811-9cef-db7e708469c8" alt=""><figcaption></figcaption></figure>

그랬더니 flag라는 column이 들어 있다고 한다!

그럼 이제 flag column에 어떤 값이 들어있는 지 알아낼 수 있다. :smirk:

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2FnPwQWd6naCXtmp2IeqQv%2Fimage.png?alt=media&#x26;token=a5cd6c83-d5f9-4cbe-a60f-54861af593cb" alt=""><figcaption></figcaption></figure>

flag\_table에서 flag column 값을 출력해! 라고 했더니 이번 문제의 flag를 알려준다. :thumbsup:

이렇게 해서 SQLi 1 문제 해결!!
