일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 리버싱
- 시스템해킹
- System
- network
- 워게임
- ftz
- 알고리즘
- 네트워크
- Web
- webhacking
- 비박스
- Webhaking
- 드림핵
- 순서도
- bee-box
- 웹
- reversing
- TCP
- 해킹
- CodeEngn
- 네트워크보안
- WarGame
- 소프트웨어
- XSS
- 웹해킹
- hacking
- 모의해킹
- 소프트웨어보안
- 시스템
- dreamhack
- Today
- Total
목록Webhaking (7)
Without a Break

[코드 분석] xss_filter(text) def xss_filter(text): _filter = ["script", "on", "javascript:"] for f in _filter: if f in text.lower(): text = text.replace(f, "") return text xss 공격을 막기 위한 필터링 script, on, javascript: 를 필터링 app.route("/vuln") @app.route("/vuln") def vuln(): param = request.args.get("param", "") param = xss_filter(param) return param /vuln 페이지에 접속했을 때의 동작 param의 값을 xss_filter를 통해 필터링하여 저..

사용자가 입력한 값이 필터링 없이 출력된다. 'or 1=1 limit 1#'을 입력했을 때, 이미 존재한다고 뜨는 것을 보아 행의 개수가 1이어야 참, 거짓을 판별할 수 있다는 것을 알 수 있었다. 위의 정보들을 바탕으로 admin 계정의 패스워드들을 추출하기 위한 공격 코드를 작성한다. 공격 코드를 작성하는 순서는 다음과 같다. admin 패스워드 길이 찾기 각 문자 별 비트열 길이 찾기 (패스워드의 각 문자가 한글인지 아스키코드인지 알 수 없기 때문에 이를 판단하기 위해) 각 문자 별 비트열 추출 비트열을 문자로 변환 1. admin 패스워드 길이 찾기 length 함수 사용한다. length 함수는 문자열을 bytes 형태로 표혔하였을 때의 길이를 반환하는 함수이다. 즉, 인코딩에 관계없이 전체 문..

문제 사이트에 들어가면 다음과 같이 나온다. 각 페이지에 들어가면 다음과 같은 페이지가 나온다. 각 페이지의 url을 보면 입력한 경로를 그대로 출력하고 있음을 알 수 있었다. 어떤 경로를 입력해도 텍스트로 뜨는 것 외에 다른 동작을 하지 않았다. 어떤 경로를 입력해도 되지 않으니 템플릿 언어를 써보기로 했다. *템플릿 언어 : 파이썬 변수 및 문법을 html 안에서 쓸 수 있도록 제공해주는 언어 템플릿 언어 {{7*7}}을 삽입했더니 결과값이 나타났다. 문제 코드를 확인하면 %(request.path)를 통해 경로를 출력한다는 것을 알 수 있었다. 섹션의 옵션 값이 뜨도록 {{config.items()}}를 입력해주니 플래그를 확인할 수 있었다.

문제 사이트로 들어가면 다음과 같이 나타난다. List 페이지에 들어가니 플래그가 있는 flag.php가 있는 것을 확인할 수 있었다. flag.php 페이지에 들어가니 역시나 플래그는 바로 뜨지 않았다. 문제에서 말했던 /uploads/flag.php 경로가 맞는데 왜 뜨지 않는걸까? view.php 파일을 확인해보니 /flag가 필터링되어 Permission denied가 뜨는 것을 알 수 있었다. index.php를 보면 GET['page']를 통해 입력을 받아서 include로 실행한다. 위와 같이 /var/www/uploads/flag의 경로로 실행해봤더니 can you see $flag?라는 글자가 뜨는 것을 확인할 수 있었다. php에서 flag를 우회하는 방법 중 하나는 flag 필터를 우..

문제 사이트에 들어가면 다음과 같은 화면이 나온다. socket 페이지의 모습이다. 문제 코드를 보면 admin으로 POST 메소드를 통해 접속한 후 if문을 통과하면 플래그가 반환되는 것을 알 수 있다. if문을 통과하는 조건은 다음과 같다. 클라이언트의 ip가 127.0.0.1인지 User-Agent의 헤더 값이 Admin Browser인지 DreamhackUser가 admin인지 admin 쿠키 값이 true인지 userid가 admin인지 현재 host의 ip는 0.0.0.0이고, 포트 번호는 8000이다. host : 127.0.0.1 port : 8000 data: POST /admin HTTP/1.1 Host:host1.dreamhack.games User-Agent:Admin Browser..

문제 사이트에 접속하면 다음과 같은 화면이 나온다. command 문제라서 주소창에 명령어를 입력해봤지만 실행되지 않는다. 문제 코드를 확인하니 GET 메소드일 때는 실행이 안되고, GET 이외의 메소드일 때만 명령어가 실행된다는 것을 알 수 있었다. 버프 스위트를 사용해 문제 사이트의 패킷을 가로채서 리피터로 보낸다. 리피터로 보낸 후 GET 메소드를 HEAD 메소드로 바꿔주고, flag.py의 내용을 request bin으로 생성한 링크로 전송하는 코드를 작성한다. 요청을 수정하고 send 버튼을 눌러줬다. 전송 버튼을 누르면 요청에 대한 응답이 잘 이루어졌다는 200 OK가 나타난다. request bin을 확인하면 요청한 응답이 제대로 와서 플래그를 확인할 수 있다.

[문제 파일] 데이터베이스 DATABASE = "database.db" if os.path.exists(DATABASE) == False: db = sqlite3.connect(DATABASE) db.execute('create table users(userid char(100), userpassword char(100));') db.execute(f'insert into users(userid, userpassword) values ("guest", "guest"), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}");') db.commit() db.close() 데이터베이스 파일이 존재하지 않는 경우 파일을 생성하고 연결한다. 유저 테이블을..