GotoKnow
  • เข้าระบบ
  • สมัครสมาชิก
  • แผงจัดการ
  • ออกจากระบบ
GotoKnow

PHP Session IDS และ Firewall

แนวทางในการแก้ไขปัญหา ด้วยการศึกษาความเป็นไปได้ สภาพแวดล้อมของระบบ ลักษณะและรูปแบบการทำงาน การสังเกตุ การทดสอบ เพื่อหาสาเหตุที่แท้จริงของปัญหา อย่าปล่อยให้ปัญหาผ่านเลยไป ต้องทำความเข้าใจกับปัญหา เพื่อให้เกิด knowhow ที่แท้จริง

ที่จริงเป็นเนื้อหาในกระทู้ ปัญหา PHP และ Session ซึ่งน้องๆ ที่ทำงานมีปัญหาในการ PHP กับ Session  ซึ่งจริงๆ แล้ว เมื่อก่อนโปรแกรมก็ใช้งานได้อย่างไม่มีปัญหา แต่อยู่ๆ ก็ใ้ช้ไม่ได้...

 


อยู่ๆ PHP scripts ที่ทำงานเกี่ยวกับ session ซึ่งเคยทำงานได้ดี กลับทำงานไม่ตรงความต้องการ
เมื่อตรวจสอบดู พบว่า PHP ได้สร้าง session ขึ้นใหม่ ทุกครั้งที่ refersh page

 

ตัวอย่างไฟล์

<?PHP
session_start();
print_r($_SESSION);
if (!isset($_SESSION['count'])) {
   $_SESSION['count'] = 0;
} else {
   $_SESSION['count']++;
}
echo "<br>". session_id();
?>

script ข้างบนใช้สำหรับทดสอบ session อย่างง่าย ซึ่งถ้าหากทำงานตามปกติ ตัวแปร $_SESSION['count'] ก็ควรจะเพิ่มค่าขึ้นเรื่อยๆ

Environment
OS : Windows 2003 Server
Web Server : IIS
PHP : 5.1.6 (ได้ทดสอบกับ 5.1.2, 5.1.4 ก็มีปัญหาเหมือนเดิม) 

ตัวอย่างการตั้งค่าใน php.ini กับ session

[Session]
session.save_handler = files
session.save_path = "c:/php/session/"
session.use_cookies = 1
session.use_only_cookies = 0
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor     = 100
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="

 ทดสอบเบื้องต้น ด้วยการเรียกใช้ script ดังกล่าว ผ่าน url ดังนี้
เครื่อง Development Server
http://127.0.0.1/testsession.php Loop back ไม่มีปัญหา
http://192.168.5.3/testsession.php IP ภายใน ไม่มีปัญหา
http://XX.XX.XX.XX/testsession.php IP จริง ทำงานผิดพลาด

เมื่อทดสอบกับเครื่องผม และเครื่องอื่นๆ ได้ผมเหมือนกัน ซึ่งปัญหาดังกล่าว เกิดขึ้นกับ IP จริง แต่ไม่เกิดกับ IP ภายใน (127.0.0.1 และ 192.168.5.3)


ก่อนหน้านี้ ได้มีผู้ดูแลระบบ ได้ทำงานปรับแต่งบางอย่างเกี่ยวกับ network ซึ่งผมยังไม่ทราบว่าได้ทำอะไรบ้าง เป็นไปได้หรือไม่ ที่ router, firewall, IDS จะ filter http

นอกจาก ปัญหาเรื่อง session แล้ว สังเกตุว่า เมื่อใช้ IP ภายใน (192.168.5.x) เรียกใช้ url เดิมติดกันสองครั้ง ครั้งที่สอง มันจะใช้งานไม่ได้ ตรวจอสอบพบว่า http status เป็น 0 (server was reset) ไม่ทราบว่าจะเพิ่มน้ำหนักให้กับอุปกรณ์อย่าง IDS หรือไม่???

สุดท้าย เอา http มาให้พิจารณาครับ

อันนี้ไม่มีปัญหา จะเห็นว่า PHPSESSID ไม่เปลี่ยนแปลง

#1  17:27:25.436  127.0.0.1:80 
GET /testsession.php HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 127.0.0.1
Connection: Keep-Alive

#2  17:27:25.530  127.0.0.1:80 
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 07 Sep 2006 10:27:25 GMT
X-Powered-By: ASP.NET
Connection: close
Content-type: text/html
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=9c1dda3401b24579d5071efa333345be; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Array
(
)
<br>9c1dda3401b24579d5071efa333345be

#3  17:27:29.546  127.0.0.1:80 
GET /testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CL 2.0.50727)
Host: 127.0.0.1
Connection: Keep-Alive
Cookie: PHPSESSID=9c1dda3401b24579d5071efa333345be

#4  17:27:29.624  127.0.0.1:80 
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 07 Sep 2006 10:27:29 GMT
X-Powered-By: ASP.NET
Connection: close
Content-type: text/html
X-Powered-By: PHP/5.1.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Array
(
    [count] => 0
)
<br>9c1dda3401b24579d5071efa333345be

#5  17:27:33.593  127.0.0.1:80 
GET /testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CL 2.0.50727)
Host: 127.0.0.1
Connection: Keep-Alive
Cookie: PHPSESSID=9c1dda3401b24579d5071efa333345be

#6  17:27:33.671  127.0.0.1:80 
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 07 Sep 2006 10:27:33 GMT
X-Powered-By: ASP.NET
Connection: close
Content-type: text/html
X-Powered-By: PHP/5.1.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Array
(
    [count] => 1
)
<br>9c1dda3401b24579d5071efa333345be

อันนี้เป็น http ที่มีปัญหา จะเห็นว่ามีการ set PHPSESSID ใหม่ทุกครั้งที่ refresh

#1  17:51:33.736  61.XX.XX.XXX:80 
GET /testsession.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 61.XX.XX.XXX
Connection: Keep-Alive

#2  17:51:33.829  61.XX.XX.XXX:80 
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 07 Sep 2006 10:51:33 GMT
X-Powered-By: ASP.NET
Connection: close
Content-type: text/html
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=38ee781da8c5b6611db678e4232ff9d9; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Array
(
)
<br>38ee781da8c5b6611db678e4232ff9d9

#3  17:51:36.173  61.XX.XX.XXX:80 
GET /testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 61.XX.XX.XXX
Connection: Keep-Alive
Cookie: PHPSESSID=38ee781da8c5b6611db678e4232ff9d9

#4  17:51:36.267  61.XX.XX.XXX:80 
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 07 Sep 2006 10:51:36 GMT
X-Powered-By: ASP.NET
Connection: close
Content-type: text/html
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=102755a6cc15b1926cdde6363668cde8; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Array
(
)
<br>102755a6cc15b1926cdde6363668cde8

#5  17:51:37.720  61.XX.XX.XXX:80 
GET /testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: 61.XX.XX.XXX
Connection: Keep-Alive
Cookie: PHPSESSID=102755a6cc15b1926cdde6363668cde8

#6  17:51:37.814  61.XX.XX.XXX:80 
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 07 Sep 2006 10:51:37 GMT
X-Powered-By: ASP.NET
Connection: close
Content-type: text/html
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=3b29e1bb6fd58a87a696b01b8b2f9dea; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Array
(
)
<br>3b29e1bb6fd58a87a696b01b8b2f9dea

 

หลังจาก ใช้การตรวจสอบ package ในระดับล่าง filter เฉพาะ package ที่มีการเชื่อมต่อกับ port 80
และ sniffer ทั้งสองฝั่ง ทั้ง Server และ Client

วิธีการทดสอบ
ติดตั้งโปรแกรม package sniffer ทั้งฝั่ง Client และ Server จากนั้นทำการ capture พร้อมกัน
โดยใช้ php scripts ข้างต้น จากนั้น refresh เพจจำนวนสามครั้ง

การทดสอบ กับ IP ภายใน ไม่พบความผิดปกติของ HTTP protocal

การทดสอบกับจริงของ Server พบความผิดปกติบางอย่าง
package ทางฝั่ง Client

GET /callsys/session/testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: XX.XX.XX.XXX
Connection: Keep-Alive
Cookie: PHPSESSID=43185d00844ebd32f4f31a7a021725e5


HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=8e1cb9302ab3805ff7d2ac45836a356c; path=/
X-Powered-By: ASP.NET
Date: Fri, 08 Sep 2006 03:34:07 GMT
Connection: close

Array
(
)
<br>8e1cb9302ab3805ff7d2ac45836a356c






GET /callsys/session/testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: XX.XX.XX.XXX
Connection: Keep-Alive
Cookie: PHPSESSID=8e1cb9302ab3805ff7d2ac45836a356c


HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=2a7b4b253350e958aae8bb5184ef843d; path=/
X-Powered-By: ASP.NET
Date: Fri, 08 Sep 2006 03:34:09 GMT
Connection: close

Array
(
)
<br>2a7b4b253350e958aae8bb5184ef843d



GET /callsys/session/testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: XX.XX.XX.XXX
Connection: Keep-Alive
Cookie: PHPSESSID=2a7b4b253350e958aae8bb5184ef843d


HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=3471409cd676653295f6be625e27964a; path=/
X-Powered-By: ASP.NET
Date: Fri, 08 Sep 2006 03:34:11 GMT
Connection: close

Array
(
)
<br>3471409cd676653295f6be625e27964a

 

อันนี้ไม่แปลกใจ เพราะมันทำงานผิดอยู่แล้ว

แต่ทางฝั่ง Server

GET /callsys/session/testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: XX.XX.XX.XXX
Connection: Keep-Alive
Xookie: PHPSESSID=43185d00844ebd32f4f31a7a021725e5



GET /callsys/session/testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: XX.XX.XX.XXX
Connection: Keep-Alive
Xookie: PHPSESSID=8e1cb9302ab3805ff7d2ac45836a356c


GET /callsys/session/testsession.php HTTP/1.1
Accept: */*
Accept-Language: th
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: XX.XX.XX.XXX
Connection: Keep-Alive
Xookie: PHPSESSID=2a7b4b253350e958aae8bb5184ef843d

 

และสังเกตุว่า IP ของ client (192.168.5.25) ส่ง http request ไปยัง Server (61.XX.XX.XX) แต่ว่าIP ที่เรียกใช้ Server นั้น กลับเป็นของ Router (192.168.254)

client <=====> Router/IDS/Firewall/Proxy <=========> server 

 สรุปว่า ปัญหาเกิดจาก Firewall ครับ

"เมื่อใช้ IP ภายใน (192.168.5.x) เรียกใช้ url เดิมติดกันสองครั้ง ครั้งที่สอง มันจะใช้งานไม่ได้ ตรวจอสอบพบว่า http status เป็น 0 (server was reset)"

เมื่อเอา firewall ออก พบว่าทำงานได้เป็นปกติ ดังนั้นจึงเข้าใจว่า ในส่วนของ IDS
มีการตรวจสอบพบ http request ติดๆ กันเข้าไป จึงเข้าเงื่อนไข DOS, IDS จึงตัด http request นั้นออกไป



อยากให้เป็น case study ถึงแนวทางในการแก้ไขปัญหา
ด้วยการศึกษาความเป็นไปได้ ลดขอบเขตของปัญหา ศึกษาสภาพแวดล้อมของระบบ ลักษณะและรูปแบบการทำงาน การสังเกตุ การทดสอบ เพื่อหาสาเหตุที่แท้จริงของปัญหา อย่าปล่อยให้ปัญหาผ่านเลยไป ต้องทำความเข้าใจกับปัญหา เพื่อให้เกิด knowhow ที่แท้จริง

บันทึกนี้เขียนที่ GotoKnow โดย 

หมายเลขบันทึก: 50176
เขียน:
แก้ไข:
อ่าน:
สัญญาอนุญาต: สงวนสิทธิ์ทุกประการ

ความเห็น (0)