Tarkoitus olis testata OP:n tupas tunnistautumista. OP:n sivulla on ohjeet mutta mites noita oikein sovelletaan käytännössä?
Teet tupas-speksin mukaisen tunnistuspalvelun, jonka palveluntuottajatunnus on "Esittelymyyja" ja tarkisteavain on "Esittelykauppiaansalainentunnus". Sitten vaan tunnistaudut ihan normaalisti, mutta omien pankkitunnusten asemesta syötät käyttäjätunnukseksi 123456 ja salasanaksi 7890 ja avainluvuksi minkä tahansa nelinumeroisen luvun.
Kokeilin äkkiä tällaista
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title></title> </head> <body> <FORM METHOD="POST" ACTION=https://kultaraha.op.fi/cgi-bin/krcgi> <INPUT NAME="A01Y_ACTION_ID" TYPE="hidden" VALUE=701> <INPUT NAME="A01Y_VERS" TYPE="hidden" VALUE=0003> <INPUT NAME="A01Y_RCVID" TYPE="hidden" VALUE=Esittelymyyja> <INPUT NAME="A01Y_LANGCODE" TYPE="hidden" VALUE=FI> <?php date_default_timezone_set ('Europe/Helsinki'); setlocale(LC_TIME, "fi_FI"); ?> <INPUT NAME="A01Y_STAMP" TYPE="hidden" VALUE=<?php echo strftime("%Y%m%d%H%M%S"); echo date(u);?>> <INPUT NAME="A01Y_IDTYPE" TYPE="hidden" VALUE=02> <INPUT NAME="A01Y_RETLINK" TYPE="hidden" VALUE=https://www.xxxx/tilausvahvistus.html> <INPUT NAME="A01Y_CANLINK" TYPE="hidden" VALUE=https://www.xxxx/keskeytys.html> <INPUT NAME="A01Y_REJLINK" TYPE="hidden" VALUE=https://www.xxxx/virhe.html> <INPUT NAME="A01Y_KEYVERS" TYPE="hidden" VALUE=0001> <INPUT NAME="A01Y_ALG" TYPE="hidden" VALUE=01> <INPUT NAME="A01Y_MAC" TYPE="hidden" VALUE=> <INPUT name="submit" type="submit"> </FORM> </body> </html> </FORM>
Tuon submit-nappulan lisäsin itse kun en keksinyt muuta keinoa lähettää lomaketta. Kenttään A01Y_MAC en löytänyt ohjetta miten testata. Se lasketaan avaimella jonka saa kun tekee diilin pankin kanssa.
lrp kirjoitti:
Kenttään A01Y_MAC en löytänyt ohjetta miten testata.
Muodostamistapa lukee tupasin speksissä. Ilmeisesti olet sen lukenut, kun tiedät, että:
lrp kirjoitti:
Se lasketaan avaimella jonka saa kun tekee diilin pankin kanssa.
Ja kuten edellisessä viestissä kerroin, niin testattaessa tarkisteavain on "Esittelykauppiaansalainentunnus".
Innostuin kokeilemaan...
Server Error kun koitan tätä eli kultaraha
<FORM METHOD="POST" ACTION="https://kultaraha.op.fi/cgi-bin/krcgi"> <INPUT NAME="A01Y_ACTION_ID" TYPE="hidden" VALUE="701"> <INPUT NAME="A01Y_VERS" TYPE="hidden" VALUE="0003"> <INPUT NAME="A01Y_RCVID" TYPE="hidden" VALUE="Esittelymyyja"> <INPUT NAME="A01Y_LANGCODE" TYPE="hidden" VALUE="FI"> <?php date_default_timezone_set ('Europe/Helsinki'); setlocale(LC_TIME, "fi_FI"); ?> <INPUT NAME="A01Y_STAMP" TYPE="hidden" VALUE="<?php echo strftime("%Y%m%d%H%M%S"); echo "123456";?>"> <INPUT NAME="A01Y_IDTYPE" TYPE="hidden" VALUE="02"> <INPUT NAME="A01Y_RETLINK" TYPE="hidden" VALUE="https://www.xxx.com/tilausvahvistus.php"> <INPUT NAME="A01Y_CANLINK" TYPE="hidden" VALUE="https://www.xxx.com/tup_keskeytys.php"> <INPUT NAME="A01Y_REJLINK" TYPE="hidden" VALUE="https://www.xxx.com/tup_virhe.php"> <INPUT NAME="A01Y_KEYVERS" TYPE="hidden" VALUE="0001"> <INPUT NAME="A01Y_ALG" TYPE="hidden" VALUE="01"> <INPUT NAME="A01Y_MAC" TYPE="hidden" VALUE="Esittelykauppiaansalainentunnus"> <INPUT name="submit" type="submit"> </FORM>
Nordea vastaa, että Turvatarkiste ei vastaa pankissa laskettua. (V2008007)
<FORM METHOD="POST" ACTION="https://solo3.nordea.fi/cgi-bin/SOLO3011"> <INPUT NAME="A01Y_ACTION_ID" TYPE="hidden" VALUE="701"> <INPUT NAME="A01Y_VERS" TYPE="hidden" VALUE="0002"> <INPUT NAME="A01Y_RCVID" TYPE="hidden" VALUE="87654321"> <INPUT NAME="A01Y_LANGCODE" TYPE="hidden" VALUE="FI"> <?php date_default_timezone_set ('Europe/Helsinki'); setlocale(LC_TIME, "fi_FI"); ?> <INPUT NAME="A01Y_STAMP" TYPE="hidden" VALUE="<?php echo strftime("%Y%m%d%H%M%S"); echo "123456";?>"> <INPUT NAME="A01Y_IDTYPE" TYPE="hidden" VALUE="02"> <INPUT NAME="A01Y_RETLINK" TYPE="hidden" VALUE="https://www.xxx.com/tilausvahvistus.php"> <INPUT NAME="A01Y_CANLINK" TYPE="hidden" VALUE="https://www.xxx.com/tup_keskeytys.php"> <INPUT NAME="A01Y_REJLINK" TYPE="hidden" VALUE="https://www.xxx.com/tup_virhe.php"> <INPUT NAME="A01Y_KEYVERS" TYPE="hidden" VALUE="0001"> <INPUT NAME="A01Y_ALG" TYPE="hidden" VALUE="01"> <INPUT NAME="A01Y_MAC" TYPE="hidden" VALUE="LEHTI"> <INPUT name="submit" type="submit"> </FORM>
S-pankki päästi pisimmälle, heitti ilmoittamalleni virhesivulle.
<FORM METHOD="POST" ACTION="https://online.s-pankki.fi/service/identify"> <INPUT NAME="A01Y_ACTION_ID" TYPE="hidden" VALUE="701"> <INPUT NAME="A01Y_VERS" TYPE="hidden" VALUE="0002"> <INPUT NAME="A01Y_RCVID" TYPE="hidden" VALUE="SPANKKITUPAS"> <INPUT NAME="A01Y_LANGCODE" TYPE="hidden" VALUE="FI"> <?php date_default_timezone_set ('Europe/Helsinki'); setlocale(LC_TIME, "fi_FI"); ?> <INPUT NAME="A01Y_STAMP" TYPE="hidden" VALUE="<?php echo strftime("%Y%m%d%H%M%S"); echo "123456";?>"> <INPUT NAME="A01Y_IDTYPE" TYPE="hidden" VALUE="02"> <INPUT NAME="A01Y_RETLINK" TYPE="hidden" VALUE="https://www.xxx.com/tilausvahvistus.php"> <INPUT NAME="A01Y_CANLINK" TYPE="hidden" VALUE="https://www.xxx.com/tup_keskeytys.php"> <INPUT NAME="A01Y_REJLINK" TYPE="hidden" VALUE="https://www.xxx.com/tup_virhe.php"> <INPUT NAME="A01Y_KEYVERS" TYPE="hidden" VALUE="0001"> <INPUT NAME="A01Y_ALG" TYPE="hidden" VALUE="01"> <INPUT NAME="A01Y_MAC" TYPE="hidden" VALUE="SPANKKI"> <INPUT name="submit" type="submit"> </FORM>
POSTin mukana lähtee submit, olisiko siitä riesaa? Miten siitä pääsee eroon?
Siitä pääsee eroon jättämällä name parametrin pois, joskaan tuskin se on ongelman ydin.
Ja sitä avainta ei todellakaan lähetetä selväkielisenä, kuten noissa testeissäsi teet, vaan tupas-speksin mukaisena tiivisteenä.
Ohje on vieläpä hyvin yksinkertaisella suomenkielellä:
lainaus:
3.3 Varmennepyynnön MAC-tarkisteen (A01Y_MAC) muodostaminen
Palveluntarjoaja muodostaa kunkin pankin painiketta varten oman pankki-
kohtaisen Varmennepyynnön, joka suojataan MAC-tarkisteella. Tarkiste las-
ketaan pankkikohtaisen pyynnön FORM-tietoryhmästä ko. pankin palvelun-
tarjoajalle antamalla tarkisteavaimella.Laskennan aluksi muodostetaan merkkijono FORM-tietoryhmän kaikkien
tarkistetta edeltävien tietokenttien (kentät 1 - 11) VALUE-arvoista ja palve-
luntarjoajan tarkisteavaimesta. Tiedot yhdistetään merkkijonoksi järjestyk-
sessä niin, että kenttien täytemerkkeinä olevat blankot jätetään pois. Merkki-
jonon tietoryhmät erotetaan toisistaan "&" -merkillä. Viimeisen tiedon (kent-
tä 11) ja tarkisteavaimen väliin sekä tarkisteavaimen loppuun laitetaan ö&ö-
merkki. ö&ö-merkit otetaan sanoman MAC-tarkisteen laskentaan mukaan.
Tieto on yhtenä rivinä. "↵" -merkki näyttää tässä dokumentissa olevan rivin-
vaihdon.A01Y_ACTION_ID&A01Y_VERS&A01Y_RCVID&A01Y_LANGCODE&↵
A01Y_STAMP&A01Y_IDTYPE&A01Y_RETLINK&A01Y_CANLINK&↵
A01Y_REJLINK&A01Y_KEYVERS&A01Y_ALG&tarkisteavain&Laskettu MAC muutetaan heksadesimaaliseen esitysmuotoon, jossa A–F esi-
tetään isoilla kirjaimilla. Heksadesimaalinen tiivisteen arvo viedään Tarkiste-
kenttään.
Sanoisin, että testi onnistui silti erinomaisesti, tulos: tupas-systeemisi ei toimi oikein.
Mäkin luin vähän tarkemmin niitä palvelunkuvauksia.
Nordean sain toimimaan näin:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title></title> </head> <body> <?php date_default_timezone_set ('Europe/Helsinki'); setlocale(LC_TIME, "fi_FI"); $eka='701'; $toka='0002'; $kolmas='87654321'; $neljas='FI'; $viides=strftime("%Y%m%d%H%M%S").'123456'; $kuudes='02'; $seiska='https://www.xxx.com/tilausvahvistus.php'; $kasi='https://www.xxx.com/tup_keskeytys.php'; $ysi='https://www.xxx.com/tup_virhe.php'; $kymppi='0001'; $yytoo='01'; $macstring=$eka.'&'.$toka.'&'.$kolmas.'&'.$neljas.'&'.$viides.'&'.$kuudes.'&' .$seiska.'&'.$kasi.'&'.$ysi.'&'.$kymppi.'&'.$yytoo.'&LEHTI&'; $kaatoo=md5($macstring); $kaatoo=strtoupper($kaatoo); echo $kaatoo; ?> <FORM METHOD="POST" ACTION="https://solo3.nordea.fi/cgi-bin/SOLO3011"> <INPUT NAME="A01Y_ACTION_ID" TYPE="hidden" VALUE="<?php echo $eka?>"> <INPUT NAME="A01Y_VERS" TYPE="hidden" VALUE="<?php echo $toka?>"> <INPUT NAME="A01Y_RCVID" TYPE="hidden" VALUE="<?php echo $kolmas?>"> <INPUT NAME="A01Y_LANGCODE" TYPE="hidden" VALUE="<?php echo $neljas?>"> <INPUT NAME="A01Y_STAMP" TYPE="hidden" VALUE="<?php echo $viides?>"> <INPUT NAME="A01Y_IDTYPE" TYPE="hidden" VALUE="<?php echo $kuudes?>"> <INPUT NAME="A01Y_RETLINK" TYPE="hidden" VALUE="<?php echo $seiska?>"> <INPUT NAME="A01Y_CANLINK" TYPE="hidden" VALUE="<?php echo $kasi?>"> <INPUT NAME="A01Y_REJLINK" TYPE="hidden" VALUE="<?php echo $ysi?>"> <INPUT NAME="A01Y_KEYVERS" TYPE="hidden" VALUE="<?php echo $kymppi?>"> <INPUT NAME="A01Y_ALG" TYPE="hidden" VALUE="<?php echo $yytoo?>"> <INPUT NAME="A01Y_MAC" TYPE="hidden" VALUE="<?php echo $kaatoo?>"> <INPUT name="submit" type="submit"> </FORM> </body> </html>
Vastauksesta saa revittyä tiedot näin
Ihanan hirvee :D No, lähinnä noi superkuvaavat muuttujanimet $eka - $kaatoo...
Itse oon tehnyt sen näin: http://grez.info/tupas/
Lähdekoodit:
http://grez.info/tupas/index.phps
http://grez.info/tupas/return.phps
Saat paremmat tyylipisteet. Eikö noi vois julkaista GNU-lisenssillä koodivinkki-osiossa? Ei varmaan eka eikä vika kerta kun joku pohtii tupaksen toteuttamista.
Tuli mieleen, että miten on vastausviestin väärentämisen laita? Kaikki tieto tulee url:n mukana
http://grez.info/tupas/return.php?=&B02K_VERS=0002&B02K_TIMESTMP=2002009063013440795&B02K_IDNBR=43185475&B02K_STAMP=20090630134430&B02K_CUSTNAME=NORDEA+%2F+DEMO&B02K_KEYVERS=0001&B02K_ALG=01&B02K_CUSTID=220100-123D&B02K_CUSTTYPE=01&B02K_MAC=D28E4FEE5E8F89FBC6F1A10FD51A03A5
Eikö tuon url:n voi rakentaa mieleisekseen ja laittaa selaimen osoiteriville?
lrp kirjoitti:
Eikö tuon url:n voi rakentaa mieleisekseen ja laittaa selaimen osoiteriville?
Nyt putosin kyllä kärryiltä, että miten se, tuleeko tieto osoiterivillä vai POST datana tms. vaikuttaa tilanteeseen.
Mutta toki voit rakentaa mieleisesi sanoman, kun tiedossasi kerran on tuo jaettu salaisuus (Nordean testin tapauksessa LEHTI). Normaaliympäristössä vain pankin ja palveluntarjoajan pitäisi sopia heidän kesken sovittu jaettu salaisuus. Ilman sitä tuon MAC:n generoiminen on jossain määrin haastavaa.
Kokeile vaikka muokata tuosta jotain ja katsoa mitä se sivu sanoo.
Se kaiketi tulee GET-datana urlin mukana. Mutta tarkistussumman väärentäminen on tosiaan hankala juttu jos ei tiedä avainta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.