목록Web/Dreamhack : Web (35)
김승현
문제 xss 필터 우회 관련 문제이다. 풀이 접속하면 예전 xss 문제를 풀 때와 같은 익숙한 페이지가 등장한다. vuln page, memo, flag 엔드포인트가 존재한다. vuln page로 이동해보면 이렇게 주소에 img 스크립트와 그로 인해 출력된 이미지가 보인다. memo로 이동해보면 memo로 올 때마다 hello가 출력되는 걸 볼 수 있다. flag로 이동해보면 이렇게 localhost의 파라미터를 직접 입력해서 제출할 수 있도록 하고 있다. 이제는 소스코드로 이동해보자. #!/usr/bin/python3 from flask import Flask, request, render_template from selenium import webdriver import urllib import os..
문제 파일 취약점을 이용해서 서버의 권한을 획득하는 문제이다. 풀이 접속하면 이렇게 파일을 선택할 수 있게 되어있다. 아무 파일이나 업로드 해보자. bof4.txt라는 파일을 골랐고 submit해보자. 이렇게 저장된 주소가 출력되고 해당 주소로 가보면 파일 내용이 출력이 된다. 다운한 파일들을 살펴보자. Online File Box Choose a file... No file uploaded index는 그냥 페이지를 구성하는 내용들이다.
문제 파일 취약점을 이용해서 flag를 얻는 문제의 advanced 버전이다. 함께 실습 문제라서 코드 분석은 안 하겠습니다! 풀이 접속하면 별 다른 거 없이 API index라고 출력되어 있다. 소스코드를 확인해보자. /file 엔드포인트를 확인해보면 path 파라미터를 통해 ./files/ 경로에서 파일을 읽는 걸 볼 수 있는데 이 때 필터링을 거치지 않고 하는 걸 볼 수 있다. 이 부분을 이용에서 path_traversal 취약점이 발생해 파일을 다운할 수 있을 것이다. 아마 현재 디렉토리는 var/www/에 있을 것 같으니 ../../etc/passwd로 가면 이용자들의 정보를 볼 수 있을 것 같다. 딱히 지금 할 건 없어보이니까 넘어가자. 소스코드에서 여길 보면 API_KEY를 환경변수에서 가져..
문제 command injection advanced 함께하기 실습문제이다. 풀이 접속하면 이렇게 화면이 나온다. -o 옵션이 정상작동되는지 확인해보기 위해 이렇게 입력해봤고 정상적으로 파일이 작성됐다. 강의에 알려주는대로 curl 명령어를 사용해봤다. 이렇게 됐고 cache/webshell.php로 들어가보자. 그럼 이렇게 셸이 뜬다. ls -al /을 입력하고 execute를 누르면 이렇게 목록이 뜨고 중간에 flag는 execute 권한만 가진 게 보인다. 실행해보자. /flag로 실행하면 정상적으로 flag를 얻을 수 있다.
문제 php로 redis를 관리하는 서비스에서 취약점을 찾아서 flag를 획득하라는 문제인 것 같다. 풀이 접속하면 이렇게 되어 있다. 일단 save를 체크하고 return 1;을 submit 해보자 이렇게 특정 주소로 저장되었다고 뜨고 command History에 내용이 입력된다. 이번엔 return 2;를 save없이 submit 해보자. 이렇게 return 2;가 입력되고 저장된 경로가 없는 걸 보니 save를 눌러야 서버 내에 저장 커맨드가 저장되고 입력 없이 하면 한 번 실행되고 끝인 것 같다. command history 오른쪽 끝에 있는 reset 버튼을 누르면 내용들이 초기화된다. 이번엔 오른쪽 젤 위의 config를 눌러보자. 이렇게 config 선택창과 , KEY, VALUE 입력창이..
문제 couchDB 함께하기 실습 문제이다. 풀이 사이트에 접속하면 uid, upw 입력칸이 있고 login하는 칸이 있다. 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'); } }); }); 여기가 uid, upw 등을 입력 받은 코드인데 강의에서도 얘기했듯이 입력받는 uid의 입력에 대한 검사가 없다. 그렇다면 uid..
문제 풀이 그냥 똑같은 코드를 써서 풀었다.. 코드도, 사이트 내용도 같은 걸 보니까 그냥 쉬운 방법이 있는데 그걸 패치한 내용인 것 같다 아마도... 쉽게 클리어 ! ㅎㅎ DH{d3def39496c4153942f3f7d5451a4b98c6db1664}
문제 방화벽 우회 문제다. 풀이 접속하면 이렇게 뜨는 걸 볼 수 있다. 아무거나 입력해보자 hello를 입력했더니 {uid}가 hello로 바꼈다. 이번엔 guest를 입력해보자. guest로 바뀌면서 가운데 guest라고 표시가 생겼다. init.sql과 소스코드는 분석은 강의에 있으니까 그냥 중요해 보이는 것만 가져오겠습니다! keywords 변수에 union, select, from, admin... 등등을 저장하고 저장된 문자열들을 check_WAF함수를 통해서 포함된다면 True를 없다면 False를 반환한다. 그리고 포함되어있다면 true이기 때문에 if문이 실행됨녀서 WAF로 차단이 되며 종료가 되고 포함되지 않았다면 SELECT * FROM use WHERE uid='[uid변수]';를 정..
문제 앞선 강의에서도 나왔듯이 아스키코드와 UTF-8(한글)로 password가 구성되어 있다는 게 핵심인 것 같다. 풀이 접속해보면 생긴 건 저번과 같은 것 같다. guest를 입력해보면 guest가 존재한다고 뜬다. 혹시나 저번처럼 error를 이용하면 될까 싶어서 저번에 error based sqli를 풀 때 사용한 코드를 입력해봤다. 역시 안 된다. 코드를 대충 훑어보자. (분석은 강의에서 했으니 중요한 거만 보고 넘어갑니다) 이 양식에 맞춰서 입력된 uid가 들어가는 것 같다. 이외엔 저번 문제와 코드가 비슷하다. from requests import get host = "http://host3.dreamhack.games:22052" password_length = 0 while True: p..
문제 간단한 error based sqli라고 한다. 풀어보자 풀이 userid쪽의 sql 쿼리문과 uid를 입력하는 창이 있다. guest를 한번 입력해보자. 그냥 저 위에 출력만 바뀌나? 아무거나 입력해보자 아무거나 입력해봤는데 입력이 됐고 이번에는 '--도 입력해보자 error문이 발생했고 mariaDB를 사용하는 것 같다. 소스코드로 가보자. import os from flask import Flask, request from flask_mysqldb import MySQL app = Flask(__name__) app.config['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', 'localhost') app.config['MYSQL_USER'] = os.envir..