문제 설명
preg_match함수로 prob, _, ., () 의 문자들이 필터링 되어있다.
id값이 admin이면서 pw가 맞으면 문제를 해결할 수 있다.
먼저 id값에 admin을 넣어보자
id값에 admin을 입력하였는데 문제가 해결되지 않았다. 왜냐하면 뒤에 and 구문이 성립하지 않았기 때문이다.
이문제를 해결하기 위해서는 비밀번호를 알아야한다.
하지만 우리는 비밀번호를 알기 힘들다. 어떻게 하면 문제를 해결할 수 있을까??
쿼리문을 보자.
select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')
첫번째 방법
쿼리문에 mysql의 주석인 #이 필터링이 되어 있지 않기 때문에
id 파라미터에 id = admin'#을 넣으면 뒤에 pw부분이 주석처리가 되어 실행이 되지 않아 admin으로 접속을 할 수 있을것이다.
하지만 url에 #을 넣으면 인식이 되지 않기때문에 #을 url 인코딩한 값인 %23을 넣어서 문제를 해결하면 된다.
payload는 다음과 같다.
?id=admin'%23
두번째 방법
php의 연산자 우선순위를 살펴보았다.
출처 : http://www.tcpschool.com/php/php_operator_arithmetic
and 연산이 우선적으로 실행이 된다.
select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')
위 쿼리 부분에서 id값에 admin' or '1' = '1 부분을 삽입해보자.
select id from prob_cobolt where id='admin' or '1' = '1' and pw=md5('')
위의 쿼리 문은 admin' or '1' = '1 부분을 삽입을 한 결과이다.
and연산자가 먼저 실행되기 때문에 '1'='1' and pw=md5('') 연산이 먼저 실행된다.
참 and 거짓 이므로 거짓을 반환한다.
그다음 id = 'admin' or 거짓이므로
참 or 거짓이된다.
따라서 참이되고 id='admin'이므로 문제를 해결할 수 있다.
payload는 다음과 같다.
?id=admin' or '1' = '1
'WEB hacking > LORD OF SQL INJECTION' 카테고리의 다른 글
[Lord of SQL Injection] darkelf 문제 풀이 (0) | 2023.04.08 |
---|---|
[Lord of SQL Injection] wolfman 문제 풀이 (0) | 2023.04.06 |
[Lord of SQL Injection] orc 문제 풀이 (0) | 2023.04.04 |
[Lord of SQL Injection] goblin 문제 풀이 (0) | 2023.04.02 |
[Lord of SQL Injection] gremlin 문제 풀이 (1) | 2022.09.27 |