-
[Webhacking.kr] 46번 풀이Wargame/webhacking.kr (old) 2019. 5. 8. 18:47
SQL Injection 문제이다.
제출버튼을 누르면 get 방식으로 lv 값이 전송되고 zzibong information이 출력된다.
lv에 다른 숫자를 넣어서 전송해보니 아무런 정보가 출력되지 않았다.
소스 코드를 보자.
시간이 1256900400보다 작으면 exit이 실행된다.
1256900400 == 2009-10-30 11:00:00
2009년 전으로 돌아갈 수 없기때문에 무시해도 되는 if문이다.
타임스탬프(timestamp)란?
1970년 1월 1일을 기준으로 경과된 시간을 초단위로 표시한 시간
time 함수
현재 시각을 timestamp 형식으로 나타내주는 함수
계속해서 소스를 해석해보면,
lv값에서 공백 / * %를 ""로 치환하고, 몇몇 문자열을 필터링하고있다.
lv 값을 이용하여 쿼리문을 검색하는데
쿼리문의 결과 값이 존재하면서 get방식으로 lv 값을 받은 경우에 id와 cash 정보를 출력해준다.
이때 결과로 나온 id 값이 admin일 경우에 문제가 풀린다.
아까 lv에 1이외의 다른 숫자를 넣었을때 아무런 정보가 출력되지 않았다.
lv 값은 1밖에 없다고 추측할 수 있다.
따라서, id가 admin이 나오기 위해서는 id=admin 조건을 이용해야한다.
select id, cash from members where lv=1이외의 숫자 or id='admin'
or을 사용하기 위해서는 or 앞뒤에 공백문자가 없으면 에러가 발생한다.
공백문자가 필터링되어있기 때문에 공백문자를 우회하는 방식으로 해당 쿼리문을 작성해주어야한다.
(||는 앞뒤에 공백이 필요없다.)
or 사용시 공백 유무에 따른 결과 확인
|| 사용시 공백 유무에 따른 결과 확인
공백문자를 우회하여 쿼리문을 작성해보았다.
select id, cash from members where lv=0%0aor%0aid='admin'
select id, cash from members where lv=0||id='admin'
아무런 반응이 일어나지 않는다.
당연하다. 이때까지 문제들에서와 같이 magic_quotes_gpc 옵션 때문이다.
2진수, 16진수, char함수를 사용해야하는데 0x가 필터링되어 있기 때문에 2진수나 char를 사용해야한다.
1. 2진수 사용 (admin : 0b0110000101100100011011010110100101101110)
문제 클리어~
2. char함수 사용 (admin : char(97, 100, 109, 105, 110))
역시나 클리어~
'Wargame > webhacking.kr (old)' 카테고리의 다른 글
[Webhacking.kr] 48번 풀이 (0) 2019.05.08 [Webhacking.kr] 47번 풀이 (0) 2019.05.08 [Webhacking.kr] 45번 풀이 (0) 2019.05.08 [Webhacking.kr] 44번 풀이 (0) 2019.05.08 [Webhacking.kr] 43번 풀이 (0) 2019.05.07 댓글