취약점 - https rest api



SHA512-hmac가있는 Coldfusion CFHTTP는 REST 요청 본문에 서명했습니다. (1)

나는 그 API를 사용하지 않았지만 몇 가지 테스트를 실시했으며 다음과 같이 조정될 것으로 보인다.

  • secretKey 값이 base64로 인코딩 binaryDecode 서명 함수는 binaryDecode 를 사용하여 바이트를 올바르게 추출해야합니다. String.getBytes(...) 를 사용하면 완전히 다른 결과가 생성됩니다.

  • 예상 된 요청 본문 값은 다음과 같습니다. nonce=#nonceValue# (선행 "?" )

  • Content-Type=application/x-www-form-urlencoded 헤더가 필요한 것 같습니다. 그렇지 않으면 내용을 구문 분석하지 못하고 응답이 다음과 같습니다. { "error": "nonce가 지정되지 않았습니다"}

암호

 <cfset apiKey = "6bd2b780-00be-11e2-bde3-2837371c3c3a">
 <cfset secretKey = "oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA==">
 <cfset passphrase = "your secret phrase">

 <cfset requestBody  = "nonce="& now().getTime()>
 <cfset signBytes    = HMAC_SHA512(secretKey, requestbody)>
 <cfset signBase64   = binaryEncode(signBytes, "base64")>

 <cfhttp url="https://api.bitfloor.com/orders" method="post" port="443" result="bitfloor">
    <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded">
    <cfhttpparam type="header" name="bitfloor-key" value="#apiKey#">
    <cfhttpparam type="header" name="bitfloor-sign" value="#signBase64#">
    <cfhttpparam type="header" name="bitfloor-passphrase" value="#passphrase#">
    <cfhttpparam type="header" name="bitfloor-version" value="1">
    <cfhttpparam type="body" value="#requestBody#">
 </cfhttp>

 <cfdump var="#bitfloor#" label="Response">

<cffunction name="HMAC_SHA512" returntype="binary" access="public" output="false">
    <cfargument name="base64Key" type="string" required="true">
    <cfargument name="signMessage" type="string" required="true">
    <cfargument name="encoding" type="string" default="UTF-8">

     <cfset var messageBytes = JavaCast("string",arguments.signMessage).getBytes(arguments.encoding)>
     <cfset var keyBytes = binaryDecode(arguments.base64Key, "base64")>
     <cfset var key  = createObject("java","javax.crypto.spec.SecretKeySpec")>
     <cfset var mac  = createObject("java","javax.crypto.Mac")>
     <cfset key  = key.init(keyBytes,"HmacSHA512")>
     <cfset mac  = mac.getInstance(key.getAlgorithm())>
     <cfset mac.init(key)>
     <cfset mac.update(messageBytes)>

     <cfreturn mac.doFinal()>
</cffunction>

bitfloor.com에서 거래 API에 서명 된 요청을하려고합니다 (REST API 임).

Bitfloor가 제공 :

1) API 키 (예 : 6bd2b780-00be-11e2-bde3-2837371c3c3a)

2) 비밀 키 (예 : oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab / TSQqxk6IuemDvimNaQoA ==)

다음은 요청을하기위한 Bitfloor의 정확한 지침입니다.

요청은 포트 443 (https)에서 HTTPS POST 요청이어야합니다. 각 요청에는 필수 헤더 (아래 나열)가 있어야합니다. 헤더는 변조를 방지하기 위해 요청을 식별하고 확인하며 유효성을 검사합니다. 머리말

bitfloor-key 귀하의 계정을 고유하게 식별하기 위해 bitfloor에서 제공하는 것입니다. (ie 6bd2b780-00be-11e2-bde3-2837371c3c3a)

bitfloor-sign 기호 필드는 api 키에 해당하는 비밀 키를 사용하여 요청 본문의 sha512-hmac입니다.

요청에 서명하려면 : base64는 비밀 키를 원시 바이트 (64 바이트)로 디코딩합니다. http 요청 본문의 sha512-hmac 서명에 해당 바이트를 사용하십시오. Base64는 서명 결과를 인코딩하고이 헤더 필드로 전송합니다.

bitfloor-passphrase 이 api 키를 만들 때 지정한 암호입니다. 암호를 잊어 버린 경우 암호를 복구 할 수 없습니다. 새 API 키를 만들어야합니다.

bitfloor-version 관심있는 리소스의 API 버전입니다. 현재 유효한 값은 1입니다.

시행 착오를 완전히 8 시간 동안 반복하고 인터넷에 반복적으로 통찰력이나 정보를 검색 한 결과, 다음 코드는 내가 요청한 정보를 적절히 구성하는 방향으로 어딘가에있을 것이라고 생각하는 것과 비슷하다. 아아, 내가 attmept 상관없이 "잘못된 서명"그들의 API에 의해 반환 얻을.

여기 내가 지금까지 가지고있는 것이있다.

첫째, 웹에서 누군가가 SHA512 서명을 위해 작성한이 함수를 찾았습니다.

<cffunction name="HMAC_SHA512" returntype="binary" access="public" output="false">
    <cfargument name="signKey" type="string" required="true">
    <cfargument name="signMessage" type="string" required="true">

    <cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("iso-8859-1")>
    <cfset var jKey = JavaCast("string",arguments.signKey).getBytes("iso-8859-1")>
    <cfset var key  = createObject("java","javax.crypto.spec.SecretKeySpec")>
    <cfset var mac  = createObject("java","javax.crypto.Mac")>
    <cfset key  = key.init(jKey,"HmacSHA512")>
    <cfset mac  = mac.getInstance(key.getAlgorithm())>
    <cfset mac.init(key)>
    <cfset mac.update(jMsg)>
    <cfreturn mac.doFinal()>
</cffunction>

나는 그것이 무엇을하는지 전혀 모른다. 그러나 그것은 일하는 것처럼 보이고, 그렇게 잘못하지 않는다.

다음은이 함수의 구현과 요청을 시도한 것입니다. 참고 : "nonce"값은 요청과 함께 보내야하는 필수 매개 변수입니다.

<cffunction name="myorders">
    <cfset nonce        = dateDiff("s",createDateTime(2012,01,01,0,0,0),now())>
    <cfset requestbody  = "?nonce=#nonce#">
    <cfset key      = "oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA==">
    <cfset sign     = HMAC_SHA512(key,requestbody)>
    <cfset signed       = binaryEncode(sign,"Base64")>

    <!--- HTTP REQUEST --->
    <cfhttp url = "https://api.bitfloor.com/orders#requestbody#"
        method  = "post"
        result  = "bitfloor">

    <!--- HEADERS --->
    <cfhttpparam
        type    = "body"
        value   = requestbody>
    <cfhttpparam
        type    = "header"
        name    = "bitfloor-key"
        value   = "6bd2b780-00be-11e2-bde3-2837371c3c3a">
    <cfhttpparam
        type    = "header"
        name    = "bitfloor-sign"
        value   = signed>
    <cfhttpparam
        type    = "header"
        name    = "bitfloor-passphrase"
        value   = "mysecretpassphrase">
    <cfhttpparam
        type    = "header"
        name    = "bitfloor-version"
        value   = "1">
    </cfhttp>
</cffunction>

내 혼란의 대부분은 정확히 "요청 몸"이 무엇인지 모르는 것에서 비롯된 것이라고 생각합니다. 아마 내가 옳은 것을 사인하지 않을 것 같아.

서명 된 요청에 익숙한 Coldfusion 프로그래머가 있기를 바랍니다. 나는 위트를 끝내고있다.

도와주세요! 나 마스트