27번 문제를 실행 하면 다음 과 같은 창이 나옴니다.

제목을 보니 SQL INJECTION 이라네요.
SQL INJECTION 이란 SQL 삽입(영어: SQL Injection, SQL 인젝션, SQL 주입)은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법 이라고 합니다.
그러면 결국 sql 구문을 찾아야 겠죠?

소스 보기를 하시면 주석으로 index.phps 라고 되어 있습니다.
여기가 수상하니 여기로 가보죠

일단 저희의 목적이 sql문에 악의적인 코드를 작성하는 것이니까
sql 구문을 보면 "select id from challenge27_table where id='guest' and no=($_GET[no])"
라고 되어있습니다.
그 값이 guest 면 guest 라고 출력을 하고, admin 이면 문제에 대한 답을 주는 것 같습니다.
guest는 바꿀 수 없으므로 $_GET[no] 에 따라서 값이 바뀌는 것 같습니다.

1을 입력하니 guest 가 출력 되었고

2를 입력하니 query error가 출력 됨을 알 수 있습니다.
0을 넣었더니 query error 라고 안뜬 것을 보아서
왠지 0,2번이 admin 인것 같습니다.
따라서 no=(0) or no=2 --)
를 통해서 0 아니면 2 를 통해서 admin으로 만들어주고
뒤에 -- 는 뒤에 있는 괄호 및 query error 라는 글을 없에기 위해서 사용 (주석) 을 쓰면 되는데
다시 sql 있는 구문으로 가보면
if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");
즉 = 등 입력 할때에 sql 구문을 사용하지 못하도록 되어있습니다.
= 대신 like를 써서 즉 0) or no like 2 -- 를 사용하면 문제를 해결 할 수 있습니다.
댓글