1. 什么是存储型xss?
攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。只要访问了这个页面的访客,都有可能会执行这段恶意脚本
(因此储存型XSS的危害会更大。因为存储型XSS的代码存在于网页的代码中,可以说是永久型的)
2. 源码剖析
这里直接贴出php源码
<html>
<head lang="en">
<meta charset="gbk">
<title>存储型XSS</title>
</head>
<body>
<form action="" method="post">
输入你的ID: <input type="text" name="id" /> <br/>
输入你的Name:<input type="text" name="name" /> <br/>
<input type="submit" value="提交">
</form>
<hr>
$id=$_POST["id"];
$name=$_POST["name"];
mysql_connect("localhost","root","root");
mysql_select_db("test");
$sql="insert into xss value ($id,'$name')";
$result=mysql_query($sql);
?>
echo "回显内容:";
echo "
";
$sql="select * from xss where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
echo $row['name'];
}
?>
</body>
</html>
可以看到的是,先在第一段部分,接受用户的内容,第二段是将内容插入
数据库,第三个回显内容就是从数据库查询。
(其实那2个php可以合成一个php,但是我不想,懒得)
具体内容我在反射型xss已经讲过了,可以狭义的概述
存储型xss
:用户输入内容插入了数据库,内存,文件等其他地方。然后再次访问的时候没有输入payload,就会自动弹窗
(例如留言板,或者个人资料修改。第一次插入后,连续访问还自动弹窗,说明这就是存储型xss)
反射型xss
:用户想要利用,就得输入一次payload (例如在搜索处发现xss,想要让他弹窗,就得重新输入一遍)
3. 靶场演示
通过源码,我们知道这是这是输出xss表中的内容
我们先看下xss表有没有内容
发现没有内容,这时候我们进入靶场先插入id和name
然后会输出我们的名字
这时候就成功的输出了,我们查看下xss这个表中有没有内容
这时候发现有条内容了。说明我们插入,或者我们平时注册的时候
会插入数据库等等,一般在网站后台可以看到
我应该把上面的第三个php输出内容的代码单独拿出来,模拟管理员访问的页面 QAQ 但是写到这里了,我也不想弄,大概理解个意思就好了
然后我把xss表内容删除掉,插入我们恶意语句的代码
payload:
这是提交,发现弹窗了
注意这里为啥没有回显内容,因为他把我们输入的内容当做代码执行了,所以没有显示
(你见过执行的代码会显示给用户嘛 QAQ)
这时候发现数据库有了一条数据,那就是我们插入的数据
恶意的js语句
这种存储型xss漏洞存在于,留言板,个人资料等等
因为会保存进数据库,然后在后台显示,所以后台管理员只要看到这条信息
他就中招了
至于会不会被发现,这个就不用担心,内容会被当做代码执行,所以不会显示的
我们可以查看一下掌控安全的靶场
这时候点击一下查看留言,因为好多人都会在这里插
(你也可以在留言反馈那边弹一条)
然而也不知道是谁在这插,插这么多,我点不完。所以就不演示了
什么是 dom—based xss?
狭义的总结
:
原本不应该出现xss的地方,但是经过javascript的操作之后产生了xss
这里涉及到了document对象的一些操作,看过前面偏移注入的话应该知道
document.cookie
这样的话就是查看自己的cookie
这里的话也可以使用下面这条命令,判断是否伪静态
如果使用这条的话,时间再不断的变化,就是动态
document.lastModifiled
还有其他的一些方法
这里具体讲document.write()
这个有啥用?
其实就是在页面上面输出
先判断下是不是动态页面,然后再写
document.write("young")
要write什么可以自己定义
然而上面提到了,其实这个write() 也是个js语句
接受编码,那我们试着将下面这个编码,看会不会弹窗
编码后再使用document.write()写入
发现这里弹窗了~~~~
我们通过js编码后,它成功的弹窗了
(但是这个不是漏洞,这里想说的是,像document.write() 会自动对编码进行解码~~)
似乎扯的有点远了,但是如果被拦截了
这里可以通过Js代码的解码,去进行绕过 QAQ
然而xss的时候,也可以使用burp
因为有可能前端有限制,但是数据包没有
例如还有比较偏的,在上传头像的地方打xss QAQ
这里的话借用靶场,因为我觉得这个靶场很容易讲的话很容易理解
通过审查源码,我们可以发现,这里是document.write()进行输出到页面上的
这时候我们可以尝试的,也在这个页面弹窗,通过修改发现,这个输入点是在url那边
这时候发现,似乎没有弹窗
但是注意看,我们输入的内容,已经被给包围了
这时候我们用其他的语句测试
这时候成功的弹窗了,说明了我们输入的内容被执行了
可以简单理解成,标签内不可以使用
其他常用的弹窗语句
1.
2.
这几个是我经常用的
dom型xss其实本质上还是反射型xss,他没有与数据库交互,每次想要弹窗,都需要输入一次payload
对dom型xss没有深入了解