대문자만하게 SQL INJECTION 이라고 나와있다.
소스코드를 보면 다음과 같다.
먼저 중요한 부분들을 살펴보면
preg_match메서드는 문자열에 패턴이 있는지 확인하는 메서드이다. * preg_match(패턴, 문자열)
이때 패턴앞뒤에 '/'가 와야하고 패턴들을 구분하기 위해 '|' 문자를 쓴다. 그리고 특수문자들을 표현할땐 앞에 '\'를 표시해준다.
만약 패턴이 하나라도 걸리면 true를 아니면 false를 반환한다.
때문에 $_GET['no']엔 위의 패턴들을 사용하면 안된다.
그리고 볼 점은 db구문이다.
select id from chall18 where id='guest' and no =$_GET[no]
id가 guest이고 no가 GET['no']인 부분을 불러오는데 여러가지 방법이 있겠지만 이때 or 구문을 사용하면 된다.
id = 'guest' and no = $_GET[no] 에서 and구문이 true가 될려면 guest의 no를 사용할 수 밖에 없겠지만 or 구문을 함께 사용하면
id = 'guest' and no = ' ' or '' 이런 식으로 만들 수 있다.
그러면 (구문) and (구문) or(구문) 이렇게 되는데
or 구문은 하나만 참이여도 참으로 반환하기 때문에 뒤의 구문이 admin에 대한 구문이면 admin을 반환할 것이다 때문에 앞에 구문은 거짓으로 만들고 뒤에 구문을 참으로 만들면 된다.
그래서 예를 들어 $_GET[no]에 -1 or no = 2 이런식으로 대입해주면 admin을 얻어올 것이다.
근데 이런식으로 넣으면 no=-1%20or%20no%20=%202 이런 똥값이 나오는데 이는 preg_match에서 공백을 패턴으로 넣어줬기 때문이다.
그래서 공백 대신으로 쓸 수 있는 값들은 아래와 같다.
1. 괄호로 묶어 공백 대신 사용
2. %0a, %09, %0d 등을 사용
그래서 -1%09or%09no=2 를 url에 대입하면 문제가 풀리게 된다.
※ 이때 꼭 쿼리를 입력란에 입력하지말고 url에 대입해야 한다!!!!!
'Web Hacking > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr old-59번 풀이 (1) | 2023.11.26 |
---|---|
Webhacking.kr old-36 풀이 (0) | 2023.11.25 |
Webhacking.kr old-25 풀이 (php wrapper) (2) | 2023.11.21 |
[Webhacking.kr] old-54번 문제 풀이 (0) | 2023.08.13 |
[Webhacking.kr] old-16번 문제 풀이 (0) | 2023.05.06 |