|
DISCUZ和很多论坛都无法进行会话劫持,因为会话和IP绑定了,DISCUZ主要的会话认证机制如下:
/inlude/common.inc.php
//第136行 验证会话重要的一段就是从sessions表中查询SID,其中一个重要的条件就是$onlineip,如果$onlineip和sessions表中的IP信息无法对应,就不能继续建立sessions表中保存的会话。
——————————————————————————–
看以下代码:
if($sid) {
if($discuz_uid) {
$query = $db->query("SELECT s.sid, s.styleid, s.groupid='6' AS ipbanned, s.pageviews AS spageviews, s.lastolupdate, s.seccode, $membertablefields
FROM {$tablepre}sessions s, {$tablepre}members m
WHERE m.uid=s.uid AND s.sid='$sid' AND CONCAT_WS('.',s.ip1,s.ip2,s.ip3,s.ip4)='$onlineip' AND m.uid='$discuz_uid'
AND m.password='$discuz_pw' AND m.secques='$discuz_secques'");
//79行 $onlineip首先取自HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR这两个HTTP头
------------------------------------------------------------------------------
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], ‘unknown’)) {
$onlineip = $_SERVER['REMOTE_ADDR'];
}
PS:要是我们伪造HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR这两个HTTP头就可以绕过IP绑定
嘿嘿 当然我们可以在简单的欺骗之后的劫持也可以...
当然这个很鸡肋!!! |
|