문제화면이다.
소스코드를 봐보자.
id 파라미터의 값이 없으면 id의 값을 "guest"로 설정한다. [$get]
if(!$_GET['id']) $_GET['id']="guest";
만약 id 가 있을경우 "addslashes()" 함수로 재설정
"addslashes()" 함수는 싱글쿼터(')를 백슬래쉬(\)로 변환한다.
$_GET['id'] = addslashes($_GET['id']);
preg_match로 필터링이 있다.
$id에 [(,), select, from, ', ', by, '.'] 각 소 괄 화, SQL 구문, 쉼표, 점을 필터링한다.
if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
id가 15글자보다 길면 안 된다고 한다.
if(strlen($_GET['id'])>15) exit("Access Denied");
SQL쿼리에서 id를 내림차순(제일최근) 레코드를 1개만 가져온다.-> 아마 Guest 이겠죠
$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
URL 인코딩을 통한 공격은 통하지 않았다 -> 대부분 15글자가 넘거나 , 문자열이 섞여있다.
'*'으로 id 값을 보냈을 때는 내림차순으로 정렬되어 있기에 (Guest) 아마 안될 것이다.
애초에 싱글 쿼터(')가 막혀있는 상태이다 addslashes() 함수에 의해..
그러면 "admin"을 다른 걸로 바꿔야 한다는 것이다.
그중 16진수로 바꿔보자.
0x61646D696E
GPT 시켜서 바꾸라고 했다.
이러면 "admin"이라는 문자열은 살아있는 것이다.
?id=0x61646D696E%20id
그럼 이 코드를 통해서 한번 실험해 보자.
id=admin id로 되는데
%20 은 URL 인코딩으로 [스페이스바] 띄어쓰기이다.
SELECT 'admin' id
으로 인식될 것이다.
$get -> id 가 조회해 줄 것이기 때문이다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
webhacking.kr - old 34 (1) | 2024.03.29 |
---|---|
webhacking.kr - old 49 (1) | 2024.03.29 |
webhacking.kr - old 47 (0) | 2024.03.28 |
webhacking.kr - old 36 (0) | 2024.03.28 |
webhacking.kr - old 08 (0) | 2024.03.27 |