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

소스코드는 검정선 기준으로 두 부분으로 나눌 수 있다. 위는 로그인을 하는 부분이고 밑은 가입을 하는 부분이다. 하나씩 살펴보자
issset은 변수가 준비되었는지 확인하는 함수이다. 즉 값이 비어있으면 if문이 실행되지 않는다.
자주 본 함수로 '나 "앞에 \를 붙여 SQL인젝션을 방지한다.
길이를 구하는 함수이다 즉 입력한 phone의 길이가 20이상이면 안된다.
insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')
lphone은 값이 있어야함
select id,lv from chall59 where id='{$_POST['lid']}' and phone='{$_POST['lphone']}'
lv는 마지막에 같이 insert하는 값으로(ex> guest)이 값이 admin이 나와야 문제가 풀린다. 즉 id와 phone을 아무렇게나 가입해도 lv가 admin이어야지 풀린다.
현재 pregmatch 함수로 admin이 삽입되면 access가 거부된다. 그러나 쿼리문에 admin을 반드시 삽입해야한다. How?
A: reverse함수
reverse('nimda')는 admin을 포함하지 않으므로 그대로 실행이되어 'admin'으로 바뀐다.
그러나 addslashes로 인해 '앞에 \가 붙고 추가로 글자수가 20개를 넘어가 access가 거부된다.
Q: 글자수도 줄이고 '도 삽입하지 않는 방법이 뭐가 있을까?
A: 그것은 바로 쿼리문을 이해하는 것이다.
insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')
Q: 만약 앞의 id를 재활용한다면? 쿼리문에 먹혀 들어갈까?
A: 답은 YES이다.

즉 뒤의 reverse(id)는 바로앞에서 입력한 'abc'(id)를 거꾸로 바꿔서 upw에 'cba'를 입력한다.
id : nimda
pw : 1,reverse(id))--
여기서 주의할것은 -- 뒤에 공백이 들어가야 주석이 먹혀들어간다는 것이다.
위의 형식대로 join하고 로그인은 id는 nimda, pw는 1로 하면 문제가 풀린다.
