다음과
같은
창이
나와 index.phps에
들어가
보았다.
나온
코드
중 php문
부분만
가져왔다.
먼저
코드에서 eregi 함수를
통해
" ,/,\(,\),\t,\|,&,union,select,from,0x"
와
같은
문자열이
있으면
종료되게
하였다.
$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]"));
if($q[0]=="guest") echo ("hi guest");
if($q[0]=="admin")
{
@solve();
echo ("hi admin!");
}
이
코드에서는, no를
받아온
것을
통해
쿼리문을
완성하여
받아온
값이 guest이면 'hi guest'를
출력하고 admin이면
문제가
풀리게
되어
있다.
select id from challenge18_table where id='guest' and no=$_GET[no]
no를
받아올
때
인젝션
시켜서
다음 id가 admin으로
인식되도록
만들어야
한다.
일단
입력
창에
여러가지
값들을
넣어
보았다.
그
중 1을
넣자 hi guest가
나왔다.
no가 2이면 admin일
것이라고
유추하고
문제를
풀어
보자.
만약
쿼리문이
select id from challenge18_table where id='guest' and no=123 or no=2
와
같이
되어
있다면
게스트
로그인에
실패하고 admin의
계정으로
로그인
될
것이다. 하지만
여기엔
공백이
들어가
있으므로
공백
우회가
필요하다.
공백
우회의
방법은
여러
가지가
있다.
1. tab - %09
2. line feed(\n) - %0a
3. carrage return(wr) - %0d
4. 주석 - /**/
5. 괄호 - ()
6. 더하기 - +
공백
우회를
이용하여
값을
입력해
보자.
그
결과
문제가
풀린
것을
확인할
수
있다.
다른
방법으로
풀어
보자.
쿼리문을
select id from challenge18_table where id='guest' and no=1 or no=2 limit 1,1
다음과
같이
전달해
주어도
문제가
풀릴
것이다.
guest 계정이 no=1로
인해
참이
되고, admin계정이 no=2로
인해
참이
되어서 guest와 admin의
결과값이
배열에
차례로
들어가게
된다.
이런
경우 admin의
값만
선택하기
위해서 limit구문을
사용한다.
여기에
공백
우회를
적용하여
값을
입력해
보자.
역시
문제가
풀린
것을
알
수
있다.