문제를 들어가니 이런 화면이 나왔다.



코드를 보니 클릭 이벤트 발생시 index.phps 라는 곳으로 이동하도록 링크되어있었다.



index.phps 로 들어가보니 다음과 같은 코드가 나왔다.



user_lv 이라는 이름의 쿠키가 없으면 만들고 값을 1로 넣어놨다.

eregi 라는 함수는 필터링 함수인데 eregi("찾고자 하는 문자", "임의의 값") 과 같이 사용하고 대소문자의 구분이 없다.

^은 not 표시 이다. [^0-9,.] 는 정규식인데 숫자와 ',', '.'를 나타낸다.

한마디로 user_lv 이라는 쿠키에 숫자, ',', '.' 없다면 true를 반환해서 user_lv의 값을 1로 설정하고,

user_lv 의 값이 6이상이라면 마찬가지로 1로, 5 초과라면 solve()라는 함수를 불러온다.

solve 라는 함수가 무슨 역할을 하는지는 모르겠지만 이름만 보면 풀릴것 같다.



따라서 1로 설정된 쿠키값을 5 초과 6 미만인 수를 쿠키 값에 넣어봤다.




성공적으로 풀렸다!

하지만 고등학교때 풀었던 문제라 성공했다는 말은 안 나왔다.

그래도 까먹은게 어느정도 돌아온 것 같아 나쁘지 않은 경험이였다.



'Hacking > Web Hacking' 카테고리의 다른 글

Webhacking.kr 15번 문제  (0) 2018.09.18
Webhacking.kr 2번 문제  (0) 2018.09.18
Suninatas 8번 문제  (0) 2018.09.09
Suninatas 7번 문제  (0) 2018.09.07
Suninatas 6번 문제  (0) 2018.09.07

< 알아야 >


Python Module -> urllib2

쿠키쿠키쿠키쿠키쿠키쿠키쿠키쿠키쿠키

HTTP 이용해 서버에 무언가를 전달하는 방식 -> GET/POST

Python 문법

Burp Suite 기능 하나, Intruder 사용법


< 풀이 >

들어가니 아이디랑 비밀번호를 입력하라고 나온다.

힌트를 보니 admin 으로 로그인을 하라는 비밀번호가 0 ~ 9999 사이라고 한다.

처음에는 다른 풀이글을 보고 Burp Suite Intruder 풀어보려고 했다.

Proxy 탭의 Request 창에서 Send to Intruder 선택하고 



원래 다음과 같았던 내용을 


페이로드 시킬 부분은 PW 뿐이기에 나머지는 § 지워 이렇게 만든다. ( 페이로드란 전송의 목적이 되는 데이터이다. )



페이로드 타입은 0 ~ 9999 이므로 숫자이고, 1씩 체크해볼것이기 때문에 다음과 같이 설정해놨다.



이대로 하면 되기는 하는데 정말정말 느리다. 이대로 하면 몇시간이고 기다려야겠다 싶어서 다른 방법을 찾아봤다.



다른 풀이로는 파이썬 코드를 통해 브루트 포싱( 하나하나 다 해보는 것 )해볼 수 있다고 하길래 User-Agent와 

Edit this cookie 에서 쿠키값을 복사해와서 Cookie 값을 바꿔서 다른 블로그의 코드로 실행해보았다.


실행이 되긴 되는데 찾지도 않고 패스워드가 0이라고 나온다. 그래서 왜 그러지 싶어서 response 를 출력해보니

로그인을 먼저하라는 alert 창을 띄우는 코드가 뜬다. 이걸보고 난 쿠키값 제대로 입력했는데 뭐가 문제지..? 싶었다.



한참을 고민하다 Burp Suite로 Request 한 번 다시 봐보기로 했다. Request 를 열어보니 Cookie 값이 

내가 입력한 거랑 전혀 달랐다. 설마 싶어 복사해서 붙여넣어보니 ..

됐다!


꼭 섬세하지 못하게 풀다가 실수하고 고생하는 것 같다.

고쳐야겠다.


< 알아가야 >

 

섬세함.

파이썬 urllib2 모듈

'Hacking > Web Hacking' 카테고리의 다른 글

Webhacking.kr 2번 문제  (0) 2018.09.18
Webhacking.kr 1번 문제  (0) 2018.09.18
Suninatas 7번 문제  (0) 2018.09.07
Suninatas 6번 문제  (0) 2018.09.07
Suninatas 5번 문제  (0) 2018.09.05

< 알아야 할 것 >

location.href 는 JavaScript에서 새로운 페이지로 이동되는 명령어로 location.href='abc.php' 이런 식으로 사용된다.

form 의 이름을 통해 form 내부의 함수를 호출할 수 있다.

event.keyCode 는 무슨 키를 눌렀는지 알려주고 event.ctrlKey 는 Ctrl 키를 눌렀는지 알려준다.

document.onkeydown 은 키보드를 눌렀을 때, document.onkeyup 은 키보드를 뗐을 때를 나타낸다.


< 풀이 >

이 문제를 접하고 사이트를 들어갔을 때 갑자기 얼굴이 튀어나와서 놀랐다.

Text field 에 Do U Like girls? 라는 말이 적혀있고 아래로 내리면 YES 라는 버튼이 있다.

버튼을 누르니 실패.. 당신은 너무 느려! 라고 Alert 창에게 혼났다.



이후 스크립트를 봤는데 F5, TAB, Ctrl + N, Ctrl + R 을 막아놨다.



힌트를 보니 빠르게 하라고 한다.

YES 라는 버튼을 보니 type 이 submit 으로 넘어가게 되어있었다. 속해있는 form의 이름이 frm 이라



콘솔창에 frm.submit();을 통해 바로 기능을 수행하려고 했는데 어찌된 일인지 정의되어 있지 않다고 나온다.



URL을 보니 7번 문제에 대한 URL 이 아닌 suninatas.com 이여서 새로고침을 해도 main 홈페이지로 가게 된다.

그래서 다른 문제에 들어가 문제에 해당하는 URL 을 찾고 번호를 바꿔 location.href 를 통해 



새로고침을 가능하게 하고 frm.submit()을 정의할 수 있도록 하였다.



그러고 새로고침을 통해 빠르게 몇번 시도해보니 아니 이게 왠일인가! Auth Key 가 나왔다! 헤헤헿



( 윤아 사진은 왜 있는지 모르겠다. 눈호강용인가..? )



< 알아야 할 것 >

크롬 개발자 도구 콘솔창 활용법

아이유

윤아















'Hacking > Web Hacking' 카테고리의 다른 글

Webhacking.kr 1번 문제  (0) 2018.09.18
Suninatas 8번 문제  (0) 2018.09.09
Suninatas 6번 문제  (0) 2018.09.07
Suninatas 5번 문제  (0) 2018.09.05
Suninatas 4번 문제  (0) 2018.09.05

< 알아야 할 것 >

SQL 에서 --는 주석의 기능을 한다.

MD5 는 128 비트 암호화 Hash 함수이다.

Cookie 는 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 

방문할 경우 그 사이트가 사용하고 있는 서버를통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일을 일컫는다.

보통 권한이 없다고 하는 문제는 Cookie 나 Session ID 를 통해 접근할 수 있다.


< 풀이 >

문제에 들어가니 다음과 같은 게시판이 나왔다.

하나 하나 읽어봤는데 3번 게시글을 읽으려면 아래 이미지와 같이 암호가 필요했다. 

Text 입력란 아래에 있는 코드를 보니 SQL인 것 같아서 'SQL Injection을 하라는건가?'라고 생각했다.

코드를 보니 "&pwd&"에 Text field 에 입력한 내용이 들어가는 것 같아서, 항상 참이 되는 조건과 이후의 

문장을 주석처리하여 SQL Injection을 시도했다. 그러나 '='은 왜 인지 되지 않아서 ' or 2>1 -- 로 성공시켰다.

성공하니 위와 같이 auth_key가 suninatastopofworld! 라는 alert창이 나왔다.

그래서 auth key 입력란에 입력했더니 틀렸다고 나온다. 


오타를 입력했나싶어 다시 alert창을 띄어봤는데 글을 읽을 수 있다면서 다음과 같이 접근권한이 없다고 나온다.



그래서 접근 권한에 대해서 찾아보니 쿠키를 만져보고 된다고 한다. 그래서 쿠키값을 봤더니 암호화 되어 있었다.

게시글 중에 2번째 게시글에 https://md5hashing.net/ 라고 적혀있길래 혹시나 싶어 들어가 auth_key를 MD5로 decode 해봤다.

다음으로 Edit this cookie 라는 구글 툴을 통해 쿠키값을 변조해서 시도해봤는데 성공하지 못했다. 그래서 뭐가 문제지하며 30분동안

고민하다가 다시 decode 해봤는데 아니 auth_key를 잘못 입력해서 Hash 값이 이상하게 나온 거였다. 그래서 다시 시도해보자

이번에는 성공했다. 이후 다음과 같은 글이 나왔는데 키를 찾아보라고 한다. 

Elements 에서 Key라는 단어를 찾아보자 다음과 같은 힌트가 적혀있었다.



구글에 검색하니 다음과 같이 나와 Auth Key 에 입력했더니 성공했다!

머리가 벗겨지는 줄 알았다!


< 알아가야 할 것 >

Hash 와 Cookie, Session, SQL











'Hacking > Web Hacking' 카테고리의 다른 글

Suninatas 8번 문제  (0) 2018.09.09
Suninatas 7번 문제  (0) 2018.09.07
Suninatas 5번 문제  (0) 2018.09.05
Suninatas 4번 문제  (0) 2018.09.05
Suninatas 3번 문제  (0) 2018.09.05


< 알아야 할 것 >

eval() 이란 JavaScript의 함수로 수식으로 표현된 '문자열'을 계산해서 결과를 도출해내는 함수이다.

구글 개발자 도구 Console 창에서 Console.log를 통해 그대로 출력할 수 있다.


< 풀이 >



처음에는 위의 스크립트를 못 보고 init이 중요한 줄 알고 찾아봤는데 

이건 단순히 시작할 때 입력창을 비우고 포커스를 맞추는 것 뿐이였다.



그러다 위의 암호화 되어있는 스크립트를 발견하고 eval 함수를 찾아보니 문자열을 계산해서 출력하는 함수이길래 Console.log를 통해 그대로 출력해보았다. 그랬더니 아래와 같이 나오길래 봤더니 본문에는 사용되지 않은 function PASS(n) 가 있었다.



이것도 JS function 이여서 console 창에 입력해보았는데 Parameter 부분에 숫자를 넣는 것 같았다.

이때 아까 본문을 보며 얻은 힌트에 있던 수를 인자로 넣었더니 값이 나왔고 입력하니 AuthKey 가 나왔다.


< 알아가야 할 것 >

웹에 관련된 언어들에 대해 알아봐야겠다.

'Hacking > Web Hacking' 카테고리의 다른 글

Suninatas 7번 문제  (0) 2018.09.07
Suninatas 6번 문제  (0) 2018.09.07
Suninatas 4번 문제  (0) 2018.09.05
Suninatas 3번 문제  (0) 2018.09.05
Suninatas 2번 문제  (0) 2018.09.05


< 알아야 할 것 >

프록시란 서버와 클라이언트 사이를 중계하여 대리로 통신을 수행하는 기능을 말한다.

Burp Suite 란 웹 프록시 툴로서 서버와 클라이언트 사이의 요청, 응답 패킷을 볼 수 있다.

인터넷 사이트에 접속할 때 User-Agent는 사용자에 관한 정보를 전송하게 되는데 

여기에 사용자의 브라우저/ 운영체제등에 대한 정보가 담겨있다.


< 풀이 >

코드를 보니 힌트가 Point 를 50으로 만들라는 것과 SuNiNaTaS 였다.

그래서 Plus 를 눌러 50을 만들고 있는데 25에서 아래와 같은 Alert 창이 나오며 자기는 SuNiNaTaS 브라우저를 좋아한다고 한다.

그래서 Burp Suite 사용법에 따라 설정을 하고 Request/Response 를 보는데 User-Agent 의 정보를 보여주길래

여기를 SuNiNaTaS 로 바꾸고 Forward 를 해보았다. 그랬더니 25에서 올라가지 않던 Forward 가 26으로 올라갔다.

근데 이 과정을 하나하나해서 50 만들기는 너무 번거로워서 찾아봤더니 Repeater 를 사용하라고 한다.

사용해봤는데 처음에는 되다가 포인트가 53까지 올라가서 실패했고 그 뒤로는 왠지 모르게 안 됐다.

그래서 고민하다가 Proxy-Option 창에서 Match and Replace 라는 곳에서 User-Agent 에 대한 정보를 요청할 때 

해당 브라우저에 맞게 변경해주는 설정을 발견했다. 그래서 되지 않을까라는 생각에 그냥 3개 체크한 뒤 SuNiNaTaS 를 넣었다.

이후 Plus 를 눌러보니 문제 창의 User-Agent 에도 SuNiNaTaS 라고 뜨고 더 이상의 제한은 없어서 Plus 버튼으로 50까지 올렸다.

물론 그 뒤에는 설정을 원래대로 바꾸었다. 



< 알아가야 할 것 >

Burp Suite 의 사용법과 웹의 네트워킹 방식에 대해 알아봐야 겠다.


'Hacking > Web Hacking' 카테고리의 다른 글

Suninatas 6번 문제  (0) 2018.09.07
Suninatas 5번 문제  (0) 2018.09.05
Suninatas 3번 문제  (0) 2018.09.05
Suninatas 2번 문제  (0) 2018.09.05
Suninatas 1번 문제  (0) 2018.09.05


< 알아야 할 것 >

사고를 유연하게 해보자.


< 풀이 >

처음에는 달랑 Notice 게시판에 글을 써보라고만 있어서 뭐지..? 하면서 3번 문제의 코드만 보고 있었다.

그러다 Notice 게시판에 가봤는데 글쓰기 버튼이 없어서 게시판의 글 소스를 보니 다음과 같은 곳에 링크되어 있었다.


그리고 이번에는 일반 회원이 글을 쓸 수 있는 Q&A 게시판에 가서 글 소스를 보니 이번에는 이 곳에 링크되어 있었다.


저 divi 라는 게 division 인지 뭔지 잘 모르겠지만 Notice와 Free 로 나뉘어져 있다는 걸알 수 있었다.

따라서 Q&A 게시판 글쓰기 버튼에 링크되어 있는 url의 divi 부분을 free에서 notice 로 바꿔보았는데

성공적으로 Notice 게시판 글 쓰기에 들어올 수 있었고, 글을 써보니 Alert 창으로 AuthKey 가 나왔다.


< 알아가야 할 것 >

위에서도 말했듯이 사고를 유연하게 해보자.

'Hacking > Web Hacking' 카테고리의 다른 글

Suninatas 6번 문제  (0) 2018.09.07
Suninatas 5번 문제  (0) 2018.09.05
Suninatas 4번 문제  (0) 2018.09.05
Suninatas 2번 문제  (0) 2018.09.05
Suninatas 1번 문제  (0) 2018.09.05


< 알아야 할 것 >

구글 개발자 도구의 Console 창에서 JavaScript 코드 실행이 가능하다.


< 풀이 >

문제를 보고 스크립트를 찾아 Elements 창에서 chk_form 함수를 ( id == pw )에서 ( id != pw )로 고치고 

ID와 PW에 같은 문자를 넣었는데 안 됬다. 그래서 찾아보니 JS 는 Console 창에서 실행하는 거고 Elements 창은

단순히 DOM과 CSS 를 조작해서 레이아웃과 디자인을 미리보기 할 수 있는 거였다. 


그래서 콘솔창으로 가서 function chk_form() 수정한 걸 붙여넣어 실행한 뒤 실행하니 성공적으로 AuthKey 가 나왔다.


< 알아가야 할 것 >

아래 링크는 구글 개발자 도구의 설명문인데, 이것에 익숙해져야 겠다. 추가로 JavaScript 도 문법과 주요 함수 정도는

알아둬야 할 것 같다.

https://developers.google.com/web/tools/chrome-devtools/?hl=ko


'Hacking > Web Hacking' 카테고리의 다른 글

Suninatas 6번 문제  (0) 2018.09.07
Suninatas 5번 문제  (0) 2018.09.05
Suninatas 4번 문제  (0) 2018.09.05
Suninatas 3번 문제  (0) 2018.09.05
Suninatas 1번 문제  (0) 2018.09.05


이번에 해킹과 보안에 대해 공부할 계기가 필요해서 스터디를 하게 되었다.

스터디에서 웹해킹부터 시작하기로 했는데 첫번째 목표가 Suninatas Webhacking 문제 풀이이다.

문제에 대한 풀이를 하며 내가 깨달은 부분에 대해서만 간략하게 적고자 한다.


< 알아야 할 것 >

위 코드는 ASP 라고 하는 동적으로 서버에서 작동하는 페이지라고 한다. 

시작과 끝이 <%, %> 인 것을 통해 간단하게 알아볼 수 있다.

Mid(str,n1,n2)는 문자열을 자르는 함수로, 문자열 str 을 n1 번째 부터 n2 개를 자르는 함수이다.

ASP 에서 &은 문자열을 합치는 연산자이다.


< 풀이 >

문자열을 입력받아 a를 aad로 치환하여 result라는 변수에 저장하고,

저장된 내용의 i를 in으로 치환하여 다시 한 번 result 에 저장한다.

그 뒤 result 를 2번째부터 2개, 4번째부터 6개를 잘라 각각 result1, result2에다 저장하고 

& 연산자를 통해 합쳐 다시 result에 저장한다.


그 뒤 Respose.write result 는 result 를 출력하는 코드라 별 신경은 쓰지 않아도 될 것같고

if 문의 result = "admin"일 때 pw = "????????" 라는 것의 pw가 잘 이해는 안 됬는데

결론적으로 result = "admin"이면 될 것 같았다.


그래서 결과로 나와야 할 admin 부터 반대로 해봤는데 admin의 ad는 result1에서 나와야 하고,

admin의 min은 result2에서 나와야 한다. 따라서 result1은 *ad****, result2는 ***min 이여야 한다.

이때 a -> aad , i -> in 이므로 ami를 입력하면 aadmin으로 admin 이 나오게 된다.


< 알아가야 할 것 >

웹페이지를 만들기 위해 ASP를 알아가보자.

'Hacking > Web Hacking' 카테고리의 다른 글

Suninatas 6번 문제  (0) 2018.09.07
Suninatas 5번 문제  (0) 2018.09.05
Suninatas 4번 문제  (0) 2018.09.05
Suninatas 3번 문제  (0) 2018.09.05
Suninatas 2번 문제  (0) 2018.09.05

1. char *p = "ABCDEFG"의 형태일 때 각각의 차이점은 무엇인가?

① *( p+3 )

② ( *p ) +3

③ *p + 3

④ p + 3


< 1번 소스코드 >



< 실행 결과 >









< 설명 >


*p 는 "ABCDEFG" 의 주소값이다.

내가 위의 보기에서 1, 2, 3은 "ABCDEFG"의 주소값을 보니 5fbff808가 나왔는데,

여기에서 3을 더하면 5fbff80b가 되어 "D"가 출력되게 된다.

반면, 4번은 그냥 p에 3을 더했기 때문에 이상한 값이 나온다.



2. char *p = {"ABCDE","KBS","XYZ"}; 일 때 다음 명령어들의 차이점은 무엇인가?

① p++

② *p++

③ (*p)++



< 소스 코드 >


1번 소스코드 : 


2번 소스코드 :





3번 소스코드 : 



-> 1, 2 출력 결과      

 -> 3 출력 결과



< 설명 >



2번 문제를 설명하기 위하여 한가지 코드를 짜보았다.

위의 문제의 1, 2, 3번의 차이는 *연산자와 ++연산자의 우선순위 차이이다.

32비트 운영 체제의 경우에 주소가 0x4씩 커진다.


*p++ = p가 가진 주소가 0x10인 경우, 0x14로 바뀐다.

(*p)++ = p가 가진 주소가 0x10인 경우, 0x10에 1이라는 값을 가지는 경우, 주소 0x10의 값이 2로 바뀐다.

*(p++) = *p++


이런 차이가 있다.




3. 다음 프로그램의 출력 결과를 예측해보아라.



나는 *c 라는 것은 주소값을 가리켜야 하는데 가르켜야 할 주소값이 없으니 입력을 받고 출력을 하지 못할 것 같다고 생각했다.


< 결과 >



내 생각이 맞았다. 난 Xcode를 사용해서 다른데에서는 어떻게 반응할지는 모르겠지만, 에러가 났다.

.

.

코드를 수정하여 이 코드가 돌아갈 수 있도록 해 보았다.




*c 라는 포인트 배열이 input 이라는 배열을 가리키게 하여 코드가 실행될 수 있도록 하였다.

▼▼▼ 출력 결과 실행이 잘 된다  ▼▼▼





4. char * p[] = {"ABC","XY","BJW","JMLEE"}; 일 때 다음 각각의 포인터의 연산 결과를 구하여라.

① *p

② *p([2] + 1)

③ *(*(p + 3) + 2)



1번만 실행할 경우 A가 출력 되지만, 2~3번은 에러가 나며 출력되지 않는다.

내가 예상한 결과는 2번의 경우 p[2]는 "BJW" 이고 +1이니 J를 예상하였고,

3번의 경우 *(p+3)은 p[3]이고 여기에 +2이니 L을 예상하였는데 에러가 나서 당황하였다.




내가 포인터를 잘못 이해하고 있는건지 모르겠다.

▶ 제가 만약 잘못하고 있는게 있으면 댓글로 달아주면 감사하겠습니다.



5. 입력받은 문자열 거꾸로 출력하는 프로그램을 만들어라.




< 코드 설명 >


위의 코드는  p 포인터 배열을 만든 뒤, Input을 받고, p[i]을 NULL 전까지 주소값를 증가시켰다.

마지막으로 for문으로 NULL 전부터 0까지 출력하게 하여 거꾸로 출력하는 프로그램을 만들어 보았다.



< 출력 결과 >






6. a가 배열이고, b가 문자열의 포인터일 때 배열 a에 b 문자열을 복사하는 함수를 만들어라.





< 코드 설명 >


이 코드는 a 배열과 b 포인터 배열을 선언하여 a를 입력받고 strcpy를 사용하여 b에 a를 저장하여 Output으로 b를 출력하였다.

결과는 아래와 같이 제대로 되었다.





7. char c[]="ABCDE" 일 때, c++과 같은 명령을 사용할 수 없는 이유를 구하여라.


c[]는 일반 배열이기 때문에 문자여서 c++를 하면 오류가 나게된다.

하지만 char *c[]를 하여 포인트 배열로 만들면 주소값의 형태를 띄게 되어 c++를 하면 주소값+1이 되어,

A의 주소값 +1 = B가 되어 BCDE가 출력되게 된다.

'Programming > C' 카테고리의 다른 글

함수 포인터  (0) 2015.08.27
[ Project ] Wild!  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27