소스코다
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>PHParse</title>
</head>
<body>
<!-- php code -->
<?php
$url = $_SERVER['REQUEST_URI'];
$host = parse_url($url,PHP_URL_HOST);
$path = parse_url($url,PHP_URL_PATH);
$query = parse_url($url,PHP_URL_QUERY);
echo "<div><h1> host: $host <br> path: $path <br> query: $query<br></h1></div>";
if(preg_match("/flag.php/i", $path)){
echo "<div><h1>NO....</h1></div>";
}
else echo "<div><h1>Cannot access flag.php: $path </h1></div> ";
?>
<style type="text/css">
body {
margin: 1em;
}
div {
margin: 0 5px 0 0;
padding: 0.1em;
border: 2px solid silver;
border-radius: 7px;
}
</style>
</body>
</html>
이 PHP와 HTML 코드의 구조를 분석해 보겠습니다.
1. 코드의 목적
- 사용자가 요청한 URL을 분석하여 호스트(host), 경로(path), **쿼리(query)**를 추출하고 화면에 출력합니다.
- 만약 경로(path)가 특정 문자열(flag.php)과 일치한다면, 특정 메시지를 출력하는 조건을 포함합니다.
- HTML과 간단한 CSS 스타일링으로 출력 형식을 정리했습니다.
2. 주요 구성 요소 분석
HTML 및 CSS
- Bootstrap CSS를 사용하여 기본적인 스타일링을 추가합니다.
<style type="text/css">
body {
margin: 1em;
}
div {
margin: 0 5px 0 0;
padding: 0.1em;
border: 2px solid silver;
border-radius: 7px;
}
</style>
- CSS:
- body와 div 태그에 기본적인 스타일을 적용.
- div에 테두리와 패딩, 둥근 모서리 적용.
PHP 코드 분석
$url = $_SERVER['REQUEST_URI'];
- 현재 페이지에 대한 URL 경로를 가져옵니다(예: /example/path?name=value).
$host = parse_url($url, PHP_URL_HOST);
$path = parse_url($url, PHP_URL_PATH);
$query = parse_url($url, PHP_URL_QUERY);
- parse_url 함수로 URL을 분석:
- PHP_URL_HOST: 호스트명 추출(예: example.com).
- PHP_URL_PATH: URL 경로 추출(예: /path/to/file).
- PHP_URL_QUERY: URL 쿼리 추출(예: key=value).
echo "<div><h1> host: $host <br> path: $path <br> query: $query<br></h1></div>";
- 추출한 데이터를 HTML로 출력.
조건문
if (preg_match("/flag.php/i", $path)) {
echo "<div><h1>NO....</h1></div>";
} else {
echo "<div><h1>Cannot access flag.php: $path </h1></div>";
}
- preg_match 함수:
- "/flag.php/i": flag.php 문자열을 대소문자 구분 없이 검사.
- preg_match가 true를 반환하면 "NO...." 메시지를 출력.
- 그렇지 않으면 "Cannot access flag.php" 메시지 출력.
3. 실행 흐름 요약
- 클라이언트가 페이지를 요청.
- PHP는 $_SERVER['REQUEST_URI']로 URL 경로를 가져와 분석.
- URL에서 호스트, 경로, 쿼리를 추출하여 HTML로 표시.
- URL 경로에 flag.php가 포함되었는지 조건문으로 검사.
- 포함되었다면: NO.... 출력.
- 포함되지 않았다면: "Cannot access flag.php" 출력.
4. 예상 동작
입력: http://example.com/flag.php?user=test
- 호스트(host): 없음 (parse_url은 상대 경로에서 호스트를 반환하지 않음).
- 경로(path): /flag.php.
- 쿼리(query): user=test.
- 출력:
<div><h1> host: <br> path: /flag.php <br> query: user=test<br></h1></div> <div><h1>NO....</h1></div>
입력: http://example.com/home.php
- 경로(path): /home.php.
- 출력:
<div><h1> host: <br> path: /home.php <br> query: <br></h1></div> <div><h1>Cannot access flag.php: /home.php </h1></div>
5. 잠재적인 문제
- PHP_URL_HOST와 상대 경로:
- 상대 URL(REQUEST_URI에 호스트 미포함)이 제공되면 $host는 항상 빈값을 반환.
- 이를 해결하려면 _SERVER['HTTP_HOST']를 사용하여 호스트를 보완할 수 있습니다:
$host = $_SERVER['HTTP_HOST'];
- 보안 취약점:
- URL 분석 결과를 그대로 출력하면 공격자가 XSS를 시도할 수 있습니다.
- 해결: htmlspecialchars로 출력값 이스케이프:
echo htmlspecialchars($host);
- 미사용된 변수:
- day 변수는 정의만 되었으며 사용되지 않음.
6. 개선 사항
- 보안 강화:
echo "<div><h1> host: " . htmlspecialchars($host) . "<br> path: " . htmlspecialchars($path) . "<br> query: " . htmlspecialchars($query) . "<br></h1></div>";
- 호스트 처리:
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'unknown';
이 코드는 주로 URL 분석 및 조건부 메시지 출력에 사용됩니다. 간단한 테스트 및 교육용으로 적합하지만, 보안과 실용성을 위해 위 개선 사항을 고려해야 합니다. 😊
parse_url() 함수에 대한 정보는 참고 사이트를 보면 더 알 수 있다.
여기선 $path에 /flag.php/ 가 들어갔을 때의 조건을 피해야 되므로, 관련 취약점으로 간단하게 '/' 를 하나 더 붙여 host로 인식되게 하는 방법을 사용했다.
출처 ㅣ https://claude97.tistory.com/entry/Dreamhack-wargame-1-9
https://blog.naver.com/bomi3628/222430877392
여기서 간단한 취약점이 하나 나오게되는데 그냥 간단하게 슬래쉬를 하나 추가해서
///path?arg=value 이런 URL를 보내주게 된다면 모두 NULL값을 반환한다.
///인 URL이 없기 때문 그렇다면 //path?arg=value 보내주게 된다면?
path를 host부분으로 인식하게 된다. // 다음은 보통 host가 나오기 때문에 그렇다.
++
#@ , ?@ 뒤에 있는 것을 호스트로 인식하는 경우
http://example.com:80#@google.com
http://example.com:80?@google.com
이 경우 google.com 으로 호스트를 인식하게 된다.
[출처] PHP Parse_url 함수 분석 / 취약점 | 2017 블랙햇 SSRF 공격|작성자 Algedi
https://codingeverybody.kr/php-parse_url-%ED%95%A8%EC%88%98/
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[98] IT 비전공자 [dreamhack]Small Counter문제 풀기 (1) | 2024.12.16 |
---|---|
[97] IT 비전공자 [dreamhack]Small Counter문제 풀기 (0) | 2024.12.15 |
[95] IT 비전공자 [dreamhack]Broken Buffalo Wings문제 풀기 (1) | 2024.12.13 |
[94] IT 비전공자 [dreamhack]wargame.kr type confusion문제 풀기 (1) | 2024.12.12 |
[93] IT 비전공자 [dreamhack]amocafe문제 풀기 (2) | 2024.12.11 |