본문 바로가기
Security/Web Hacking

[bWAPP] HTML Injection - Stored(Blog)

by 단월໒꒱ 2022. 2. 8.

1. HTML Injection Stored이 무엇인지 간단하게 정리하시오.

 1) HTML Injection Stored (저장기법)

   - 공격자가 취약한 사이트에 악의적인 스크립트가 포함된 게시글 등을 올릴 경우 이 게시물을 열람하면 스크립트가 실행됨

   - 공격 당한 사용자는 쿠키를 탈취당하거나 다른 사이트로 리다이렉션 되는 등의 피해를 입음

   - 데이터베이스에 저장되고 해당 게시물을 열람한 사용자들이 공격의 대상이 되기 때문에 파급력이 큼

   - 공격 방법

      ⓐ 악성 행위를 하는 html 코드를 게시물에 심음

      ⓑ 사용자가 게시물을 조회하면 악성 html 코드 실행

 

2. 문제 페이지에 코드를 삽입하여 아래와 같이 이전 QUEST인 html injection - reflected (POST)를 해결하세요.

 

 

 

 

[난이도 low]

 

 

 

 

글을 쓰는 칸이 있어서 이전 POST 방식 문제의 페이지 소스코드를 참고하여 form 태그를 입력해보았다.

 

 

 

 

그랬더니 firstname과 lastname을 입력하는 form 칸이 잘 나타난 것을 확인할 수 있었다.

 

 

 

 

입력도 할 수 있어서 이전 문제들의 low 단계에서 입력했던 태그들을 그대로 입력하고 Go 버튼을 눌러보았다.

 

 

 

 

원하는 화면을 출력할 수 있었다.

 

 

 

 

난이도 & 결과 화면 확인

 

 

 

[난이도 medium] - 풀 수 없는 이유를 설명하시오.

 

 

 

 

난이도 medium으로 옮기니 이전 단계에서 작성했던 form 코드가 모두 글자 그대로 출력되는 것을 확인할 수 있다.

 

저렇게 출력되는 원인을 알기 위해 페이지 소스 코드를 확인하여 이용된 htmli_stored 파일을 확인해보았다.

 

 

function htmli($data)
{

    include("connect_i.php");

    switch($_COOKIE["security_level"])
    {

        case "0" :

            $data = sqli_check_3($link, $data);
            break;

        case "1" :

            $data = sqli_check_3($link, $data);
            // $data = xss_check_4($data);
            break;

        case "2" :

            $data = sqli_check_3($link, $data);
            // $data = xss_check_3($data);
            break;

        default :

            $data = sqli_check_3($link, $data);
            break;

    }

    return $data;

}

 

 

medium 단계이므로 케이스 1 부분을 확인해보았다.

입력된 데이터에 sqli_check_3 함수가 적용되어 있는 것을 확인할 수 있었다.

주석으로 xss_check_4 함수도 같이 있었기에 두 함수를 같이 살펴보기로 했다.

 

function_external 파일을 열어 sqli_check_3 함수와 xss_check_4 함수의 기능을 확인해보았다.

 

 

function sqli_check_3($link, $data)
{
   
    return mysqli_real_escape_string($link, $data);
    
}

 

 

sqli_check_3 함수는 mysqli_real_escape_string 함수가 적용되어 있는 것을 확인할 수 있었다.

 

mysqli_real_escape_string 함수를 사용하면 SQL 문에서 특수 문자가 이스케이프된다.

사용 형식은 mysqli_real_escape_string(connection, escapestring)으로 connection 에는 사용하는 mysql의 연결을 해주고 escapestring에 오는 건 이스케이프 할 문자열이다.

문자를 이스케이프 하면 스크립트나 태그의 기능은 제거되지만 입력한 내용은 그대로 브라우저에서 확인이 가능하다.

 

 

function xss_check_4($data)
{
  
    // addslashes - returns a string with backslashes before characters that need to be quoted in database queries etc.
    // These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
    // Do NOT use this for XSS or HTML validations!!!
    
    return addslashes($data);
    
}

 

 

xss_check_4 함수는 addslashes 함수가 적용되어 있는 것을 확인할 수 있었다.

 

addslashes 함수를 사용하면 '나 " 같은 특수 문자들을 포함하고 있는 문자열에 \를 추가함으로써 xss 공격을 방지할 수 있다고 한다.

예시를 보면 아래와 같다.

 

 

$str = "hello wo'rld";
$escp = addslashes($str);
// hello wo\rld

 

 

이처럼 사용자의 입력 값에 특수문자가 포함될 경우 위의 함수들로 인하여 브라우저가 html 요소로 해석하지 않아서 xss가 불가능하다.

 

따라서 난이도 high의 문제는 푸는 게 불가능하다.

 

'Security > Web Hacking' 카테고리의 다른 글

[bWAPP] SQL Injection - POST/search  (0) 2022.02.10
[bWAPP] SQL Injection - GET/search  (0) 2022.02.10
[bWAPP] HTML Injection - Reflected(POST)  (0) 2022.02.08
[bWAPP] HTML Injection - Reflected(GET)  (0) 2022.01.30
[XSS Game] Level 6  (0) 2022.01.23

댓글