Finger
拎着烈酒背着孤独踟蹰的代码狗

最近在学习代码审计看了许多教程现在来说说储存型的XSS形成。
什么是储存型XSS?
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。

下面我们来搭建一个本地漏洞平台进行演示。【说明一下代码是暗月某课程里面挖来的不过因为有点老所以有些语句写法不用了,所以找了团队某个牛给改改了】
样式如下,源文件肯定也会发出来给你们自己动手操作的。

[PHP] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
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
35
36
37
38
39
40
41
42
43
<?php
mysql_connect('localhost','root','root');
mysql_select_db('test');
mysql_query("set names gbk");
if(isset($_POST['submit'])){
$title=$_POST['title']; $con=$_POST['con'];
$sql="INSERT INTO `book` (`id` ,`title` ,`con`)VALUES (NULL , '$title', '$con');";
if(mysql_query($sql))
{ echo "留言成功";
 }else{
 echo "留言失败";
}
}else{
$sql="select * from book";
if($row=mysql_query($sql)){
while($rows=mysql_fetch_array($row)){
echo $rows['id'].$rows['title'].$rows['con']."<br>";
//echo htmlspecialchars ($rows['id'].$rows['title'].$rows['con']."<br>");
}
}
}
?>
<html>
<h1>i春秋储存XSS审计与防御【代码来自暗月后团队大牛改写】</h1> <form action="?action=insert" method="post"> 标题:<input type="text" name="title"><br> 内容:<textarea name="con"></textarea>
<input type="submit" name="submit" value="提交"> <form>
</html>


下面是mysql的表。

[SQL] 纯文本查看 复制代码
1
2
3
4
5
6
CREATE TABLE `book` (
`id` int(5) NOT NULL auto_increment, `title` varchar(32) NOT NULL,
`con` text NOT NULL, PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;

好了我们先看看能不能留言成功!

留言成功,我们让看看我们留言的内容。


下面我们测试一下我们的跨站脚本。我们用HACKbar生成一个payload .

我们插入一下.【嘿别想歪了......】成功留言。


我们返回看一下留言的内容,成功触发了XSS。


下面我们分析他的源代码,原因很常见。

[PHP] 纯文本查看 复制代码
1
2
$title=$_POST['title'];
$con=$_POST['con'];


这两处变量参数没有任何过滤导致了下面

[PHP] 纯文本查看 复制代码
1
echo $rows['id'].$rows['title'].$rows['con']."<br>");

输出语句毫无保留的输出出去了......
心细的同学可能发现了,在这输出语句下面我还注释了一串输出语句。
那个注释的语句是干什么的那?如果各位在写代码时候已经写了很多了又不想翻回去添加过滤的代码

[PHP] 纯文本查看 复制代码
1
htmlspecialchars

函数可以帮助你完美的解决问题。下面我们演示一下,注释上面直接输出语句使用我们过滤语句。


大家看见了咱们的脚本被转义了

[PHP] 纯文本查看 复制代码
1
htmlspecialchars
[PHP] 纯文本查看 复制代码
1
2
预定义的字符是:
& (和号) 成为 & " (双引号) 成为 " ' (单引号) 成为 ' < (小于) 成为 < > (大于) 成为 >

在学习时候我问了zusheng  咱们还可以

[PHP] 纯文本查看 复制代码
1
$cahr = htmlspecialchars(需要转译的字符串);

自定义转义字符来过滤XSS跨站脚本。
拿储存型XSS一半都是获取cookies的我们演示一下如何获取cookies。那我团队私有的xss平台做演示。成功获取。

这篇文章有人发言喽~

  1. What a plrausee to find someone who thinks through the issues

    Laquisha

    2016/12/27

    @Ta
    #1

发表评论