일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 비박스
- 워게임
- 웹해킹
- network
- 드림핵
- TCP
- System
- XSS
- 시스템
- bee-box
- 웹
- hacking
- ftz
- 모의해킹
- dreamhack
- 알고리즘
- 소프트웨어보안
- 시스템해킹
- 네트워크보안
- 네트워크
- Webhaking
- 리버싱
- webhacking
- Web
- CodeEngn
- WarGame
- reversing
- 소프트웨어
- 순서도
- 해킹
- Today
- Total
목록웹해킹 (17)
Without a Break

strcmp 함수를 무시할 수 있으면 플래그를 얻을 수 있다고 한다. 문제 사이트로 들어가면 패스워드를 입력할 수 있다. 패스워드 입력란 밑의 view-source를 누르면 소스코드를 볼 수 있다. 소스코드를 살펴보면, 사용자가 입력한 password와 실제 password를 strcmp(비교)하여 둘이 같으면(0) 플래그를 출력하는 것을 알 수 있다. PHP strcmp의 취약점을 이용해서 플래그를 얻을 수 있다는 것을 알 수 있다. PHP strcmp의 취약점은, 문자열이 아닌 배열을 인자로 넣게 되면 반환 값이 0이 된다는 것이다. 개발자 도구 요소에서 password를 배열로 바꿔주면 플래그를 얻을 수 있다.

코드 분석 @app.route('/login') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'GET': return render_template('login.html') else: userlevel = request.form.get('userlevel') res = query_db(f"select * from users where userlevel='{userlevel}'") if res: userid = res[0] userlevel = res[2] print(userid, userlevel) if userid == 'admin' and userlevel == 0: return f'hello {useri..

코드 분석 @APP.route('/ping', methods=['GET', 'POST']) def ping(): if request.method == 'POST': host = request.form.get('host') cmd = f'ping -c 3 {host}' try: output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5) return render_template('ping_result.html', data=output.decode('utf-8')) except subprocess.TimeoutExpired: return render_template('ping_result.html', data='Timeout !') except s..

[코드 분석] 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 형태로 표혔하였을 때의 길이를 반환하는 함수이다. 즉, 인코딩에 관계없이 전체 문..

플래그는 username이 admin일 때 index.html에 나타남 username은 sessionid에 저장되어 있음 sessionid는 4바이트의 랜덤 값을 hex로 변환한 값을 출력함 즉, 이 문제에서는 무차별 대입 공격을 사용하여 sessionid에 저장되어 있는 admin 계정을 찾아 패스워드(플래그)를 찾는다. 먼저, 코드에서 아이디와 패스워드를 알 수 있었던 guest 계정으로 로그인한다. burp suite를 통해 패킷을 캡처하면 guest의 sessionid가 함께 나온다. 무차별 대입 공격을 위해 캡처한 패킷을 send to Intruder로 Intruder로 보내준다. Payload type을 무차별 대입 공격(Brute forcer)으로 바꿔주고, Character set을 16..

문제 사이트에 들어가면 다음과 같이 나온다. 각 페이지에 들어가면 다음과 같은 페이지가 나온다. 각 페이지의 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 필터를 우..