2022. 3. 23. 15:21ㆍSite/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 |