티스토리 뷰

LOS 포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.

29단계 소스코드이다.

모르는 함수가 있다. 문제를 풀기에 앞서 정리부터 해보자.

$_SERVERP [REMOTE_ADDR] // 웹서버에 접속한 사용자의 ip를 갖고 있다. ex) 127.0.0.1

on duplicate key update // sql에서 데이터 안에 있는 값을 수정할 수 있다. 자세한 설명은 링크를 첨부한다.

https://sdevstudy.tistory.com/12

 

[MySQL]값이 없으면 Insert, 값이 있으면 Update - on duplicate key update

INTRO 테이블을 생성 후, 중복 저장을 막기 위해 name에 unique키를 등록한다. 데이터베이스에서 대량의 데이터를 등록할 경우, 키 값이 있음에도 Insert문을 실행하게 되면 에러가 발생한다. 해결방법

sdevstudy.tistory.com

 

문제를 해결하기 위해선 no가 1인 email을 입력해야 한다.

joinmail이 파라미터를 어떻게 처리하는지 알아보기 위해 1을 넣어본다.

테이블에 나의 ip와 email이 추가되었다. 아마 no는 0이고 표시되지 않는 듯하다.

항상 select sql만 풀다가 insert가 들어간 문제는 처음이다. 그래서 인터넷 검색을 했다.

insert의 취약점은 별도의 필터링이 없을 경우, insert문 하나로 여러 개의 열을 삽입할 수 있다는 점이다.

따라서 쿼리를 ?joinmail=12'),(3333,"나의ip",(select email from prob_phantom where no=1))--+-

를 삽입하여 ****처리된 email을 새로운 email 삽입해서 알아낼 수 있다.

결과는 아무 변화도 없었다.

문제는 oracle과는 달리 mysql에서는 하나의 쿼리문에서 동일한 테이블을 호출할 때 오류를 발생한다는 것이다.

이를 해결하려면 테이블 이름에 별칭을 주면 된다. 파이썬에서의 import time as t 같은 개념이다.

따라서 쿼리는 ?joinmail=321'),(3333,"나의 ip주소",(select email from prob_phantom as p where no=1))--+- 이다.

no가 1인 email이 입력 되었다.

이제 email파라미터에 값을 준다.

문제해결

시행착오&느낀점

1. 일단 나는 select 방식의 injection만 진행해봐서 insert와 delete, update, create등의 공격방법을 전혀 몰랐다. 

   하지만 이번 문제로 insert의 방법 하나는 알게된거 같아 뿌듯하다.

2. 일단 정말 모르는 문제라도 코드를 잘보면 감을 조금이라도 잡을 수 있다.

댓글