sfw8입니다. 문제를 보면 admin을 alert하면 될 거 같긴합니다.
위의 그림처럼 단순히 admin을 script태그로 alert할려고 하면 필터링 되어서 안되는 것 같습니다. 그리고 아무 글자를 입력해서 버튼을 누르면 화면에 그대로 출력되는 것 같습니다. 그렇다면 일단 소스코드를 보겠습니다.
script부분을 주목해야 할 것 같습니다. admin이 일단 필터링 되는 것처럼 보이고 onload, onerror의 핸들러, write나 char을 통해 함수를 사용하는 방법 등도 필터링 되어 있는 것 같습니다. 간단하게 필터링 하는 방법으로는 admin을 hex값으로 바꾸어서 우회하는 방법이 있습니다.
먼저 hex값으로 바꾼 코드는 아래의 코드였습니다.
<script>alert('\x61646d696e');</script> 이렇게 넣은 이유는 sql injection을 할 때 이렇게 넣으면 알아서 admin으로 인식했기 때문입니다. 하지만 이렇게 넣으면
이렇게 뜹니다. a는 뜬 거보니 하마 한 hex값 앞에 \x를 붙여줘야하는 것 같습니다. 그래서 두 번째 글자도 시험해보았습니다.
예상대로인 것 같습니다. 그래서 admin을 하나하나 '\xhex 값'으로 사용해서 우회한 코드인
<script>alert('\x61\x64\x6d\x69\x6e');</script>로 admin을 띄울 수 있었습니다.
생각보다 너무 간단히 우회가 되서 먼저 푼 친구들의 라업을 보니 다른 풀이법도 있어서 그것을 참고해서 다시 풀어보았습니다.
#새로운 풀이법
소개하는 풀이법은 홈페이지를 변조하는 방식을 사용하는 것이었습니다. 이 방법은 xss challenges 문제들을 풀 때 많이 사용했던 방법입니다. 필터링 등의 조건이 존재할 때 홈페이지 변조를 통해 조건을 해제하거나 우회해서 기본 script태그를 이용해서 푸는 것입니다.
이 문제에서 <form>을 입력하게 되면 기존 페이지 코드의 form태그가 덮이게 되는 것이었습니다. 이것을 이용해서 이 문제를 푼 친구는 form 태그의 return 부분을 필터링하는 함수를 거치지 않고 무조건 그냥 입력된 값을 실행하거나 값을 적히게 만들어준 뒤
<script> alert('admin'); <scrip>를 넣어주어서 문제를 해결하는 방법이었습니다. 원래의 소스코드에서 form 태그는
<form name="whoUR" action="check.php" method="post" onsubmit="return myfunction()"> 으로 값이 입력되었을 때 myfunction 함수를 통해 필터링 되는 구조인 것 같은데 아래의 값을 입력해주어서 form태그를 변경 해 주었습니다.
<form name="whoUR" action="check.php" method="post" onsubmit="return true">
위 태그처럼 입력하게 되면 무조건 입력된 값이 실행되거나 적히게 되고, 그렇게 되면 필터링 조건이 무의미해지기 때문에 문제가 해결되는 구조였습니다.(굉장히 똑똑한것 같습니다...)
'웹 > sfw' 카테고리의 다른 글
sfw6 (XSS) (0) | 2021.01.08 |
---|---|
sfw5 (information schema SQL injection) (0) | 2021.01.08 |
sfw4 (error based SQL injection) (0) | 2021.01.08 |
sfw3 (time based SQL injection) (0) | 2021.01.08 |
sfw2 (blind SQL injection) (0) | 2021.01.08 |