【安全牛学习笔记】存储型XSS漏洞原理及修复方法

来源:互联网 发布:网络发帖推广怎么发 编辑:程序博客网 时间:2024/06/07 18:26

存储型 XSS 

漏洞的原理及修复方法 

1.常见的触发场景

2.漏洞原理

3.漏洞危害

4.一些tips

5.如何避免&修复漏洞

www-data@w:~/controller$ vim missionController.class.php

<?php

class missionController extends baseController{

public $var;

public function __construct(){

parent::__construct();

if($this->loged){

return;

}else{

header('Location: /index.php');

exit();

}

}

public function feedAction(){

$missionModel = new missionModel();

$feeds = $missionModel->get();

$url = '/index.php?c=mission&a=feed';

$username = $this->username;

require('tpl/feed.tpl');

}

public function feedApiAction(){

//permission check

$id = request('id');

$sid = request('sessionid');

$userModel = new userModel();

$userInfo = $userModel->getUserInfo($id,$sid);

$role = $userInfo['role'];

$feeds = array();

$callback = request('callback');

if($role == 1){

$missionModel = new missionModel();

$feeds = $missionModel->getMost($this->id);

$feeds = json_encode(array('email'=>$this->username,'count'=>$feeds[0]));

header("Content-Type: application/json");

echo ' '.$callback.'('.$feeds.')';

}else{

echo $callback.'('.json_encode($feeds).')';

}

}

public function missionAddAction(){

$referer = $_SERVER['HTTP_REFERER'];

$hostname = parse_url($referer,PHP_URL_HOST);

if($hostname !== 'paper.com' && $hostname !== 'csrf.com'){

die('csrf');

}

$missionModel = new missionModel();

$missionUrl = request('missionUrl');

$missionContent = request('missionContent');

$missionModel->add($this->id,$this->username,$missionUrl,$missionContent);

$count = 1;

if($count > 0){

$this->json(array('result'=>0,'message'=>'add mission ok'));

}else{

$this->json(array('result'=>1,'message'=>'add mission wrong'));

}

}

public function deleteAction(){

$missionId = request('missionId');

$missionModel = new missionModel();

$missionModel->delete($missionId,$this->id);

header('Location: /index.php?c=mission&a=feed');

}

public function testDeleteAction(){

echo 'testDeleteAction';

}

public function evalAction(){

$param = request('param');

$a = 0;

eval("\$a = $param;");

echo $a;

}

public function preg_replaceAction(){

$param = request('param');

$result = preg_replace("/(.*)/e",'$var = \'\\1\';',$param);

echo $result;

}

public function add(){

$this->id;

}


}

--------------------------------------------------------------------------------

?php

class missionModel extends baseModel{

public function __construct(){

parent::__construct();

}

public function get(){

$sql = 'select id,username,url,content,time from mission order by id desc';

$db_prepare = $this->conn->prepare($sql);

$db_prepare->execute(array());

$result = $db_prepare->fetchAll();

return $result;

}

public function getMost($uid){

$sql = 'select count(*) from mission where uid=?';

$db_prepare = $this->conn->prepare($sql);

$db_prepare->execute(array($uid));

$result = $db_prepare->fetch();

return $result;

}

public function add($uid,$username,$missionUrl,$missionContent){


$sql = 'insert into mission(uid,username,url,content,time) values(?,?,?,?,?)';

$db_prepare = $this->conn->prepare($sql);

$time = unixTime();

$db_prepare->execute(array($uid,$username,$missionUrl,$missionContent,$time));

return ;

}

public function delete($id,$uid){

$sql = 'delete from mission where id=? and uid=?';

$db_prepare = $this->conn->prepare($sql);

$db_prepare->execute(array($id,$uid));

return;

}

}

---------------------------------------------------------------------------------

用户可以提交自己的内容到web server端

其他用户可以浏览之前用户产生的内容

<script>alert(0)</script>

漏洞原理:

将A用户提交给 web server 的数据存储到数据库,其他用户访问这些数据的时候,没有做转义||编码。将数据直接输出到浏览器,导致而已用户可以插入任意的 html 代码 || javascript 代码

mysql> select * from mission 

www-data@w:~# cd /tpl

www-data@w:~/tpl$ ls

dom.tpl      feed.tpl    index.js      jsohijack.tpl      stroeEdit.tpl  style.css

feedAdd.tpl  footer.tpl  indexPDO.tpl  reflectResult.tpl  stroe.tpl      userIndex.tpl

feeds.tpl    head.tpl    index.tpl     search.tpl         stroeView.tpl

---------------------------------------------------------------------------------

www-data@w:~/tpl$ vim feeds.tpl

<div class="media">

  <a class="media-left media-middle" href="#">

        <img data-holder-rendered="true" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PGRlZnMvPjxyZWN0IHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZmlsbD0iI0VFRUVFRSIvPjxnPjx0ZXh0IHg9IjEyLjk1ODMzMzk2OTExNjIxMSIgeT0iMzIiIHN0eWxlPSJmaWxsOiNBQUFBQUE7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LWZhbWlseTpBcmlhbCwgSGVsdmV0aWNhLCBPcGVuIFNhbnMsIHNhbnMtc2VyaWYsIG1vbm9zcGFjZTtmb250LXNpemU6MTBwdDtkb21pbmFudC1iYXNlbGluZTpjZW50cmFsIj42NHg2NDwvdGV4dD48L2c+PC9zdmc+" style="width: 75px; height: 75px;" data-src="holder.js/75x75" alt="75x75">

  </a>

  <div class="media-body">

    <h4 class="media-heading">user:<a href="" class="mission-username"><?php echo $mission_username; ?></a></h4>

    <p class="mission-url">url:<?php echo $mission_url; ?></p>

    <p class="mission-content">content:<?php echo htmlspecialchars($mission_content); ?></p>

    <p class="mission-time">time<?php echo $mission_time; ?></p>

    <p class="mission-delete"><a href="<?php echo $delete; ?>">delete</a></p>

  </div>

</div>

---------------------------------------------------------------------------------

漏洞危害:

在任意用户的浏览器内执行任意js代码,可以伪装用户在网站发起任操作,比如发消息,转账等操作,在ugc社区还可以造成xss蠕虫,比如myspace的蠕虫,新浪微博蠕虫,百度贴蠕虫等。

浏览器将用户产生的js代码当做web server的代码而解析执行了,->就会避免xss漏洞。

htmlspecialchars

html实体编码:有些字符预留的字符串

该笔记为安全牛课堂学员笔记,想看此课程或者信息安全类干货可以移步到安全牛课堂

Security+认证为什么是互联网+时代最火爆的认证?


      牛妹先给大家介绍一下Security+


        Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA ;是和CISSP、ITIL 等共同包含在内的国际 IT 业 10 大热门认证之一,和CISSP偏重信息安全管理相比,Security+ 认证更偏重信息安全技术和操作。

       通过该认证证明了您具备网络安全,合规性和操作安全,威胁和漏洞,应用程序、数据和主机安全,访问控制和身份管理以及加密技术等方面的能力。因其考试难度不易,含金量较高,目前已被全球企业和安全专业人士所普遍采纳。

Security+认证如此火爆的原因?  

       原因一:在所有信息安全认证当中,偏重信息安全技术的认证是空白的, Security+认证正好可以弥补信息安全技术领域的空白 。

      目前行业内受认可的信息安全认证主要有CISP和CISSP,但是无论CISP还是CISSP都是偏重信息安全管理的,技术知识讲的宽泛且浅显,考试都是一带而过。而且CISSP要求持证人员的信息安全工作经验都要5年以上,CISP也要求大专学历4年以上工作经验,这些要求无疑把有能力且上进的年轻人的持证之路堵住。在现实社会中,无论是找工作还是升职加薪,或是投标时候报人员,认证都是必不可少的,这给年轻人带来了很多不公平。而Security+的出现可以扫清这些年轻人职业发展中的障碍,由于Security+偏重信息安全技术,所以对工作经验没有特别的要求。只要你有IT相关背景,追求进步就可以学习和考试。

       原因二: IT运维人员工作与翻身的利器。

       在银行、证券、保险、信息通讯等行业,IT运维人员非常多,IT运维涉及的工作面也非常广。是一个集网络、系统、安全、应用架构、存储为一体的综合性技术岗。虽然没有程序猿们“生当做光棍,死亦写代码”的悲壮,但也有着“锄禾日当午,不如运维苦“的感慨。天天对着电脑和机器,时间长了难免有对于职业发展的迷茫和困惑。Security+国际认证的出现可以让有追求的IT运维人员学习网络安全知识,掌握网络安全实践。职业发展朝着网络安全的方向发展,解决国内信息安全人才的匮乏问题。另外,即使不转型,要做好运维工作,学习安全知识取得安全认证也是必不可少的。

        原因三:接地气、国际范儿、考试方便、费用适中!

CompTIA作为全球ICT领域最具影响力的全球领先机构,在信息安全人才认证方面是专业、公平、公正的。Security+认证偏重操作且和一线工程师的日常工作息息相关。适合银行、证券、保险、互联网公司等IT相关人员学习。作为国际认证在全球147个国家受到广泛的认可。

        在目前的信息安全大潮之下,人才是信息安全发展的关键。而目前国内的信息安全人才是非常匮乏的,相信Security+认证一定会成为最火爆的信息安全认证。

原创粉丝点击