会话管理与httponly实验

A2-5 Session Mgmt. - Administrative Portals

1. 总概

实验目标:通过获得admin权限了解会话管理中的漏洞

知识点:代码审计 php会话管理知识

三个不同难度的实验分别代表了三种会话管理的方法

2. 实验操作步骤

Low级别

Get传参验证 (不安全)

img

页面被锁住,说明当前用户没有权限查看内容

提示:请检查url

http://127.0.0.1:12003/smgmt_admin_portal.php?admin=0

url中我们可以看到有个admin参数,内容是0,我们改成1试一下

http://127.0.0.1:12003/smgmt_admin_portal.php?admin=1

img

成功解锁

代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
case "0" :       

if(isset($_GET["admin"]))
{

if($_GET["admin"] == "1")
{

$message = "Cowabunga...<p><font color=\"green\">You unlocked this page using an URL manipulation.</font></p>";

}

else
{

$message="<font color=\"red\">This page is locked.</font><p>HINT: check the URL...</p>";

}

}

else
{

header("Location: " . $_SERVER["SCRIPT_NAME"] . "?admin=0");

exit;

}

break;

当case等于0也就是安全级别为low的时候

接收admin参数,弱admin参数等于1,则解锁页面,否则锁定页面

Medium 级别

Cookie单项验证 (不安全)

img

页面依然被锁住,提示查看cookies

img

我们在控制台输出cookie内容

1
"order=id%20desc; serverType=apache; force=0; pnull=1; softType=0; depType=0; Hm_lvt_8d47cbee4e5b4661d33f3edc68a1c7f0=1583834260,1584437445,1584449503; PHPSESSID=abgvim5hfug5meddk2kl476kv0; security_level=1; admin=0"

可以看到cookie中最后一项参数为admin=0;我们改成admin=1试一试

img

成功解锁

代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
case "1" :

if((isset($_COOKIE["admin"])))
{

if($_COOKIE["admin"] == "1")
{

$message = "Cowabunga...<p><font color=\"green\">You unlocked this page using a cookie manipulation.</font></p>";

}

else
{

$message="<font color=\"red\">This page is locked.</font><p>HINT: check the cookies...</p>";

}

}

else
{

// Sets a cookie 'admin' when there is no cookie detected
setcookie("admin", "0", time()+300, "/", "", false, false);

header("Location: " . $_SERVER["SCRIPT_NAME"]);

exit;

}

break;

在代码中可以看到只验证了cookie中admin的内容,很不安全

High级别

启用session验证(相对安全)

先来看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case "2" :             

// Debugging
// print_r($_SESSION);

if(isset($_SESSION["admin"]) && $_SESSION["admin"] == 1)
{

$message = "Cowabunga...<p><font color=\"green\">You unlocked this page with a little help from the dba :)</font></p>";

}

else
{

$message="<font color=\"red\">This page is locked.</font><p>HINT: contact your dba...</p>";

}

break;

high级别是启用了session验证

image-20210825225356952

session是存在服务器的,没法在本地被我们随意修改

这种验证方式还是比较安全的

3.总结

这个实验展示了获取管理权限的三种验证方法,GET传参验证是极不安全的,直接修改URL参数就可以获取权限。不过现实中基本不会有程序员这样写代码。Cookie单项验证也是不安全的,因为Cookie存储在客户端,容易在本地被篡改。而用Session来验证相对安全一些,因为Session存储在服务器端,没法在本地修改。

A2-6 Session Mgmt. - Cookies (HTTPOnly)

1.总概

实验目标:认识httponly

知识点:代码审计 php setcookie函数

什么是 HttpOnly?

如果Cookie中设置了httponly属性,那么通过js脚本将无法读取到Cookie信息,这样能有效的防止XSS攻击,窃取Cookie内容,这样就增加了Cookie的安全性,即便是这样,也不要将重要信息存入Cookie。

着重讲一下php setcookie( ) 参数httponly的用法:

1
setcookie( string $name[, string $value = ""[, int $expire = 0[, string $path = ""[, string $domain = ""[, bool $secure = false[, bool $httponly = false]]]]]] ) : bool


​参数

httponly

设置成 TRUE,Cookie 仅可通过 HTTP 协议访问。这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。要有效减少 XSS 攻击时的身份窃取行为,可建议用此设置(虽然不是所有浏览器都支持)。

2.实验操作步骤

Low级别

点击cookies看到cookie中有三个参数

image-20210825225708801

可以看到所有的cookie信息

代码审计

1
2
3
4
5
case "0" : 

// The cookie will be available within the entire domain
setcookie("top_security", "no", time()+3600, "/", "", false, false);
break;

当级别为low的时候

后面两个false分别对应了setcookie函数里secure参数和httonly参数,说明

http下可以查看cookie

cookie可以通过js查看

Medium级别

image-20210825225743254

使用js无法查看top_security

代码审计

1
2
3
4
5
6
case "1" :

// The cookie will be available within the entire domain
// Sets the Http Only flag
setcookie("top_security", "maybe", time()+3600, "/", "", false, true);
break;

显而易见,开启了httponly,无法用js查看设置的cookie内容。

High级别

image-20210825225836097

使用js无法查看top_security

代码审计

1
2
3
4
5
6
case "2" :            
// The cookie will be available within the entire domain
// The cookie expires at end of the session
// Sets the Http Only flag
setcookie("top_security", "yes", time()+300, "/", "", false, true);
break;

减少了cookie存在时间,开启了httponly,使用js无法查看top_security

3.总结

本实验主要通过设置setcookie()函数中httponly参数,让大家理解这个参数的安全作用,如果设置为true,那么用js就无法查看cookie,但是可以通过抓包查看修改。设置这个参数为true有一定的防xss的安全作用。

A2-7 Session Mgmt. - Cookies (Secure)

1.总概

实验目标:知道secure参数对应的安全作用

知识点:代码审计 php setcookie函数

着重讲一下php setcookie( ) 参数secure的用法:

1
setcookie( string $name[, string $value = ""[, int $expire = 0[, string $path = ""[, string $domain = ""[, bool $secure = false[, bool $httponly = false]]]]]] ) : bool


​参数

secure
设置这个Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。设置成 TRUE 时,只有安全连接存在时才会设置 Cookie。

2.实验操作步骤

Low级别

image-20210825225953257

通过在控制台用js调出cookie 我们是看不到top_security的

image-20210825230002100

但是通过抓包是可以看到的

代码审计

1
case "0" :              $message.= "<p>Browse to another page to see if the cookies are protected over a non-SSL channel.</p>";              // The cookie will be available within the entire domain       // Sets the Http Only flag       setcookie("top_security", "no", time()+3600, "/", "", false, true);               break;

可以看到当low级别时,只开启http_only 不开启secure

http协议下

js无法读cookie

抓包可以

Medium级别

1
当secure判断是https协议时才会设置cookie

image-20210825230025849

所以在medium级别下我们已经看不到了,因为是http协议,所以根本没有设置。

代码审计

1
case "1" :              $message = "<p>This page must be accessed over a SSL channel to fully function!<br />";       $message.= "Browse to another page to see if the cookies are protected over a non-SSL channel.</p>";                  // The cookie will be available within the entire domain       // Sets the Http Only flag and the Secure flag       setcookie("top_security", "maybe", time()+3600, "/", "", true, true);               break;

同时开启了secure和httponly

由于是http协议

没有写入cookie

High级别

image-20210825230045338

高级别下也没有设置cookie

代码审计

1
case "2" :              $message = "<p>This page must be accessed over a SSL channel to fully function!<br />";       $message.= "Browse to another page to see if the cookies are protected over a non-SSL channel.</p>";       // The cookie will be available within the entire domain       // The cookie expires at end of the session       // Sets the Http Only flag and the Secure flag       setcookie("top_security", "yes", time()+300, "/", "", true, true);               break;

可以看到与medium不同的是减少了cookie的存在时间

3.总结

本实验主要通过设置setcookie()函数中secure参数,让大家理解这个参

数的安全作用,如果设置为true,那么http就无法收到cookie,除非改为https。