PHP代码审计:XSS漏洞

原文链接: https://blog.csdn.net/God_XiangYu/article/details/97839722

当你的才华

还撑不起你的野心时

那你就应该静下心来学习


      代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。

目录

XSS代码审计

XSS漏洞介绍

反射型XSS

存储型XSS

XXS漏洞防范

反射型xss漏洞防范

php中xss的漏洞防范方法总结

 存储型xss漏洞防范


XSS代码审计

       XSS漏洞是Web应用程序中最常见的漏洞之一。

       网上小公司的站点可能基本大部分没有预防XSS漏洞的固定方法,那么很可能就存在XSS漏洞

XSS漏洞介绍

       跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。 常见的输出函数有: echo printf print print_r sprintf die var_dump var_export.

xss 分类:

  • 反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

  • 存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

       这些本来会在XSS 学习的篇幅里也会再详细的说明,这里就先再重复一下吧

 

反射型XSS

       在黑盒测试中,这种类型比较容易通过漏洞扫描器直接发现,我们只需要按照扫描结果进行相应的验证就可以了。

相对的在白盒审计中, 我们首先要寻找带参数的输出函数,接下来通过输出内容回溯到输入参数,观察是否过滤即可

echo()函数 来演示反射性XSS

   代码如下,变量 $XssReflex 获取 get 方式传递的变量名为 input 的变量值(值为一个字符串),然后直接通过echo()函数输出,注意这中间并未对用户输入进行任何过滤,创建x.php:


  
  
  1. <html>
  2. <head>
  3. <meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" />
  4. <title>XSS</title>
  5. </head>
  6. <body>
  7. <form action= "" method= "get">
  8. <input type= "text" name= "input">
  9. <input type= "submit">
  10. </form>
  11. <br>
  12. <?php
  13. $XssReflex = $_GET[ 'input'];
  14. echo 'output:<br>'.$XssReflex;
  15. ?>
  16. </body>
  17. </html>

页面展示效果,随便输入一些内容:

以上都为正常的输出,但如果我们输出一些javascript代码呢?

通过代码分析,开始构造我们的payload为:<script>alert(1)</script>时,页面成功弹窗且弹窗内容为填写字符串的值

页面源代码检查一波,发现12行增加了我们刚刚输入的XSS脚本

注:<script>alert(1)</script>

       这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,详细的XSS内容请移步看CE博客的XSS文章,这里就不做过多讲解

存储型XSS

       和反射性XSS的即时响应相比,存储型XSS则需要先把利用代码保存在比如数据库或文件中,当web程序读取利用代码时再输出在页面上执行利用代码。但存储型XSS不用考虑绕过浏览器的过滤问题,屏蔽性也要好很多。 存储型XSS攻击流程:

 

       存储型XSS的白盒审计同样要寻找未过滤的输入点和未过滤的输出函数,如果提示没有执行权限,请用chmod +x  文件名.php 赋予文件执行权限

代码如下,创建x1.php:


  
  
  1. <span style= "font-size:18px;"><meta http-equiv= "Content-Type" content= "text/html;charset=utf-8"/>
  2. <html>
  3. <head>
  4. <title>XssStorage</title>
  5. </head>
  6. <body>
  7. <h2>Message Board<h2>
  8. <br>
  9. <form action= "x1.php" method= "post">
  10. Message:<textarea id= 'Mid' name= "desc"></textarea>
  11. <br>
  12. <br>
  13. Subuser:<input type= "text" name= "user"/><br>
  14. <br>
  15. <input type= "submit" value= "submit" οnclick= 'loction="x1.php"'/>
  16. </form>
  17. <?php
  18. if( isset($_POST[ 'user'])&& isset($_POST[ 'desc'])){
  19. $log=fopen( "sql.txt", "a");
  20. fwrite($log,$_POST[ 'user']. "\r\n");
  21. fwrite($log,$_POST[ 'desc']. "\r\n");
  22. fclose($log);
  23. }
  24. if(file_exists( "sql.txt"))
  25. {
  26. $read= fopen( "sql.txt", 'r');
  27. while(!feof($read))
  28. {
  29. echo fgets($read). "</br>";
  30. }
  31. fclose($read);
  32. }
  33. ?>
  34. </body>
  35. </html></span>

这个页面采用POST提交数据,生成、读取文本模拟数据库,提交数据之后页面会将数据写入sql.txt,再打开页面时会读取sql.txt中内容并显示在网页上,实现了存储型xss攻击模拟,页面展示效果:

Message中输入<script>alert(1)</script>,成功弹窗

页面源代码,并且我们重启浏览器之后再加载该页面,页面依然会弹窗,这是因为恶意代码已经写入数据库中,每当有人访问该页面时,恶意代码就会被加载执行!

这就是所谓的存储型XSS漏洞,一次提交之后,每当有用户访问这个页面都会受到XSS攻击,危害巨大

XXS漏洞防范

反射型xss漏洞防范

php中xss的漏洞防范方法总结:

A.PHP直接输出html的,可以采用以下的方法进行过滤:

    1.htmlspecialchars函数
    2.htmlentities函数
    3.HTMLPurifier.auto.php插件
    4.RemoveXss函数

B.PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:

    1.尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
    2.必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤

C.其它的通用的补充性防御手段

    1.在输出html时,加上Content Security Policy的Http Header
    (作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
    (缺陷:IE或低版本的浏览器可能不支持)
    2.在设置Cookie时,加上HttpOnly参数
    (作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
    (缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
    3.在开发API时,检验请求的Referer参数
    (作用:可以在一定程度上防止CSRF攻击)
    (缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

使用htmlentities()函数 演示:

    htmlentities() 函数把字符转换为 HTML 实体

代码如下,创建x2.php:


  
  
  1. <html>
  2. <head>
  3. <meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" />
  4. <title>XSS</title>
  5. </head>
  6. <body>
  7. <form action= "" method= "get">
  8. <input type= "text" name= "input">
  9. <input type= "submit">
  10. </form>
  11. <br>
  12. <?php
  13. $XssReflex = $_GET[ 'input'];
  14. echo 'output:<br>'.htmlentities($XssReflex); #仅在这里对变量 $XssReflex 做了处理.
  15. ?>
  16. </body>
  17. </html>

htmlentities()函数对用户输入的<>做了转义处理,恶意代码当然也就没法执行了。 还有其他过滤函数,有兴趣的可以自己去尝试一番

检查页面源码:

 存储型xss漏洞防范

       存储型XSS对用户的输入进行过滤的方式和反射型XSS相同

使用htmlspecialchars() 函数 演示:

      htmlentities() :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体

htmlspecialchars和htmlentities的区别:

       htmlspecialchars 只转义 & 、" 、' 、< 、> 这几个html代码,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化,如果没有执行权限,请赋予权限,前面写过,这里就不再复述了,就是用chmod 赋予执行权限

代码如下,创建v3.php:


  
  
  1. <span style= "font-size:18px;"><meta http-equiv= "Content-Type" content= "text/html;charset=utf-8"/>
  2. <html>
  3. <head>
  4. <title>x1</title>
  5. </head>
  6. <body>
  7. <h2>Message Board<h2>
  8. <br>
  9. <form action= "x3.php" method= "post">
  10. Message:<textarea id= 'Mid' name= "desc"></textarea>
  11. <br>
  12. <br>
  13. Subuser:<input type= "text" name= "user"/><br>
  14. <br>
  15. <input type= "submit" value= "submit" οnclick= 'loction="x1.php"'/>
  16. </form>
  17. <?php
  18. if( isset($_POST[ 'user'])&& isset($_POST[ 'desc'])){
  19. $log=fopen( "sqlStorage.txt", "a");
  20. fwrite($log,htmlspecialchars($_POST[ 'user']). "\r\n"); # 在此对用户输入数据$_POST['user']进行过滤
  21. fwrite($log,htmlspecialchars($_POST[ 'desc']). "\r\n"); # 在此对用户输入数据$_POST['desc']进行过滤
  22. fclose($log);
  23. }
  24. if(file_exists( "sqlStorage.txt"))
  25. {
  26. $read= fopen( "sqlStorage.txt", 'r');
  27. while(!feof($read))
  28. {
  29. echo fgets($read). "</br>";
  30. }
  31. fclose($read);
  32. }
  33. ?>
  34. </body>
  35. </html></span>

试试输入<script>alert(1)</script> 发现输入的代码并没有被执行

检测页面源代码

htmlspecialchars()函数对用户输入的<>做了转义处理

参考链接:https://www.shiyanlou.com/courses/895


我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


猜你喜欢

转载自blog.csdn.net/bylfsj/article/details/102731875
今日推荐