1.문제풀이
1) 코드해석
- 이번문제는 약간의 필터링이 걸려있다는것을 다음 코드에서 알 수 있다
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
- 위에 보이는것과 같이 우리가 공격할 때 필요한 싱글쿼터('), 더블쿼터(")가 필터링이 걸려있는것을 볼 수 있다.
- 또 이번문제에서는 SQL쿼리문에 id='guest'로 고정되어있고 그뒤에 no={$_GET[no]}값으로 검증한다
- 이번에도 2번문제와 같이 admin계정으로 접속해야 문제가 풀리는 방식이다
2) 문제풀이
select id from prob_goblin where id='guest' and no={$_GET[no]}
- 우리는 guest의 no값을 알 수 없으므로 위 SQL쿼리문에서 노란색으로 칠해진 부분부터 참이되게 만들어야한다
- 먼저 no=no라고 대입하여 말 그대로 참이되게 만든결과 guest로 접속한것을 볼 수 있다
- 하지만 문제는 admin으로 접속해야 한다는 것이다
- 그렇다면 no=2 or id='admin'으로 공격을 시도해본다
- no=2라는 값을 준 이유는 위 구문을 SQL쿼리문에 대입하면 select id from prob_goblin where id='guest' and no=2 or id='admin'
- 위 파란색부분이 거짓이되고 id='admin'이라는 부분이 참이되므로 admin으로 접속할 수 있기 때문이다.
- 하지만 이번 문제에서는 쿼터가 필터링 되어있으므로 다른방법을 찾아야한다.
- 여러 방법중 하나로 admin이라는 문자를 16진수(Hex)로 입력하는 스트링 우회법이 있다
- 인터넷에 검색해본 결과 admin은 0x61646d696e로 변환된다
- 따라서 admin대신 변환문자를 이용해 공격하면 된다
- 공격시 삽입 구문: no=2 or id=0x61646d696e
- 공격 후 구문: https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id=0x61646d696e
- 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.
- select id from prob_goblin where id='guest' and no=2 or id=0x61646d696e
'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글
Lord of SQLi(#6 darkelf) (0) | 2022.12.30 |
---|---|
Lord of SQLi(#5 wolfman) (0) | 2022.12.28 |
Lord of SQLi(#4 orc) (0) | 2022.12.28 |
Lord of SQLi(#2 cobolt) (1) | 2022.12.28 |
Lord of SQLi(#1 gremlin) (0) | 2022.12.28 |