2022. 3. 23. 16:51ㆍSite/Webhacking.kr
이번시간에는 level39를 풀어보겠습니다
공부하는 입장이니 틀린 것 이있더라도 양해부탁드리겠습니다
일단 level39를 클릭하니 위 화면이 뜹니다
어떠한 값을 입력하도 그대로 리셋되네요...
view-source를 클릭해서 소스코드를 확인했습니다
한번 차근히 보겠습니다
<?php
$db = dbconnect(); // db연결
if($_POST['id']){ // 만약 POST로 id값이 전달되면
$_POST['id'] = str_replace("\\","",$_POST['id']); //id값에있는 \\를 ""으로 치환
cf) str_replace(타겟문자열, 바꿀문자열, 문자열이 담겨있는변수)
$_POST['id'] = str_replace("'","''",$_POST['id']); //id값에있는 '를 "으로 치환
$_POST['id'] = substr($_POST['id'],0,15); //id값에서 0번째부터 15째값까지 추출
cf) substr(추출할값이담긴문자열, 추출시작index, 추출끝index)
$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
// member 테이블에서 id값길이가 14미만이고 POST로 받은 id값이 일치하면은 1을 변수 result에다가 저장함
if($result[0] == 1){ // 만약 result의 0번째값이 1이라면
solve(39); // 클리어
}
}
?>
위코드에서 중요한것을 생각해보면은
1. \\->"", '->"으로 입력하면 치환
2. 입력한 15번째까지의 값이 출력
3. result의 첫번째값이 1이어야 클리어
일단 무조건 앞에는 1이어야 되므로 쿼리문 테스트를 위해
1을 15번을 넘게 입력하고 그 이후부터는 써지질 않는걸 확인...
코드를 자세히 보니까 이상한 점을 찾았는데요
"select 1 from member where length(id)<14 and id='{$_POST['id']}"
위 쿼리문에서 id의 싱글쿼터가 뒤쪽에 하나 빠져있는것을 발견했습니다
이 싱글쿼터도 해결을 해야될것같습니다
substr으로 입력값 15개의 문자열을 받으므로
마지막 부분에 싱글쿼터를 넣어주게되면은 더블쿼터로 치환되어 총 문자는 16개가 됩니다
하지만 다시 substr은 15개의 문자열만 받게 되니깐 16번째에 있는 더블쿼터중 마지막 쿼터를 없애야 되니
" -> ' 으로 변경될것같습니다
앞에는 무조건 1이고 뒤에는 무조건 '이 와야되니 10000000000000' [0 = 공백]처럼 작성면 클리어 될것같습니다
cf)
mysql에서는 'a'='a ' -> true
'a' like 'a ' -> false
'Site > Webhacking.kr' 카테고리의 다른 글
level38[old] (0) | 2022.03.24 |
---|---|
level23[old] (0) | 2022.03.23 |
level27[old] (0) | 2022.03.23 |
level25[old] (0) | 2022.03.21 |
level1[old] (0) | 2022.03.21 |