일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 해외 워게임
- hacking
- CTF
- WarGame
- hackingcamp ctf writeup
- thinkPHP
- writeup
- hackingcamp
- cve 분석
- backdoorctf 2023
- XSS
- 웹 해킹
- 해킹캠프
- Hacker.org
- RCE
- WEB-hacking
- Web Hacking
- php
- Web
- backdoorctf 2023 web
- XSS-game
- wargame.kr
- CVE
- webhacking
- 해킹캠프 ctf
- backdoorctf writeup
- hackctf
- backdoorctf 2023 web Unintelligible
- 해외 wargame
- 웹해킹
- Today
- Total
목록hackctf (14)
<OOO>
flag.php 에서 you are not local 이라는 문장이 보인다. 밑에 링크를 클릭하면 user를 search 할 수 있는 칸이 나온다. 페이지 소스를 보면 op.gg에 내가 입력한 user 값 대로 검색을 하는 것 같다. 이 문제에서 요구하는 취약점은 SSRF 이다. SSRF이란 Server-Side Request Forgery의 약자로 Server Side에서 이루어지는 요청을 변조해 해커가 의도한 서버로 요청을 가게 하거나 요청 자체를 변경 할 수 있는 공격을 말한다. SSRF는 @를 이용하여 취약점을 발생시킨다. 페이지 소스를 보면 hidden으로 url을 전송시키는 것을 확인할 수 있다. @로 우회를 할 수 있는데, hidden 속성이 있는 value 값에서 맨 앞에 ? 를 넣고, 뒤..
제목 그대로 쿠키에 뭐가 있는지 살펴봤는데 base64로 인코딩이 되어 있는 문자열을 발견했다. base64로 인코딩이 3번 되어있는데, 디코딩을 하면 이렇게 id와 type이 뜬다. 여기서 id를 1로 바꾸고, type을 admin으로 바꾼 후 base64로 인코딩을 3번해준다. 그리고 새로고침을 하면 패스워드가 틀렸다고 한다. 이때는 프록시를 사용하여 캡처 한 후 strcmp을 우회 해주면 풀린다. PassAdmin 부분에 strcmp를 우회 하는 방식으로 []를 추가하면 풀린다.
이 셋 중에 하나를 누르면 랜덤으로 NPC가 하나를 골라 승부하는 게임이다. 내가 져도, 이겨도 flag를 뱉지 않는다. 이게 뭔지 싶어서 삽질을 좀 오래 했던 것 같다. 그러나, 우측 상단에 있는 설정 부분을 누르면 이름과 사진을 올릴 수 있게끔 만들어 놨다. 여기서 파일 업로드 취약점이 터지는것 같아 메모장으로 php 파일을 만들어 올려보았으나, 필터링을 하였다. 확장자 이름을 .jpg로 해도, 필터링이 되는걸로 보아 다른 방법으로 필터링을 하는 것임을 느낄 수 있다. 파일 시그니처를 PNG 시그니처로 바꾼 다음 올리면 어떻게 될까 싶어 올려보니 성공을 하였다. 파일 시그니처를 잘 모르겠으면, http://forensic-proof.com/archives/323 이 주소를 참고하자. 이렇게 저장을 하..
내 IP가 나오면서 인증되지 않은 IP 주소라고 한다. 그리고 머릿말에 빨간색으로 강조를 하는걸로 보아 localhost로 인식을 하게끔 만들면 되는것 같다. 헤더에 뭐를 하면 될것 같다는 생각에 버프 슈트 켜서 살펴보았으나... 아무것도 없었다. 근데 헤더에서 설정할 수 있는게 X-Forwarded-For 라는 것이 있는데, 이건 client IP를 식별하기 위한 표준이라고 한다. http://blog.plura.io/?p=6597 보충 설명은 이 사이트에서 들어가서 보면 된다. 프록시로 잡아서 X-forwarded-for 부분에 127.0.0.1을 넣어주면 풀린다.
flag를 입력하라고 하는데, 정직하게(?) 입력할 경우 이렇게 뜬다. replace를 이용해서 우회를 하는 방법인가 싶었지만, 그건 아니었다. 제목 그대로 Input Check를 하는걸로 보아 string 형인지, int 형인지, list형인지 구분하는 것 같다. 일단 flag를 입력해보자. 그러면 No Hack~ 이라는 단어를 볼 수 있는데, 내가 입력한 단어는 string 형인걸로 보인다. 이걸 배열로 바꿔버린다면 이 문제는 풀린다. ?text=flag 부분에 []를 추가하게 된다면 풀리게 된다. strcmp 에서도 이 부분이 먹힌다..! ?text[]=flag를 하면 flag가 나온다.
time 이라는 변수에 최소 5,184,000 초 이상 7,776,000초 미만을 넣으면 넣은 시간만큼 sleep이 작동 한 후 flag를 출력해준다. 여기에서 취약점이 터지는 부분은 sleep((int)$_GET['time']); 부분이다. 정상적인 소스이고, 취약점이 터지는 함수는 안보이는것 같은데... 라고 생각을 할 수 있으나, int형으로 변환을 하는 부분에서 취약점이 발생한다. 이 문제를 해결하는 방법은 5184000초를 지수형태로 입력을 하게 된다면 첫번째 is_numberic 함수에서는 통과가 된다. 그리고 11번째 라인에서 int로 변환할 때, 소수점이 있는 값일 경우 소수점을 버리게 되므로 문제가 짧은 시간 내에 풀리게 된다. 즉, 5184000초를 지수로 변환을 하면 풀린다는 것이다...
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 유명한 짤이 떠오른다. 소스는 위의 사진과 같다. sha1로 input값을 해시화 하는데 md5로 240610708의 값을 해시화 시킨 값과 같다면 풀리게 된다. 여기서 필요한건 sha1의 매직해시 값이다. https://humit.tistory.com/170 여기서 매직해시 값을 알 수 있다. input 값에 10932435112 를 넣게되면 풀린다.
딱 봐도 SQL injection을 해보고 싶은 마음이 든다. View Source 버튼을 누르면 소스가 나온다. GET 방식으로 id 와 pw 를 받고, pw는 sha256으로 해쉬를 돌린 다음 sql 쿼리에 넣는다. mysqli_real_escape_string 이나 preg_match 와 같은 필터링이 없는걸 확인이 가능하다. 자 그러면... SQL injeciton을 해보자. id에 ' or 1=1 # 을 하고 로그인을 시도하면 flag가 나온다.