일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- DLInear
- 벨만방정식
- DL
- DataProcessing
- de
- 엠프로
- node.js
- 도커로 깃블로그 만들기
- 프레딧
- mlflow
- socket.io
- transformer
- LTSF
- express
- 흥미붙이기
- pandas
- MPRO
- 프로바이오틱스
- AI
- RL
- 강화학습
- 오토트레이딩
- NLinear
- 강화학습으로주식하기
- 제발쉽게좀가르치자
- TimeSeries
- HY7714
- ML
- YOLO
- 불법마약특별단속 #부산지방경찰청
- Today
- Total
상황파악
Wechall - Training : MySQL II 본문
이전의 MySQL I 보다 업그레이 된 버전입니다.
어떤 게 추가되었는지 확인해보겠습니다.
쿼리문에서 password를 받지 않고 md5로 변환한 값을 비교하는군요
해결조건은 md5로 암호화된 패스워드를 맞추고 username에 admin이 있어야 합니다.
password에 암호화가 걸리면 보통 쿼리문에서 주석처리를 해주는데 이번 문제는 그러한 접근이 불가능 하니 db의 구성도를 알 필요가 있습니다.
이번 문제는 총 3개의 포인트가 있습니다.
처음 DB를 다루는 사람의 눈높이에서 설명하기 위해 MySQL 실습을 통해 설명을 돕겠습니다.
설명을 위해 간단하게 제작된 sample 테이블입니다.
column은 username과 password가 있습니다.
위에 입력된 SELECT * FROM (table name) 은 검색의 기본이 되는 문법입니다.
SELECT문에는 WHERE을 통해 조건을 달 수 있습니다.
위와 같이 username이 admin인 행을 보여주는 쿼리문입니다.
이번 문제에서는 첫 번째로 WHERE을 이용합니다.
WHERE 뒤에 오는 조건에 해당하는 데이터만 보여주는데 만약 해당하는 데이터가 없다면 아무것도 출력되지 않습니다.
이처럼 공백이 오면 아무것도 뜨지 않습니다.
두 번째로 SELECT를 사용합니다.
쿼리문에 SELECT만 오면 입력된 값이 그대로 출력됩니다.
여러 값을 넣어도 마찬가지입니다.
값을 넣으니 열이 늘어나는군요
마지막으로 처음에 언급했던 UNION을 이용합니다.
두 개의 쿼리문의 결과를 한 번에 보여주는 방법은 UNION을 이용하는 것입니다.
위 사진처럼 말이죠
여기서 재밌는 점을 알게 되었습니다.
서브 쿼리를 이용하여 테이블의 값을 마음대로 바꿀 수 있다는 점입니다.
이제 세 가지 포인트를 활용하여 쿼리문을 만듭니다.
SELECT * FROM sample WHERE username='' UNION SELECT 'admin'
위 쿼리문을 입력하면 sample이라는 table은 사용하지만 불러들이는 값은 없고 UNION 뒤의 SELECT 문을 통해 admin이라는 값이 등록됩니다.
즉, 앞의 쿼리문을 이용하여 원하는 테이블에 접근한 후 UNION 뒤의 서브 쿼리를 통해 원하는 값을 추가합니다.
하지만 UNION의 중요한 특성상 메인 쿼리와 서브 쿼리가 불러들이는 칼럼의 수가 동일해야 하는데
위의 쿼리를 입력 시 메인 쿼리는 2개의 칼럼, 서브 쿼리는 1개의 칼럼만을 사용하여 오류가 발생합니다.
이를 바꿔 말하면 에러가 뜨지 않으면 해당 테이블에서 사용하는 칼럼의 수를 알아내었다는 말이 됩니다.
이러한 꼼수를 통해 문제에 접근해보았습니다.
지속적인 에러가 발생하다 서브 쿼리에 3개의 칼럼 값을 넣었을 때 비밀번호 오류가 뜨는 것을 확인하였습니다.
' UNION SELECT 'admin',1,1#
위 값을 id에 넣어 보았는데 뭔가 이상합니다.
password를 어떻게 알아낼까요?
생각해보니 password로 제가 마음대로 넣어주면 되는 거였습니다.
문제에서 password를 md5로 변경하여 검사를 하기 때문에 md5(password) 형식으로 넣어주면 해결이 됩니다.
하지만 column의 순서는 어떻게 알아낼까요?
보통 로그인 과정에서 사용되는 3개의 칼럼은 인덱스, ID, PW 순으로 지정을 하지 않을까 하는 추측으로 대입을 해보았습니다.
위를 토대로 제가 입력한 값은 다음과 같습니다.
Username - ' UNION SELECT 1, 'admin', md5(1)#
Password - 1
문제가 해결되었습니다.
'Wargame > Wechall' 카테고리의 다른 글
Wechall - PHP 0817 (0) | 2020.01.08 |
---|---|
Wechall - hi (0) | 2020.01.08 |
Wechall - Training : MySQL I (0) | 2019.12.31 |
Wechall - Training: Programming 1 정리 (0) | 2019.12.11 |
Wechall - Training: Encodings (0) | 2019.12.10 |