webhacking.kr 59(SQL Injection)

Sirius·2023년 3월 28일


JOIN시켜서 LOGIN을 하면 풀릴 것으로 보인다. 소스코드를 살펴보자


소스코드는 검정선 기준으로 두 부분으로 나눌 수 있다. 위는 로그인을 하는 부분이고 밑은 가입을 하는 부분이다. 하나씩 살펴보자

1. 가입하는 부분

1. isset

issset은 변수가 준비되었는지 확인하는 함수이다. 즉 값이 비어있으면 if문이 실행되지 않는다.

2. addslashes

자주 본 함수로 '나 "앞에 \를 붙여 SQL인젝션을 방지한다.

3. strlen

길이를 구하는 함수이다 즉 입력한 phone의 길이가 20이상이면 안된다.

4. pregmatch

  1. id에 admin(소문자 섞는거 포함)이 들어가면 안된다.
  2. phone에는 admin, 0x, #, hex, char, ascii, ord, select가 들어가면 안된다.

5. insert쿼리

insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')

2. 로그인하는 부분

1. isset

lphone은 값이 있어야함

2. addslashes(생략)

3. 쿼리문

select id,lv from chall59 where id='{$_POST['lid']}' and phone='{$_POST['lphone']}'

4. lv

lv는 마지막에 같이 insert하는 값으로(ex> guest)이 값이 admin이 나와야 문제가 풀린다. 즉 id와 phone을 아무렇게나 가입해도 lv가 admin이어야지 풀린다.

3.Injection

1. reverse함수

현재 pregmatch 함수로 admin이 삽입되면 access가 거부된다. 그러나 쿼리문에 admin을 반드시 삽입해야한다. How?
A: reverse함수

reverse('nimda')는 admin을 포함하지 않으므로 그대로 실행이되어 'admin'으로 바뀐다.

그러나 addslashes로 인해 '앞에 \가 붙고 추가로 글자수가 20개를 넘어가 access가 거부된다.

2. reverse(id)

Q: 글자수도 줄이고 '도 삽입하지 않는 방법이 뭐가 있을까?
A: 그것은 바로 쿼리문을 이해하는 것이다.

insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')

Q: 만약 앞의 id를 재활용한다면? 쿼리문에 먹혀 들어갈까?
A: 답은 YES이다.

즉 뒤의 reverse(id)는 바로앞에서 입력한 'abc'(id)를 거꾸로 바꿔서 upw에 'cba'를 입력한다.

3. 최종코드

id : nimda
pw : 1,reverse(id))--

여기서 주의할것은 -- 뒤에 공백이 들어가야 주석이 먹혀들어간다는 것이다.
위의 형식대로 join하고 로그인은 id는 nimda, pw는 1로 하면 문제가 풀린다.

0개의 댓글