'Solve Problem/Webhacking.kr'에 해당되는 글 34건

반응형

접속하면 위와 같은 빈칸과 check 버튼이 있다.

소스코드를 보자.



소스 코드 내에 스크립트가 있다.

URL 내에 .kr의 위치를 ul에 넣고 이에 30을 곱한 값이 input의 값과 같으면 문제가 풀린다.

이는 개발자도구의 console을 이용하면 쉽게 풀 수 있다.



510을 넣으면 아래와 같은 alert 창이 뜬다.


해당 답을 Auth에 넣으면 클리어~

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 16번 문제  (0) 2018.03.08
[webhacking.kr] 15번 문제  (0) 2018.03.07
[webhacking.kr] 13번 문제  (0) 2018.03.07
[webhacking.kr] 8번 문제  (0) 2018.03.05
[webhacking.kr] 6번 문제  (0) 2018.03.05
블로그 이미지

rootable

,
반응형

에이.. 작성하다가 다 날려버렸네 ㅠㅠ 다시쓰자


접근하면 위와 같이 뜬다.

123을 넣고 제출을 누르면 result로 0이 뜬다.

1을 넣었을 떄는 result가 1로 뜨는 것으로 보아 blind sql injection을 하면 될 듯 하다.


일단 공백을 넣었을 떄 no hack이 출력되어 이를 우회하기 위해

/**/, %09을 넣었을 때 no hack이 떴지만 %0a를 넣었을 때 우회가 되었다.


* 공백 우회

 - 테스트 쿼리 : ?no=1(이 부분에 공백 문자)test 

 - /**/, %09, %0a, %0b, %0c, %0d, ( )


그 후 여러가지 시도 결과 or이 no hack에 걸리지 않았다.

?no=1%0aor%0a1 를 한 결과 result도 1이 잘 떨어지는 것을 볼 수 있다.


HINT를 보면 prob13password 테이블에서 flag를 select하라는 것을 보아 if문을 통해 blind를 시도하였다.

다행히 if문은 막혀있지 않았다.


일단 flag를 찾기 전에 쿼리를 확인하기 위해 select하는 컬럼 부분에 1을 넣고 시도해보았더니 no hack이 떴다.

?no=1%0aor%0aif((select%0a1%0afrom%0aprob13password)=1,1,1)

확인 결과 =가 필터링되는 것을 알 수 있었다.

그래서 이를 우회하기 위해 난 IN( )을 사용하였다.

( 참고 : 

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21700&cat1=12&cat2=351&cat3=363&lang=k )


그 결과 no hack이 뜨지는 않는데 result에 1이 출력되지 않는다.

?no=1%0aor%0aif((select%0a1%0afrom%0aprob13password)%0aIN(1),1,1)

local에 깔린 mysql에서 테스트해본 결과 서브쿼리 결과가 1개의 row를 넘는다는 에러를 출력한다는 것을 볼 수 있었다.


따라서 이를 해결하기 위해 limit를 사용하려 했지만 no hack이 떴다.

이를 우회하기 위해 난 max( )를 사용하였다.

* limit 우회

- limit를 우회하기 위해서는 max(column), min(column), group_concat(column)을 사용할 수 있다.

- max는 해당 컬럼의 최대값, min은 해당 컬럼의 최솟값, group_concat은 해당 컬럼의 값을 하나의 row로 출력시켜주는 함수이다.


?no=0%0aor%0aif(ord(substr((select%0amax(flag)%0afrom%0aprob13password),1,1))%0ain%0a(1),1,1)

쿼리를 날린 결과 1이 잘 뜨는 것을 확인하였고 false의 경우 0이 뜨게 한 뒤 Intruder 돌린 결과 첫번째 문자가 f인 것을 확인하였다.


?no=0%0aor%0aif(ord(substr((select%0amax(flag)%0afrom%0aprob13password),1,1))%0ain%0a(1),1,0)

쿼리를 통해 문자열의 길이가 4인 것을 확인하였고 길이가 얼마되지 않아 Intruder 기능을 이용하여 flag 값을 찾았다


그런데... flag 값이 flag...???

혹시나 하여 flag를 넣고 Auth를 넣었지만 반응이 없었다.


substr(group_concat(flag),6,1) 방식으로 우회하려했지만 group이 필터걸림..

혹시나 하여 정말 데이터가 한개 뿐이라면 삽질하는 것이므로 row수를 확인해보았다.

?no=0%0aor%0aif((select%0acount(flag)%0afrom%0aprob13password)%0ain%0a(2),1,0)

그 결과 위의 쿼리대로 데이터가 2개 존재함을 알 수 있었다.


그럼 max로 했을 때 flag가 나오니까.. min으로 하면 나머지 하나가 나와야할꺼같은데... 왜 안나오는거야 ㅠㅠ

와우........ 설마 하고 그냥 length를 늘려가며 테스트했더니 20글자라는 것을 확인하였다.


?no=0%0aor%0aif(length((select%0amin(flag)%0afrom%0aprob13password))%0ain%0a(20),1,0)


Intruder로 돌리기엔 오래걸릴꺼같으니 efficienct blind sql injection으로 가자.



결과로 나온 값을 넣고 auth를 누르면 클리어 ~



반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 15번 문제  (0) 2018.03.07
[webhacking.kr] 14번 문제  (0) 2018.03.07
[webhacking.kr] 8번 문제  (0) 2018.03.05
[webhacking.kr] 6번 문제  (0) 2018.03.05
[webhacking.kr] 5번 문제  (0) 2018.03.05
블로그 이미지

rootable

,
반응형


문제에 접근하면 위와 같은 문자열들만 나타난다.

소스코드를 보니 index.phps가 있는것 같다.

접근해보자


소스코드가 있는데 간단히 정리하면 

$q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'");

의 결과 첫번째 행의 id가 admin이면 문제가 풀리고 만약 쿼리 결과가 존재하지 않으면 ('User_Agent 입력값', '현재 내 IP', 'guest' ) 로 lv0 테이블에 삽입시킨다.


여기서 중요한 점은 내가 USER_AGENT에 뭐라고 입력하던지 삽입되는 id는 guest로 지정되어있다는 점이다.


문제를 풀기위해서는 id가 admin이어야하므로 이 부분을 변경시켜줘야 한다는 것을 알 수 있다.


아래는 입력 쿼리이다.


$q=@mysql_query("insert into lv0(agent,ip,id) values('$agent','$ip','guest')") or die("query error");


내가 입력한 것이 '$agent' 부분에 들어가므로 이 부분부터 시작하여 'guest' 부분을 침범하면 된다.

따라서 나는 User-Agent 부분에 admin12','1','admin')# 으로 입력해주었다.



그 결과 실행이 잘 되었고 where 절에 agent로 되어있으므로 User-Agent에 admin12를 넣으면~?


클리어 ~

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 14번 문제  (0) 2018.03.07
[webhacking.kr] 13번 문제  (0) 2018.03.07
[webhacking.kr] 6번 문제  (0) 2018.03.05
[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
블로그 이미지

rootable

,
반응형


문제에 접근하면 위와 같이 뜬다.

phps는 php의 소스코드를 볼 수 있는 파일이므로 해당 파일에 접근해본다.


접근하면 소스코드가 쭉 있는데 분석을 해보면 만약 cookie내 user라는 변수가 없으면 id과 pw에 guest와 123qwe를 넣어두고 20번 base64로 인코딩을 한다.

그 후 1부터 8까지를 특수문자로 변경한 뒤 그 값을 user와 password라는 cookie로 저장한다.


그 후 특수문자를 1부터 8까지 변경시키고 base64로 20번 디코딩한 결과가 id와 pw가 admin이면 문제가 풀린다.


이는 간단하게 코딩을 통해 문제를 풀 수 있을 것으로 보인다.

아래는 내가 문제 해결을 위해 python으로 코딩한 것이다.



실행 결과로 나온 값을 user와 password 쿠키의 값으로 저장하고 새로고침하면 문제가 풀린다 ~



반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 13번 문제  (0) 2018.03.07
[webhacking.kr] 8번 문제  (0) 2018.03.05
[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
블로그 이미지

rootable

,
반응형


문제에 접근하면 이렇게 버튼이 2개가 존재한다.

Join을 누르면 Access_Denied 라는 메시지와 함께 아무런 동작을 하지 않는다.

Login 버튼을 누르면 mem/login.php에 접근을 한다.

그리고 로그인창이 뜨는데 여기에 test / test로 로그인을 시도하였다.



그 결과 위와 같이 admin이 아닌 id라며 Access Denied가 출력된다.


문제는 admin으로 회원가입을 하면 될 것으로 보인다.

게싱을 하여 mem/join.php에 접근을 시도해보았다.


접근은 되는데 검은 화면 뿐이다.

소스코드를 보면 아래와 같은 자바스크립트가 존재하는 것을 볼 수 있다.



보기가 어려워 JSbeautifier에 넣었다.


그 결과 변수에 값을 넣고 그 값으로 JS를 만든 것이다.

조건이 2가지가 있는데 첫번째는 document.cookie 내에 oldzombie가 존재하는가를 확인한다.


이를 위해 chrome의 EditThisCookie 라는 확장 프로그램을 이용하여 test라는 cookie를 만들고 그 안에 oldzombie를 넣어주었다.


그리고 다시 join.php에 접근하면 또 다시 access_denied가 뜬다.

여기서 두번쨰 조건인 document.URL에 mode=1이라는 문자열이 있는지를 확인하는 조건을 만족시켜주기 위해 http://webhacking.kr/challenge/web/web-05/mem/join.php?mode=1로 접근하였다.


그 결과 아래와 같이 회원가입하는 창이 떴다.


여기서 admin으로 가입하면 되는 것으로 보인다.

처음에는 소문자, 대문자 비교를 하지 않는 것으로 푸는것으로 생각하였는데 생각해보니 mysql은 소문자, 대문자 비교를 하지 않기 떄문에 Admin으로 가입을 시도했을 떄 admin으로 인식하여 중복체크를 우회할 수 없다.


admin이라는 계정으로 중복체크를 우회해서 가입해야하므로 구글링을 조금만 해보면 취약점이 나온다.

( 참고 : https://crehacktive3.blog.me/221119849411 )


이를 이용하여 id에 admin, pass에 123을 넣은 뒤 burp 상에서 공백을 주고 전송시키면 회원가입이 된다.

다시 login.php에 가서 admin / 123으로 로그인을 시도하면 클리어~

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 8번 문제  (0) 2018.03.05
[webhacking.kr] 6번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
블로그 이미지

rootable

,
반응형


문제 접근 시 위와 같은 화면이 뜬다.


==으로 끝나는 것으로 보아 Base64라 생각하여 디코딩을 시도하였다.

그 결과 아래와 같은 문자가 나왔다.


c4033bff94b567a190e33faa551f411caef444f2


길이가 40자인것으로 보아 sha1으로 인코딩된 것으로 보인다.

(참고 : 인코딩 결과가 32자면 md5로 인코딩, 40자면 sha1으로 인코딩)



온라인 decode 사이트에 가서 decode 시도 시 결과의 길이도 40자로 sha1으로 인코딩된 것으로 판단된다.


다시 decode를 하면 아래와 같이 test라는 문자가 출력된다.


해당 값을 password에 넣고 제출을 누르면 클리어~

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 6번 문제  (0) 2018.03.05
[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
[webhacking.kr] 1번 문제  (0) 2018.02.13
블로그 이미지

rootable

,
반응형

문제에 접근하면 위와 같은 거대한 퍼즐이 나온다.

클릭할 수 있는 거라곤 숫자들 사이의 칸과 밑에 있는 [gogo] 버튼 뿐이다.

수도쿠 문제인가?? 재미삼아 해봐야지 ㅎㅎㅎ



위와 같이 클릭 후 gogo를 눌렀더니..오잉??


이름을 입력하는 칸이 나왔다.

name을 입력하고 write 버튼을 눌러보았다.



입력한 name과 함께 answer과 ip가 뜬다.

이번에도 SQL Injection인가..?


name부분은 10자리만 입력 가능하길래 JS에서 바꾸면될까 해서 바꿔보았지만 서버단에서 10개의 문자만 받는 듯 하다.

answer부분에 '를 넣었을 떄 no hack이 뜨고 "을 넣었을 떄 query error가 뜨는 것으로 보아 answer부분에서 SQL Injection을 하는 듯 하다.


정답은 or을 ||로 바꿔서 진행하는 것!

answer=101010000001110010101111||1

을 입력하면 정답이 출력된다.


반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
[webhacking.kr] 1번 문제  (0) 2018.02.13
[webhacking.kr] 새로운 시작  (0) 2018.02.13
블로그 이미지

rootable

,
반응형

문제를 풀어보자

첫 페이지 접근 시 응답 내 아래와 같은 주석이 존재함을 알 수 있다.

쿠키를 보면 time이라는 변수가 존재하는데 이 값을 변경하면 저 주석의 값이 변경됨을 알 수 있다.

이를 이용하는 것이 아닐까?


조금 더 포인트를 찾아보았다.

응답 내 admin이라는 페이지가 존재하여 들어가면 아래와 같은 페이지가 뜬다.

패스워드를 입력하는 부분인거 같아 SQL Injection으로 로그인을 bypass해보려했지만 실패했다.


마지막으로 찾은 포인트는 BOARD에 들어가면 글이 하나 있는데 접근하려하면 아래와 같이 비밀글이라며 패스워드를 요구한다.

이 또한 SQL Injection으로 bypass해보려했지만 실패하였다.


다시 처음으로 돌아가 time을 이용한 주석에서 SQL Injection을 하는 것이 아닐까하여 원래값인 time=1520154131을 time=1520154131%2b1 로 하였을 때 값이 변하는 것을 통해 SQL Injection 포인트인 것을 확인하였다.


time=1520154131+and+1=1 → <!--2070-01-01 09:00:01-->

time=1520154131+and+1=2 → <!--2070-01-01 09:00:00-->

으로 출력되는 것을 통해 blind sql injection으로 패스워드를 획득해야겠다 생각하였다.


삽질의 결과 limit가 사용이 불가한 것을 알았다. 따라서 information_schema를 통해서 데이터를 획득하는데는 한계가 있다.


아래 사진과 같이 BOARD를 눌렀을 때 상단에 FreeB0aRd라고 나오는 것을 통해 테이블명이 저것과 같지 않을까란 생각에 시도.


time=1520154131+and+(select 1+from+FreeB0aRd)=1 의 결과 <!--2070-01-01 09:00:01-->이 출력되었다.

이를 통해 해당 테이블이 존재함을 확인하였고 패스워드 획득을 위해 또 게싱을 하였다.


time=1520154131+and+(select+ascii(substr(password,1,1))+from+FreeB0aRd)>1의 결과 <!--2070-01-01 09:00:01-->이 출력되었다.


이를 통해 column명은 password임을 알았다. (데이터가 1개 뿐이였기 때문에 password도 하나일 거란 생각을 하였다. limit도 사용못하므로 1개만 했을 거란 생각도..)


efficient blind sql injection으로 할까 하다가 귀찮아서 Intruder를 돌리고 있는데 오래걸린다... 여기까지를 작성하면 다 될줄 알았는데....

Efficient blind sql injection 코드를 써보자.


음???? 코드짜고 돌린 efficient 가 더 빨랐따 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

결과로 나온 7598522ae를 패스워드로 입력하면 아래와 같은 화면이 뜬다.


저 admin manual이라는 파일을 다운을 받을 수가 있는데 다운받아 압축을 해제하려고 하면 패스워드를 입력하란다...

웹해킹.kr이니까 압축 비밀번호를 찾으라는 건 아니겠지....??

혹시나해서 게시판 비밀번호를 입력해봤지만 실패

admin 페이지도 같은 비밀번호로는 로그인 실패


다시 처음으로 온 느낌...

오!! 개이득

게싱으로 admin 테이블을 시도해봤는데 password 컬럼까지 존재를 확인했다.

time=1520154131+and+(select+ascii(substr(password,1,1))+from+admin)>1 → <!--2070-01-01 09:00:01-->


아까와 같은 방법으로 패스워드를 찾아보자.

time=1520154131+and+(select+length(password)+from+admin)=10; 를 통해 패스워드가 10자리인 것을 확인하였고 efficient blind sql injection 코드 짜 놓은 것으로 패스워드를 알아보았다.


확인 결과 0nly_admin임을 알았다.

이것을 통해 admin 페이지에 접근 완료!


써져있는 메뉴얼 패스워드로 압축을 풀면 될 듯 하다.

풀어보자~



정답 획득!


여기서는 아래와 같은 것을 깨달았다.

1. cookie의 값으로도 sql injection이 가능하다.

2. 게싱도 필요하다.

3. Intruder보다 efficient blind sql injection이 훨씬 빠르다... (Free 버전이라 Intruder가 느린건가?)

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 1번 문제  (0) 2018.02.13
[webhacking.kr] 새로운 시작  (0) 2018.02.13
블로그 이미지

rootable

,