level27[old]

2022. 3. 23. 15:21Site/Webhacking.kr

이번시간에는 level27을 풀어보겠습니다

공부하는 입장이라 틀린것이 있더라도 양해부탁드리겠습니다


level18과 마찬가지인 SQL INJECTION 문제입니다

0을 입력했더니 아무값도 안뜹니다

1을 입력했더니 guest라는 문구가 나오네요(level18과 패턴이 비슷한 느낌이듭니다...)

일단 view-source를 클릭해 소스코드를 보았습니다

일단 get방식으로 입력을 받고있고 db를 연결하네요

그 이후가 중요할것 같으니 천천히 보겠습니다

 

if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");

-> preg_match를 통해서 #[주석], select, (, 공백, limit, =, 0x가 있다면 no hack을 출력합니다

 

$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");

-> 변수r에다가 chall27에서 id가 guest이고 no값을 가져오고 id가 guest가 아니라면 query error라는 메시지를 출력합니다

 

if($r['id']=="guest") echo("guest"); -> id가 guest이면 guest를 출력

if($r['id']=="admin"solve(27); // admin's no = 2

-> id가 admin이면 클리어[admin의 no값은 2]

 

level18때 풀었던 방법으로 비슷하게 접근하면 될것같다는 생각이 들었는데

이번에는 preg_match에서 제약사항들이 좀 있어서 그부분을 고려해야하고

쿼리문에서 no값에 괄호가 열려있으니 작성할때 신경을 써주어야 될것같습니다

 

따라서 위에서 0은 존재하지 않는 값인걸 확인했으니

guest의 no값에 0을 주어 쓰레기 값으로 만들고 이 문제를 풀기위한 admin의 no인 2를

or=2로 붙여주겠습니다.

또한 or die도 쓰레기 값으로 바꿔주어야 되니 주석처리를 하는 방법으로 접근하겠습니다

 

정리

1. #[주석], select, (, 공백, limit, =, 0x 사용불가능

2. 쿼리문에 (가 열려서 시간되므로 0)으로 guest의 no값 입력

3. #[주석]을 못쓰므로 -- 으로 대체[--뒤에 공백이 있어야 주석처리됨]

4. 공백이 있으면 안되므로 %09로 대체

 

where id='guest' and no=(0) or no=2 -- die("query error");

먼저 guest의 no값과 admin의 no값을 입력해주고 그 다음 =을 못쓰므로 like로 변경한 다음 그리고 주석처리를 합니다

-> where id='guest' and no=(0) or no like 2 -- die("query error");

 

그 다음 공백부분에 %09채웁니다

-> no=(0)%09or%09no%09like%092%09--%09die("query error");

 

GET방식으로 받으니 위 값을 url에 입력시면 클리어입니다

 

'Site > Webhacking.kr' 카테고리의 다른 글

level23[old]  (0) 2022.03.23
level39[old]  (0) 2022.03.23
level25[old]  (0) 2022.03.21
level1[old]  (0) 2022.03.21
level24[old]  (0) 2022.03.19