일단 소스코드는 다음과 같다. javascript 함수로 정규표현식을 사용해서 admin, img, iframe, onload, onerror, write,concat,join,char 등을 대소문자 구분없이 검증하고 있다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SFW8</title>
</head>
<body>
<form name ="whoUR" action="check.php" method="post" onsubmit="return myfunction()">
<h1>Hi admin! Alert 'admin'😕;</h1>
<h2>input field is below</h2>
<input type="text" name="id" placeholder="write" value="">
<input type="submit" value= "submit">
</form>
<script>
const warningTitleCSS = 'color:red; font-size:60px; font-weight: bold; -webkit-text-stroke: 1px black;';
const warningDescCSS = 'font-size: 18px;';
console.log('%cNo NO. Stop!', warningTitleCSS);
console.log("%cDon\'t use this.", warningDescCSS);
console.log('%cjust use blank, please😂.', warningDescCSS);
function myfunction(){
var inputa = document.whoUR.id.value;
var regExp = /admin|\+|img|iframe|onload|onerror|write|concat|join|char/gi;
if(inputa.match(regExp)){
alert("😟");
return false;
}
return true;
}
</script>
</body>
</html>
그래서 내가 생각한 풀이 방법은 이렇다. javascript는 페이지를 로딩할 때 같이 로드되는 client side 언어이다. 그런데 개발자들은 항상 조심해야 한다. javascript는 끌 수 있기때문에 server side에서도 검증을 같이 해주어야 하고 에러로그를 남겨야 한다. 그런데 이 문제의 경우에는 그런 것이 없었다.
그래서 먼저 자바스크립트를 끄고 페이지를 로딩한다.
페이지 로딩이 끝난 후에는 다시 켜준다. 그리고 <script>alert('admin')</script> 입력해준다.
너무 날빌인것 같기도 하지만 엄연한 공격 방법이라고 생각했다.
그리고 그냥 두번째 방법도 어려워 보이지 않아서, 해보았다. char이 안들어간 함수를 이용하는데 decode만 가능하면 되는거 아닌가? 싶었고, 가장쉬운 인코딩 함수는 base64 인코딩/디코딩이 있겠다.
최근에 웹페이지를 만들면서 해킹 시도 탐지기능을 추가하고 있는데, 해킹시도에서 어떤 공격을 어떻게 했는지 알기 위해서는 sql injection의 완전 방지가 가능한 prepared statement 가 아닌
쿼터 문자도 mysql db에 들어갈 필요가 있었고, base64 인코딩에서는 쿼터문자가 쓰이지 않는다는 것을 이용해서 이용한 방법이다.
<script>alert(atob("YWRtaW4="))</script>
잘 된다.
'전공쪽 > 동아리 관련' 카테고리의 다른 글
webhacking.kr (0) | 2021.01.27 |
---|---|
sfctf winter write up (0) | 2021.01.26 |
sfw5 write up (0) | 2021.01.10 |
xss challenges (0) | 2021.01.07 |
sfw6 up (0) | 2021.01.07 |