마우스를 이동할 때마다 monster가 움직인다

 rank 링크 클릭

rank.php와 문제 해결에 도움을 줄 문구가 적혀있다.

 

score 값을 각각 다르게 넘겨주니 각각 다른 id 값이 나왔다.

 

 

and 참 구문
and 거짓 구문

참과 거짓에 따라 나오는 결과가 다르니 SQL Injection 공격을 시도할 수 있겠다.

 

 

 

 

Procedure analyse() 를 사용하여 쿼리 명령 시 DB명.테이블명.컬럼명 획득이 가능하다.

하지만, procedure analyse()라는 함수는 limit 절 뒤에 사용이 가능하다.

즉, limit 구문을 앞에 추가하여 필드를 차례로 뽑아내는 것이 가능하다는 이야기이다.

 

~ limit 0,1 procedure analyse()   // 첫째 필드

~ limit 1,1 procedure analyse()   // 둘째 필드

limit 2,1 procedure analyse()   // 셋째 필드

이를 통해 알게 된 사실?

컬럼명 : id / score / p4ssword_1123581321

 

 

p4ssword_1123581321 컬럼의 length를 알기 위해 score=1 일 때

id 값이 Piterpan 이었다는 점을 이용하여 

참 구문일 때의 length 값이 뜨도록 하였다.

 

길이는 31임이 확실해졌다!

 

 

 

이제 p4ssword_1123581321 컬럼의 문자열을 알기위해 score=1 일 때

id 값이 Piterpan 이었다는 점을 이용하여 

참 구문일 때의 문자열이 순차적으로 뜨게 하였다.

 

하지만... 기다려도 안 돼서 확인해보니까 

no hack!! 

 

이 후 알게된 것

1. ascii 함수는 막아놨다 → ord 또는 hex 이용

2. substr 함수도 막아놨다 → right, left, mid 이용

 

 

해결

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

XSS 취약점 참고  (0) 2022.11.29
Webhacking.kr Challenge(old) 23번 풀이  (0) 2021.11.15
wfuzz  (0) 2021.07.10
[Webhacking.kr] Challenge(old) 39번 풀이  (0) 2021.06.07
[Webhacking.kr] Challenge(old) 38번 풀이  (0) 2021.06.04

33번 문제는 ,, 10문제다.... 쿨럭 

 

33-1

33-1 문제
view-source
Next

문제가 이런식으로 계속 이어져 있다.


33-2

33-2 문제
소스코드

POST 방식으로 넘겨주는 값이 있어야 할 것 같다.

하지만 문제에선 POST 방식으로 보낼 수 있는 text 상자가 없기 때문에 직접 페이지코드를 수정하였다.

코드 수정
수정 후 post 방식으로 해당 값 전송
Next


33-3

33-3 문제
소스코드

'$_SERVER["REMOTE_ADDR"] : 웹서버에 접속한 접속자의 IP정보' 이기 때문에 나의 IP주소를 적어주었다.

 

Next


33-4

33-4 문제
소스코드

※ md5() : 문자열에서 md5 해시값을 생성하는 함수

 time() : 1970년 1월 1일 0시 0분 0초부터 지금까지 지나온 초를 정수형태로 리턴해주는 함수

 

GET 방식으로 전달된 password 값이 time()을 md5 방식으로 암호화한 값이라면 문제가 풀리는 것 같다.

하지만 이 time() 값은 현재 시간을 나타내는 것이어서 1초마다 바뀐다.

 

 

따라서 현재 시간에서 약 15초 정도 뒤의 time값을 md5 방식으로 암호화시킨 후,

15초 뒤에 URL에 ?password=15초 뒤 time값을 암호화한 값을 전달해주었다.

Next


33-5

33-5 문제
소스코드

이번에는 GET 방식으로 imget, POST 방식으로 impost를 넘기고, 쿠키 값을 imcookie로 설정하면 풀릴 것 같다.

 

소스코드 수정

get과 post 방식으로 데이터를 한 번에 전송하기 위해서 

form의 action 주소를 md555.php?imget=imget 으로 설정하였고(이러면 GET 방식으로도 전달되므로)

post 방식으로 impost를 넘겨주었다.

쿠키 값도 imcookie로 설정

쿠키 값도 imcookie로 설정한 후의 화면이다.

Next


33-6

33-6 문제
소스코드

① 이름이 test인 쿠키를 만들어 33-3에 사용됐던 IP주소를 MD5로 암호화한 값을 넣어주고

② post 방식으로 문제 화면에 나와있는 값을 MD5로 암호화한 뒤 kk라는 이름으로 넘겨주면 될 것 같다.

 

name이 kk인 post 방식 form 생성, test 쿠키 생성
Next


33-7

33-7 문제
소스코드

33-3번 문제에서 쓰였던 내 IP 주소를 활용하는 문제이다.

 

str_replace 함수를 사용하여 이 IP 문자열에 있는 모든 .없애고

$_SERVER['REMOTE_ADDR']에 다시 저장하고 있다.

 

주의할 점은 GET으로 넘겨지는 값(인자값)변수(인자)도 이와 똑같다는 것!

따라서 .을 없앤 IP주소를 GET 방식으로 전달했다.

Next


33-8

33-8 문제
소스코드

※ extract 함수 : $_GET을 인자로 넣으면 ($_POST도 가능) GET으로 넘기는 파라미터와 값을 변수와 그 초기값으로 설정
extract 함수의 기능을 이용하여 넘기는 파라미터 addr의 값을 127.0.0.1로 설정하면 풀릴 것 같다.

 

Next

 


33-9

33-9 문제
소스코드

※ chr : 아스키코드 번호를 받아 해당하는 문자열을 리턴해주는 함수

+) ord : 문자열의 첫번째 문자에 해당하는 아스키도르를 리턴해주는 함수

 

아스키코드 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121에 해당하는 문자열이 $answer에 연속적으로 추가된다.

따라서 이를 GET 방식으로 ans 파라미터에 넣어서 문제를 풀면 될 것 같다.

 

Next


33-10

33-10 문제
소스코드

이리저리 변경된 나의 IP주소를 $answer과 $ip 변수에 넣고 문제 풀이를 유도하고 있다.

 

php 코드를 실행

실행 결과 $ip 변수와 $answer 변수의 값을 알아냈다.

그리고 fopen시 사용하는 디렉토리를 그냥 URL에 적어주면 될 것 같다.

ㅜㅜ 끝

문제
페이지 소스코드

평범한 코드이다.

제출 클릭 시

you are not admin이라는 문자열이 뜨고 몇 초 후에 다시 메인 페이지로 돌아간다.

 

guest로 제출

guest를 입력해줬더니 hello guest라는 문자열이 보인다.

 

1234로 제출

 

제출한 값 그대로 나온다.

admin을 제외하고는 모두 이렇게 뜨는 것 같다.

 

하지만, logout을 눌러도 페이지에 변화가 없고,, 주소창도 그대로여서 쿠키를 확인해봤다. 

일반적으로 사용하는 PHPSESSID 말고 userid라는 쿠키가 있다.

 

들어있는 값을 URL 디코더로 돌린 후 %3D=를 의미한다는 것을 알았다.

어떠한 난독화된 값이 =로 끝난다면 이는 base64 로 인코딩된 것일 확률이 높다고 한다.

 

따라서 이것을 base64 방식으로 디코딩하려 했으나 오류만 나고,, 알 수 없는 문자열이 가득.. 

그래서 다시 처음부터 시작

 


 

id에 0을 입력

0을 입력했을 때는 URL 주소가 정상적으로 나타나지만 메인 페이지에 머물러 있다.

따라서 1을 입력해봤다.

 

id에 1을 입력
쿠키값 확인

비교적 짧은 쿠키값이 나왔다. 

이 또한 %3D로 끝난다. base64 방식으로 인코딩 된 것 같아서 base64 방식으로 디코딩해보았다.

 

base64로 디코딩

 

암호 알고리즘 별 해쉬값의 길이를 보니 (https://m.blog.naver.com/PostView.naver?blogId=thescream&logNo=220210025548&proxyReferer=https:%2F%2Fwww.google.com%2F)

 

32자리라면 MD5 해시값이라고 한다.

 

따라서 1을 MD5로 암호화해줬더니 

1을 MD5 방식으로 암호화한 결과

 


 

id에 11을 입력했을 떄의 쿠키값
이 쿠키값을 base64 방식으로 디코딩 한 결과

디코딩 한 결과, 앞서 봤던 1의 결과가 두번 연속으로 나타나는 것을 알 수 있다.

 

 

따라서 이 문제에선 입력한 문자열을 각각 MD5방식으로 암호화한 후, 

전체적으로 base64방식으로 또 한번 암호화하고 있다는 것을 알게되었다.

 

따라서 문제를 해결하려면

① admin 각 문자열에 대해 MD5로 암호화

② 합쳐서 base64로 암호화

③ 쿠키값에 이를 입력

하는 것이 좋겠다.

 

a → 0cc175b9c0f1b6a831c399e269772661

d → 8277e0910d750195b448797616e091ad 

m → 6f8f57715090da2632453988d9a1501b

i → 865c0c0b4ab0e063e5caa3387c1a8741

n →7b8b965ad4bca0e41ab51de7b31363a1

 

base64로 인코딩한 결과

 

이를 쿠키값에 입력할 때 주의할 점!
마지막 =는 %3D로 적어줄 것!!

 

해결~

 

아직 작성 중인 글 입니다...

[그림 1] 문제화면
[그림 2] 소스코드

trim()

:: 문자열 앞뒤로 공백을 없애주는 함수

 

getenv()
:: 함수의 인자로 오는 변수에 따라 해당되는 환경 변수값을 알려주는 함수.

- REMOTE_ADDR : 웹 사이트를 접속한 컴퓨터의 ip address
- HTTP_USER_AGENT : 웹 사이트를 접속한 컴퓨터의 웹 브라우저 정보

 

addslashes()

:: DB 작업을 위해 쿼리를 작성할 때, 따옴표를 escape 시켜주는 함수.

ex) addslashes(You're my sunshine) >>> You\'re my sunshine

 

htmlentities()

:: html 태그를 그대로 출력하는 함수.


PHP 부분부터 살펴보면,

$agent 변수에 HTTP_USER_AGENT(접속 웹 브라우저 정보)을 저장하고,

$ip에는 REMOTE_ADDR(접속 ip주소)을 넣어준다.

만약 $agent 변수에 from 또는 FROM이 들어가면 Access Denied! 를 한다.

 

$count_ck에는 'select count(id) from chall8'의 결과가 배열의 형태로 저장되어 있다.

$count_ck에는 70개 이상의 값이 들어가면 저절로 삭제되게 되어있다.

 

그리고 $agent 변수가 현재 접속한 유저의 HTTP_USER_AGENT와 같은지 비교하고,

그중에서도 $agent의 id가 admin이면 문제가 풀리는 구조이다.

 

만약 $agent 변수가 존재하지 않는다면 agent와 ip, id를 insert 해준다.

 

 

우리가 현재 건드릴 수 있는 값은 $agent이고

$agent 변수에 'admin' 문자열을 넣는 것을 목표로 해야한다.

데이터를 넣는 것은 Insert 쿼리가 있는 맨 마지막 조건문을 이용해야 한다.

 

(!$ck){
  $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo("<br><br>done!  ({$count_ck[0]}/70)");

}

 

$agent 에 test','1.1.1.1','admin')('test2 를 넣게 되면

쿼리문은 insert into chall8(agent, ip, id) values('test','1.1.1.1','admin')('test2',$ip값,'guest') 가 되는 것이다.

 

 

$agent를 변조시키기 위해서는 Burp Suite를 이용해야 한다고 한다.

(Burp Suite 도구를 사용해서 HTTPS 요청 패킷을 캡처할 수 있기 때문)

 

Burp Suite 사용법을 익힌 후 다시 작성하겠다,,^^

 

 

+ Recent posts