Bilginin Adresi Ana Sayfa
Forum Anasayfası Forum Anasayfası > Bilgisayar Güvenliği / Computer Security > Güvenlik / Security Makaleleri
  Aktif Konular Aktif Konular RSS - OS Fingerprinting ve Güvenliği
  SSS SSS  Forumu Ara   Events   Kayıt Ol Kayıt Ol  GiriÅŸ GiriÅŸ

OS Fingerprinting ve Güvenliği

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
megabros Açılır Kutu Gör
Security Professional
Security Professional
Simge

Kayıt Tarihi: 08-06-2009
Konum: Turkey
Status: Aktif DeÄŸil
Points: 752
Mesaj Seçenekleri Mesaj Seçenekleri   Thanks (0) Thanks(0)   Alıntı megabros Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: OS Fingerprinting ve Güvenliği
    Gönderim Zamanı: 23-08-2009 Saat 23:53

Web sunucularına uygulanan parmak izi araştırması ve güvenliğini masaya yatırıyoruz.

Web Sunucusu/Uygulaması Parmak İzi Araştırması

Web sunucusu/uygulaması parmak izi araştırması, selefi olan TCP/IP parmak izi araştırmasına (Bugünün en popüler tarama aracı olan Nmap gibi) benzer. Aralarındaki fark web sunucusu/uygulaması parmak izi araştırmasının OSI modelinde Transport katmanının yerine Uygulama katmanına odaklanmış olmasıdır. Web sunucusu/uygulaması parmak izi araştırmasının arkasındaki teori aşağıda sıralananları analiz ederek hedef yazılımı, konfigürasyonları ve muhtemelen network ağı yapıları/topolojisi hakkında doğru bir profil ortaya k****ktır:

· HTTP Protokolünün implementasyon farklılıkları

· HTTP Cevap başlıkları

· Dosya uzantıları (.asp ve .jsp gibi)

· Cookiler (ASPSESSIONID)

· Hata sayfaları (Kurulum ile beraber gelen)

· Dizin yapıları ve isimlendirmeleri (Windows/Unix)

· Web Geliştirici ara yüzleri (Frontpage/WebPublisher)

· Web Yönetici ara yüzleri (iPlanet/Comanche)

· İşletim sistemi parmak izi araştırması uyuşmazlıkları (Linux üzerinde IIS?),

Saldırganlar için amaç hedef web olgusunun ayak izini çıkarmak ve mümkün olduğunca bilgiyi ortaya çıkarmaktır. Bu bilgi ile, saldırgan, hedefin kullandığı yazılımın versiyonunda/tipinde bulunan açıklığı gerçekleyebilen doğru bir saldırı senaryosu geliştirebilir.

Bu bilgiyi doğru olarak ortaya çıkarmak çok önemlidir çünkü güvenlik açıklıklıkların büyük bölümü (ara bellek taşması, v.b.) belli yazılım sağlayıcılarına ve versiyon numaralarına büyük ölçüde bağlıdır. Buna ek olarak, yazılım versiyonlarını doğru olarak belirlemek ve uygun açıklık gerçeklemesini seçmek saldırının çıkaracağı “kalabalığı” azaltacağı gibi etkisini arttıracaktır. Bu nedenledir ki, kendisini açıkça tanımlayan bir web sunucusu/uygulaması belaya davetiye çıkarmaktadır.

Aslında, HTTP RFC 2086 tam da bu meseleden söz eder ve web yöneticilerini HTTP cevabındaki “Server:” başlığında gösterilen yazılım versiyonunu gizlemeleri hakkında uyarır:

“Not: Sunucunun yazılım versiyonunu belli etmek bilinen açıklıkları bulunan yazılımları saldırılara karşı daha fazla açık kılar. Sunucu sağlayıcıları bu alanı konfigüre edilebilir şekilde hazırlamaya cesaretlendirilmektedir.”

Diğer bilgi ifşa kategorileri tarafından toplanılan bilgiler ile hedef tarafından kullanılıyor olan web sunucuların/uygulamaların versiyon ve türünü çıkarmak mümkün olduğu gerçeği dolayısıyla burda sadece günümüzün web parmak izi araştırma araçlarının kullandığı HTTP Protokolü implementasyonu analizine odaklanacağız.

Örnekler

Aşağıdaki bütün örnekler hedef web sunucularının ürettikleri ve yorumladıkları HTTP isteklerinin analiz tekniklerini göstermektedir.

HTTP Protokolünün implementasyon farklılıkları

1. Leksikal – Leksikal karakteristik kategorileri kullanılan kelimeler/tabirler, gösterilen HTTP Cevap Başlıklarındaki kullanılan büyük/küçük harf ve noktalamalar arasındaki farklılıkları içerir.

2. Cevap Kodu Mesajları – 404 hata kodunda, Apache “Not Found” mesajını bildirirken, Microsoft IIS/5.0 “Object Not Found” mesajını bildirir.

Apache 1.3.29 – 404

Microsoft-IIS/4.0 – 404

# telnet target1.com 80

Trying target1.com…

Connected to target1.com.

Escape character is ’^]’.

HEAD /non-existent-file.txt HTTP/1.0

HTTP/1.1 404 Not Found

Date: Mon, 07 Jun 2004 14:31:03 GMT

Server: Apache/1.3.29 (Unix) mod_perl/1.29

Connection: close

Content-Type: text/html; charset=iso-

8859-1

Connection closed by foreign host.

# telnet target2.com 80

Trying target2.com…

Connected to target2.com.

Escape character is ’^]’.

HEAD /non-existent-file.txt HTTP/1.0

HTTP/1.1 404 Object Not Found

Server: Microsoft-IIS/4.0

Date: Mon, 07 Jun 2004 14:41:22 GMT

Content-Length: 461

Content-Type: text/html

Connection closed by foreign host.

3. Başlıklarda Kullanılan Kelimeler – “Content-length” yerine geri dönülen “Content-Length” başlığı.

Netscape-Enterprise/6.0 – HEAD

Microsoft-IIS/4.0 – HEAD

# telnet target1.com 80

Trying target1.com…

Connected to target1.com.

Escape character is ’^]’.

HEAD / HTTP/1.0

HTTP/1.1 200 OK

Server: Netscape-Enterprise/6.0

Date: Mon, 07 Jun 2004 14:55:25 GMT

Content-length: 26248

Content-type: text/html

Accept-ranges: bytes

Connection closed by foreign host.

# telnet target2.com 80

Trying target2.com…

Connected to target2.com.

Escape character is ’^]’.

HEAD / HTTP/1.0

HTTP/1.1 404 Object Not Found

Server: Microsoft-IIS/4.0

Date: Mon, 07 Jun 2004 15:22:54 GMT

Content-Length: 461

Content-Type: text/html

Connection closed by foreign host.

4. Sözdizimi – HTTP RFC tarafından, bütün web haberleşmelerinde haberleşen partilerin birbirlerini anlamaları için önceden belirlenmiş yapılar ve oluşumların kullanılması zorunlu tutulur. Yine de HTTP Cevap başlıklarının sırasında ve formatında farklılıklar vardır.

5. Başlık Sıralaması – Apache sunucuları sürekli olarak “Date” başlığını “Server” başlığından önce yerleştirirken Microsoft-IIS bu başlıkları ters sırada yerleştirir.

Apache 1.3.29- HEAD

Microsoft-IIS/4.0 – HEAD

# telnet target1.com 80

Trying target1.com…

Connected to target1.com.

Escape character is ’^]’.

HEAD / HTTP/1.0

HTTP/1.1 200 OK

Date: Mon, 07 Jun 2004 15:21:24 GMT

Server: Apache/1.3.29 (Unix) mod_perl/1.29

Content-Location: index.html.en

Vary: negotiate,accept-language,accept-charset

TCN: choice

Last-Modified: Fri, 04 May 2001 00:00:38 GMT

ETag: “4de14-5b0-3af1f126;40a4ed5d”

Accept-Ranges: bytes

Content-Length: 1456

Connection: close

Content-Type: text/html

Content-Language: en

Expires: Mon, 07 Jun 2004 15:21:24 GMT

Connection closed by foreign host.

# telnet target2.com 80

Trying target2.com…

Connected to target2.com.

Escape character is ’^]’.

HEAD / HTTP/1.0

HTTP/1.1 404 Object Not Found

Server: Microsoft-IIS/4.0

Date: Mon, 07 Jun 2004 15:22:54 GMT

Content-Length: 461

Content-Type: text/html

Connection closed by foreign host.

6. List metodu Sıralaması – Bir HTTP isteğinde OPTIONS metodu yollandığında, istenilen URL için izin verilen metodlar “Allow” başlığı içinde dönülür. Apache sadece “Allow” başlığını dönerken, IIS ayrıca “Public” başlığını da içerir.

Apache 1.3.29- OPTIONS

Microsoft-IIS/5.0 – OPTIONS

# telnet target1.com 80

Trying target1.com…

Connected to target1.com.

Escape character is ’^]’.

OPTIONS * HTTP/1.0

HTTP/1.1 200 OK

Date: Mon, 07 Jun 2004 16:21:58 GMT

Server: Apache/1.3.29 (Unix) mod_perl/1.29

Content-Length: 0

Allow: GET, HEAD, OPTIONS, TRACE

Connection: close

Connection closed by foreign host.

# telnet target2.com 80

Trying target2.com…

Connected to target2.com.

Escape character is ’^]’.

OPTIONS * HTTP/1.0

HTTP/1.1 200 OK

Server: Microsoft-IIS/5.0

Date: Mon, 7 Jun 2004 12:21:38 GMT

Content-Length: 0

Accept-Ranges: bytes

DASL: <DAV:sql>

DAV: 1, 2

Public: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL,

PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH

Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL,

PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH

Cache-Control: private

Connection closed by foreign host.

7. Semantic – HTTP cevabında dönülen kelimeler ve ibarelerin yanı sıra, doğru ve yanlış oluşturulmuş isteklerin yorumlarında belirgin farklılıklar vardır.

8. Belli başlıkların bulunması – Bir sunucu, cevabında istediği başlığı kullanabilir. Bazı başlıklar spesifikasyon tarafından zorunlu tutulmuşlarsa da, bir çok başlık (mesela ETag) opsiyoneldir. Aşağıdaki örneklerde, Apache sunucuları cevap başlıklarında IIS tarafından kullanılmayan şu ilave kayıtları içerir; ETag, Vary ve Expires.

Apache 1.3.29- HEAD

Microsoft-IIS/4.0 – HEAD

# telnet target1.com 80

Trying target1.com…

Connected to target1.com.

Escape character is ’^]’.

HEAD / HTTP/1.0

HTTP/1.1 200 OK

Date: Mon, 07 Jun 2004 15:21:24 GMT

Server: Apache/1.3.29 (Unix) mod_perl/1.29

Content-Location: index.html.en

Vary: negotiate,accept-language,accept-charset

TCN: choice

Last-Modified: Fri, 04 May 2001 00:00:38 GMT

ETag: “4de14-5b0-3af1f126;40a4ed5d”

Accept-Ranges: bytes

Content-Length: 1456

Connection: close

Content-Type: text/html

Content-Language: en

Expires: Mon, 07 Jun 2004 15:21:24 GMT

Connection closed by foreign host.

# telnet target2.com 80

Trying target2.com…

Connected to target2.com.

Escape character is ’^]’.

HEAD / HTTP/1.0

HTTP/1.1 404 Object Not Found

Server: Microsoft-IIS/4.0

Date: Mon, 07 Jun 2004 15:22:54 GMT

Content-Length: 461

Content-Type: text/html

Connection closed by foreign host.

9. Normal olmayan Cevap Başlıkları – Aynı istekler hedef web sunucularına gönderilse de, yorumlar farklı olabilir ve bu yüzden değişik cevap kodları üretilebilir. Bu anlamsal (semantik) farklılığa en iyi örnek Whisker tarayıcı aracının kullandığı “Light FingerPrinting” kontrolüdür. Whisker 2.1’in main.test dosyasından alınan aşağıdaki Perl kodu bölümü, hedef sunucunun Apache olup olmadığını anlamak için banner’lerinde görülen bilgilerden bağımsız olarak iki test koşar. İlk istek “GET //” isteğidir ve eğer cevap HTTP durum kodu 200 ise, ikinci istek yollanır. İkinci istek URL kodlanmış ve “GET //” olarak çevrilen “GET /%2f”’dir. Bu sefer Apache sunucusu, 404 – Not Found hatası döner. Diğer web sunucuları (IIS) bu tür istekler için aynı durum kodunu (404) dönmez.

# now do some light fingerprinting…

– CUT –

my $Aflag=0;

$req{whisker}->{uri}=’//’;

if(!_do_request(\\\\\\\\\\\\\\\\\\%req,\\\\\\\\\\\\\\\\\\%G_RESP)){

_d_response(\\\\\\\\\\\\\\\\\\%G_RESP);

if($G_RESP{whisker}->{code}==200){

$req{whisker}->{uri}=’/%2f’;

if(!_do_request(\\\\\\\\\\\\\\\\\\%req,\\\\\\\\\\\\\\\\\\%G_RESP)){

_d_response(\\\\\\\\\\\\\\\\\\%G_RESP);

$Aflag++ if($G_RESP{whisker}->{code}==404);

}       }       }

m_re_banner(’Apache’,$Aflag);

Hedef siteye karşı Whisker koşulduğunda, ön testler ışığında web sunucusunun Apache sunucusu olduğu rapor edilir. Aşağıdaki örnek Whisker raporundan bir bölümdür;

———————————————————————–

Title: Server banner

Id: 100

Severity: Informational

The server returned the following banner:

Microsoft-IIS/4.0

———————————————————————–

Title: Alternate server type

Id: 103

Severity: Informational

Testing has identified the server might be an ’Apache’ server. This Change could be due to the server not correctly identifying itself (the Admins changed the banner).  Tests will now check for this server type as well as the previously identified server types.

———————————————————————–

Bu rapor saldırgana, sadece sunucu yöneticilerinin web bannerlarını değiştirecek kadar becerikli olduklarını göstermez aynı zamanda Whisker raporun doğruluğunu güçlendirebilecek diğer Apache testlerini de taramasına ekleyecektir.

Çözümler

Web sunucunuz tarafından sağlanan tanımlayıcı bütün verileri kaldırmak mümkün değildir. Gerçek şudur ki, kararlı bir saldırı web sunucu yazılımınızı tanımlayabilecektir. Amacınız keşif barını olabildiğince yukarıya çekerek saldırganın güvenlik tehlike alarmlarını tetikleyecek kadar fazla uğraşmasını sağlamak olmalıdır. Aşağıdaki adımlar bu iş için yardımcı olacaktır. Öneriler uygulanması kolaydan zora doğu sıralanmışlardır.

1. Sunucu Banner Bilgisinin Değiştirilmesi

Web sunucusunun cevap başlıklarındaki “Server” alanı tarafından gösterilen bilgiyi değiştirmek (aldatma amaçlı) mümkündür. HTTP Server alanını değiştirmek ile kazanılacak güvenlik hakkında web güvenlik çevrelerinde bir çok tartışma olmuştur. Sadece banner bilgisinin değiştirilmesi ve yazılım versiyonunu gizleyici diğer önleyici faktörlerin uygulanmaması keşfi düzenleyen gerçek insanlara karşı etkili olmamakla beraber, otomatikleştirilmiş WORM (solucan) programlarına karşı yardımcı olur. Çok miktarda sistemi enfekte etmek için kullanılan solucanların gittikçe artan popülerliği nedeniyle web sunucuların bu şekilde korunması hayati önem taşır. Bu adım organizasyonlara yama üretilme süresinde yeni çıkacak ve banner bilgisine göre hareket eden solucanlara karşı zaman kazandırır.

· Apache Sunucuları – Modsecurity’nin Server banner bilgisini Apache kodunun derlemeden önce değiştirilmesi yerine httpd.conf dosyasını edit?? ederek değiştirmesini sağlayan SecServerSignature ayarı vardır.

· IIS Sunucuları – IISLockDown ve URLScan araçlarını kurarak, istemcilere dönen banner bilgisini değiştirebilirsiniz.

2. Başlıklardaki Bilgi Detayının Minimize Edilmesi

Cevap başlıklarında dönülen bilgi miktarını kısıtlayın. Mesela, Apache ServerTokens direktifini kullanarak Server banner alanındaki bilginin detaylarının kontrol edilmesini sağlar:

ServerTokens Prod[uctOnly]

Server sends (e.g.): Server: Apache

ServerTokens Min[imal]

Server sends (e.g.): Server: Apache/1.3.0

ServerTokens OS

Server sends (e.g.): Server: Apache/1.3.0 (Unix)

ServerTokens Full (or not specified)

Server sends (e.g.): Server: Apache/1.3.0 (Unix) PHP/3.0 MyMod/1.2

Başlıkları minimize ederek, ek olarak kurulmuş Apache modülleri gibi bilgileri gizleyebilirsiniz.

3. Sahte Başlıklar Oluşturun

Web sunucu parmak izi araştırmasını engelleyici/şaşırtıcı alternatif tekniklerden bir tanesi sahte bir web topolojisi oluşturmaktır. Saldırganlar genellikle banner elde etme tekniği oturumlarını Parmak İzi araştırması işinin bir parçası olarak kullanırlar. Parmak İzi araştırmasında saldırgan hedefin genel yapısını tanımlamaya çalışır.  İlave olarak eklenen sahte başlıklar ile karmaşık bir web yapısı simule edilebilir (Mesela bir DMZ). Ek başlıklar eklenerek sahte bir geri vekilin (reverse proxy) olduğu simule edilebilir.

Bu işi başarmak için Apache sunucularında httpd.conf dosyasına aşağıdaki kayıtlar eklenebilir;

_ Header set Via “1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)”

_ ErrorHeader set Via “1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)”

_ Header set X-Cache “MISS from www.nonexistenthost.com”

_ ErrorHeader set X-Cache “MISS from www.nonexistenthost.com

Bu kayıtlar aşağıda gösterildiği gibi “Via” ve “X-Cache” ibarelerini bütün HTTP cevap başlıklarına ekler:

# telnet localhost 80

Trying 127.0.0.1…

Connected to localhost.

Escape character is ’^]’.

HEAD / HTTP/1.0

HTTP/1.1 200 OK

Server: Microsoft-IIS/4.0

Date: Sun, 30 Mar 2003 21:59:46 GMT

Content-Location: index.html.en

Vary: negotiate,accept-language,accept-charset

TCN: choice

Via: 1.1 squid.proxy.companyx.com (Squid/2.4.STABLE6)

X-Cache: MISS from www.nonexistenthost.com

Content-Length: 2673

Connection: close

Bu durum sanki Squid Proxy sunucusu kullandığımızı ve web verilerini olmayan bir sunucudan sunduğumuzu gösterir. Bu durum saldırganı ya Apache sunucumuza (tabi ki başarısız olacak) Squid saldırılarını uygulamaya ya da olmayan ve X-Cache başlığında belirtilen bileşene saldırı yapmaya sevk eder.

4. Üçüncü Parti Web Güvenlik Araçlarını Kurulumu

Modsecurity veya ServerMask gibi ek üçüncü parti web güvenlik araçlarını kurarak HTTPrint gibi günümüz web sunucu parmak izi araştırma araçlarını şaşırtmak veya tamamen egale etmek mümkündür. Yukarıdaki örnek bölümünde anlatıldığı gibi bu tür araçlar hedef web sunucularını bir çok isteğe boğacak ve belli cevaplar üretmeye zorlayacaklardır. Aşağıda HTTPrint tarafından üretilen bazı anormal istekler bulunmaktadır:

192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “JUNKMETHOD / HTTP/1.0″ 501

344 “-” “-”

192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / JUNK/1.0″ 400 381 “-”

“-”

192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “get / HTTP/1.0″ 501 330 “-”

“-”

192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / HTTP/0.8″ 200 1456 “-”

“-”

192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / HTTP/1.2″ 200 1456 “-”

“-”

192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET / HTTP/3.0″ 200 1456 “-”

“-”

192.168.139.101 – - [08/Jun/2004:11:21:40 -0400] “GET /../../ HTTP/1.0″ 400 344

“-” “-”

Eğer Apache sunucuları için ModSecurity gibi bir araç implement etmek istersek bu anormal istekler nedeniyle tetiklenecek HTTP RFC uyumlu filtreler üretebiliriz. İşte kullanılabilecek ModSecurity httpd.conf kayıtları:

# This will return a 403 – Forbidden Status Code for all Mod_Security actions

SecFilterDefaultAction “deny,log,status:403″

# This will deny directory traversals

SecFilter “\\\\\\\\\\\\\\\\\\.\\\\\\\\\\\\\\\\\\./”

# This entry forces compliance of the request method.  Any requests that do NOT

# start with either GET|HEAD|POST will be denied.  This will catch/trigger on

# junk methods.

SecFilterSelective THE_REQUEST “!^(GET|HEAD|POST)”

# This entry will force HTTP compliance to the end portion of the request.  If

# the request does NOT end with a valid HTTP version, then it will be denied.

SecFilterSelective THE_REQUEST “!HTTP\\\\\\\\\\\\\\\\\\/(0\\\\\\\\\\\\\\\\\\.9|1\\\\\\\\\\\\\\\\\\.0|1\\\\\\\\\\\\\\\\\\.1)$”

5. Kaynak Kodu Değiştirme

Bu parmak izi değiştirme önlemlerinden en zor fakat en etkili olanı budur. Bu işte riskin ödüle oranı programlama becerinizin seviyesine ve web yapınıza göre büyük ölçüde değişebilir. Genel olarak konuşursak, bu işi web sunucunuzun kaynak kodunu derlemeden önce veya makina kodunu bir editör yardımı ile direk olarak değiştirerek yapabilirsiniz. Apache gibi açık kaynak kodlu web sunucuları için bu iş daha kolaydır çünkü kaynak koduna erişiminiz vardır.

Başlık Sıralaması – Aşağıdaki Apache 1.3.29 sunucusu için DATE/SERVER sıralamasını düzeltecek ve IIS OPTIONS çıktı bilgisini taklit edecek bir yama kodudur. Bu yama /apache_1.3.29/src/main dizini içerisindeki http_protocol.c dosyasını yeniler. OPTIONS bölümü normal olarak IIS cevap alanları ile ilişkilendirilen başlıkların dönülmelerini sağlar. Bu başlıklar Public, DASL, DAV ve Cache-Control’ü kapsar.

— http_protocol.c.orig        Mon Apr 26 02:11:58 2004

+++ http_protocol.c     Mon Apr 26 02:43:31 2004

@@ -1597,9 +1597,6 @@

/* output the HTTP/1.x Status-Line */

ap_rvputs(r, protocol, ” “, r->status_line, CRLF, NULL);

-    /* output the date header */

-    ap_send_header_field(r, “Date”, ap_gm_timestr_822(r->pool, r->request_time));

-

/* keep the set-by-proxy server header, otherwise

* generate a new server header */

if (r->proxyreq) {

@@ -1612,6 +1609,9 @@

ap_send_header_field(r, “Server”, ap_get_server_version());

}

+    /* output the date header */

+    ap_send_header_field(r, “Date”, ap_gm_timestr_822(r->pool, r->request_time));

+

/* unset so we don’t send them again */

ap_table_unset(r->headers_out, “Date”);        /* Avoid bogosity */

ap_table_unset(r->headers_out, “Server”);

@@ -1716,7 +1716,9 @@

ap_basic_http_header(r);

ap_table_setn(r->headers_out, “Content-Length”, “0″);

+    ap_table_setn(r->headers_out, “Public”, “OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH”);

ap_table_setn(r->headers_out, “Allow”, make_allow(r));

+    ap_table_setn(r->headers_out, “Cache-Control”, “private”);

ap_set_keepalive(r);

ap_table_do((int (*) (void *, const char *, const char *))

ap_send_header_field,

Saygılar..


Düzenleyen megabros - 23-08-2009 Saat 23:54
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör



Bu Sayfa 0.180 Saniyede Yüklendi.