본문 바로가기

드림핵

(68)
[드림핵 워게임] [wargame.kr] fly me to the moon 문제 사이트에 접속하면 처음으로 보이는 페이지이다. 문제에 나와있는대로 자바스크립트로 만든 게임인 것 같다. 클릭해서 게임을 플레이해본다. 우주선이 터널 벽에 닿으면 Game over가 되면서 YOU NEED GET THE SCORE 31337 이라는 메시지가 뜬다. SCORE가 31337이 될 때까지 플레이하려면 아주 많은 시간과 노력이 걸리므로 javascript 코드를 수정해서 SCORE 값을 저장하는 변수에 임의로 31337을 입력해줄 것이다. 개발자도구(F12)를 열어서 Elements 탭에서 script 코드가 있는 태그를 살펴보았다. 안에서 난독화 되어있는 script 코드를 찾을 수 있었다. 난독화되더있는 javascript를 디코딩해주는 사이트가 있다. https://beautifier...
[드림핵 워게임] [wargame.kr] strcmp 문제 사이트에 접속하면 처음으로 볼 수 있는 페이지이다. password를 입력하는 폼을 확인할 수 있다. view-source를 클릭하여 코드를 확인해본다. 사용자의 입력값을 POST 메소드로 받아서 입력값을 $password와 strcmp()함수로 비교한다. strcmp()의 결과가 0이면 FLAG를 출력한다. $password는 랜덤으로 생성하고 암호화하므로 그 값을 알아낼 수 없다. 문제에서도 말하고 있는 것처럼 strcmp 함수를 우회하는 방법으로 풀어야 한다. php strcmp bypass를 검색해서 strcmp()는 배열과 문자열을 비교하면 0을 반환하는 것을 알게 되었다. Burp Suite를 실행해서 브라우저를 열고 password 값을 전달하는 패킷을 intercept했다. passw..
[드림핵 워게임] [wargame.kr] type confusion 문제 사이트에 접속하면 처음으로 뜨는 페이지이다. 이것만 보고는 아무것도 알 수 없으므로 view-source를 클릭해서 코드를 확인해본다. POST 요청으로 받은 'json' 입력값에 들어있는 key의 value를 gen_key() 함수로 생성한 $key 값과 비교해서 같으면 flag를 출력한다. 이때 gen_key()로 생성한 $key값은 uniqid() 함수와 sha1() 함수를 거쳐 만들어지는데 마이크로초 단위의 현재시간으로 생성(uniqid())되고 암호화(sha1())되므로 그 값을 알아낼 수 없다. 그런데 json 입력값에 들어있는 key의 value와 $key 값을 비교하는 연산자가 == 인 점에 주목할 필요가 있다. ==은 느슨한 비교로, 위의 표를 보면 한 쪽 인자가 비어있지 않은 문자..
[드림핵 워게임] [wargame.kr] login filtering 문제 사이트에 접속하면 처음으로 보이는 페이지이다. get source를 클릭해서 코드를 확인한다. 쿼리문을 실행하는 php 코드를 확인할 수 있다. 사용자의 입력값이 select 문에 들어가서 실행된다. select 문만 보면 sql injection을 시도해보고 싶지만 사용자의 입력값이 mysqli_real_escape_string()함수를 통해 가공되기 때문에 단순한 sql injection은 먹히지 않을 것이다. FLAG가 출력되는 조건을 확인해보면 select 문 결과 조회된 계정이 존재하야 하고 $id가 guest 혹은 blueh4g이 아니어야 한다. 소스코드에 위와 같이 guest와 blueh4g 두 개의 계정 정보가 제공되고 있다. guest계정으로 로그인을 해본다. 역시 your acco..
[드림핵 워게임] [wargame.kr] tmitter 문제 사이트에 접속하면 처음으로 보이는 페이지이다. Sign Up으로 들어가본다. id 와 ps를 입력하는 폼이 있다. sql injection을 시도해본다. id에 admin' or 1=1-- 를 입력하고 ps에 12341234를 입력했다. sql injection이 제대로 먹혔다면 id : admin, pw : 12341234 로 로그인할 수 있을 것이다. 그런데 login failed가 떴다. Sign Up은 제대로 된 것인가 확인하기 위해 id : admin' or 1=1-- ps : 12341234로 로그인해보았다. 로그인에 성공했다. 하지만 id가 admin이 아니다. 오랜 시간 삽질 끝에 다음과 같은 방법으로 문제를 해결할 수 있었다. 문제에 계정 테이블를 생성하는 sql문이 제공되었는데, ..
[드림핵 워게임] NoSQL-CouchDB 문제 사이트에 접속하면 처음으로 보이는 페이지이다. app.post('/auth', function(req, res) { users.get(req.body.uid, function(err, result) { if (err) { console.log(err); res.send('error'); return; } if (result.upw === req.body.upw) { res.send(`FLAG: ${process.env.FLAG}`); } else { res.send('fail'); } }); }); 로그인 폼에서 받은 값을 처리하는 부분의 코드를 살펴보면 get() 함수를 통해 uid값을 받고 있는데 get() 함수는 전달된 인자에 대해 특수 구성 요소의 포함 여부를 검사하지 않기 때문에 취약점이 ..
[드림핵 워게임] XSS Filtering Bypass 1. 사이트 및 코드 확인 문제 사이트에 처음 접속하면 보이는 페이지이다. 먼저 vuln page에 들어가봤다. param 파라미터를 바꿔보고 싶다. xss 문제니까 일단 가장 단순한 형태의 xss 페이로드를 보내본다. 될 리가 없다. @app.route("/vuln") def vuln(): param = request.args.get("param", "") param = xss_filter(param) return param vuln 함수에서 xss_filter() 함수를 호출하고 있는데, def xss_filter(text): _filter = ["script", "on", "javascript:"] for f in _filter: if f in text.lower(): text = text.repl..
[드림핵 워게임] CSRF Advanced 1. 취약점 확인하기 문제 사이트에 접속하면 처음으로 뜨는 페이지이다. login, change password, vuln page, flag가 있는데, 먼저 취약점이 있는 vuln page를 확인해보자. vuln 페이지에 접속하면 위와 같은 url로 요청이 간다. @app.route("/vuln") def vuln(): param = request.args.get("param", "").lower() xss_filter = ["frame", "script", "on"] for _ in xss_filter: param = param.replace(_, "*") return param vuln 페이지에 해당하는 코드를 살펴보면 param에 전달된 파라미터에 대해서 XSS 공격만 필터링하고 그대로 리턴하는 ..